skills/a11y-checker/SKILL.md
Accessibility audit for CSS covering focus styles, color contrast, text sizing, screen reader support, and WCAG compliance. Provides actionable fixes. Use when auditing accessibility or fixing a11y issues.
npx skillsauth add andronics/claude-plugin-css-pro a11y-checkerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill performs comprehensive CSS accessibility audits based on WCAG 2.2 guidelines. I'll identify issues and provide specific, actionable fixes to make your styles more accessible.
/* Removes default focus outline */
button:focus {
outline: none;
}
/* No visible focus indicator */
.link:focus {
text-decoration: underline;
}
/* Clear, visible focus indicator */
button:focus-visible {
outline: 2px solid #0066cc;
outline-offset: 2px;
}
/* High contrast focus ring */
.link:focus-visible {
outline: 2px solid currentColor;
outline-offset: 4px;
text-decoration: underline;
}
/* Fallback for browsers without :focus-visible */
button:focus {
outline: 2px solid #0066cc;
outline-offset: 2px;
}
button:focus:not(:focus-visible) {
outline: none;
}
/* 2.85:1 contrast - fails AA */
.text-muted {
color: #999999;
background: #ffffff;
}
/* 3.2:1 contrast - fails AA for normal text */
.button {
color: #3b82f6;
background: #ffffff;
}
/* 7.03:1 contrast - passes AAA */
.text-muted {
color: #666666;
background: #ffffff;
}
/* 7.02:1 contrast - passes AAA */
.button {
color: #2563eb;
background: #ffffff;
}
/* Alternative: Use for large text only */
.large-text {
font-size: 18px; /* or 14px bold */
color: #3b82f6; /* 4.52:1 - passes AA for large text */
}
/* 20x20px - too small */
.icon-button {
width: 20px;
height: 20px;
padding: 0;
}
/* 44x44px - meets WCAG 2.5.5 */
.icon-button {
width: 44px;
height: 44px;
padding: 12px; /* 20px icon + 12px padding each side */
}
/* Or use minimum size */
.icon-button {
min-width: 44px;
min-height: 44px;
padding: 0.75rem;
}
/* Animated without considering preferences */
.animated {
animation: spin 2s infinite;
transition: all 0.5s ease;
}
/* Respects user preferences */
.animated {
animation: spin 2s infinite;
transition: all 0.5s ease;
}
@media (prefers-reduced-motion: reduce) {
.animated {
animation-duration: 0.01ms;
animation-iteration-count: 1;
transition-duration: 0.01ms;
}
}
/* Or completely remove animations */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-play-state: paused !important;
transition-duration: 0.01ms !important;
}
}
/* Hidden from everyone including screen readers */
.error-message {
display: none;
}
.announcement {
visibility: hidden;
}
/* Visually hidden but accessible to screen readers */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/* Hidden until shown (keeps in DOM) */
.error-message {
position: absolute;
left: -9999px;
opacity: 0;
}
.error-message.visible {
position: static;
opacity: 1;
}
/* 10px - too small to read */
.caption {
font-size: 10px;
}
/* Fixed pixel sizes don't scale */
body {
font-size: 14px;
}
/* Minimum 12px, uses relative units */
.caption {
font-size: 0.75rem; /* 12px if root is 16px */
}
/* Uses relative units for scalability */
body {
font-size: 1rem; /* 16px default, scales with user preferences */
}
.small {
font-size: 0.875rem; /* 14px */
}
/* Or use clamp for fluid sizing */
body {
font-size: clamp(1rem, 2vw, 1.125rem);
}
/* 1.1 line height - too tight */
.text {
line-height: 1.1;
}
/* 1.5 line height - WCAG recommendation */
.text {
line-height: 1.5;
}
/* Adjust for different text sizes */
.heading {
line-height: 1.2; /* Tighter for large text */
}
.body {
line-height: 1.5; /* Normal for body text */
}
.caption {
line-height: 1.4; /* Slightly tighter for small text */
}
/* Hover-only dropdown - not keyboard accessible */
.nav-item:hover .dropdown {
display: block;
}
/* CSS-only toggle - not accessible */
#toggle:checked + .content {
display: block;
}
/* Keyboard accessible dropdown */
.nav-item:hover .dropdown,
.nav-item:focus-within .dropdown {
display: block;
}
/* Or better: use JavaScript for complex interactions */
/* For toggle, ensure keyboard access */
.toggle-button:focus + .content,
.toggle-button[aria-expanded="true"] + .content {
display: block;
}
/* Accessible button component */
.button {
/* Size & spacing */
min-width: 44px;
min-height: 44px;
padding: 0.75rem 1.5rem;
font-size: 1rem; /* 16px */
/* Contrast */
background: #2563eb; /* 7.02:1 on white */
color: white; /* 9.52:1 on button bg */
border: 2px solid transparent;
/* Typography */
font-weight: 600;
line-height: 1;
text-align: center;
/* Visual */
border-radius: 0.375rem;
cursor: pointer;
transition: all 0.2s ease;
}
/* Hover state */
.button:hover {
background: #1d4ed8; /* Darker, higher contrast */
transform: translateY(-1px);
}
/* Focus state */
.button:focus-visible {
outline: 2px solid #0066cc;
outline-offset: 2px;
}
/* Active state */
.button:active {
transform: translateY(0);
}
/* Disabled state */
.button:disabled {
background: #93c5fd;
color: #1e40af;
cursor: not-allowed;
opacity: 0.7;
}
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
.button {
transition-duration: 0.01ms;
}
.button:hover {
transform: none;
}
}
/* High contrast mode */
@media (prefers-contrast: high) {
.button {
border-color: currentColor;
}
}
You: "Audit this button for accessibility issues"
.button {
font-size: 12px;
padding: 5px 10px;
color: #999;
background: white;
border: 1px solid #ccc;
}
.button:focus {
outline: none;
}
I'll respond:
🔴 CRITICAL: No focus indicator
🔴 CRITICAL: Insufficient contrast
🟠 IMPORTANT: Small touch target
🟠 IMPORTANT: Small text size
.button {
/* Size */
min-width: 44px;
min-height: 44px;
padding: 0.75rem 1.5rem;
/* Typography */
font-size: 1rem; /* 16px */
font-weight: 500;
/* Colors - AAA compliant */
color: #1f2937; /* 14.07:1 on white */
background: white;
border: 2px solid #6b7280; /* 5.77:1 on white */
/* Interaction */
cursor: pointer;
transition: all 0.2s ease;
}
.button:hover {
border-color: #374151;
background: #f9fafb;
}
.button:focus-visible {
outline: 2px solid #2563eb;
outline-offset: 2px;
}
@media (prefers-reduced-motion: reduce) {
.button {
transition-duration: 0.01ms;
}
}
Request an accessibility audit:
I'll identify problems and provide fixes!
tools
Responsive design assistance including breakpoint generation, fluid typography, container queries, and mobile-first/desktop-first strategy guidance. Use when creating responsive layouts or adapting designs for multiple screen sizes.
development
CSS performance analysis covering bundle size, selector complexity, render-blocking resources, critical CSS, and optimization strategies. Use when CSS performance is slow or bundle size is too large.
development
Interactive Flexbox and Grid layout generator with real-time code output. Creates production-ready layouts based on your requirements with proper fallbacks and responsive considerations. Use when building layouts, grids, or complex positioning systems.
development
Design token management for creating, organizing, and applying design tokens across projects. Supports multiple formats (CSS custom properties, Sass, JS, JSON). Use when setting up design systems or managing design tokens.