FAB
Botão de ação flutuante (FAB) ancorado a um dos cantos da viewport ou de um container posicionado, destacando a ação primária de uma tela (`mk-fab`).
Componente Experimental
Este componente é experimental — não possui design aprovado no Figma. A API pode mudar entre versões.
O mk-fab é um botão de ação flutuante (FAB) que se ancora a um dos 4 cantos da viewport (strategy="fixed", padrão) — ou de um container posicionado (strategy="absolute") — para destacar a ação primária de uma tela, como "criar item" ou "compor mensagem". Suporta um modo compacto (apenas ícone, círculo) e um modo extended (ícone + rótulo visível, pill), além de integração nativa com formulários via ElementInternals.
Padrão
Por padrão, o botão é ancorado ao canto inferior direito (position="bottom-right") com strategy="fixed", exibindo apenas o ícone. O label é sempre obrigatório — ele vira aria-label no modo compacto e texto visível no modo extended.
import { MkFab } from '@db1/makuco-ui-react';
<MkFab icon="plus" label="Adicionar item" /><mk-fab icon="plus" label="Adicionar item"></mk-fab>Posições
position ancora o botão a um dos 4 cantos: bottom-right (padrão), bottom-left, top-right ou top-left.
<MkFab icon="plus" label="Adicionar" position="top-left" />
<MkFab icon="plus" label="Adicionar" position="top-right" />
<MkFab icon="plus" label="Adicionar" position="bottom-left" />
<MkFab icon="plus" label="Adicionar" position="bottom-right" /><mk-fab icon="plus" label="Adicionar" position="top-left"></mk-fab>
<mk-fab icon="plus" label="Adicionar" position="top-right"></mk-fab>
<mk-fab icon="plus" label="Adicionar" position="bottom-left"></mk-fab>
<mk-fab icon="plus" label="Adicionar" position="bottom-right"></mk-fab>Tamanhos
size controla o diâmetro no modo compacto e a altura no modo estendido: sm, md (padrão) ou lg. Mesmo no menor tamanho a área de toque respeita 44×44px.
<MkFab icon="plus" label="Adicionar" size="sm" />
<MkFab icon="plus" label="Adicionar" size="md" />
<MkFab icon="plus" label="Adicionar" size="lg" /><mk-fab icon="plus" label="Adicionar" size="sm"></mk-fab>
<mk-fab icon="plus" label="Adicionar" size="md"></mk-fab>
<mk-fab icon="plus" label="Adicionar" size="lg"></mk-fab>Intenções
Use kind="destructive" para ações destrutivas ou irreversíveis — como excluir os itens selecionados em massa.
<MkFab icon="trash-2" label="Excluir selecionados" kind="destructive" /><mk-fab icon="trash-2" label="Excluir selecionados" kind="destructive"></mk-fab>Extended
extended alterna entre o formato círculo (ícone apenas) e o formato pill (ícone + rótulo visível lado a lado), animando a transição entre os dois modos.
<MkFab icon="plus" label="Adicionar item" extended /><mk-fab icon="plus" label="Adicionar item" extended></mk-fab>Ancoragem: fixed e absolute
strategy="fixed" (padrão) usa position: fixed, ancorando o botão à viewport e respeitando env(safe-area-inset-*) em dispositivos com notch/home indicator. Use strategy="absolute" para ancorar ao ancestral posicionado mais próximo — útil dentro de um mk-card, mk-drawer ou painel com scroll interno. Nesse caso, garanta que o container tenha position: relative.
Preview simulado
O transform: translateZ(0) aplicado ao container do preview cria um novo containing block, prendendo o strategy="fixed" dentro da caixa. Na prática real, strategy="fixed" ancora à viewport do navegador, independente de qualquer ancestral.
{/* ancorado à viewport (padrão) */}
<MkFab icon="plus" label="Adicionar" />
{/* ancorado ao container pai */}
<div style={{ position: 'relative', height: '400px' }}>
<MkFab icon="plus" label="Adicionar" strategy="absolute" />
</div><!-- ancorado à viewport (padrão) -->
<mk-fab icon="plus" label="Adicionar"></mk-fab>
<!-- ancorado ao container pai -->
<div style="position: relative; height: 400px;">
<mk-fab icon="plus" label="Adicionar" strategy="absolute"></mk-fab>
</div>Três custom properties controlam o posicionamento e podem ser sobrescritas pelo consumidor: --mk-fab-offset-x (padrão var(--db1-spacing-6)), --mk-fab-offset-y (padrão var(--db1-spacing-6)) e --mk-fab-z-index (padrão 1000).
Ícone customizado
Use o slot icon para substituir o ícone renderizado a partir da prop icon por um SVG customizado.
<MkFab label="Ação customizada">
<svg slot="icon" viewBox="0 0 24 24">{/* ... */}</svg>
</MkFab><mk-fab label="Ação customizada">
<svg slot="icon" viewBox="0 0 24 24"><!-- ... --></svg>
</mk-fab>Formulários
mk-fab é form-associated: type="submit" aciona form.requestSubmit() e type="reset" aciona form.reset() no formulário ancestral, mesmo estando dentro de Shadow DOM.
<form onSubmit={handleSubmit}>
<MkFab type="submit" icon="check" label="Enviar" strategy="absolute" />
</form><form (ngSubmit)="handleSubmit()">
<mk-fab type="submit" icon="check" label="Enviar" strategy="absolute"></mk-fab>
</form>Desabilitado
<MkFab icon="plus" label="Adicionar" disabled /><mk-fab icon="plus" label="Adicionar" [disabled]="isDisabled"></mk-fab>Props
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
icon | IconName | — | Ícone Lucide exibido no botão. Obrigatório. |
label | string | — | Rótulo textual. Vira aria-label no modo compacto e texto visível no modo extended. Obrigatório. |
position | "bottom-right" | "bottom-left" | "top-right" | "top-left" | "bottom-right" | Canto de ancoragem. Reflete no atributo HTML. |
size | "sm" | "md" | "lg" | "md" | Tamanho do botão (diâmetro compacto ou altura estendida). |
kind | "default" | "destructive" | "default" | Intenção visual — use destructive para ações perigosas. |
extended | boolean | false | Alterna entre formato círculo (ícone apenas) e pill (ícone + rótulo visível). |
strategy | "fixed" | "absolute" | "fixed" | "fixed" ancora à viewport com env(safe-area-inset-*); "absolute" ancora ao ancestral posicionado mais próximo. |
disabled | boolean | false | Desabilita o botão e impede a interação. Reflete no atributo HTML. |
type | "button" | "submit" | "reset" | "button" | Tipo do elemento <button> nativo. submit/reset interagem com o formulário associado. |
Eventos
| Evento | Payload | Descrição |
|---|---|---|
mkClick | void | Emitido quando o botão é ativado (clique ou Enter/Space) e não está disabled. |
Slots
| Slot | Descrição |
|---|---|
icon | Substitui o ícone renderizado a partir da prop icon. Use um único <svg> como raiz do slot — dimensionado automaticamente; a cor do traço herda currentColor por padrão. |
Acessibilidade
- Renderiza um
<button>nativo internamente — suporte a teclado (Enter / Space) e foco inclusos. - Modo compacto (
extended=false): a proplabeldefine oaria-labeldo botão, já que apenas o ícone é visível. - Modo estendido (
extended=true): o texto dolabeljá está visível como conteúdo do botão — nenhumaria-labelredundante é adicionado, evitando duplicação em leitores de tela. - O ícone interno (
<mk-icon>) já aplicaaria-hidden="true"automaticamente; ao usar um SVG customizado via sloticon, garanta o mesmo. disabledreflete no atributo HTML nativo do<button>, removendo o elemento da ordem de tabulação e da árvore de acessibilidade interativa.- Foco visível: o anel de foco (
:focus-visible) é especialmente importante neste componente por estar sobreposto a conteúdo de fundo variável — não remova ooutlinesem substituí-lo. - Área de toque: mesmo no tamanho
sm, a área mínima respeita 44×44px (WCAG 2.5.5), já que o FAB é frequentemente o único ponto de ação em contexto mobile.