with one click
rams
Accessibility and visual design review based on WCAG 2.1
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Accessibility and visual design review based on WCAG 2.1
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Creative direction for AI image generation — distill a codebase's FEEL canon (taste tokens, TDRs, persona files) into prompt-ready material vocabulary, map product architecture to scene systems, and enforce visual discipline across banner sets and scene stacks.
Analyze feedback logs to detect design preference patterns. Auto-contributes HIGH confidence patterns upstream.
Motion design and animation patterns for UI based on Emil Kowalski's principles
Touch, keyboard, and form interaction patterns for accessible UI
Design physics system for UI interactions - sync strategies, timing, confirmations
Convert vague "feel" feedback into specific actionable fixes via decomposition questions
| name | rams |
| description | Accessibility and visual design review based on WCAG 2.1 |
| user-invocable | true |
| allowed-tools | Read, Write, Glob, Grep, Edit, Bash |
Expert accessibility and visual design review for React components based on WCAG 2.1 guidelines.
/rams [file]
Rams reviews code for accessibility issues and visual design problems. Named after Dieter Rams whose design principles emphasize that good design makes a product useful and understandable.
Use this skill when:
If a file is specified, analyze that file. If no file specified, scan for component files:
# Find React components
find src -name "*.tsx" -o -name "*.jsx" | head -20
| Check | WCAG | What to look for |
|---|---|---|
| Images without alt | 1.1.1 | <img> without alt attribute |
| Icon-only buttons | 4.1.2 | <button> with only SVG/icon, no aria-label |
| Form inputs without labels | 1.3.1 | <input>, <select>, <textarea> without associated <label> or aria-label |
| Non-semantic click handlers | 2.1.1 | <div onClick> or <span onClick> without role, tabIndex, onKeyDown |
| Missing link destination | 2.1.1 | <a> without href using only onClick |
Detection patterns:
// Missing alt text
<img src="..." /> // FAIL
<img src="..." alt="" /> // OK (decorative)
<img src="..." alt="Description" /> // OK
// Icon-only buttons
<button><CloseIcon /></button> // FAIL
<button aria-label="Close"><CloseIcon /></button> // OK
// Missing form labels
<input type="email" /> // FAIL
<label>Email <input type="email" /></label> // OK
<input type="email" aria-label="Email" /> // OK
// Non-semantic handlers
<div onClick={handleClick}>Click me</div> // FAIL
<button onClick={handleClick}>Click me</button> // OK
| Check | WCAG | What to look for |
|---|---|---|
| Focus outline removed | 2.4.7 | outline-none without visible focus replacement |
| Missing keyboard handlers | 2.1.1 | Interactive elements with onClick but no keyboard support |
| Color-only information | 1.4.1 | Status indicated only by color (no icon/text) |
| Touch target too small | 2.5.5 | Clickable elements smaller than 44x44px |
Detection patterns:
/* Focus outline removed - FAIL */
.button {
outline: none;
}
/* OK - has visible replacement */
.button {
outline: none;
}
.button:focus-visible {
ring: 2px;
}
// Color-only error - FAIL
<input className={error ? "border-red-500" : ""} />
// OK - has text indicator
<input className={error ? "border-red-500" : ""} />
{error && <span className="text-red-500">{error}</span>}
| Check | WCAG | What to look for |
|---|---|---|
| Heading hierarchy | 1.3.1 | Skipped heading levels (h1 → h3) |
| Positive tabIndex | 2.4.3 | tabIndex > 0 (disrupts natural order) |
| Role without required attributes | 4.1.2 | role="button" without tabIndex="0" |
Check for:
Check for:
Check for:
Check for missing states:
Output format:
═══════════════════════════════════════════════════
RAMS DESIGN REVIEW: [filename]
═══════════════════════════════════════════════════
CRITICAL (X issues)
───────────────────
[A11Y] Line 24: Button missing accessible name
<button><CloseIcon /></button>
Fix: Add aria-label="Close"
WCAG: 4.1.2
[A11Y] Line 45: Image missing alt text
<img src="/hero.jpg" />
Fix: Add alt="Hero image description"
WCAG: 1.1.1
SERIOUS (X issues)
──────────────────
[A11Y] Line 67: Focus outline removed without replacement
className="outline-none"
Fix: Add focus-visible:ring-2
WCAG: 2.4.7
[VISUAL] Line 89: Touch target too small
className="w-6 h-6"
Fix: Add min-w-[44px] min-h-[44px]
WCAG: 2.5.5
MODERATE (X issues)
───────────────────
[A11Y] Line 102: Skipped heading level
<h1>Title</h1> ... <h3>Section</h3>
Fix: Use <h2> for sections under h1
WCAG: 1.3.1
═══════════════════════════════════════════════════
SUMMARY: X critical, X serious, X moderate
Score: XX/100
═══════════════════════════════════════════════════
After generating report, offer to fix issues:
Would you like me to fix these issues?
[1] Fix all critical issues
[2] Fix all issues
[3] Fix specific issue (by line number)
[4] Skip
Run these to find common issues:
# Find images without alt
grep -rn "<img" --include="*.tsx" | grep -v "alt="
# Find buttons with only icons
grep -rn "<button>" --include="*.tsx" | grep -v "aria-label"
# Find outline-none without focus replacement
grep -rn "outline-none" --include="*.tsx"
# Find onClick on non-semantic elements
grep -rn "div onClick\|span onClick" --include="*.tsx"
| Category | Weight | Scoring |
|---|---|---|
| Critical issues | 30 points each | -30 per issue |
| Serious issues | 15 points each | -15 per issue |
| Moderate issues | 5 points each | -5 per issue |
Score thresholds:
| Level | Description | Required for |
|---|---|---|
| A | Minimum accessibility | All websites |
| AA | Standard accessibility | Most regulations |
| AAA | Enhanced accessibility | Specialized needs |
Common WCAG references:
CRITICAL (must fix):
├── img without alt
├── button without aria-label (icon-only)
├── input without label
├── div/span with onClick (use button)
└── a without href
SERIOUS (should fix):
├── outline-none without focus replacement
├── onClick without keyboard handler
├── Color-only status indicators
└── Touch targets < 44px
MODERATE (consider):
├── Skipped heading levels
├── tabIndex > 0
└── role without required attributes
AUTOMATED CHECKS:
├── grep for missing alt
├── grep for outline-none
├── grep for onClick on div/span
└── Review all button elements
Before Review:
├── [ ] Identify all interactive elements
├── [ ] Identify all images and icons
├── [ ] Identify all form inputs
└── [ ] Check heading structure
Critical Checks:
├── [ ] All images have alt text
├── [ ] All buttons have accessible names
├── [ ] All inputs have labels
├── [ ] All click handlers on semantic elements
└── [ ] All links have href
Serious Checks:
├── [ ] Focus indicators visible
├── [ ] Keyboard navigation works
├── [ ] Color not sole indicator
└── [ ] Touch targets adequate
Visual Checks:
├── [ ] Spacing consistent
├── [ ] Typography consistent
├── [ ] All states implemented
└── [ ] Dark mode works