Skip to content

Commit 296de45

Browse files
authored
[Accessibility] Input/Select - wrapped error message within live region (#312)
* chore: Input - wrapped error message within live region * chore: input aria-live changed from assertive to polite * chore: Select component, added support for aria-live
1 parent 44243e3 commit 296de45

File tree

2 files changed

+47
-41
lines changed

2 files changed

+47
-41
lines changed

src/Input.tsx

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ export const Input = memo(
101101
})();
102102

103103
const messageId = `${inputId}-desc-error`;
104+
const messagesGroupId = `${inputId}-messages-group`;
104105

105106
return (
106107
<div
@@ -182,29 +183,31 @@ export const Input = memo(
182183
nativeInputOrTextArea
183184
);
184185
})()}
185-
{state !== "default" && (
186-
<p
187-
id={messageId}
188-
className={cx(
189-
fr.cx(
190-
(() => {
191-
switch (state) {
192-
case "error":
193-
return "fr-error-text";
194-
case "success":
195-
return "fr-valid-text";
196-
case "info":
197-
return "fr-info-text";
198-
}
199-
assert<Equals<typeof state, never>>();
200-
})()
201-
),
202-
classes.message
203-
)}
204-
>
205-
{stateRelatedMessage}
206-
</p>
207-
)}
186+
<div id={messagesGroupId} className={fr.cx("fr-messages-group")} aria-live="polite">
187+
{state !== "default" && (
188+
<p
189+
id={messageId}
190+
className={cx(
191+
fr.cx(
192+
(() => {
193+
switch (state) {
194+
case "error":
195+
return "fr-error-text";
196+
case "success":
197+
return "fr-valid-text";
198+
case "info":
199+
return "fr-info-text";
200+
}
201+
assert<Equals<typeof state, never>>();
202+
})()
203+
),
204+
classes.message
205+
)}
206+
>
207+
{stateRelatedMessage}
208+
</p>
209+
)}
210+
</div>
208211
</div>
209212
);
210213
})

src/Select.tsx

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export const Select = memo(
6464
})();
6565

6666
const stateDescriptionId = `select-${useId()}-desc`;
67+
const messagesGroupId = `${selectId}-messages-group`;
6768

6869
return (
6970
<div
@@ -107,24 +108,26 @@ export const Select = memo(
107108
>
108109
{children}
109110
</select>
110-
{state !== "default" && (
111-
<p
112-
id={stateDescriptionId}
113-
className={fr.cx(
114-
(() => {
115-
switch (state) {
116-
case "error":
117-
return "fr-error-text";
118-
case "success":
119-
return "fr-valid-text";
120-
}
121-
assert<Equals<typeof state, never>>(false);
122-
})()
123-
)}
124-
>
125-
{stateRelatedMessage}
126-
</p>
127-
)}
111+
<div id={messagesGroupId} className={fr.cx("fr-messages-group")} aria-live="polite">
112+
{state !== "default" && (
113+
<p
114+
id={stateDescriptionId}
115+
className={fr.cx(
116+
(() => {
117+
switch (state) {
118+
case "error":
119+
return "fr-error-text";
120+
case "success":
121+
return "fr-valid-text";
122+
}
123+
assert<Equals<typeof state, never>>(false);
124+
})()
125+
)}
126+
>
127+
{stateRelatedMessage}
128+
</p>
129+
)}
130+
</div>
128131
</div>
129132
);
130133
})

0 commit comments

Comments
 (0)