Icon
Renderiza um ícone Lucide como SVG inline através de `mk-icon`, com tamanho, cor e espessura de traço controlados por props e por CSS custom properties.
mk-icon renderiza um ícone do conjunto Lucide como SVG inline. O catálogo completo é distribuído com a biblioteca, sem requisição em runtime e sem dependência externa. O componente é puramente visual: não emite eventos, não recebe foco e não expõe nome acessível próprio.
Quando usar
Use mk-icon para qualquer ícone de interface: dentro de botões e campos, ao lado de rótulos, em itens de navegação e em indicadores de status.
Para um indicador de carregamento em rotação, use mk-spinner, que já é mk-icon mais rotação contínua. Para ilustrações maiores e decorativas, use mk-illustration-icon.
Padrão
name é a única prop obrigatória. O padrão de size é md e o de color é currentColor, que herda a cor de texto do elemento pai.
import { MkIcon } from '@db1/makuco-ui-react';
<MkIcon name="search" /><mk-icon name="search"></mk-icon>Tamanhos
size usa a escala semântica compartilhada com o resto do sistema. Cada valor mapeia para um token da escala de espaçamento, de --db1-spacing-3 a --db1-spacing-12.
<MkIcon name="settings" size="xs" />
<MkIcon name="settings" size="md" />
<MkIcon name="settings" size="xxl" /><mk-icon name="settings" size="xs"></mk-icon>
<mk-icon name="settings" size="md"></mk-icon>
<mk-icon name="settings" size="xxl"></mk-icon>Cor
A cor do traço é resolvida nesta ordem de precedência:
| Ordem | Mecanismo | Onde é declarado |
|---|---|---|
| 1 | --mk-icon-color | No próprio mk-icon ou em qualquer ancestral |
| 2 | prop color | No elemento, como atributo ou propriedade |
| 3 | --icon-high-emphasis | Fallback no CSS do componente |
A prop color aceita qualquer valor de cor CSS. Prefira tokens da camada --icon-*, que são theme-aware.
<MkIcon name="circle-alert" color="var(--icon-error)" /><mk-icon name="circle-alert" color="var(--icon-error)"></mk-icon>Sobrescrever a cor com --mk-icon-color
--mk-icon-color tem precedência sobre a prop color. Um ancestral que declara a variável colore todos os mk-icon descendentes de uma vez, e a prop deixa de ter efeito. Abaixo os dois ícones declaram color="red", e a variável do container vence:
<div style={{ '--mk-icon-color': 'var(--icon-success)' }}>
<MkIcon name="check" color="red" />
<MkIcon name="circle-alert" color="red" />
</div><div style="--mk-icon-color: var(--icon-success)">
<mk-icon name="check" color="red"></mk-icon>
<mk-icon name="circle-alert" color="red"></mk-icon>
</div>Propriedades customizadas atravessam fronteiras de shadow DOM, então a variável alcança um mk-icon renderizado dentro de outro componente, em qualquer profundidade. É por esse caminho que mk-button, mk-autocomplete, mk-search e mk-mentions colorem seus próprios ícones e spinners sem passar props — e é como recolorir um ícone que você não instancia diretamente:
/* recolore o ícone interno de um componente de terceiro nível */
mk-button.destructive {
--mk-icon-color: var(--icon-error);
}Sem nenhum --mk-icon-color no contexto, vale a prop color, cujo padrão currentColor herda a cor de texto do elemento pai.
Preenchimento
filled preenche o desenho com a cor atual. --mk-icon-fill tem precedência sobre a prop e também vale a partir de qualquer ancestral.
<MkIcon name="heart" size="lg" color="var(--icon-error)" filled /><mk-icon name="heart" size="lg" color="var(--icon-error)" [filled]="true"></mk-icon>Espessura do traço
strokeWidth ajusta a ênfase do desenho. Use valores menores para ícones decorativos e maiores quando o ícone precisa competir com texto em peso alto.
<MkIcon name="star" size="lg" strokeWidth={1.5} /><mk-icon name="star" size="lg" [strokeWidth]="1.5"></mk-icon>Props — mk-icon
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
name | IconName | — | Obrigatória. Nome do ícone no registro gerado a partir do Lucide. |
size | "xs" | "sm" | "md" | "lg" | "xl" | "xxl" | "md" | Tamanho semântico. Mapeia para a escala de espaçamento, de |
color | string | "currentColor" | Cor do traço. Aceita qualquer valor de cor CSS. Sobrescrita por |
strokeWidth | number | 2 | Espessura do traço do SVG. |
filled | boolean | false | Preenche o desenho com a cor atual. Sobrescrita por --mk-icon-fill. |
CSS custom properties
| Variável | Precedência | Descrição |
|---|---|---|
--mk-icon-color | Vence a prop color | Cor do traço. Vale a partir de qualquer ancestral. |
--mk-icon-fill | Vence a prop filled | Cor de preenchimento. Vale a partir de qualquer ancestral. |
--mk-icon-size | Vence a prop size | Lado da caixa do SVG. Precisa ser declarada no próprio elemento. |
Eventos
Não emite eventos. O componente é puramente visual e não responde a interação.
Acessibilidade
O <svg> interno é sempre aria-hidden="true". mk-icon é decorativo em todos os casos e nunca expõe nome acessível próprio — não há prop de rótulo.
Quando o ícone carrega significado, o nome acessível é responsabilidade de quem o envolve:
- Em um controle sem texto visível, declare o nome no elemento interativo —
aria-labelnobutton, ou a proplabeldemk-icon-button. - Ao lado de um texto que já descreve a ação, nada mais é necessário: o ícone reforça o rótulo e permanece fora da árvore de acessibilidade.
- Para um ícone de status sem texto adjacente, acompanhe-o de conteúdo visualmente oculto que descreva o estado.
Como elemento gráfico não textual, o ícone se enquadra no critério 1.4.11 (Non-text Contrast), que exige 3:1 contra o fundo adjacente. Os valores da camada --icon-* atendem esse limite nos dois temas.
A transição de 0.2s aplicada ao SVG é removida sob prefers-reduced-motion: reduce.
O componente não entra na ordem de tabulação e não expõe operações de teclado.