| name | healthcare-ux-guidelines |
| description | Healthcare UX design standards for MYCURE products combining WCAG 2.2 Level AA accessibility compliance with patient safety language guidelines. Auto-activates for healthcare UI design, form validation, error messaging, clinical workflows, patient-facing interfaces, and government health system integration. Includes Philippine healthcare context (LGU, RHU, BHS, FHSIS systems). |
Healthcare UX Guidelines
Comprehensive healthcare user experience standards ensuring accessibility, patient safety, and usability for MYCURE clinical and government health products.
When This Skill Activates
- Designing healthcare interfaces (clinical systems, patient portals, LGU health centers)
- Creating forms for patient data, medical records, or health services
- Writing error messages, notifications, or system feedback
- Conducting accessibility audits (WCAG 2.2)
- Implementing clinical workflows (consultation, pharmacy, laboratory)
- Building government health reporting interfaces (FHISIS, PhilHealth)
Core Principles
1. Accessibility is Patient Safety
WCAG 2.2 Level AA compliance is MANDATORY for all MYCURE interfaces.
Why it matters:
- Healthcare access is a right, not a privilege
- Patients with disabilities must have equal access to health services
- Inaccessible interfaces create barriers to care
- Legal requirements in many jurisdictions
2. Language Shapes Patient Experience
Error messages must not alarm or undermine trust.
Why it matters:
- Patients may be anxious about their health
- Healthcare professionals rely on system confidence
- Alarming language increases stress and reduces compliance
- Calm, professional tone maintains therapeutic relationship
3. Philippine Healthcare Context
Design for variable infrastructure and diverse users.
Challenges:
- Low-quality displays in rural health units (RHUs)
- Limited bandwidth in barangay health stations (BHS)
- Mixed technical literacy among government health workers
- Multiple languages (Filipino, English, regional languages)
Quick Reference: Critical Requirements
✅ MUST DO (P0 Priority)
- Color Contrast: 4.5:1 minimum for normal text, 3:1 for large text
- Focus Indicators: Visible 3px outline on all interactive elements
- Touch Targets: Minimum 44×44px for all clickable elements
- Keyboard Navigation: All functionality accessible via keyboard
- Alt Text: All images and icons have descriptive alt attributes
- Form Labels: All inputs have visible, associated labels
- Patient Safety Language: NO "Error", "Failed", "Broken", "Denied"
- Semantic HTML: Proper heading hierarchy, list tags, button elements
❌ NEVER DO (Critical Violations)
- Remove focus indicators (
outline: nonewithout replacement) - Use placeholder as label (placeholders disappear on focus)
- Rely on color alone for status or information
- Use alarming terminology ("Fatal error", "Critical failure")
- Make buttons from divs without proper ARIA roles
- Use images of text instead of actual text
- Block keyboard navigation (keyboard traps)
- Ignore screen reader compatibility
Accessibility Standards (WCAG 2.2 Level AA)
Perceivable: Users Must Perceive Content
Text Alternatives
<!-- ✅ Good: Descriptive alt text -->
<img src="patient-chart.png" alt="Patient vital signs chart showing blood pressure trend over 7 days">
<!-- ✅ Good: Decorative images -->
<img src="decorative-line.png" alt="" role="presentation">
<!-- ✅ Good: Icon with accessible name -->
<button aria-label="Save patient record">
<svg aria-hidden="true"><!-- Save icon --></svg>
</button>
<!-- ❌ Bad: Missing alt text -->
<img src="chart.png">
<!-- ❌ Bad: Icon without label -->
<button><svg><!-- Icon --></svg></button>
Color Contrast
Test all color combinations:
/* ✅ Good: High contrast (7.0:1 on white) */
--clinical-blue: #0066CC;
--text-primary: #212529; /* 16.1:1 */
/* ✅ Good: Passes AA (4.54:1 on white) */
--text-secondary: #6C757D;
/* ❌ Bad: Fails AA (2.85:1 on white) */
--text-muted: #ADB5BD; /* Don't use for critical text */
Tools:
- Chrome DevTools: Inspect element → Contrast ratio indicator
- WebAIM Contrast Checker: https://webaim.org/resources/contrastchecker/
Status Indicators
<!-- ❌ Bad: Color only -->
<span class="text-red">Critical</span>
<!-- ✅ Good: Icon + text + color -->
<span class="status-critical">
<svg aria-hidden="true"><!-- Alert icon --></svg>
<span>Critical: Requires immediate attention</span>
</span>
Operable: Users Must Operate Interface
Keyboard Navigation
All functionality must work via keyboard:
<!-- ✅ Good: Native button -->
<button onclick="saveRecord()">Save Patient Record</button>
<!-- ❌ Bad: Div without keyboard support -->
<div onclick="saveRecord()">Save Patient Record</div>
<!-- ✅ Good: Div with proper ARIA -->
<div
role="button"
tabindex="0"
aria-label="Save patient record"
onclick="saveRecord()"
onkeydown="if(event.key==='Enter'||event.key===' ')saveRecord()"
>
Save Patient Record
</div>
Test: Navigate entire interface using only Tab, Shift+Tab, Enter, Space, Arrow keys.
Focus Indicators
/* ✅ Good: Visible focus indicator */
*:focus-visible {
outline: 3px solid var(--clinical-blue);
outline-offset: 2px;
}
/* ❌ Bad: Removing outline without replacement */
button {
outline: none; /* NEVER DO THIS */
}
Touch Targets (Mobile/Tablet)
/* ✅ Good: 44×44px minimum */
.button {
min-width: 44px;
min-height: 44px;
padding: 12px 24px;
}
/* ✅ Good: Increased padding for small icons */
.icon-button {
width: 24px;
height: 24px;
padding: 10px; /* Total: 44×44px */
}
/* ❌ Bad: Too small for touch */
.tiny-button {
width: 20px;
height: 20px;
padding: 2px; /* Total: 24×24px - TOO SMALL */
}
Understandable: Users Must Understand Content
Form Labels
<!-- ❌ Bad: Placeholder as label -->
<input type="text" placeholder="Patient Name">
<!-- ✅ Good: Visible label + placeholder as hint -->
<label for="patient-name">Patient Name *</label>
<input
type="text"
id="patient-name"
name="patientName"
placeholder="e.g., Juan Dela Cruz"
required
aria-required="true"
>
<!-- ✅ Good: Grouped related fields -->
<fieldset>
<legend>Patient Contact Information</legend>
<label for="phone">Phone Number</label>
<input type="tel" id="phone" autocomplete="tel">
<label for="email">Email Address</label>
<input type="email" id="email" autocomplete="email">
</fieldset>
Error Messages
See Patient Safety Language section below for complete guidelines.
<!-- ❌ Bad: Generic, alarming -->
<div class="error">Error: Invalid input</div>
<!-- ✅ Good: Specific, helpful, calm -->
<div class="error" role="alert">
<strong>Please check the following:</strong>
<ul>
<li>Patient Name is required</li>
<li>Date of Birth must be in MM/DD/YYYY format</li>
</ul>
</div>
Consistent Navigation
<!-- ✅ Good: Consistent button labels -->
<!-- Across all forms: -->
<button>Save Changes</button>
<button>Cancel</button>
<!-- ❌ Bad: Inconsistent labels -->
<!-- Form 1: -->
<button>Submit</button>
<!-- Form 2: -->
<button>Save</button>
<!-- Form 3: -->
<button>OK</button>
Robust: Works with Assistive Technologies
Semantic HTML
<!-- ❌ Bad: Divs for everything -->
<div class="heading">Patient Information</div>
<div class="list">
<div>Name: Juan Dela Cruz</div>
<div>Age: 45</div>
</div>
<!-- ✅ Good: Semantic HTML -->
<h2>Patient Information</h2>
<dl>
<dt>Name</dt>
<dd>Juan Dela Cruz</dd>
<dt>Age</dt>
<dd>45 years old</dd>
</dl>
ARIA Roles and States
<!-- ✅ Good: Custom checkbox with ARIA -->
<div
role="checkbox"
aria-checked="true"
aria-label="Enable appointment reminders"
tabindex="0"
onclick="toggleCheckbox()"
onkeydown="if(event.key===' ')toggleCheckbox()"
>
✓ Enable appointment reminders
</div>
<!-- ✅ Good: Dropdown menu with ARIA -->
<button
aria-expanded="false"
aria-controls="patient-menu"
onclick="toggleMenu()"
>
Actions ▼
</button>
<ul id="patient-menu" hidden>
<li><a href="/edit">Edit Record</a></li>
<li><a href="/delete">Delete Record</a></li>
</ul>
Patient Safety Language
Core Principle: Calm, Professional Communication
Healthcare software must not alarm patients or undermine trust.
Word Substitutions
| ❌ Avoid | ✅ Use Instead |
|---|---|
| Error, Failed, Broken | Unable to process, Not completed |
| Invalid, Illegal | Please check, Please verify |
| Denied, Rejected | Unable to access, Needs review |
| Crashed, Down | Temporarily unavailable |
| Fatal error, Critical failure | Please contact support, Needs immediate attention |
| Alert!, Warning! | Please note, Important |
Message Templates
Form Validation
❌ Error: Field required
✅ Please enter patient name
❌ Invalid email address
✅ Please enter a valid email address (e.g., name@example.com)
❌ Error: Value too high
✅ Quantity cannot exceed 500 (available stock)
Data Not Found
❌ Fatal error: Patient record not found
✅ This patient record is not currently available.
Please verify the patient ID or contact support if the issue persists.
Permission Issues
❌ Access denied - forbidden
✅ You don't have permission to access this section.
Please contact your administrator for assistance.
Network/System Issues
❌ Server down - error 500
✅ We're experiencing technical difficulties.
Your data is safe. Please try again in a few moments.
Critical Patient Safety Alerts
When there IS an actual safety concern, be direct:
✅ ALLERGY ALERT: Patient is allergic to Penicillin.
This medication (Amoxicillin) contains Penicillin.
Action required: Do not dispense. Select alternative medication.
[View Alternatives] [Cancel Order]
Use "WARNING" or "ALERT" only for:
- Actual patient safety risks (allergies, drug interactions)
- Regulatory compliance issues (expired medications)
- Critical system failures affecting patient care
- Data integrity issues impacting treatment decisions
Philippine Healthcare Context
LGU/Government Health Systems
Design for:
- Rural Health Units (RHUs) with limited infrastructure
- Barangay Health Stations (BHS) with basic facilities
- City/Municipal Health Offices (CHO/MHO)
- Provincial Health Offices (PHO)
Technical Constraints:
- Low-quality displays (often older monitors)
- Limited bandwidth (2G/3G in rural areas)
- Inconsistent power supply
- Shared/public computers
Design Adaptations:
/* High contrast for low-quality displays */
:root {
--text-primary: #1A1A1A; /* Darker than standard */
--border-strong: #000000; /* Pure black for definition */
}
/* Larger minimum font sizes */
body {
font-size: 16px; /* Never below 16px */
}
.data-label {
font-size: 14px; /* Never below 14px */
}
/* Performance: CSS-only animations */
.loading {
animation: pulse 1.5s ease-in-out infinite;
}
/* NO video backgrounds, NO heavy JavaScript animations */
FHISIS Reporting
Field Health Service Information System (FHISIS) integration:
<!-- ✅ Good: Clear FHISIS field labels -->
<label for="fhisis-report-type">FHISIS Report Type</label>
<select id="fhisis-report-type" name="fhisisReportType">
<option value="m1">M1 - Target Client List</option>
<option value="m2">M2 - Summary of Services</option>
<option value="individual">Individual Treatment Record</option>
</select>
<label for="reporting-period">Reporting Period</label>
<input
type="month"
id="reporting-period"
name="reportingPeriod"
aria-describedby="period-help"
>
<small id="period-help">Select month and year for FHISIS submission</small>
Multilingual Support
English + Filipino (Tagalog) minimum:
<html lang="en">
<!-- Primary language: English -->
<!-- Filipino text sections -->
<section lang="tl">
<h2>Pangalan ng Pasyente</h2>
<p>Ilagay ang buong pangalan ng pasyente.</p>
</section>
<!-- Switch language based on user preference -->
<label for="language">Language / Wika</label>
<select id="language" name="language">
<option value="en">English</option>
<option value="tl">Filipino</option>
</select>
Testing Checklist
Accessibility Testing
Automated (30% of issues):
- axe DevTools browser extension
- Lighthouse accessibility audit
- WAVE accessibility checker
Keyboard Navigation (Manual):
- Tab through all interactive elements
- Verify focus order matches visual order
- Check focus indicators are visible
- Test Escape key closes modals/dropouts
- Verify Enter/Space activates buttons
Screen Reader (Manual):
- Navigate by headings (H key in NVDA/JAWS)
- Navigate by landmarks (D key)
- Navigate by form fields (F key)
- Verify all images have alt text
- Verify all buttons have accessible names
- Check ARIA states announce correctly
Visual Testing:
- Zoom to 200% - verify no horizontal scrolling
- Resize window to 320px - verify content reflows
- Test in Windows High Contrast Mode
- Test with increased text spacing
Patient Safety Language Testing
Before Release:
- All error messages reviewed by healthcare professional
- No alarming terminology (Error, Failed, Broken, Denied)
- All messages provide clear next steps
- Messages appropriate for audience (patient vs. staff)
- Critical alerts properly identified
- Spelling and grammar checked
- Tone is calm, professional, helpful
Common Violations & Fixes
1. Missing Focus Indicators
Problem:
/* ❌ Removes all focus indicators */
* {
outline: none;
}
Fix:
/* ✅ Replace with visible focus indicator */
*:focus-visible {
outline: 3px solid var(--clinical-blue);
outline-offset: 2px;
}
2. Placeholder as Label
Problem:
<!-- ❌ Placeholder disappears when typing -->
<input type="text" placeholder="Patient Name">
Fix:
<!-- ✅ Visible label + placeholder as hint -->
<label for="patient-name">Patient Name</label>
<input
type="text"
id="patient-name"
placeholder="e.g., Juan Dela Cruz"
>
3. Insufficient Color Contrast
Problem:
/* ❌ Light gray on white (2.5:1 - FAILS) */
.text-muted {
color: #CCCCCC;
}
Fix:
/* ✅ Darker gray (4.54:1 - PASSES AA) */
.text-muted {
color: #6C757D;
}
4. Alarming Error Messages
Problem:
❌ Fatal error: Stock transfer failed
Fix:
✅ Unable to complete stock transfer.
Requested quantity (500) exceeds available stock (300).
Please adjust the quantity and try again.
Resources
Reference Documents:
- WCAG_COMPLIANCE.md - Complete WCAG 2.2 checklist
- PATIENT_SAFETY_LANGUAGE.md - Full messaging guidelines
Testing Tools:
- axe DevTools: https://www.deque.com/axe/devtools/
- WAVE: https://wave.webaim.org/extension/
- WebAIM Contrast Checker: https://webaim.org/resources/contrastchecker/
- Lighthouse (built into Chrome DevTools)
Screen Readers:
- NVDA (Windows, free): https://www.nvaccess.org/
- VoiceOver (macOS, built-in): Cmd+F5
- TalkBack (Android, built-in)
WCAG Guidelines:
- WCAG 2.2: https://www.w3.org/WAI/WCAG22/quickref/
- WCAG 2.1: https://www.w3.org/WAI/WCAG21/quickref/
Summary Checklist
Before releasing ANY healthcare interface:
- WCAG 2.2 Level AA compliant (minimum)
- Keyboard navigation works for all functionality
- Focus indicators visible on all interactive elements
- Touch targets ≥ 44×44px for all clickable elements
- Color contrast ≥ 4.5:1 for normal text, ≥ 3:1 for large text
- All images have alt text (or alt="" for decorative)
- All form inputs have visible labels (not just placeholders)
- Error messages use patient safety language (no "Error", "Failed", etc.)
- Semantic HTML (proper headings, lists, buttons)
- Screen reader compatible (tested with NVDA/VoiceOver)
- Works at 200% zoom without horizontal scrolling
- High contrast mode supported
- Filipino/multilingual support (where applicable)
- Optimized for LGU/low-bandwidth contexts (where applicable)
Remember: Accessibility is not optional in healthcare. It's a patient safety requirement and legal obligation.