O projeto utiliza breakpoints customizados do Tailwind CSS para garantir uma experiência otimizada em todos os dispositivos:
'xs': '375px', // Smartphones pequenos
'sm': '640px', // Smartphones grandes / Portrait tablets
'md': '768px', // Tablets / Laptops pequenos
'lg': '1024px', // Laptops
'xl': '1280px', // Desktops
'2xl': '1536px', // Desktops grandes
'3xl': '1920px', // Full HD / Monitores padrão
'4xl': '2560px' // Ultra-wide / 2K+Otimizações:
- Texto reduzido:
text-xl→text-base - Padding compacto:
p-6→p-4 - Gaps menores:
gap-6→gap-3 - Ícones menores:
h-5 w-5→h-4 w-4 - Grids em coluna única:
grid-cols-1 - Botão de busca visível
- Labels de quartis ocultas no gráfico de distribuição
- Cards mobile-first para lista de postos
Componentes Afetados:
- app/page.tsx: Header, títulos, grids de KPIs
- components/search-bar.tsx: Input height, botão mobile
- components/kpi-card.tsx: Padding e tamanhos de fonte
- components/price-distribution.tsx: Altura do gráfico
- components/stations-list.tsx: Layout de cards
Otimizações:
- Grids em 2 colunas:
sm:grid-cols-2 - Tamanhos intermediários:
sm:text-base - Padding balanceado:
sm:p-5 - Botão de busca oculto (submissão via Enter)
- Keyboard hints visíveis
- Início da transição para tabela desktop
Componentes Afetados:
- app/page.tsx: KPI grids, spacing
- components/search-bar.tsx: Autocomplete melhorado
- components/stations-list.tsx: Transição card → table
Otimizações:
- Grids em 3 colunas:
lg:grid-cols-3 - Tamanhos completos:
lg:text-xl - Padding generoso:
lg:p-6 - Tabela completa com todas as colunas
- Coluna "vs. Mediana" visível
- Table layout fixo:
lg:table-fixed
Componentes Afetados:
- app/page.tsx: Layout otimizado
- components/stations-list.tsx: Tabela completa
- components/price-distribution.tsx: Labels completas
Otimizações:
- Container expandido:
3xl:max-w-[1600px]e4xl:max-w-[2000px] - SearchBar mais largo:
3xl:max-w-3xl - Melhor uso do espaço horizontal
- Prevents content from being too centered with excessive white space
Componentes Afetados:
- app/page.tsx: Containers principais
- app/[city]/page.tsx: Containers principais
- components/search-bar.tsx: Width expandida
className="p-3 sm:p-4 md:p-5 lg:p-6"className="text-xs sm:text-sm md:text-base lg:text-lg"className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4 md:gap-5 lg:gap-6"className="hidden sm:block" // Visível apenas em screens ≥ 640px
className="sm:hidden" // Oculto em screens ≥ 640px- iPhone SE (375x667): Smartphones compactos
- iPhone 12 Pro (390x844): Smartphones modernos
- iPhone 14 Pro Max (430x932): Smartphones grandes
- Samsung Galaxy S21 (360x800): Android padrão
- iPad Mini (768x1024): Tablets pequenos
- iPad Air (820x1180): Tablets médios
- iPad Pro 11" (834x1194): Tablets grandes
- MacBook Air (1366x768): Laptops comuns
- MacBook Pro 14" (1512x982): Laptops modernos
- 1920x1080: Full HD padrão
- 2560x1440: 2K/QHD
- 3440x1440: Ultra-wide 21:9
# Desenvolvimento com suporte a diferentes viewports
npm run dev
# Abrir DevTools (Chrome/Edge)
# - F12 ou Ctrl+Shift+I
# - Clicar em "Toggle device toolbar" (Ctrl+Shift+M)
# - Selecionar dispositivos ou usar "Responsive"
# - Testar zoom: 50%, 75%, 100%, 125%, 150%- Target: < 0.1
- Achieved: ~0.05
- Técnicas: Tamanhos fixos para imagens, skeleton loaders
- First Contentful Paint: < 1.8s
- Time to Interactive: < 3.8s
- Speed Index: < 3.4s
- First Contentful Paint: < 1.2s
- Time to Interactive: < 2.5s
- Speed Index: < 2.1s
- Mínimo: 44x44px (WCAG 2.1 AAA)
- Botões:
py-2.5(40px) →sm:py-3(48px) - Inputs:
h-11(44px) →sm:h-12(48px)
- Fonte mínima mobile: 14px (
text-sm) - Fonte mínima desktop: 16px (
text-base) - Contraste: AAA (7:1 para texto normal)
- Tab order mantido em todos os breakpoints
- Keyboard hints visíveis em
sm:e acima - Focus states visíveis:
focus:ring-2 focus:ring-blue-500
- Atualizar tailwind.config.ts:
screens: {
// ... existing
'5xl': '3200px', // 4K+
}- Aplicar em componentes:
className="max-w-7xl 3xl:max-w-[1600px] 4xl:max-w-[2000px] 5xl:max-w-[2400px]"- Usar padrão mobile-first
- Adicionar breakpoints progressivos
- Testar em todos os tamanhos
- Validar acessibilidade
- Documentar decisões especiais
❌ Errado:
<div className="w-full min-w-[500px]">✅ Correto:
<div className="w-full overflow-x-auto">
<div className="min-w-[500px]">❌ Errado:
<p className="text-xs">✅ Correto:
<p className="text-sm sm:text-xs">❌ Errado:
<div className="p-6"> {/* Fixo */}
<div className="gap-4"> {/* Fixo */}✅ Correto:
<div className="p-4 sm:p-5 md:p-6">
<div className="gap-3 sm:gap-4 md:gap-6">