Accessibility

Last updated on 2026-09-03

The kit is built with WCAG AA accessibility as a baseline. Every component, from the public blog and comment forms to the admin CMS and media library, follows accessible patterns.

Accessibility Features

Keyboard Navigation

  • All interactive elements are keyboard-accessible
  • Tab order follows logical reading order
  • Focus indicators are visible on all focusable elements (focus-visible:ring-2)
  • Dialogs and sheets trap focus and return it on close
  • The admin sidebar, post editor, and media library are fully keyboard-navigable
  • Dropdown menus, tag pickers, and date pickers are fully keyboard-operable
  • Comment reply forms can be opened and submitted without a mouse

Screen Reader Support

  • Semantic HTML throughout: <nav>, <main>, <footer>, <article>, <section>
  • One <h1> per page with no heading level skips
  • All images have descriptive alt text sourced from the media library alt field
  • Icon-only buttons have aria-label attributes
  • Form fields have associated <label> elements
  • Validation errors use aria-invalid and aria-describedby
  • Heading hierarchy within articles follows proper nesting (h1 > h2 > h3)
  • Form submission results (comment posted, newsletter subscribed) are announced via aria-live regions
  • The admin post list and comment moderation tables use proper <thead>, <tbody>, and <th> elements

Color and Contrast

  • All text meets WCAG AA contrast ratio (4.5:1 for normal text, 3:1 for large text)
  • Status indicators use color + text + icon (never color alone)
  • Post status badges include text labels alongside color indicators
  • Both light and dark themes maintain contrast compliance
  • Focus rings are visible against all backgrounds
  • Article body text uses high-contrast foreground on the background surface

Reduced Motion

  • prefers-reduced-motion is respected throughout:
    @media (prefers-reduced-motion: reduce) {
      .animate-fade-in-up,
      .animate-float,
      .animate-scale-in {
        animation: none;
        opacity: 1;
        transform: none;
      }
    }
    
  • Page transitions, hover effects, and toast slide-ins are disabled for users who prefer reduced motion
  • Chart animations on the admin analytics dashboard are disabled

Touch Targets

  • All interactive elements meet the 44x44px minimum touch target size
  • Small visual elements (tag pills, category badges, action dots) use padding to increase the touch area
  • Calendar date pickers and filter buttons use min-h-11 px-3 for comfortable touch

Every page includes a skip-to-content link that becomes visible on focus, allowing keyboard users to bypass the navigation header or admin sidebar.

Form Accessibility

Forms are central to both public and admin experiences (comment forms, newsletter signup, post editor, media uploads):

  • Required fields are marked with a red asterisk and aria-required="true"
  • Validation errors appear inline below the field
  • Error fields have aria-invalid="true" and link to error text via aria-describedby
  • Submit buttons show loading state with aria-busy="true" during async operations
  • The public comment form is accessible without authentication -- name and email fields are clearly labeled
  • Newsletter signup forms use aria-describedby to associate helper text

Comment Form Accessibility

The public comment form is designed for broad accessibility:

  • All fields (name, email, comment body) have visible labels and placeholder text
  • The form does not require authentication, removing a barrier for assistive technology users
  • Successful comment submission is announced via an aria-live="polite" region
  • If moderation is enabled, a message explains that the comment is pending review
  • Reply-to-comment forms are inserted inline with proper focus management

Admin CMS Accessibility

The admin CMS follows the same standards as the public blog:

  • The sidebar navigation is keyboard-navigable with clear focus indicators
  • The post editor toolbar buttons have aria-label attributes describing their function
  • The media library grid items are focusable and have descriptive aria-label attributes (image filename and alt text)
  • Bulk action checkboxes in post and comment lists are properly labeled
  • Sortable table headers have aria-sort attributes
  • Pagination controls are keyboard-accessible with descriptive labels

Image Alt Text

  • All images uploaded through the media library include an alt text field
  • The alt text is required when inserting images into posts
  • When no alt text is provided, a warning is shown in the admin interface
  • Public-facing <img> tags always render the alt attribute from the media library record