forked from StellarSplit/StellarSplit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseAccessibility.ts
More file actions
68 lines (57 loc) · 2.04 KB
/
Copy pathuseAccessibility.ts
File metadata and controls
68 lines (57 loc) · 2.04 KB
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
56
57
58
59
60
61
62
63
64
65
66
67
68
import { useState, useEffect, useCallback } from 'react';
interface AccessibilityPreferences {
prefersReducedMotion: boolean;
prefersHighContrast: boolean;
prefersReducedTransparency: boolean;
}
/**
* Hook to detect user's accessibility preferences
* Follows WCAG guidelines for respecting user preferences
*/
export function useAccessibility(): AccessibilityPreferences {
const [preferences, setPreferences] = useState<AccessibilityPreferences>({
prefersReducedMotion: false,
prefersHighContrast: false,
prefersReducedTransparency: false,
});
useEffect(() => {
// Check for reduced motion preference
const motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
const contrastQuery = window.matchMedia('(prefers-contrast: more)');
const transparencyQuery = window.matchMedia('(prefers-reduced-transparency: reduce)');
const updatePreferences = () => {
setPreferences({
prefersReducedMotion: motionQuery.matches,
prefersHighContrast: contrastQuery.matches,
prefersReducedTransparency: transparencyQuery.matches,
});
};
// Initial check
updatePreferences();
// Listen for changes
motionQuery.addEventListener('change', updatePreferences);
contrastQuery.addEventListener('change', updatePreferences);
transparencyQuery.addEventListener('change', updatePreferences);
return () => {
motionQuery.removeEventListener('change', updatePreferences);
contrastQuery.removeEventListener('change', updatePreferences);
transparencyQuery.removeEventListener('change', updatePreferences);
};
}, []);
return preferences;
}
/**
* Hook to announce messages to screen readers
* Uses a live region for accessibility
*/
export function useAnnounce() {
const [message, setMessage] = useState('');
const announce = useCallback((newMessage: string) => {
setMessage('');
// Small delay to ensure screen readers detect the change
setTimeout(() => {
setMessage(newMessage);
}, 50);
}, []);
return { message, announce };
}