๐ฒ Mobile-First Design
Comecando pelo menor e expandindo para o maior
Mobile-First e uma filosofia de design onde voce comeca criando para telas pequenas e depois adiciona complexidade para telas maiores. Isso garante que a experiencia mobile nao seja uma adaptacao, mas sim o ponto de partida. O CSS base e para mobile, e media queries adicionam estilos para telas maiores.
Tailwind CSS e mobile-first por padrao. Classes sem prefixo (p-4) aplicam em todas telas. Classes com prefixo (md:p-6) aplicam apenas a partir daquele breakpoint. Isso inverte a logica tradicional de "desktop primeiro".
Box de Detalhamento
Mobile-First (Correto)
- โ CSS base = mobile
- โ Media queries adicionam para telas maiores
- โ Prioriza conteudo essencial
- โ Performance melhor em mobile
-
โ
min-widthmedia queries
Desktop-First (Evitar)
- โ CSS base = desktop
- โ Media queries removem para telas menores
- โ Mobile recebe CSS desnecessario
- โ Experiencia mobile e "adaptacao"
-
โ
max-widthmedia queries
Box de Dados
<!-- Mobile-First com Tailwind -->
<div class="
p-4 // Padding base (mobile)
md:p-6 // Mais padding em tablet+
lg:p-8 // Ainda mais em desktop+
grid
grid-cols-1 // 1 coluna (mobile)
md:grid-cols-2 // 2 colunas (tablet+)
lg:grid-cols-3 // 3 colunas (desktop+)
gap-4 // Gap base
lg:gap-6 // Gap maior em desktop
text-sm // Texto menor (mobile)
md:text-base // Texto normal (tablet+)
">
...
</div>
<!-- Equivalente CSS puro -->
<style>
.container {
padding: 1rem; /* Base: mobile */
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
}
@media (min-width: 768px) { /* md: */
.container {
padding: 1.5rem;
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) { /* lg: */
.container {
padding: 2rem;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
}
}
</style>
๐ก Dica Pratica
Comece sempre testando em 320px de largura (iPhone SE). Se funcionar bem nessa tela, funcionara em qualquer dispositivo. Use o DevTools do Chrome em modo responsivo e va aumentando a largura gradualmente.
๐ Breakpoints do Tailwind
Os cinco pontos de quebra padrao e quando usar cada um
Tailwind define cinco breakpoints padrao: sm (640px), md (768px), lg (1024px), xl (1280px) e 2xl (1536px). Cada prefixo ativa estilos "a partir de" aquela largura. Voce pode customizar esses valores no tailwind.config.js se necessario.
Para dashboards, os breakpoints mais usados sao md (tablet) e lg (desktop). O breakpoint sm raramente e necessario - se algo funciona em mobile (sem prefixo), geralmente funciona em sm tambem.
| Prefixo | Min-Width | Dispositivo | Uso em Dashboard |
|---|---|---|---|
| (sem) | 0px | Mobile | Base - sempre define |
| sm: | 640px | Mobile landscape | Raramente usado |
| md: | 768px | Tablet | Muito usado - sidebar visivel |
| lg: | 1024px | Desktop | Muito usado - layout completo |
| xl: | 1280px | Desktop grande | Mais colunas, detalhes extras |
| 2xl: | 1536px | Ultrawide | Max-width para legibilidade |
<!-- Padroes comuns em dashboards -->
<!-- Grid responsivo de cards -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<div>Card KPI 1</div>
<div>Card KPI 2</div>
<div>Card KPI 3</div>
<div>Card KPI 4</div>
</div>
<!-- Sidebar que aparece em desktop -->
<aside class="hidden md:block w-64 fixed left-0 top-0">
Sidebar
</aside>
<!-- Botao hamburguer so em mobile -->
<button class="md:hidden p-2">
โฐ
</button>
<!-- Texto que muda de tamanho -->
<h1 class="text-xl md:text-2xl lg:text-3xl">
Titulo Responsivo
</h1>
<!-- Elemento que some em mobile -->
<span class="hidden sm:inline">
Texto so visivel em telas maiores
</span>
โ Fazer
- โข Usar md: e lg: como breakpoints principais
- โข Sempre definir estilo base (sem prefixo)
- โข Testar em cada breakpoint
- โข Usar hidden/block para mostrar/esconder
โ Evitar
- โข Pular o estilo base e so usar prefixos
- โข Usar todos 5 breakpoints em tudo
- โข Definir valores arbitrarios sem justificativa
- โข Esquecer de testar entre breakpoints
๐ Tabelas Responsivas
Estrategias para exibir dados tabulares em telas pequenas
Tabelas sao um dos maiores desafios de responsividade. Uma tabela de 10 colunas simplesmente nao cabe em 320px. Existem varias estrategias: scroll horizontal, esconder colunas menos importantes, transformar em cards, ou usar accordion para detalhes.
A estrategia mais simples e eficaz e scroll horizontal com container. Mantem a estrutura da tabela, usuario pode arrastar para ver mais colunas. Para dashboards, essa e geralmente a melhor opcao.
Box de Detalhamento
Estrategias para Tabelas
- 1. Scroll horizontal: overflow-x-auto no container
- 2. Esconder colunas: hidden md:table-cell
- 3. Card layout: Transforma linhas em cards empilhados
- 4. Accordion: Linha principal + detalhes expandiveis
Quando usar cada uma
- โธ Scroll: Muitas colunas, dados uniformes
- โธ Esconder: Colunas com prioridade clara
- โธ Cards: Poucos itens, muitos detalhes
- โธ Accordion: Lista + detalhes sob demanda
Exemplo: Tabela com Scroll Horizontal
Arraste para os lados em telas pequenas:
| ID | Cliente | Produto | Status | Valor | Data |
|---|---|---|---|---|---|
| #1234 | Ana Silva | Dashboard Pro | Pago | R$ 299 | 15/01/2024 |
| #1235 | Carlos Souza | Analytics Suite | Pendente | R$ 499 | 14/01/2024 |
<!-- Estrategia 1: Scroll horizontal -->
<div class="overflow-x-auto">
<table class="w-full min-w-[600px]">
...
</table>
</div>
<!-- Estrategia 2: Esconder colunas -->
<table>
<thead>
<tr>
<th>Nome</th> <!-- Sempre visivel -->
<th class="hidden md:table-cell">Email</th>
<th class="hidden lg:table-cell">Telefone</th>
<th>Status</th> <!-- Sempre visivel -->
</tr>
</thead>
<tbody>
<tr>
<td>Ana Silva</td>
<td class="hidden md:table-cell">ana@email.com</td>
<td class="hidden lg:table-cell">(11) 99999</td>
<td>Ativo</td>
</tr>
</tbody>
</table>
<!-- Estrategia 3: Cards em mobile -->
<div class="md:hidden space-y-4">
<!-- Card por item -->
<div class="bg-dark-800 p-4 rounded-lg">
<div class="font-medium">Ana Silva</div>
<div class="text-sm text-neutral-400">ana@email.com</div>
<div class="text-sm">Status: Ativo</div>
</div>
</div>
<!-- Tabela so em desktop -->
<table class="hidden md:table w-full">
...
</table>
๐ก Dica Pratica
Adicione uma sombra de fade nas bordas da tabela com scroll para indicar que ha mais conteudo. Use background: linear-gradient(90deg, transparent, black) posicionado com pointer-events: none.
โฐ Navegacao Responsiva
Sidebar, hamburguer menu e navegacao mobile
Em dashboards, a sidebar normalmente desaparece em mobile e e substituida por um menu hamburguer. Ao clicar no icone, a sidebar desliza da esquerda como um drawer. O header geralmente permanece visivel com logo e acoes essenciais.
A transicao entre os modos deve ser suave. Use transforms e transitions para animar a entrada/saida do drawer. Um overlay escuro atras do drawer ajuda o usuario a entender que pode clicar fora para fechar.
Box de Detalhamento
Componentes do Menu Mobile
- 1. Hamburguer: Botao com 3 linhas (โฐ)
- 2. Drawer: Sidebar que desliza da esquerda
- 3. Overlay: Fundo escuro clicavel
- 4. Close button: X dentro do drawer
Comportamentos
- โธ ESC fecha o menu
- โธ Clicar no overlay fecha
- โธ Scroll do body bloqueado quando aberto
- โธ Focus trap dentro do drawer
<!-- Header com hamburguer -->
<header class="sticky top-0 z-50 bg-dark-900 border-b">
<div class="flex items-center justify-between h-14 px-4">
<!-- Hamburguer (so mobile) -->
<button
class="md:hidden p-2 hover:bg-dark-700 rounded"
onclick="toggleMenu()"
>
โฐ
</button>
<!-- Logo -->
<span class="font-bold">Dashboard</span>
<!-- Acoes -->
<div>...</div>
</div>
</header>
<!-- Overlay -->
<div
id="overlay"
class="fixed inset-0 bg-black/50 z-40 hidden md:hidden"
onclick="toggleMenu()"
></div>
<!-- Drawer/Sidebar -->
<aside
id="sidebar"
class="fixed top-0 left-0 h-full w-64 bg-dark-800 z-50
transform -translate-x-full transition-transform
md:translate-x-0 md:static"
>
<!-- Close button (so mobile) -->
<button class="md:hidden absolute top-4 right-4" onclick="toggleMenu()">
โ
</button>
<nav class="p-4 space-y-2">
<a href="#">Dashboard</a>
<a href="#">Pedidos</a>
<a href="#">Clientes</a>
</nav>
</aside>
<script>
function toggleMenu() {
const sidebar = document.getElementById('sidebar');
const overlay = document.getElementById('overlay');
sidebar.classList.toggle('-translate-x-full');
overlay.classList.toggle('hidden');
document.body.classList.toggle('overflow-hidden');
}
</script>
Box de Dados
๐ UI Touch-Friendly
Projetando para dedos, nao apenas cursores
Interfaces touch precisam de alvos de toque maiores (minimo 44x44px segundo Apple, 48x48dp segundo Google). Dedos sao menos precisos que cursores. Espacamento entre elementos clicaveis deve evitar toques acidentais.
Alem do tamanho, considere gestos touch: swipe para excluir, pull-to-refresh, pinch-to-zoom. Em dashboards mobile, swipe lateral pode navegar entre abas ou cards. Feedback visual (ripple, highlight) confirma o toque.
Box de Detalhamento
Tamanhos Minimos
Gestos Comuns
- โโ Swipe: Excluir, arquivar, navegar
- โ Pull-down: Atualizar dados
- โท Pinch: Zoom em graficos
- โ Long press: Menu contextual
<!-- Botao touch-friendly -->
<button class="
min-h-[44px] // Altura minima Apple
min-w-[44px] // Largura minima
px-6 py-3 // Padding generoso
text-base // Texto legivel
// Feedback visual
active:scale-95 // Leve encolhimento ao tocar
active:bg-blue-700
">
Salvar
</button>
<!-- Espacamento entre botoes -->
<div class="flex gap-3"> <!-- gap-3 = 12px -->
<button>Cancelar</button>
<button>Confirmar</button>
</div>
<!-- Lista com itens tocaveis -->
<ul class="divide-y divide-dark-600">
<li class="
py-4 px-4 // Padding generoso
min-h-[56px] // Altura minima
flex items-center
active:bg-dark-700 // Feedback
">
Item da lista
</li>
</ul>
<!-- CSS para desabilitar zoom no double-tap -->
<style>
* {
touch-action: manipulation;
}
</style>
โ Fazer
- โข Botoes de pelo menos 44x44px
- โข Espaco entre elementos clicaveis
- โข Feedback visual ao tocar (active states)
- โข Acoes destrutivas com confirmacao
โ Evitar
- โข Links muito pequenos ou proximos
- โข Hover-only interactions em mobile
- โข Gestos complexos sem alternativa
- โข Formularios com teclado cobrindo inputs
๐งช Testando Responsividade
Ferramentas e tecnicas para garantir que funciona em todos dispositivos
DevTools do navegador e sua principal ferramenta. Chrome, Firefox e Safari tem modos de emulacao responsiva. Mas emuladores nao substituem teste em dispositivos reais - touch, performance e renderizacao podem variar.
Estabeleca um conjunto de dispositivos de teste: um iPhone (Safari iOS), um Android mid-range (Chrome), e um tablet. Teste em conexoes lentas (3G) para verificar performance. BrowserStack e LambdaTest oferecem dispositivos virtuais na nuvem.
Box de Detalhamento
Ferramentas de Teste
- โข Chrome DevTools: Cmd+Shift+M para modo responsivo
- โข Responsively: App que mostra multiplos devices
- โข BrowserStack: Dispositivos reais na nuvem
- โข Lighthouse: Audit de mobile-friendliness
Larguras para Testar
- 320px: iPhone SE - menor comum
- 375px: iPhone 12/13/14
- 768px: iPad portrait
- 1024px: iPad landscape / laptops
- 1440px: Desktop padrao
Box de Dados
Checklist de Teste Responsivo
๐ก Dica Pratica
No Chrome DevTools, ative "Show media queries" na barra de ferramentas responsiva. Isso mostra barras coloridas indicando onde cada breakpoint comeca, facilitando identificar problemas de transicao.