From cb6348ae16f207c8af365ea6c680bffa9a77847b Mon Sep 17 00:00:00 2001 From: Mattias Carlsson Date: Wed, 4 Mar 2026 16:54:31 +0100 Subject: [PATCH 1/5] fix(a11y): pipe form errors into React Aria FieldError for aria-describedby --- src/components/form/SelectField.tsx | 27 ++++++++++----------- src/components/form/TextAreaField.tsx | 35 +++++++++++++-------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/components/form/SelectField.tsx b/src/components/form/SelectField.tsx index 8d802c8..ad9e1f5 100644 --- a/src/components/form/SelectField.tsx +++ b/src/components/form/SelectField.tsx @@ -1,6 +1,6 @@ import { FormSelect } from './FormSelect' -import { FieldErrorMessage } from './FieldErrorMessage' import { useFieldContext } from '@/hooks/form' +import { formatFieldErrors } from '@/lib/errors' import type { SelectOption } from '@/lib/converter-configs' interface SelectFieldProps { @@ -11,19 +11,18 @@ interface SelectFieldProps { export function SelectField({ label, options }: SelectFieldProps) { const field = useFieldContext() + const shouldShow = field.state.meta.isTouched || field.state.meta.isBlurred || field.form.state.isSubmitted + const errs = field.state.meta.errors ?? [] + const errorMessage = shouldShow && errs.length > 0 ? formatFieldErrors(errs) : undefined + return ( - <> - field.setValue(value)} - options={options} - /> - - + field.setValue(value)} + options={options} + errorMessage={errorMessage} + /> ) } diff --git a/src/components/form/TextAreaField.tsx b/src/components/form/TextAreaField.tsx index 2b45712..230c614 100644 --- a/src/components/form/TextAreaField.tsx +++ b/src/components/form/TextAreaField.tsx @@ -1,6 +1,6 @@ import { FormTextArea } from './FormTextArea' -import { FieldErrorMessage } from './FieldErrorMessage' import { useFieldContext } from '@/hooks/form' +import { formatFieldErrors } from '@/lib/errors' interface TextAreaFieldProps { label: string @@ -19,23 +19,22 @@ export function TextAreaField({ }: TextAreaFieldProps) { const field = useFieldContext() + const shouldShow = field.state.meta.isTouched || field.state.meta.isBlurred || field.form.state.isSubmitted + const errs = field.state.meta.errors ?? [] + const errorMessage = shouldShow && errs.length > 0 ? formatFieldErrors(errs) : undefined + return ( - <> - field.handleChange(value)} - className={className} - /> - - + field.handleChange(value)} + className={className} + errorMessage={errorMessage} + /> ) } From 90ed0df72d392ce9341221470c6d0dda09e55fd0 Mon Sep 17 00:00:00 2001 From: Mattias Carlsson Date: Wed, 4 Mar 2026 16:57:14 +0100 Subject: [PATCH 2/5] fix(a11y): add aria-live region to converter output --- src/components/form/ConverterPage.tsx | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/components/form/ConverterPage.tsx b/src/components/form/ConverterPage.tsx index 3877665..78d487f 100644 --- a/src/components/form/ConverterPage.tsx +++ b/src/components/form/ConverterPage.tsx @@ -102,15 +102,17 @@ export function ConverterPage({ - {output && ( - - )} +
+ {output && ( + + )} +
) From 11bc6dcf5ae028035ed46f4f5fbfbd1a951334f1 Mon Sep 17 00:00:00 2001 From: Mattias Carlsson Date: Wed, 4 Mar 2026 16:57:22 +0100 Subject: [PATCH 3/5] fix(a11y): add missing ARIA props to Home page and Loader --- src/components/Loader.tsx | 11 ++++++++--- src/pages/Home.tsx | 13 ++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/components/Loader.tsx b/src/components/Loader.tsx index 43aba21..0597a6b 100644 --- a/src/components/Loader.tsx +++ b/src/components/Loader.tsx @@ -9,8 +9,9 @@ interface LoaderProps { export function Loader({ size = 24, className, text }: LoaderProps) { return ( -
+