Skip to content

Accessibility

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:

CombinationRatioStatus
Primary text on background (dark)15.8:1AAA
Primary text on background (light)12.1:1AAA
Secondary text on background (dark)7.2:1AAA
Secondary text on background (light)4.8:1AA
Gold on dark background8.4:1AAA
Gold (dark) on light background5.2:1AA
  • Normal text: 4.5:1 contrast ratio
  • Large text (18px+ or 14px+ bold): 3:1 contrast ratio
  • UI components: 3:1 contrast ratio against adjacent colors

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:

RoleUsage
buttonInteractive elements that trigger actions
linkNavigation to other screens/pages
headerSection headings
imageDecorative or informative images
textStatic text content
adjustableSliders, 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 />;
}
  • Essential animations: Replace with instant state changes
  • Decorative animations: Hide completely
  • Loading indicators: Use static or minimal animation
  • Auto-playing content: Pause by default

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:

  • Line height: At least 1.5× font size for body text
  • Paragraph spacing: At least 2× font size
  • Letter spacing: Not condensed below normal

Use this checklist when building components:

  • Sufficient color contrast (4.5:1 for text)
  • Touch targets at least 44×44 points
  • Meaningful accessibility labels
  • Appropriate accessibility roles
  • Focus indicator visible
  • Respects reduced motion preference
  • Supports dynamic type
  • Keyboard navigable (web)
  • Screen reader tested
  • VoiceOver (built-in screen reader)
  • Accessibility Inspector (Xcode)
  • TalkBack (built-in screen reader)
  • Accessibility Scanner app
  • axe DevTools browser extension
  • Lighthouse accessibility audit
  • WAVE evaluation tool