From 14fda0efee49d0f1adac4e40dcd5352b9a321c4c Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 3 Sep 2026 13:08:27 +0000 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20aria-label=20no=20l=C3=A1pis=20de=20?= =?UTF-8?q?editar=20em=20metas,=20or=C3=A7amento=20e=20investimentos=20(cl?= =?UTF-8?q?oses=20#128)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Os três lápis de editar em GoalDialog, BudgetOverrideDialog e InvestmentEntryDialog envolvem só um ícone Pencil sem aria-label — o Icon do lucide-react@1.8.0 marca o svg como aria-hidden quando não recebe filho nem prop de a11y, então o botão chega ao leitor de tela como role=button name="". Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_012WLtBDDRT1KDQqQtNjTgjK --- __tests__/unit/a11y-nomes-acessiveis.test.ts | 76 +++++++++++++++++++ .../configuracao-mes/BudgetOverrideDialog.tsx | 1 + .../investimentos/InvestmentEntryDialog.tsx | 1 + components/metas/GoalDialog.tsx | 1 + 4 files changed, 79 insertions(+) create mode 100644 __tests__/unit/a11y-nomes-acessiveis.test.ts diff --git a/__tests__/unit/a11y-nomes-acessiveis.test.ts b/__tests__/unit/a11y-nomes-acessiveis.test.ts new file mode 100644 index 0000000..0567b34 --- /dev/null +++ b/__tests__/unit/a11y-nomes-acessiveis.test.ts @@ -0,0 +1,76 @@ +import { describe, it, expect } from 'vitest' +import { readFileSync } from 'node:fs' +import { join } from 'node:path' + +// ─── Botões só de ícone sem nome acessível (#106) ────────────────────────── +// +// `lucide-react@1.8.0` (package.json:45) marca o do ícone como +// `aria-hidden="true"` quando ele não recebe filho nem prop de a11y — então +// um diff --git a/components/investimentos/InvestmentEntryDialog.tsx b/components/investimentos/InvestmentEntryDialog.tsx index c96d357..64c4089 100644 --- a/components/investimentos/InvestmentEntryDialog.tsx +++ b/components/investimentos/InvestmentEntryDialog.tsx @@ -189,6 +189,7 @@ export function InvestmentEntryDialog({ variant="ghost" className="h-7 w-7 text-text-tertiary hover:text-text-primary" onClick={() => setOpen(true)} + aria-label="Editar registro" > diff --git a/components/metas/GoalDialog.tsx b/components/metas/GoalDialog.tsx index 2b13c20..50c39df 100644 --- a/components/metas/GoalDialog.tsx +++ b/components/metas/GoalDialog.tsx @@ -158,6 +158,7 @@ export function GoalDialog(props: Props) { variant="ghost" className="h-7 w-7 text-text-tertiary hover:text-text-primary" onClick={() => setOpen(true)} + aria-label="Editar meta" > From 84d8b8e3a5a8cc5c0891ac4f09f5d7279bb148fc Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 3 Sep 2026 15:22:38 +0000 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20ancora=20asser=C3=A7=C3=A3o=20do=20B?= =?UTF-8?q?udgetOverrideDialog=20no=20bot=C3=A3o=20mais=20pr=C3=B3ximo=20d?= =?UTF-8?q?o=20=C3=ADcone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Achado no review de #144: expect(source).toMatch(/aria-label/) sobre o arquivo inteiro passava mesmo com o rótulo no botão errado ("Usar padrão"), porque o gatilho não é ramo de ternário e o arquivo tem dois outros