-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
55 lines (46 loc) · 1.21 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import * as React from "react";
let visuallyHidden = {
clip: "rect(0 0 0 0)",
clipPath: "inset(50%)",
height: "1px",
overflow: "hidden",
position: "absolute",
whiteSpace: "nowrap",
width: "1px",
};
export function useAriaLive(timeout = 5_000) {
let [announcement, setAnnouncement] = React.useState(null);
React.useEffect(() => {
let latestAnnouncementCooldown = setTimeout(() => {
setAnnouncement(null);
}, timeout);
return () => clearTimeout(latestAnnouncementCooldown);
}, [announcement]);
function announce(announcement) {
setAnnouncement(null);
setTimeout(() => setAnnouncement(announcement), 10);
}
return [announcement, announce];
}
export function AriaLive({ as: As = "div", children, style, ...props }) {
return (
<As
role="status"
aria-live="polite"
style={
typeof style === "function"
? style(visuallyHidden)
: { ...visuallyHidden, ...style }
}
{...props}
>
{children}
</As>
);
}
export function PoliteAriaLive({ ...props }) {
return <AriaLive {...props} aria-live="polite" />;
}
export function AssertiveAriaLive({ ...props }) {
return <AriaLive {...props} aria-live="assertive" />;
}