diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 529a226..26c46aa 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -117,6 +117,115 @@ sshpass -p 'Master9354' ssh -o StrictHostKeyChecking=no root@213.165.93.60 "mysq ❌ NUNCA usar `ssh root@213.165.93.60` sem sshpass (vai travar esperando senha) +## 🎨 Padrão Visual de Modais + +**TODOS os modais de formulário devem seguir este padrão elegante:** + +### Estrutura Base +```jsx +
+
+
+ + {/* Header sem borda */} +
+
+
+ + Título +
+

Subtítulo

+
+ +
+ + {/* Body com scroll */} +
+ {/* Preview Card - SEMPRE no topo */} +
+ {/* Preview visual do item sendo criado/editado */} +
+ + {/* Campos em cards com background #0f172a */} + {/* Labels com ícones coloridos */} + {/* Badges "Opcional" quando necessário */} +
+ + {/* Footer sem borda */} +
+ + +
+
+
+
+``` + +### Cores do Sistema +- **Background modal**: `#1e293b` +- **Background campos/cards**: `#0f172a` +- **Texto principal**: `text-white` +- **Texto secundário**: `text-slate-400` +- **Texto desabilitado**: `text-slate-500` + +### Labels com Ícones +```jsx + +``` + +### Badge Opcional +```jsx + + {t('common.optional')} + +``` + +### Seleção Visual com Cards +Para seleções (categorias, ícones), usar cards clicáveis: +```jsx +
handleSelect(item)} + className="p-2 rounded text-center" + style={{ + background: isSelected ? 'rgba(59, 130, 246, 0.15)' : '#0f172a', + cursor: 'pointer', + border: isSelected ? '2px solid #3b82f6' : '2px solid transparent' + }} +> + + {label} +
+``` + +### Seção de Keywords/Tags +```jsx +
+
+ + +
+
+ {/* Tags com cor do item */} +
+
+``` + +### Switch de Status +```jsx +
+ + +
+``` + ## Documentação Consulte `.DIRETRIZES_DESENVOLVIMENTO_v5` para regras completas. diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json index 211a7e2..36b5ac3 100644 --- a/frontend/src/i18n/locales/en.json +++ b/frontend/src/i18n/locales/en.json @@ -412,8 +412,13 @@ "budget": "Budget", "keywords": "Keywords", "addKeyword": "Add Keyword", - "keywordPlaceholder": "Type a keyword", - "keywordHelp": "Keywords help automatically assign transactions", + "keywordPlaceholder": "Type and press Enter...", + "keywordHelp": "E.g.: \"UBER\", \"iFood\" - Transactions with these words are auto-assigned", + "noKeywords": "No keywords. Transactions will be assigned manually.", + "namePlaceholder": "E.g.: Project Alpha, Marketing Dept...", + "descPlaceholder": "Describe the purpose of this cost center...", + "visualSettings": "Appearance", + "autoAssignLabel": "Auto-assign", "createSuccess": "Cost center created successfully", "updateSuccess": "Cost center updated successfully", "deleteSuccess": "Cost center deleted successfully", diff --git a/frontend/src/i18n/locales/es.json b/frontend/src/i18n/locales/es.json index 5cabdeb..c7ecde2 100644 --- a/frontend/src/i18n/locales/es.json +++ b/frontend/src/i18n/locales/es.json @@ -415,8 +415,13 @@ "budget": "Presupuesto", "keywords": "Palabras Clave", "addKeyword": "Agregar Palabra Clave", - "keywordPlaceholder": "Escribe una palabra clave", - "keywordHelp": "Las palabras clave ayudan a asignar transacciones automáticamente", + "keywordPlaceholder": "Escribe y presiona Enter...", + "keywordHelp": "Ej: \"UBER\", \"iFood\" - Transacciones con estas palabras se asignan automáticamente", + "noKeywords": "Sin palabras clave. Las transacciones se asignarán manualmente.", + "namePlaceholder": "Ej: Proyecto Alpha, Dpto. Marketing...", + "descPlaceholder": "Describe el propósito de este centro de costo...", + "visualSettings": "Apariencia", + "autoAssignLabel": "Auto-asignación", "createSuccess": "Centro de costo creado correctamente", "updateSuccess": "Centro de costo actualizado correctamente", "deleteSuccess": "Centro de costo eliminado correctamente", diff --git a/frontend/src/i18n/locales/pt-BR.json b/frontend/src/i18n/locales/pt-BR.json index ec8cb66..30f4a04 100644 --- a/frontend/src/i18n/locales/pt-BR.json +++ b/frontend/src/i18n/locales/pt-BR.json @@ -417,8 +417,13 @@ "budget": "Orçamento", "keywords": "Palavras-chave", "addKeyword": "Adicionar Palavra-chave", - "keywordPlaceholder": "Digite uma palavra-chave", - "keywordHelp": "Palavras-chave ajudam a atribuir transações automaticamente", + "keywordPlaceholder": "Digite e pressione Enter...", + "keywordHelp": "Ex: \"UBER\", \"iFood\" - Transações com essas palavras são atribuídas automaticamente", + "noKeywords": "Sem palavras-chave. Transações serão atribuídas manualmente.", + "namePlaceholder": "Ex: Projeto Alpha, Dpto. Marketing...", + "descPlaceholder": "Descreva o propósito deste centro de custo...", + "visualSettings": "Aparência", + "autoAssignLabel": "Auto-atribuição", "createSuccess": "Centro de custo criado com sucesso", "updateSuccess": "Centro de custo atualizado com sucesso", "deleteSuccess": "Centro de custo excluído com sucesso", diff --git a/frontend/src/pages/CostCenters.jsx b/frontend/src/pages/CostCenters.jsx index 8dfa8d1..034ec82 100644 --- a/frontend/src/pages/CostCenters.jsx +++ b/frontend/src/pages/CostCenters.jsx @@ -357,170 +357,242 @@ const CostCenters = () => { )} - {/* Modal de Criar/Editar */} + {/* Modal de Criar/Editar - Design Elegante */} {showModal && ( -
-
-
-
-
- - {selectedItem ? t('costCenters.editCostCenter') : t('costCenters.newCostCenter')} -
+
+
+
+ {/* Header elegante */} +
+
+
+ + {selectedItem ? t('costCenters.editCostCenter') : t('costCenters.newCostCenter')} +
+

+ {t('costCenters.title')} +

+
+
-
-
- {/* Nome */} +
+ + {/* Preview Card */} +
+
+
+ +
+
+
{formData.name || t('costCenters.newCostCenter')}
+ + {formData.code ? `${t('costCenters.code')}: ${formData.code}` : t('common.description')} + +
+
+ {formData.is_active ? ( + {t('common.active')} + ) : ( + {t('common.inactive')} + )} +
+
+
+ + {/* Nome e Código - Linha principal */} +
- +
- - {/* Código */}
- +
+
- {/* Cor */} -
- - -
- - {/* Ícone */} -
- - setFormData(prev => ({ ...prev, icon }))} - type="costCenter" - /> -
- - {/* Status */} -
- -
- - + {/* Visual - Cor e Ícone */} +
+ +
+
+
+ + +
+
+
+
+ + setFormData(prev => ({ ...prev, icon }))} + type="costCenter" + /> +
+
- {/* Descrição */} -
- - -
+ {/* Descrição */} +
+ + +
- {/* Palavras-chave */} -
- + {/* Palavras-chave - Seção destacada */} +
+ +
setNewKeyword(e.target.value)} onKeyPress={handleKeywordKeyPress} - placeholder="Digite uma palavra-chave e pressione Enter..." + placeholder={t('costCenters.keywordPlaceholder') || 'Escribe y presiona Enter...'} />
{formData.keywords.map((keyword, index) => ( {keyword} ))} {formData.keywords.length === 0 && ( - {t('common.noData')} + + {t('costCenters.noKeywords') || 'Sin palabras clave. Las transacciones se asignarán manualmente.'} )}
- - Ex: "UBER", "iFood", "Supermercado XYZ" - Quando estas palavras aparecerem na - descrição de uma transação, este centro de custo será sugerido automaticamente. -
+ + + {t('costCenters.keywordHelp')} + +
+ + {/* Status */} +
+ +
-
- -