Makuco UI
ComponentesData Display

Meter

Medição visual somente leitura dentro de uma escala conhecida, com cálculo automático de cor semântica. Tag `mk-meter`.

Componente Experimental

Este componente é experimental — não possui design aprovado no Figma. A API pode mudar entre versões.

O mk-meter exibe uma medição visual somente leitura dentro de uma escala conhecida — força de senha, uso de disco, capacidade utilizada, nível de volume. Ele replica a semântica do elemento nativo <meter> (role="meter", aria-valuenow/min/max/valuetext) com estilização total via tokens --db1-*, e calcula automaticamente a cor semântica (success/warning/danger) a partir de low, high e optimum, eliminando a necessidade de o consumidor calcular breakpoints manualmente. Para captura de valor pelo usuário, use mk-slider; para progresso de tarefa assíncrona, use mk-progress.

Padrão

import { MkMeter } from '@db1/makuco-ui-react';

<MkMeter value={72} label="Uso de disco" showValue></MkMeter>
<mk-meter value="72" label="Uso de disco" show-value></mk-meter>

Tamanhos

Três tamanhos disponíveis via size: sm, md (padrão) e lg. A prop controla a altura da trilha e a tipografia do label/valor.

import { MkMeter } from '@db1/makuco-ui-react';

<MkMeter value={72} size="sm" label="Small" showValue></MkMeter>
<MkMeter value={72} size="md" label="Medium" showValue></MkMeter>
<MkMeter value={72} size="lg" label="Large" showValue></MkMeter>
<mk-meter value="72" size="sm" label="Small" show-value></mk-meter>
<mk-meter value="72" size="md" label="Medium" show-value></mk-meter>
<mk-meter value="72" size="lg" label="Large" show-value></mk-meter>

Cálculo automático de cor

Com variant="auto" (padrão), a cor é calculada a partir de low, high e optimum, reproduzindo o algoritmo de três regiões do elemento <meter> nativo do HTML Living Standard:

  • Sem low/high/optimum: fallback de 3 faixas fixas relativas ao percentual do valor — < 34%danger, 34%–66%warning, > 66%success.
  • optimum < low (quanto menor, melhor): valores ≤ lowsuccess; entre low e highwarning; > highdanger.
  • optimum > high (quanto maior, melhor): valores < lowdanger; entre low e highwarning; ≥ highsuccess.
  • low ≤ optimum ≤ high (faixa intermediária é a ideal): valores < lowwarning; entre low e highsuccess; > highwarning — não existe região danger neste caso.

Se low > high, a configuração é inválida: o componente emite um console.warn em desenvolvimento e cai no fallback de 3 faixas fixas.

import { MkMeter } from '@db1/makuco-ui-react';

<MkMeter value={20} low={34} high={67} optimum={100} label="Abaixo de low" showValue></MkMeter>
<MkMeter value={50} low={34} high={67} optimum={100} label="Entre low e high" showValue></MkMeter>
<MkMeter value={90} low={34} high={67} optimum={100} label="Acima de high" showValue></MkMeter>
<mk-meter value="20" low="34" high="67" optimum="100" label="Abaixo de low" show-value></mk-meter>
<mk-meter value="50" low="34" high="67" optimum="100" label="Entre low e high" show-value></mk-meter>
<mk-meter value="90" low="34" high="67" optimum="100" label="Acima de high" show-value></mk-meter>

Variantes explícitas

Uma variant diferente de "auto" (success, warning, danger, info, brand) sempre sobrescreve o cálculo automático — útil quando a severidade já vem calculada no backend (ex.: status: "critical" retornado por uma API).

import { MkMeter } from '@db1/makuco-ui-react';

<MkMeter value={95} variant="danger" label="Capacidade do plano" showValue></MkMeter>
<mk-meter value="95" variant="danger" label="Capacidade do plano" show-value></mk-meter>

Slot de valor customizado

O slot value substitui o texto percentual gerado automaticamente por markup customizado (ex.: "8 de 10 GB"). O slot tem prioridade sobre showValue — se houver conteúdo projetado, ele é exibido independentemente do valor da prop.

import { MkMeter } from '@db1/makuco-ui-react';

<MkMeter value={8} min={0} max={10} label="Armazenamento">
  <span slot="value">8 de 10 GB</span>
</MkMeter>
<mk-meter value="8" min="0" max="10" label="Armazenamento">
  <span slot="value">8 de 10 GB</span>
</mk-meter>

Reagindo a mudanças de severidade

O evento mkChange é disparado quando value muda ou quando a variante de cor resolvida cruza de faixa (ex.: de warning para danger), permitindo reagir programaticamente — por exemplo, disparando um mk-toast de alerta.

import { MkMeter } from '@db1/makuco-ui-react';

<MkMeter
  value={72}
  label="Uso de disco"
  showValue
  onMkChange={(e) => {
    if (e.detail.variant === 'danger') {
      console.warn('Uso de disco crítico:', e.detail.value);
    }
  }}
></MkMeter>
<mk-meter
  value="72"
  label="Uso de disco"
  show-value
  (mkChange)="onDiskUsageChange($event)"
></mk-meter>

Props

PropTipoPadrãoDescrição
valuenumberValor atual da medição. Clampado internamente ao intervalo [min, max].
minnumber0Limite inferior da escala.
maxnumber100Limite superior da escala.
lownumber | undefinedundefined

Ponto que separa a faixa "baixa" da faixa "média" (semântica idêntica ao atributo low do <meter> nativo). Usado apenas quando variant="auto".

highnumber | undefinedundefinedPonto que separa a faixa "média" da faixa "alta". Usado apenas quando variant="auto".
optimumnumber | undefinedundefined

Ponto que indica o valor ideal dentro da escala — determina se valores mais altos, mais baixos, ou a faixa intermediária são considerados "bons". Usado apenas quando variant="auto".

variant"auto" | "success" | "warning" | "danger" | "info" | "brand""auto"

Cor semântica. "auto" calcula a cor a partir de low/high/optimum; qualquer outro valor fixa a cor manualmente.

size"sm" | "md" | "lg""md"Escala visual (altura da trilha, tipografia do label/valor).
labelstring | undefinedundefined

Texto descritivo exibido acima da barra e usado como aria-label do host quando não há aria-labelledby externo associado.

showValuebooleanfalseExibe o valor formatado (percentual por padrão) ao lado do label.
valueLabelstring | undefinedundefined

Texto customizado que substitui o valor numérico formatado (ex.: "Forte", "8 de 10 GB"). Usado tanto na exibição visual quanto em aria-valuetext.

localestring | undefinedundefined

Locale BCP 47 para formatação do valor via Intl.NumberFormat (ex.: "pt-BR", "en-US"). Quando omitido, resolve a partir do atributo lang mais próximo na árvore do DOM, com fallback para "pt-BR".

Eventos

EventoPayloadDescrição
mkChange

{ value: number; min: number; max: number; variant: "success" | "warning" | "danger" | "info" | "brand" }

Disparado sempre que value muda ou quando a variante de cor resolvida (mesmo em variant="auto") muda em relação ao render anterior. variant no payload é sempre a cor resolvida/concreta — nunca "auto". Não é emitido no primeiro render.

Slots

SlotDescrição
value

Substitui o texto de valor gerado automaticamente (percentual ou valueLabel) por markup customizado. Renderizado dentro de .mk-meter__value; aparece sempre que projetado, independentemente de showValue.

Acessibilidade

  • O host recebe role="meter" — um papel WAI-ARIA não interativo, análogo a progressbar, mas para uma medição estática dentro de uma escala conhecida, e não para o avanço de uma tarefa assíncrona.
  • aria-valuenow, aria-valuemin e aria-valuemax refletem value (clampado), min e max, sempre atualizados.
  • aria-valuetext comunica o significado qualitativo da faixa (ex.: "72%, atenção"), já que role="meter" não expõe low/high/optimum nativamente a tecnologias assistivas. Quando valueLabel é fornecido, ele substitui o texto gerado (ex.: "Forte").
  • aria-label reflete a prop label quando não há aria-labelledby aplicado externamente pelo consumidor.
  • O componente nunca recebe foco: não há tabindex no host nem em nenhum elemento interno, e não responde a Tab, Enter, Space ou setas.
  • A cor nunca é o único indicador de severidade — o valor numérico/textual está sempre disponível via aria-valuetext e, opcionalmente, também visualmente via showValue.
  • Contraste ≥ 4.5:1 para o texto do label/valor e ≥ 3:1 para o preenchimento da barra contra o trilho, garantido pelos tokens semânticos em ambos os temas (claro/escuro).

On this page