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).
Comprehensive healthcare user experience standards ensuring accessibility, patient safety, and usability for MYCURE clinical and government health products.
WCAG 2.2 Level AA compliance is MANDATORY for all MYCURE interfaces.
Why it matters:
Error messages must not alarm or undermine trust.
Why it matters:
Design for variable infrastructure and diverse users.
Challenges:
outline: none without replacement)<!-- ✅ 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>
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:
<!-- ❌ 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>
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.
/* ✅ 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 */
}
/* ✅ 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 */
}
<!-- ❌ 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>
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>
<!-- ✅ 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>
<!-- ❌ 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>
<!-- ✅ 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>
Healthcare software must not alarm patients or undermine trust.
| ❌ 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 |
❌ Error: Field required
✅ Please enter patient name
❌ Invalid email address
✅ Please enter a valid email address (e.g., [email protected])
❌ Error: Value too high
✅ Quantity cannot exceed 500 (available stock)
❌ 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.
❌ Access denied - forbidden
✅ You don't have permission to access this section.
Please contact your administrator for assistance.
❌ Server down - error 500
✅ We're experiencing technical difficulties.
Your data is safe. Please try again in a few moments.
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:
Design for:
Technical Constraints:
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 */
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>
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>
Automated (30% of issues):
Keyboard Navigation (Manual):
Screen Reader (Manual):
Visual Testing:
Before Release:
Problem:
/* ❌ Removes all focus indicators */
* {
outline: none;
}
Fix:
/* ✅ Replace with visible focus indicator */
*:focus-visible {
outline: 3px solid var(--clinical-blue);
outline-offset: 2px;
}
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"
>
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;
}
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.
Reference Documents:
Testing Tools:
Screen Readers:
WCAG Guidelines:
Before releasing ANY healthcare interface:
Remember: Accessibility is not optional in healthcare. It's a patient safety requirement and legal obligation.