Perceivable
Information and UI components must be presentable in ways users can perceive.
Synchronicity is designed to be inclusive and accessible to all users. We follow WCAG 2.1 AA guidelines and platform-specific accessibility standards.
Perceivable
Information and UI components must be presentable in ways users can perceive.
Operable
UI components and navigation must be operable by all users.
Understandable
Information and UI operation must be understandable.
Robust
Content must be robust enough for diverse assistive technologies.
All color combinations meet WCAG AA standards:
| Combination | Ratio | Status |
|---|---|---|
| Primary text on background (dark) | 15.8:1 | AAA |
| Primary text on background (light) | 12.1:1 | AAA |
| Secondary text on background (dark) | 7.2:1 | AAA |
| Secondary text on background (light) | 4.8:1 | AA |
| Gold on dark background | 8.4:1 | AAA |
| Gold (dark) on light background | 5.2:1 | AA |
All interactive elements meet minimum touch target sizes:
const touchTargets = { minimum: 44, // Apple HIG minimum (44×44 points) comfortable: 48, // Comfortable touch size large: 56, // Primary actions};import { Pressable, StyleSheet } from 'react-native';import { touchTargets } from '@synchronicity/tokens';
function IconButton({ icon, onPress, label }) { return ( <Pressable onPress={onPress} style={styles.button} accessibilityLabel={label} accessibilityRole="button" > {icon} </Pressable> );}
const styles = StyleSheet.create({ button: { minWidth: touchTargets.minimum, minHeight: touchTargets.minimum, justifyContent: 'center', alignItems: 'center', },});Always provide meaningful accessibility labels:
// Good<Pressable accessibilityLabel="Cast hexagram using three coins"> <CoinIcon /></Pressable>
// Bad<Pressable accessibilityLabel="Button"> <CoinIcon /></Pressable>Use appropriate roles for screen readers:
| Role | Usage |
|---|---|
button | Interactive elements that trigger actions |
link | Navigation to other screens/pages |
header | Section headings |
image | Decorative or informative images |
text | Static text content |
adjustable | Sliders, steppers |
Provide additional context when needed:
<Pressable accessibilityLabel="Hexagram 1: The Creative" accessibilityHint="Double tap to view full hexagram details" accessibilityRole="button"> <HexagramCard /></Pressable>Always respect the user’s reduced motion preference:
import { useReducedMotion } from 'react-native-reanimated';import { AccessibilityInfo } from 'react-native';
function AnimatedComponent() { const reducedMotion = useReducedMotion();
if (reducedMotion) { // Skip animation or use instant transition return <StaticComponent />; }
return <AnimatedVersion />;}Ensure visible focus states for keyboard/switch control users:
const styles = StyleSheet.create({ button: { // Default state }, buttonFocused: { borderWidth: 2, borderColor: colors.gold['gold-60'], // Or use outline for web },});Maintain logical focus order that matches visual layout:
<View> <Header accessibilityRole="header" /> <MainContent /> <NavigationTabs /></View>Support system font size preferences:
import { useWindowDimensions } from 'react-native';
function ResponsiveText({ children, style }) { const { fontScale } = useWindowDimensions();
return ( <Text style={[style, { fontSize: style.fontSize * fontScale }]} allowFontScaling={true} maxFontSizeMultiplier={2} > {children} </Text> );}Ensure adequate spacing for readability:
Use this checklist when building components: