Skip to main content

Snackbar

O componente Snackbar exibe notificações temporárias na interface do usuário, fornecendo feedback sobre ações ou eventos importantes.

Importação

import { Snackbar } from '@useblu/ocean-react';

Importação específica (recomendado para tree-shaking)

import { Snackbar } from '@useblu/ocean-react/Snackbar';

Importação de tipos TypeScript

import type { SnackbarProps } from '@useblu/ocean-react';

// Uso em componente customizado
const MyComponent: React.FC<SnackbarProps> = (props) => {
return <Snackbar {...props} />;
};

Playground Interativo

Explore o componente Snackbar no playground interativo do Storybook:

Documentação Completa

Para documentação técnica detalhada, exemplos de uso e API completa, consulte o Storybook do Snackbar.

No Storybook você encontrará:

  • Controles interativos para testar todas as props
  • API gerada automaticamente com tipagem completa
  • Exemplos visuais de todas as variantes e estados
  • Playground para experimentação rápida

Uso básico

O Snackbar é usado para exibir notificações temporárias:

import { useState } from 'react';

function SnackbarExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Abrir Snackbar</Button>
<Snackbar
type="info"
message="Esta é uma mensagem de exemplo."
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<SnackbarExample />;

Tipos

O Snackbar está disponível em quatro tipos diferentes:

Info

import { useState } from 'react';

function InfoExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Info</Button>
<Snackbar
type="info"
message="Esta é uma mensagem informativa."
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<InfoExample />;

Positive

import { useState } from 'react';

function PositiveExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Positive</Button>
<Snackbar
type="positive"
message="Operação realizada com sucesso!"
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<PositiveExample />;

Negative

import { useState } from 'react';

function NegativeExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Negative</Button>
<Snackbar
type="negative"
message="Ocorreu um erro na operação."
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<NegativeExample />;

Warning

import { useState } from 'react';

function WarningExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Warning</Button>
<Snackbar
type="warning"
message="Atenção! Esta ação requer confirmação."
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<WarningExample />;

Veja todos os tipos juntos:

Posições

O Snackbar pode ser posicionado em quatro locais diferentes da tela:

Bottom Right (padrão)

import { useState } from 'react';

function BottomRightExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Bottom Right</Button>
<Snackbar
type="info"
message="Snackbar no canto inferior direito"
position="bottom-right"
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<BottomRightExample />;

Top Right

import { useState } from 'react';

function TopRightExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Top Right</Button>
<Snackbar
type="info"
message="Snackbar no canto superior direito"
position="top-right"
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<TopRightExample />;

Top Left

import { useState } from 'react';

function TopLeftExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Top Left</Button>
<Snackbar
type="info"
message="Snackbar no canto superior esquerdo"
position="top-left"
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<TopLeftExample />;

Bottom Left

import { useState } from 'react';

function BottomLeftExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Bottom Left</Button>
<Snackbar
type="info"
message="Snackbar no canto inferior esquerdo"
position="bottom-left"
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<BottomLeftExample />;

Veja todas as posições:

Com Ação

O Snackbar pode incluir um botão de ação para permitir interação do usuário:

import { useState } from 'react';

function ActionExample() {
const [isOpen, setIsOpen] = useState(false);

return (
<div>
<Button onClick={() => setIsOpen(true)}>Abrir com Ação</Button>
<Snackbar
type="warning"
message="Esta ação não pode ser desfeita."
actionLabel="Desfazer"
action={() => console.log('Ação de desfazer executada')}
isOpen={isOpen}
setIsOpen={setIsOpen}
/>
</div>
);
}

<ActionExample />;

Exemplo com ação:

API

Props

PropTipoPadrãoDescrição
type'info' | 'positive' | 'negative' | 'warning''info'O tipo do snackbar
messagestring-Mensagem exibida no snackbar
isOpenboolean-Define se o snackbar está visível
setIsOpenDispatch<SetStateAction<boolean>>-Função para controlar a visibilidade
action() => void-Função executada ao clicar na ação
actionLabelstring'action'Texto do botão de ação
position'bottom-left' | 'top-left' | 'top-right' | 'bottom-right''bottom-right'Posição onde o snackbar é exibido
classNamestring-Classes CSS adicionais

Classes CSS

O componente Snackbar utiliza as seguintes classes CSS para customização:

Classes principais

ClasseDescrição
.ods-snackbarClasse base do componente
.ods-snackbar__bottom-left-defaultPosição bottom-left sem ação
.ods-snackbar__bottom-left-actionPosição bottom-left com ação
.ods-snackbar__top-left-defaultPosição top-left sem ação
.ods-snackbar__top-left-actionPosição top-left com ação
.ods-snackbar__top-right-defaultPosição top-right sem ação
.ods-snackbar__top-right-actionPosição top-right com ação
.ods-snackbar__bottom-right-defaultPosição bottom-right sem ação (padrão)
.ods-snackbar__bottom-right-actionPosição bottom-right com ação

Classes de elementos internos

ClasseDescrição
.ods-snackbar__contentContainer do conteúdo
.ods-snackbar__iconContainer do ícone
.ods-snackbar__icon-infoÍcone para tipo info
.ods-snackbar__icon-positiveÍcone para tipo positive
.ods-snackbar__icon-negativeÍcone para tipo negative
.ods-snackbar__icon-warningÍcone para tipo warning
.ods-snackbar__labelTexto da mensagem
.ods-snackbar__actionContainer do botão de ação
.ods-snackbar__action-text-infoTexto da ação para tipo info
.ods-snackbar__action-text-positiveTexto da ação para tipo positive
.ods-snackbar__action-text-negativeTexto da ação para tipo negative
.ods-snackbar__action-text-warningTexto da ação para tipo warning
.ods-snackbar__progressBarra de progresso
.ods-snackbar__progress-defaultBarra de progresso sem ação
.ods-snackbar__progress-actionBarra de progresso com ação

Acessibilidade

  • ✅ Suporte completo a navegação por teclado
  • ✅ Estados de foco visíveis
  • ✅ Atributos ARIA apropriados
  • ✅ Suporte a screen readers
  • ✅ Contraste adequado em todos os estados
  • ✅ Auto-dismiss após 10 segundos (configurável)
TeclaFunção
TabMove o foco para o snackbar
Space / EnterAtiva o botão de ação
EscapeFecha o snackbar

Melhores práticas

✅ Faça

  • Use mensagens claras e concisas
  • Escolha o tipo apropriado para o contexto (info, positive, negative, warning)
  • Use ações apenas quando necessário para interação do usuário
  • Posicione o snackbar onde não interfira com o conteúdo principal
  • Mantenha mensagens curtas (máximo 2 linhas)

❌ Não faça

  • Não use snackbars para informações críticas (use modais)
  • Não use múltiplos snackbars simultaneamente
  • Não use textos muito longos nas mensagens
  • Não use snackbars para confirmações complexas
  • Não omita o tipo apropriado para o contexto