9.8 KiB
9.8 KiB
Plano de Responsividade Mobile + Reutilizacao de Codigo
Breakpoints alvo
| Nome | Largura | Dispositivo |
|---|---|---|
| xs | < 640px | iPhone SE, pequenos |
| sm | 640px+ | Smartphones grandes |
| md | 768px+ | Tablets retrato |
| lg | 1024px+ | Tablets paisagem / laptops |
Fase 0: Extrair componentes base (reutilizacao)
Antes de aplicar responsividade, consolidar codigo duplicado.
0.1 Componentes novos a criar
| Componente | Substitui | Arquivos afetados |
|---|---|---|
Modal |
11 copias do overlay fixed inset-0 bg-black/50 |
11 arquivos |
TableWrapper |
9 wrappers identicos de tabela admin | 9 arquivos |
MaterialsList |
Listagem de materiais nos 3 ClassDetail | 3 arquivos |
ClassHistoryList |
3 versoes (teacher/student/guardian) | 3 arquivos |
PaymentForm unificado |
2 PaymentForms 98% identicos | 2 arquivos |
FormField |
Padrao label+input+helper repetido em 4 forms | 4 arquivos |
Spinner |
SVG de loading copiado em 2+ arquivos | 2+ arquivos |
0.2 Componentes existentes nao utilizados
| Componente existente | Redefinido inline em | Acao |
|---|---|---|
Card (dashboard/components/Card.jsx) |
20 ocorrencias em 10 arquivos | Importar em vez de inline |
Stat (dashboard/components/Stat.jsx) |
Redefinido localmente em 2 arquivos | Importar |
Row (dashboard/components/Row.jsx) |
Redefinido em StudentClassDetail |
Importar |
Button (shared/Button.jsx) |
Redefinido em StudentClassDetail |
Importar |
DashboardLayout |
Existe mas zero paginas usam | Adotar ou remover |
dateUtils.js |
formatDateBR redefinido em 12 arquivos (22 instancias) |
Importar |
0.3 Funcoes utilitarias a centralizar
| Funcao | Onde centralizar | Redefinida em |
|---|---|---|
formatDateBR |
@/app/lib/utils/dateUtils.js |
12 arquivos |
formatTime |
@/app/lib/utils/dateUtils.js |
2 ExamResults |
normalizeStatus |
@/app/lib/utils/statusPatterns.js |
5 arquivos |
Fase 1: Layout responsivo global
1.1 Admin Sidebar -- Drawer off-canvas
Arquivos: SideBarNav.jsx:7, admin/layout.jsx:22-28
Problema: Sidebar fixa w-64 (256px) visivel em todas as telas. Em celulares de 375px, sobram ~119px para conteudo.
Solucao:
- Criar
MobileSidebarToggle(hamburger button) visivel apenas emmd:hidden - Sidebar:
hidden md:flex+ state para abrir/fechar no mobile com overlay - Usar
@headlessui/react(ja no projeto) para o Dialog/Drawer - Drawer aberto: largura
w-72+ overlay escuro - Animação de slide-in/slide-out
1.2 Page container padronizado
Problema: 14+ paginas com container max-w-6xl mx-auto p-6 hardcoded de formas inconsistentes.
Solucao: Padronizar usando MainSection ou DashboardLayout com padding responsivo:
px-4 sm:px-6 lg:px-8 py-4 sm:py-6
| Pagina | Container atual | Correcao |
|---|---|---|
student/StudentClassDetail |
max-w-6xl p-6 (sem mx-auto) |
Adicionar mx-auto |
guardian/GuardianClassDetail |
w-full p-6 |
max-w-6xl mx-auto p-4 sm:p-6 |
guardian/GuardianClassHistoryList |
w-full sem padding |
Adicionar px-4 sm:px-6 |
| Todas as outras | Variacoes de max-w-6xl mx-auto p-6 |
Padronizar via MainSection |
1.3 PageHeader -- actions com wrap
Arquivo: shared/PageHeader.jsx:29
Correcao: Adicionar flex-wrap no div de actions. Resolve ~9 paginas de uma vez.
Fase 2: Componentes responsivos (1 correcao aplica-se a N paginas)
2.1 Modal (novo componente)
max-w-[95vw] sm:max-w-2xl md:max-w-4xl
- padding responsivo
p-4 sm:p-6
Afeta: 11 modais
2.2 TableWrapper (novo componente)
overflow-x-autopor padrao- Borda e estilo consistentes
Afeta: 9 tabelas admin
2.3 MainSection -- padding responsivo
p-4 sm:p-6
Afeta: todas as paginas que usam MainSection
Fase 3: Ajustes por componente
3.1 Grids sem breakpoint responsivo
| Arquivo | Linha | Atual | Correcao |
|---|---|---|---|
teacher/ExamResults.jsx |
140 | grid-cols-3 |
grid-cols-1 sm:grid-cols-3 |
teacher/ExamResults.jsx |
251 | grid-cols-2 |
grid-cols-1 sm:grid-cols-2 |
exam-templates/TemplateForm.jsx |
485 | grid-cols-2 |
grid-cols-1 sm:grid-cols-2 |
exam-templates/AssignmentForm.jsx |
485 | grid-cols-2 |
grid-cols-1 sm:grid-cols-2 |
3.2 Tabela com overflow-hidden
| Arquivo | Linha | Atual | Correcao |
|---|---|---|---|
teacher/ClassDetail.jsx |
304 | overflow-hidden |
overflow-x-auto |
3.3 Flex layouts que transbordam
| Arquivo | Linha | Correcao |
|---|---|---|
student/TakeExam.jsx |
211 | flex-wrap + gap-2 |
dashboard/student/page.jsx |
29 | flex-wrap nos botoes |
teacher/ExamResults.jsx |
169 | flex-wrap nos metadados |
student/ExamResults.jsx |
269 | flex-wrap gap-4 no resumo |
lessons/LessonForm.jsx |
372-376 | flex-col sm:flex-row |
teacher/AssignmentList.jsx |
127 | flex-wrap gap-2 |
exam-templates/TemplateList.jsx |
153 | flex-wrap nos botoes |
student/AvailableExams.jsx |
187, 231 | flex-col sm:flex-row |
3.4 Texto longo sem quebra
| Arquivo | Linha | Correcao |
|---|---|---|
guardian/GuardianClassDetail.jsx |
40 | break-words |
teacher/class/[id]/page.jsx |
212 | Truncar no mobile |
3.5 Tabelas com muitas colunas -- ocultar no mobile
| Arquivo | Colunas | Correcao |
|---|---|---|
teacher/ExamStatistics.jsx |
7 | hidden sm:table-cell nas colunas menos importantes |
guardian/payments/page.jsx |
6 | Ocultar "Comprovante" no mobile |
3.6 Botoes que podem empilhar
| Arquivo | Linha | Correcao |
|---|---|---|
PaymentForm.jsx |
193 | flex-col sm:flex-row |
RegisterForm.jsx |
253 | flex-col sm:flex-row |
Header mobile -- ja parcialmente implementado
O Header.jsx ja tem navegacao mobile (md:hidden com scroll horizontal). Pontos de melhoria:
- Chips de navegacao mobile (linhas 147-162) poderiam usar icones maiores e mais touch-friendly
- Considerar colapsar os chips em menu hamburger quando ha mais de 4 items (admin tem 6 links)
Resumo de prioridade de execucao
- Fase 0 -- Extrair componentes base (maior esforco, maior ganho em manutenibilidade)
- Fase 1 -- Layout global responsivo (sidebar + containers + page header)
- Fase 2 -- Componentes responsivos reutilizaveis (Modal + TableWrapper)
- Fase 3 -- Ajustes pontuais por componente (grids, flex, tabelas)
Metricas estimadas
| Metricica | Valor |
|---|---|
| Arquivos alterados | ~18 |
| Linhas removidas (duplicacao) | ~800-1000 |
| Componentes novos reutilizaveis | 7 |
| Componentes importados (ja existiam) | 6 |
| Correcoes de responsividade | ~26 |
| Modais afetados por 1 componente | 11 |
| Tabelas afetadas por 1 componente | 9 |
Componentes que NAO precisam de correcao de responsividade
Ja estao corretos:
page.jsx(landing page) -- bem estruturado com breakpointsLoginForm.jsx-- formulario centralizado simplesClassCard.jsx-- card layout responsivoClassCardsComponent.jsx--grid-cols-1 sm:grid-cols-2WardClassCardComponent.jsx--grid-cols-1 sm:grid-cols-2 lg:grid-cols-3DashboardCard.jsx-- card layoutAdminDashboard.jsx--grid-cols-1 sm:grid-cols-2RoleDispatcher.jsx--grid-cols-1 sm:grid-cols-2ProfileForm.jsx--grid-cols-1 md:grid-cols-2PasswordUpdateForm.jsx--grid-cols-1 md:grid-cols-2AffiliateProductsSection.jsx--grid-cols-1 sm:grid-cols-2 lg:grid-cols-3ToggleTheme.jsx-- botao de tamanho fixoUserMenu.jsx-- esconde nome em telas pequenas comhidden sm:inline