diff --git a/.env.example b/.env.example index 457b056..1ace8df 100644 --- a/.env.example +++ b/.env.example @@ -58,9 +58,5 @@ OPENROUTER_API_KEY= # === Logo.dev (Opcional) === # Logos automáticos de estabelecimentos. Cadastre em https://www.logo.dev -# Ambas as variáveis são lidas em runtime pelo servidor — basta configurá-las -# no host (Coolify, Railway, Docker Compose etc.), sem mexer no CI. -# LOGO_DEV_TOKEN — token público usado pelo servidor para montar a URL da imagem -# LOGO_DEV_SECRET_KEY — chave secreta para a Brand Search API (picker de logo) LOGO_DEV_TOKEN= LOGO_DEV_SECRET_KEY= \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 969eda0..24e5d70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ Esta versão é quase toda sobre organização e polimento. O código interno do - Logo.dev: `NEXT_PUBLIC_LOGO_DEV_TOKEN` renomeado para `LOGO_DEV_TOKEN` (agora lido em runtime server-side apenas) - UI: conceito "Pagador/Pagadores" renomeado para **"Pessoa/Pessoas"** em toda a interface — labels, títulos, toasts, mensagens de erro, cabeçalhos de tabela e exportações. Código, rotas (`/payers`) e schema do banco (`pagadores`) permanecem inalterados; a divergência entre UI e código é intencional - Deps: next 16.2.3 → 16.2.4, better-auth 1.6.2 → 1.6.5, ai 6.0.159 → 6.0.168 e outros patches menores +- Notas/Tarefas: ícone de tarefa concluída em visualização (card e detalhes) simplificado para `RiCheckLine` verde sem caixa; checkbox no modal de edição usa fundo e borda `success` com ícone `success-foreground` (claro no light, escuro no dark) +- Notas/Detalhes: botões do footer reordenados ("Cancelar" à esquerda, "Alterar" primário à direita) ### Removido diff --git a/src/features/accounts/components/account-dialog.tsx b/src/features/accounts/components/account-dialog.tsx index 5b3e267..8e02ac2 100644 --- a/src/features/accounts/components/account-dialog.tsx +++ b/src/features/accounts/components/account-dialog.tsx @@ -227,12 +227,12 @@ export function AccountDialog({ }); }; - const title = mode === "create" ? "Nova conta" : "Editar conta"; + const title = mode === "create" ? "Nova conta" : "Atualizar conta"; const description = mode === "create" ? "Cadastre uma nova conta para organizar seus lançamentos." : "Atualize as informações da conta selecionada."; - const submitLabel = mode === "create" ? "Salvar conta" : "Atualizar conta"; + const submitLabel = mode === "create" ? "Salvar" : "Atualizar"; const handleMainDialogOpenChange = (open: boolean) => { if (!open && logoDialogOpen) { diff --git a/src/features/accounts/components/accounts-page.tsx b/src/features/accounts/components/accounts-page.tsx index 03ac528..50d9329 100644 --- a/src/features/accounts/components/accounts-page.tsx +++ b/src/features/accounts/components/accounts-page.tsx @@ -212,7 +212,7 @@ export function AccountsPage({ onOpenChange={handleRemoveOpenChange} title={removeTitle} description="Ao remover esta conta, todos os dados relacionados a ela serão perdidos." - confirmLabel="Remover conta" + confirmLabel="Remover" pendingLabel="Removendo..." confirmVariant="destructive" onConfirm={handleRemoveConfirm} diff --git a/src/features/budgets/components/budget-dialog.tsx b/src/features/budgets/components/budget-dialog.tsx index 2616434..01eab23 100644 --- a/src/features/budgets/components/budget-dialog.tsx +++ b/src/features/budgets/components/budget-dialog.tsx @@ -161,13 +161,12 @@ export function BudgetDialog({ }); }; - const title = mode === "create" ? "Novo orçamento" : "Editar orçamento"; + const title = mode === "create" ? "Novo orçamento" : "Atualizar orçamento"; const description = mode === "create" ? "Defina um limite de gastos para acompanhar suas despesas." : "Atualize os detalhes do orçamento selecionado."; - const submitLabel = - mode === "create" ? "Salvar orçamento" : "Atualizar orçamento"; + const submitLabel = mode === "create" ? "Salvar" : "Atualizar"; const disabled = categories.length === 0; const parsedAmount = Number.parseFloat(formState.amount); const sliderValue = Number.isFinite(parsedAmount) diff --git a/src/features/budgets/components/budgets-page.tsx b/src/features/budgets/components/budgets-page.tsx index 5c4f572..5a55fa2 100644 --- a/src/features/budgets/components/budgets-page.tsx +++ b/src/features/budgets/components/budgets-page.tsx @@ -165,7 +165,7 @@ export function BudgetsPage({ onOpenChange={handleRemoveOpenChange} title={removeTitle} description="Esta ação remove o limite configurado para a categoria selecionada." - confirmLabel="Remover orçamento" + confirmLabel="Remover" pendingLabel="Removendo..." confirmVariant="destructive" onConfirm={handleRemoveConfirm} @@ -176,7 +176,7 @@ export function BudgetsPage({ onOpenChange={setDuplicateOpen} title="Copiar orçamentos do último mês?" description="Isso copiará os limites definidos no mês anterior para as categorias que ainda não possuem orçamento neste mês." - confirmLabel="Copiar orçamentos" + confirmLabel="Copiar" pendingLabel="Copiando..." onConfirm={handleDuplicateConfirm} /> diff --git a/src/features/cards/components/card-dialog.tsx b/src/features/cards/components/card-dialog.tsx index bc6bcb8..8e18cf8 100644 --- a/src/features/cards/components/card-dialog.tsx +++ b/src/features/cards/components/card-dialog.tsx @@ -194,12 +194,12 @@ export function CardDialog({ }); }; - const title = mode === "create" ? "Novo cartão" : "Editar cartão"; + const title = mode === "create" ? "Novo cartão" : "Atualizar cartão"; const description = mode === "create" ? "Inclua um novo cartão de crédito para acompanhar seus gastos." : "Atualize as informações do cartão selecionado."; - const submitLabel = mode === "create" ? "Salvar cartão" : "Atualizar cartão"; + const submitLabel = mode === "create" ? "Salvar" : "Atualizar"; const handleMainDialogOpenChange = (open: boolean) => { if (!open && logoDialogOpen) { diff --git a/src/features/cards/components/cards-page.tsx b/src/features/cards/components/cards-page.tsx index 406a7ce..cefb648 100644 --- a/src/features/cards/components/cards-page.tsx +++ b/src/features/cards/components/cards-page.tsx @@ -201,7 +201,7 @@ export function CardsPage({ onOpenChange={handleRemoveOpenChange} title={removeTitle} description="Ao remover este cartão, os registros relacionados a ele serão excluídos permanentemente." - confirmLabel="Remover cartão" + confirmLabel="Remover" pendingLabel="Removendo..." confirmVariant="destructive" onConfirm={handleRemoveConfirm} diff --git a/src/features/categories/components/categories-page.tsx b/src/features/categories/components/categories-page.tsx index b580d4f..c16a2ec 100644 --- a/src/features/categories/components/categories-page.tsx +++ b/src/features/categories/components/categories-page.tsx @@ -11,6 +11,7 @@ import { useMemo, useState } from "react"; import { toast } from "sonner"; import { deleteCategoryAction } from "@/features/categories/actions"; import { ConfirmActionDialog } from "@/shared/components/confirm-action-dialog"; +import { CategoryIconBadge } from "@/shared/components/entity-avatar"; import { Button } from "@/shared/components/ui/button"; import { Card, CardContent } from "@/shared/components/ui/card"; import { @@ -32,7 +33,6 @@ import { CATEGORY_TYPES, type CategoryType, } from "@/shared/lib/categories/constants"; -import { CategoryIconBadge } from "@/shared/components/entity-avatar"; import { CategoryDialog } from "./category-dialog"; import type { Category } from "./types"; @@ -250,7 +250,7 @@ export function CategoriesPage({ categories }: CategoriesPageProps) { onOpenChange={handleRemoveOpenChange} title={removeTitle} description="Ao remover esta categoria, os lançamentos associados serão desrelacionados." - confirmLabel="Remover categoria" + confirmLabel="Remover" pendingLabel="Removendo..." confirmVariant="destructive" onConfirm={handleRemoveConfirm} diff --git a/src/features/categories/components/category-dialog.tsx b/src/features/categories/components/category-dialog.tsx index d5d3041..a4e247a 100644 --- a/src/features/categories/components/category-dialog.tsx +++ b/src/features/categories/components/category-dialog.tsx @@ -136,13 +136,12 @@ export function CategoryDialog({ }); }; - const title = mode === "create" ? "Nova categoria" : "Editar categoria"; + const title = mode === "create" ? "Nova categoria" : "Atualizar categoria"; const description = mode === "create" ? "Crie uma categoria para organizar seus lançamentos." : "Atualize os detalhes da categoria selecionada."; - const submitLabel = - mode === "create" ? "Salvar categoria" : "Atualizar categoria"; + const submitLabel = mode === "create" ? "Salvar" : "Atualizar"; return ( diff --git a/src/features/dashboard/components/bills/bill-payment-dialog.tsx b/src/features/dashboard/components/bills/bill-payment-dialog.tsx index 80d5ffa..a574843 100644 --- a/src/features/dashboard/components/bills/bill-payment-dialog.tsx +++ b/src/features/dashboard/components/bills/bill-payment-dialog.tsx @@ -171,7 +171,7 @@ export function BillPaymentDialog({ Processando... ) : ( - "Confirmar pagamento" + "Confirmar" )} diff --git a/src/features/dashboard/components/goals-progress/goals-progress-item.tsx b/src/features/dashboard/components/goals-progress/goals-progress-item.tsx index fe487cc..20ef571 100644 --- a/src/features/dashboard/components/goals-progress/goals-progress-item.tsx +++ b/src/features/dashboard/components/goals-progress/goals-progress-item.tsx @@ -59,7 +59,7 @@ export function GoalProgressItem({ size="icon-sm" className="transition-opacity text-primary hover:opacity-80" onClick={() => onEdit(item)} - aria-label={`Editar orçamento de ${item.categoryName}`} + aria-label={`Atualizar orçamento de ${item.categoryName}`} > diff --git a/src/features/dashboard/components/invoices/invoice-payment-dialog.tsx b/src/features/dashboard/components/invoices/invoice-payment-dialog.tsx index 8c0286c..54a5419 100644 --- a/src/features/dashboard/components/invoices/invoice-payment-dialog.tsx +++ b/src/features/dashboard/components/invoices/invoice-payment-dialog.tsx @@ -193,7 +193,7 @@ export function InvoicePaymentDialog({ Processando... ) : ( - "Confirmar pagamento" + "Confirmar" )} diff --git a/src/features/invoices/components/edit-payment-date-dialog.tsx b/src/features/invoices/components/edit-payment-date-dialog.tsx index ec50605..09bf9a5 100644 --- a/src/features/invoices/components/edit-payment-date-dialog.tsx +++ b/src/features/invoices/components/edit-payment-date-dialog.tsx @@ -38,12 +38,12 @@ export function EditPaymentDateDialog({ {trigger} - Editar data de pagamento + Atualizar data de pagamento Selecione a data em que o pagamento foi realizado. -
+
{sortedTasks.slice(0, 5).map((task) => (
-
- {task.completed && ( - +
+ {task.completed ? ( + + ) : ( +
)}
-
- {task.completed && ( - +
+ {task.completed ? ( + + ) : ( +
)}
+ + + {onEdit && ( )} - - -
diff --git a/src/features/notes/components/note-dialog.tsx b/src/features/notes/components/note-dialog.tsx index 469e696..ba9133e 100644 --- a/src/features/notes/components/note-dialog.tsx +++ b/src/features/notes/components/note-dialog.tsx @@ -94,13 +94,14 @@ export function NoteDialog({ } }, [dialogOpen, note, resetForm]); - const dialogTitle = mode === "create" ? "Nova anotação" : "Editar anotação"; + const dialogTitle = + mode === "create" ? "Nova anotação" : "Atualizar anotação"; const description = mode === "create" ? "Crie uma nota simples ou uma lista de tarefas." : note?.type === "tarefa" - ? "Editando lista de tarefas." - : "Editando nota."; + ? "Atualize sua lista de tarefas" + : "Atualize sua nota"; const submitLabel = mode === "create" ? "Salvar" : "Atualizar"; const titleCount = formState.title.length; @@ -361,7 +362,6 @@ export function NoteDialog({ className="shrink-0 gap-1.5" > - Adicionar @@ -374,7 +374,7 @@ export function NoteDialog({ className="flex items-center gap-3 rounded-md px-3 py-1.5 hover:bg-muted/50" > handleToggleTask(task.id)} disabled={isPending} diff --git a/src/features/payers/components/payer-dialog.tsx b/src/features/payers/components/payer-dialog.tsx index 35b2cd6..94f5e5e 100644 --- a/src/features/payers/components/payer-dialog.tsx +++ b/src/features/payers/components/payer-dialog.tsx @@ -216,12 +216,12 @@ export function PayerDialog({ }); }; - const title = mode === "create" ? "Nova pessoa" : "Editar pessoa"; + const title = mode === "create" ? "Nova pessoa" : "Atualizar pessoa"; const description = mode === "create" ? "Selecione um avatar e informe os detalhes para criar uma nova pessoa." : "Atualize os detalhes da pessoa selecionada."; - const submitLabel = mode === "create" ? "Salvar pessoa" : "Atualizar pessoa"; + const submitLabel = mode === "create" ? "Salvar" : "Atualizar"; const isUploadSelected = uploadedAvatar !== null && formState.avatarUrl === uploadedAvatar; diff --git a/src/features/payers/components/payers-page.tsx b/src/features/payers/components/payers-page.tsx index c01ed49..766f50e 100644 --- a/src/features/payers/components/payers-page.tsx +++ b/src/features/payers/components/payers-page.tsx @@ -151,8 +151,8 @@ export function PayersPage({ payers, avatarOptions }: PayersPageProps) { {orderedPayers.length === 0 ? (
- Cadastre seu primeira pessoa para organizar cobranças e - pagamentos recorrentes. + Cadastre seu primeira pessoa para organizar cobranças e pagamentos + recorrentes.
) : ( @@ -186,7 +186,7 @@ export function PayersPage({ payers, avatarOptions }: PayersPageProps) { onOpenChange={handleRemoveOpenChange} title={removeTitle} description="Ao remover esta pessoa, os registros relacionados a ele deixarão de ser associados automaticamente." - confirmLabel="Remover pessoa" + confirmLabel="Remover" pendingLabel="Removendo..." confirmVariant="destructive" onConfirm={handleRemoveConfirm} diff --git a/src/features/transactions/components/dialogs/mass-add-dialog.tsx b/src/features/transactions/components/dialogs/mass-add-dialog.tsx index 7848dc3..af203f8 100644 --- a/src/features/transactions/components/dialogs/mass-add-dialog.tsx +++ b/src/features/transactions/components/dialogs/mass-add-dialog.tsx @@ -642,7 +642,7 @@ export function MassAddDialog({ diff --git a/src/features/transactions/components/dialogs/transaction-details-dialog.tsx b/src/features/transactions/components/dialogs/transaction-details-dialog.tsx index 1545b98..8170f6f 100644 --- a/src/features/transactions/components/dialogs/transaction-details-dialog.tsx +++ b/src/features/transactions/components/dialogs/transaction-details-dialog.tsx @@ -242,7 +242,7 @@ export function TransactionDetailsDialog({ {onEdit && !transaction.readonly && ( - + )} diff --git a/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog.tsx b/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog.tsx index 7e0aa61..20edb42 100644 --- a/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog.tsx +++ b/src/features/transactions/components/dialogs/transaction-dialog/transaction-dialog.tsx @@ -229,8 +229,7 @@ export function TransactionDialog({ } if (formState.isSplit && !formState.payerId) { - const message = - "Selecione a pessoa principal para dividir o lançamento."; + const message = "Selecione a pessoa principal para dividir o lançamento."; setErrorMessage(message); toast.error(message); return; @@ -460,7 +459,7 @@ export function TransactionDialog({ ? "Nova Despesa" : "Nova Receita" : "Novo lançamento" - : "Editar lançamento"; + : "Atualizar lançamento"; const description = mode === "create" ? isImportMode @@ -471,7 +470,7 @@ export function TransactionDialog({ ? `Informe os dados abaixo para registrar ${defaultTransactionType === "Despesa" ? "uma nova despesa" : "uma nova receita"}.` : "Informe os dados abaixo para registrar um novo lançamento." : "Atualize as informações do lançamento selecionado."; - const submitLabel = mode === "create" ? "Salvar lançamento" : "Atualizar"; + const submitLabel = mode === "create" ? "Salvar" : "Atualizar"; const showInstallments = formState.condition === "Parcelado"; const showRecurrence = formState.condition === "Recorrente";