--- name: high-contrast description: Web and App implementation guide for High Contrast Design. Trigger when user wants accessibility-focused design, extreme legibility, or stark visual impact. date_added: "2026-06-17" risk: safe source: self source_type: self --- # High Contrast Design > "Maximum legibility. Stark, powerful, and universally accessible." ## When to Use Use this sub-style when the user's request matches the aesthetic described above. This is a child reference of the `design-it` skill and is not meant to be triggered directly. ## Core Principles 1. **WCAG AAA Compliance**: Every color pairing must exceed a 7:1 contrast ratio. 2. **Clear Boundaries**: Interactive elements have highly visible borders and focus states. 3. **No Ambiguity**: Avoid subtle greys, low-opacity text, or purely decorative elements that distract from the core content. ## Visual DNA - **Colors**: **Industrial Chic** (Black and White) or **Modern Editorial**. Often uses a single, highly luminous accent color (like pure Yellow `#FFFF00` or Cyan `#00FFFF`) against black. - **Typography**: Highly legible, robust sans-serifs (`Atkinson Hyperlegible`, `Inter`, `Roboto`). Large base font sizes (18px+). - **Styling**: Solid 2px borders around cards and buttons. Avoid drop shadows as they reduce edge clarity. ## Web Implementation - Focus heavily on focus states (`:focus-visible`) and clear active states. - **CSS Example**: ```css :root { --hc-bg: #ffffff; --hc-text: #000000; --hc-accent: #0000FF; /* Pure blue */ --hc-focus: #FF00FF; /* High visibility focus ring */ } body { background-color: var(--hc-bg); color: var(--hc-text); font-family: 'Atkinson Hyperlegible', sans-serif; font-size: 18px; /* Larger default */ } .hc-card { background-color: #ffffff; border: 3px solid #000000; /* Unmissable boundary */ padding: 32px; border-radius: 8px; } .hc-btn { background-color: var(--hc-accent); color: #ffffff; border: 3px solid transparent; /* Reserve space for focus */ border-radius: 4px; padding: 16px 32px; font-weight: 700; font-size: 1.1rem; cursor: pointer; } /* Crucial for high contrast / accessibility */ .hc-btn:focus-visible, a:focus-visible { outline: 4px solid var(--hc-focus); outline-offset: 4px; } a { color: var(--hc-accent); text-decoration: underline; text-decoration-thickness: 2px; } ``` ## App Implementation ### SwiftUI ```swift struct HighContrastView: View { var body: some View { VStack(spacing: 32) { // High Contrast Card VStack(alignment: .leading, spacing: 16) { Text("Maximum Legibility") .font(.custom("Atkinson Hyperlegible", size: 24)) .fontWeight(.bold) .foregroundColor(.black) Text("Content is king. Borders are stark. Contrast ratios exceed 7:1.") .font(.custom("Atkinson Hyperlegible", size: 18)) .foregroundColor(.black) } .padding(32) .background(Color.white) .overlay( RoundedRectangle(cornerRadius: 8) .stroke(Color.black, lineWidth: 3) ) // High Contrast Action Button Button(action: {}) { Text("CONFIRM ACTION") .font(.custom("Atkinson Hyperlegible", size: 18)) .fontWeight(.black) .foregroundColor(.white) .padding(.vertical, 16) .padding(.horizontal, 32) .background(Color.blue) // Must be a high-contrast blue, e.g., #0000FF .cornerRadius(4) } } .padding() .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.white) } } ``` - Rely on thick `.stroke(Color.black, lineWidth: 3)` overlays. - Ensure text is pure `.black` on pure `.white`. Do not use `.secondary` colors if they drop below a 7:1 contrast ratio. - Use fonts specifically designed for legibility, like Atkinson Hyperlegible. ### Flutter ```dart class HighContrastScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: Center( child: Padding( padding: const EdgeInsets.all(24.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // High Contrast Card Container( width: double.infinity, padding: const EdgeInsets.all(32), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.black, width: 3), // Unmissable boundary ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: const [ Text('Maximum Legibility', style: TextStyle(fontFamily: 'Atkinson', fontSize: 24, fontWeight: FontWeight.bold, color: Colors.black)), SizedBox(height: 16), Text('Content is king. Borders are stark. Contrast ratios exceed 7:1.', style: TextStyle(fontFamily: 'Atkinson', fontSize: 18, color: Colors.black)), ], ), ), const SizedBox(height: 32), // High Contrast Button ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF0000FF), // Pure blue foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), elevation: 0, // No shadows ), child: const Text('CONFIRM ACTION', style: TextStyle(fontFamily: 'Atkinson', fontSize: 18, fontWeight: FontWeight.w900)), ), ], ), ), ), ); } } ``` - Disable `elevation` on buttons; shadows blur the edges and reduce contrast. - Use `Border.all(color: Colors.black, width: 3)` on containers to explicitly define spatial boundaries for users with low vision. ### React Native ```jsx const HighContrastScreen = () => { return ( {/* High Contrast Card */} Maximum Legibility Content is king. Borders are stark. Contrast ratios exceed 7:1. {/* High Contrast Button */} CONFIRM ACTION ); }; ``` - In React Native, accessibility relies heavily on high contrast. Ensure `borderWidth: 3` and explicit pure `#000000` text colors. - Make sure to use accessible `` areas (minimum 48x48 padding for hit slop). ### Jetpack Compose ```kotlin @Composable fun HighContrastScreen() { Column( modifier = Modifier .fillMaxSize() .background(Color.White) .padding(24.dp), verticalArrangement = Arrangement.Center ) { // High Contrast Card Box( modifier = Modifier .fillMaxWidth() .background(Color.White, RoundedCornerShape(8.dp)) .border(3.dp, Color.Black, RoundedCornerShape(8.dp)) .padding(32.dp) ) { Column { Text( text = "Maximum Legibility", fontSize = 24.sp, fontWeight = FontWeight.Bold, color = Color.Black ) Spacer(Modifier.height(16.dp)) Text( text = "Content is king. Borders are stark. Contrast ratios exceed 7:1.", fontSize = 18.sp, color = Color.Black ) } } Spacer(Modifier.height(32.dp)) // High Contrast Button Button( onClick = { }, colors = ButtonDefaults.buttonColors( containerColor = Color(0xFF0000FF), contentColor = Color.White ), shape = RoundedCornerShape(4.dp), elevation = null, // Disable shadows for stark look modifier = Modifier.fillMaxWidth().height(56.dp) ) { Text("CONFIRM ACTION", fontSize = 18.sp, fontWeight = FontWeight.Black) } } } ``` - Use `Modifier.border(3.dp, Color.Black)` around containers. - Disable button elevations (`elevation = null`) to keep the design perfectly flat and sharp. ## Do's and Don'ts - **DO**: Run your colors through a contrast checker. If it's below 7:1, adjust it. - **DON'T**: Rely on color alone to convey meaning (e.g., don't just make an error state red; make it red AND add an error icon AND bold the text). ## Limitations - This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review. - Ensure appropriate contrast ratios and responsive behaviors are verified separately.