Link
Link de navegação e ação inline. Renderiza `<a>` ou `<button>` com sublinhado configurável e estado desabilitado.
O mk-link é o componente para navegação inline e ações de texto do Makuco UI. Suporta renderização como <a> ou <button>, tratamento de sublinhado e integração segura com target="_blank".
Uso básico
import { MkLink } from '@db1/makuco-ui-react';
<MkLink href="/destino">Visitar página</MkLink><mk-link href="/destino">Visitar página</mk-link>Sublinhado
Controle a exibição do sublinhado com a prop underline.
<MkLink href="#" underline="always">Sempre sublinhado</MkLink>
<MkLink href="#" underline="hover">Sublinhado no hover</MkLink>
<MkLink href="#" underline="none">Sem sublinhado</MkLink><mk-link href="#" underline="always">Sempre sublinhado</mk-link>
<mk-link href="#" underline="hover">Sublinhado no hover</mk-link>
<mk-link href="#" underline="none">Sem sublinhado</mk-link>Como botão
Use component="button" quando o link disparar uma ação JavaScript em vez de navegar para uma URL.
<MkLink component="button" onMkClick={handleAction}>
Ação inline
</MkLink><mk-link component="button" (mkClick)="handleAction()">
Ação inline
</mk-link>Abrir em nova aba
Quando target="_blank" é definido sem rel, noopener noreferrer é aplicado automaticamente.
<MkLink href="https://db1.com.br" target="_blank">
Abrir em nova aba
</MkLink><mk-link href="https://db1.com.br" target="_blank">
Abrir em nova aba
</mk-link>Desabilitado
<MkLink href="#" disabled>Link desabilitado</MkLink><mk-link href="#" [disabled]="isDisabled">Link desabilitado</mk-link>Quando usar
Use mk-link quando:
- O texto é navegável e está inserido em um parágrafo (ex.: "Leia nossa política de privacidade").
- A ação é orientada a navegação.
- O contexto possui texto denso e um botão quebraria o fluxo de leitura.
Prefira alternativas quando:
- A ação é primária e precisa se destacar — use
mk-button. - O link está isolado, sem texto ao redor — um botão ghost ou text comunica melhor.
- A ação é destrutiva ou irreversível — botões carregam mais peso visual e semântico.
Anatomia
| # | Parte | Obrigatório? | Função |
|---|---|---|---|
| 1 | Texto do link | Sim | Palavra ou trecho clicável. Deve descrever o destino — evite "clique aqui" sem contexto. |
| 2 | Sublinhado | Depende da variante | Principal sinal visual de que o texto é interativo. |
Variantes
- Sempre sublinhado (
underline="always"): sublinhado sempre visível, independente do estado. Variante mais acessível — recomendada para leitura densa. - Sublinhado no hover (
underline="hover"): sublinhado aparece somente no hover. Atenção: em dispositivos touch o hover não existe — o link ficará sem sublinhado no mobile. Use apenas quando a cor sozinha for suficiente para identificar o link. - Sem sublinhado (
underline="none"): sem sublinhado em nenhum estado. Use com critério — a cor passa a ser o único diferenciador. Reservado para contextos onde a natureza do link já é clara pela interface (menus de navegação, breadcrumbs).
Comportamento
Hover ativa o estado de hover. Ao clicar, o estado active é exibido momentaneamente antes da navegação. Teclado: Tab para focar, Enter para ativar. O estado visitado (quando o usuário já acessou aquele destino) não está contemplado neste estilo — se o contexto exigir distinção entre links visitados e não visitados, o estilo :visited deverá ser definido separadamente.
Estados
| Estado | Quando aparece | O que muda visualmente |
|---|---|---|
| Padrão | Tela carregada, link ainda não tocado | Texto na cor do link; sublinhado conforme variante |
| Hover | Cursor posicionado sobre o link | Sublinhado aparece ou se intensifica; cursor vira pointer |
| Active | Durante o clique, antes da navegação | Feedback visual imediato confirmando a interação |
| Desabilitado | Link temporariamente indisponível | Opacidade reduzida; cursor not-allowed |
Composição
O link inline é sempre parte de um bloco de texto maior — nunca aparece sozinho na interface. Quando a ação merece mais destaque, prefira mk-button com variante ghost ou text. Quando o link precisar vir acompanhado de um ícone (ex.: link externo com seta), verifique se mk-link atende o caso antes de compor manualmente ícone + texto.
Props
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
href | string | — | URL de destino. Usado apenas quando component="a". |
underline | "always" | "hover" | "none" | "hover" | Comportamento do sublinhado. |
component | "a" | "button" | "a" | Elemento raiz renderizado. |
target | string | — | Atributo target do elemento <a>. |
rel | string | — | Atributo rel. Quando target="_blank" e rel não é fornecido, noopener noreferrer é aplicado automaticamente. |
disabled | boolean | false | Desabilita o link. |
Eventos
| Evento | Payload | Descrição |
|---|---|---|
mkClick | MouseEvent | Emitido ao clicar quando o link não está disabled. |
Acessibilidade
- Usa
<a>ou<button>nativo — suporte a teclado incluso sem ARIA extra. aria-disabled="true"é aplicado quandodisabled, mantendo o elemento visível para leitores de tela.- Para âncoras desabilitadas,
tabIndex="-1"remove o elemento do fluxo de foco. noopener noreferreré adicionado automaticamente em linkstarget="_blank"para evitar vazamento dewindow.opener.- Use
component="a"para destinos de navegação ecomponent="button"para ações JavaScript.
Rótulos e identificação: o texto do link deve descrever o destino por si só, sem depender do contexto ao redor. Leitores de tela navegam pelos links da página isoladamente — um texto genérico não comunica nada nesse contexto.
| Evitar | Preferir |
|---|---|
| "Clique aqui" | "Leia a política de privacidade completa" |
| "Saiba mais" | "Acesse o relatório de março" |
| "Acesse" | "Abra a documentação do componente" |
Estado desabilitado: prefira esconder o link ou substituir por texto informativo. Se precisar usar o estado desabilitado, sempre acompanhe com mensagem ou tooltip explicando por que a ação não está disponível.