# Padrões de Estilo - Course Platform Este documento define os padrões de estilo unificados para todo o sistema, garantindo consistência visual e facilidade de manutenção. ## Índice - [Princípios Fundamentais](#princípios-fundamentais) - [Cores e Tema](#cores-e-tema) - [Tipografia](#tipografia) - [Espaçamento](#espaçamento) - [Badges e Labels](#badges-e-labels) - [Componentes](#componentes) - [Transições e Animações](#transições-e-animações) - [Regras CSS Globais](#regras-css-globais) --- ## Princípios Fundamentais 1. **Usar CSS Variables** para cores, backgrounds e bordas (definidas em `:root` e `.dark`) 2. **Padronizar em `neutral-*`** em vez de `gray-*` para consistência 3. **Usar `blue-600`** como cor primária para botões de ação principal 4. **Manter border-radius de 8px** (`rounded-lg` ou `rounded-xl`) 5. **Usar sombras sutis**: `shadow-sm` padrão, `shadow-md` no hover 6. **Evitar regras CSS globais com `!important`** que sobrescrevem classes Tailwind --- ## Cores e Tema ### CSS Variables (Definidas em `globals.css`) ```css /* Tema Claro (:root) */ --background: #ffffff; --foreground: #09090b; --card: #ffffff; --card-foreground: #09090b; --primary: #18181b; --primary-foreground: #fafafa; --secondary: #f4f4f5; --secondary-foreground: #18181b; --muted: #f4f4f5; --muted-foreground: #71717a; --accent: #f4f4f5; --accent-foreground: #18181b; --destructive: #ef4444; --destructive-foreground: #fafafa; --border: #e4e4e7; --input: #e4e4e7; --ring: #18181b; --radius: 0.5rem; /* Tema Escuro (.dark) */ --background: #09090b; --foreground: #fafafa; --card: #09090b; --card-foreground: #fafafa; --primary: #fafafa; --primary-foreground: #18181b; --secondary: #27272a; --secondary-foreground: #fafafa; --muted: #27272a; --muted-foreground: #a1a1aa; --accent: #27272a; --accent-foreground: #fafafa; --destructive: #7f1d1d; --destructive-foreground: #fafafa; --border: #27272a; --input: #27272a; --ring: #d4d4d8; ``` ### Cores Semânticas (Tailwind) | Propósito | Light Mode | Dark Mode | |-----------|------------|-----------| | Primary (Ação principal) | `blue-600` | `blue-500` | | Primary Hover | `blue-700` | `blue-600` | | Success | `green-600` | `green-500` | | Success Hover | `green-700` | `green-600` | | Warning | `yellow-500` | `yellow-400` | | Warning Hover | `yellow-600` | `yellow-500` | | Error/Destructive | `red-600` | `red-500` | | Error Hover | `red-700` | `red-600` | | Info | `blue-600` | `blue-500` | ### Cores Neutras (Padrão) **Use sempre `neutral-*` em vez de `gray-*` para consistência:** | Escala | Light Mode | Dark Mode | |--------|------------|-----------| | 50 | `#fafafa` | `#18181b` | | 100 | `#f5f5f5` | `#27272a` | | 200 | `#e5e5e5` | `#3f3f46` | | 300 | `#d4d4d4` | `#52525b` | | 400 | `#a3a3a3` | `#71717a` | | 500 | `#737373` | `#a1a1aa` | | 600 | `#525252` | `#d4d4d8` | | 700 | `#404040` | `#e4e4e7` | | 800 | `#262626` | `#f4f4f5` | | 900 | `#171717` | `#fafafa` | | 950 | `#0a0a0a` | `#fafafa` | --- ## Tipografia ### Fonte - **Fonte Principal**: Geist Sans (Google Fonts) - **Fonte Monospace**: Geist Mono (Google Fonts) ### Tamanhos e Pesos | Elemento | Classe Tailwind | Uso | |----------|-----------------|-----| | Título Principal | `text-2xl md:text-3xl font-semibold` | Títulos de página | | Título de Seção | `text-lg font-semibold` | Títulos de seção | | Subtítulo | `text-base font-medium` | Subtítulos | | Texto Normal | `text-sm` | Texto de conteúdo | | Texto Secundário | `text-sm text-muted-foreground` | Texto de apoio | | Label | `text-sm font-medium` | Labels de formulário | | Caption/Small | `text-xs` | Textos pequenos | ### Exemplos ```jsx // Título de Página

Título da Página

// Título de Seção

Título da Seção

// Subtítulo

Descrição ou subtítulo

// Label ``` --- ## Espaçamento ### Padrões de Padding | Elemento | Padding/Margin | |----------|----------------| | Card padding | `p-5` | | Card padding (compacto) | `p-4` | | Button padding | `px-4 py-2` | | Input padding | `px-3 py-2` | | Table cell padding | `px-6 py-4` | | Section gap | `gap-3` ou `gap-4` | | Vertical spacing entre elementos | `space-y-4` | | Horizontal spacing entre elementos | `space-x-3` | ### Exemplos ```jsx // Card
{/* conteúdo */}
// Formulário com espaçamento vertical
{/* campos */}
// Botões com espaçamento horizontal
``` --- ## Badges e Labels Badges são pequenos labels coloridos usados para indicar status, categorias ou outros metadados. Devem ser usados consistentemente em toda a aplicação. ### Estrutura Base ```jsx Label Text ``` ### Padrões de Cores #### Success/Green (Disponível, Pago, Ativo, Presente) **Tema Claro:** `bg-emerald-100 text-emerald-700 border-emerald-200` **Tema Escuro:** `dark:bg-emerald-900/20 dark:text-emerald-300 dark:border-emerald-800` ```jsx Disponível ``` **Casos de Uso:** - "Disponível" (Available) - "Pago" (Paid) - "Ativa" (Active) - "Presente" (Present) - Status "Verified" --- #### Info/Blue (Em breve, Aguardando Verificação, Justificado) **Tema Claro:** `bg-blue-100 text-blue-700 border-blue-200` **Tema Escuro:** `dark:bg-blue-900/20 dark:text-blue-300 dark:border-blue-800` ```jsx Em breve ``` **Casos de Uso:** - "Em breve" (Upcoming) - "Aguardando Verificação" (Pending Verification) - "Justificado" (Excused) - Templates "Public" --- #### Danger/Red (Encerrada, Rejeitado, Ausente) **Tema Claro:** `bg-red-100 text-red-700 border-red-200` **Tema Escuro:** `dark:bg-red-900/20 dark:text-red-300 dark:border-red-800` ```jsx Encerrada ``` **Casos de Uso:** - "Encerrada" (Expired) - "Rejeitado" (Rejected) - "Ausente" (Absent) - Status "Rejected" --- #### Warning/Amber (Aguardando Pagamento, Atrasado, Arquivada) **Tema Claro:** `bg-amber-100 text-amber-700 border-amber-200` **Tema Escuro:** `dark:bg-amber-900/20 dark:text-amber-300 dark:border-amber-800` ```jsx Aguardando Pagamento ``` **Casos de Uso:** - "Aguardando Pagamento" (Pending Payment) - "Atrasado" (Late) - "Arquivada" (Archived) - Status "Pending" --- #### Warning/Yellow (Obrigações) **Tema Claro:** `bg-yellow-100 text-yellow-800 border-yellow-300` **Tema Escuro:** `dark:bg-yellow-900/50 dark:text-yellow-200 dark:border-yellow-700` ```jsx Obrigação ``` **Casos de Uso:** - Obrigações de pagamento - "Obrigação" (Obligation) --- #### Purple (Leitura) **Tema Claro:** `bg-purple-100 text-purple-700 border-purple-200` **Tema Escuro:** `dark:bg-purple-900/20 dark:text-purple-300 dark:border-purple-800` ```jsx Leitura ``` **Casos de Uso:** - "Leitura" (Reading) - Categoria "Indigo" --- #### Indigo (Trabalhos) **Tema Claro:** `bg-indigo-100 text-indigo-700 border-indigo-200` **Tema Escuro:** `dark:bg-indigo-900/20 dark:text-indigo-300 dark:border-indigo-800` ```jsx Trabalhos ``` **Casos de Uso:** - "Trabalhos" (Homework) - Itens relacionados a assignments --- #### Neutral/Gray (Outros, Padrão) **Tema Claro:** `bg-gray-100 text-gray-700 border-gray-200` **Tema Escuro:** `dark:bg-gray-800 dark:text-gray-300 dark:border-gray-700` ```jsx Outros ``` **Casos de Uso:** - "Outros" (Other) - Categorias padrão/desconhecidas - Status neutro ### Badges por Categoria #### Categorias de Arquivos | Categoria | Cor | |-----------|-----| | Slides | Blue | | Exercícios | Green | | Leitura | Purple | | Vídeos | Red | | Áudio | Yellow | | Trabalhos | Indigo | | Outros | Gray | #### Status de Presença | Status | Cor | |--------|-----| | Presente | Green | | Ausente | Red | | Atrasado | Amber | | Justificado | Blue | #### Status de Pagamento | Status | Cor | |--------|-----| | Pago | Green | | Aguardando Verificação | Blue | | Rejeitado | Red | | Aguardando Pagamento | Amber | | Obrigação | Yellow | #### Status de Provas | Status | Cor | |--------|-----| | Disponível | Green | | Em breve | Blue | | Encerrada | Red | #### Status de Turma | Status | Cor | |--------|-----| | Ativa | Green | | Arquivada | Amber | ### Exemplo de Implementação ```jsx const categoryColors = { 'Slides': 'text-xs px-2 py-1 rounded-full border bg-blue-100 text-blue-700 border-blue-200 dark:bg-blue-900/20 dark:text-blue-300 dark:border-blue-800', 'Exercícios': 'text-xs px-2 py-1 rounded-full border bg-green-100 text-green-700 border-green-200 dark:bg-green-900/20 dark:text-green-300 dark:border-green-800', 'Leitura': 'text-xs px-2 py-1 rounded-full border bg-purple-100 text-purple-700 border-purple-200 dark:bg-purple-900/20 dark:text-purple-300 dark:border-purple-800', 'Vídeos': 'text-xs px-2 py-1 rounded-full border bg-red-100 text-red-700 border-red-200 dark:bg-red-900/20 dark:text-red-300 dark:border-red-800', 'Áudio': 'text-xs px-2 py-1 rounded-full border bg-yellow-100 text-yellow-700 border-yellow-200 dark:bg-yellow-900/20 dark:text-yellow-300 dark:border-yellow-800', 'Trabalhos': 'text-xs px-2 py-1 rounded-full border bg-indigo-100 text-indigo-700 border-indigo-200 dark:bg-indigo-900/20 dark:text-indigo-300 dark:border-indigo-800', 'Outros': 'text-xs px-2 py-1 rounded-full border bg-gray-100 text-gray-700 border-gray-200 dark:bg-gray-800 dark:text-gray-300 dark:border-gray-700' }; {category} ``` ### Notas Importantes 1. **Consistência**: Sempre use a string de classes completa incluindo variantes de tema claro e escuro 2. **Acessibilidade**: As combinações de cores fornecem contraste suficiente para ambos os temas 3. **Opacidade**: O tema escuro usa `/20` de opacidade para a maioria das cores (exceto yellow que usa `/50`) 4. **Borda**: Sempre inclua borda para melhor separação visual 5. **Arredondamento**: Use `rounded-full` para badges em formato de pílula 6. **Tamanho**: Use `text-xs` para badges pequenos, `text-sm` para badges maiores se necessário --- ## Componentes ### Cards **Padrão Unificado:** ```jsx
{/* conteúdo */}
``` **Card com Link:** ```jsx
{/* conteúdo */}
``` ### Botões **Primary (Ação Principal):** ```jsx ``` **Secondary (Ação Secundária):** ```jsx ``` **Destructive (Ação de Exclusão):** ```jsx ``` **Botão com Ícone:** ```jsx ``` ### Inputs **Input de Texto:** ```jsx ``` **Select:** ```jsx
{/* ícone de seta */}
``` **Textarea:** ```jsx