React Accessibility: Making Your App Inclusive

October 29, 2024
accessibility, react, web development, inclusive design

In today’s digital landscape, creating inclusive web applications is not just a best practice; it’s a necessity. Accessibility ensures that everyone, including individuals with disabilities, can use and enjoy the web. This is particularly important for developers working with frameworks like React, where the focus on user experience must extend to all users, regardless of their abilities. When we talk about accessibility, we refer to the design and development of web applications that can be accessed and understood by people with various disabilities, including visual, auditory, motor, and cognitive impairments.

React Accessibility

React, with its component-based architecture, offers unique opportunities to enhance accessibility. By building accessible applications in React, developers can ensure that their applications are usable by a wider audience. This not only aligns with ethical development practices but also enhances the overall user experience. When users encounter accessible features, such as screen reader compatibility and keyboard navigation, they are more likely to engage with the application and find it enjoyable to use.

Consider the experience of someone with visual impairments navigating a web application. Without proper accessibility features, they might struggle to understand the content or interact with critical elements, leading to frustration and abandonment of the site. However, when an application is designed with accessibility in mind—using semantic HTML, ARIA roles, and keyboard navigation—it transforms the experience, allowing users to navigate seamlessly and engage fully with the content.

As we delve deeper into this topic, we’ll explore how you can leverage React’s capabilities to create accessible components, adhere to established web standards, and implement best practices. We will cover essential topics such as the Web Content Accessibility Guidelines (WCAG), the effective use of ARIA attributes, and tools for testing accessibility. This guide will equip you with the knowledge needed to build inclusive applications. Let’s embark on this journey to ensure that every user can interact with your React applications without barriers.


1. Understanding Web Accessibility Standards

To create accessible web applications in React, it’s crucial to understand the standards and guidelines that govern web accessibility. At the forefront of these guidelines are the Web Content Accessibility Guidelines (WCAG), which provide a comprehensive framework for making web content more accessible to people with disabilities. These guidelines are organized into four main principles: Perceivable, Operable, Understandable, and Robust—often referred to as the POUR principles.

Perceivable means that information and user interface components must be presented in ways that users can perceive. This includes providing text alternatives for non-text content, ensuring that all visual content can be read by screen readers, and offering captions for videos. For instance, when using an image in a React component, you should always include an alt attribute. Here’s an example:

<img src="logo.png" alt="Company Logo" />

In this code, the alt text describes the image, which is crucial for screen reader users. Additionally, using semantic HTML elements like <header>, <nav>, <main>, and <footer> helps structure content clearly, making it easier for assistive technologies to interpret.

Operable emphasizes that user interface components must be operable by all users. This includes providing keyboard accessibility, ensuring users can navigate and interact with all elements using only a keyboard. Many users, particularly those with motor disabilities, rely on keyboard shortcuts and navigation to access web applications. For example, consider a button in a React app that performs an important action:

<button onClick={handleClick} tabIndex="0">
  Submit
</button>

Setting the tabIndex attribute ensures that this button is focusable via keyboard navigation, allowing all users to interact with it.

Understandable highlights the importance of making information and operation of the user interface clear and consistent. This means that users should be able to comprehend the information being presented and how to interact with it. For example, using clear labeling of form elements enhances user comprehension. Here’s how you can create an accessible form in React:

<label htmlFor="email">Email:</label>
<input type="email" id="email" aria-describedby="emailHelp" />
<span id="emailHelp">We'll never share your email with anyone else.</span>

In this example, the htmlFor attribute in the <label> element associates it with the corresponding input field, making it clear what information is being requested.

Finally, Robust refers to the need for content to be robust enough to be reliably interpreted by a wide variety of user agents, including assistive technologies. This principle underscores the importance of using standard HTML and ARIA attributes properly to ensure compatibility with different browsers and assistive devices. In React, it’s essential to ensure that components are built using valid HTML and that they conform to accessibility best practices. For instance, using ARIA roles can enhance accessibility when necessary:

<div role="alert">
  This is an important message for the user.
</div>

By using the role attribute, you inform assistive technologies that this div contains important information that should be conveyed to the user immediately.

By understanding and applying these principles and examples, you can begin to create React applications that not only meet accessibility standards but also offer a better experience for all users. In the upcoming sections, we will delve into practical strategies for implementing these principles in your React components. This will include creating accessible components, leveraging ARIA attributes effectively, and managing focus and keyboard navigation to ensure that your applications are as inclusive as possible. Together, we can make the web a more accessible place for everyone.


2. Creating Accessible Components in React

Building accessible components in React is a crucial step in ensuring that your web applications are usable by everyone. Accessibility begins with the fundamentals of semantic HTML, which not only helps screen readers and other assistive technologies interpret your content but also promotes better SEO and performance. In this section, we’ll explore how to create accessible components, focusing on the use of semantic HTML, best practices for forms, and buttons.

Utilizing Semantic HTML

Semantic HTML refers to the use of HTML markup that conveys meaning about the content it contains. This not only enhances accessibility but also improves the overall structure and readability of your code. For example, using appropriate tags for different sections of your webpage helps screen readers understand the layout and context. Consider the following example of a simple navigation bar:

<nav>
  <ul>
    <li><a href="#home">Home</a></li>
    <li><a href="#about">About</a></li>
    <li><a href="#services">Services</a></li>
    <li><a href="#contact">Contact</a></li>
  </ul>
</nav>

In this code, the use of the <nav> element indicates that this section contains navigation links, allowing assistive technologies to convey this information to users.

Creating Accessible Forms

Forms are critical components of many web applications, but they can often pose accessibility challenges if not designed correctly. To create accessible forms, start by ensuring each input field is properly labeled. Using the label element not only helps visually but also associates the label with the corresponding input, which is especially important for screen reader users. Here’s an example:

<form>
  <label htmlFor="username">Username:</label>
  <input type="text" id="username" />
  
  <label htmlFor="password">Password:</label>
  <input type="password" id="password" />
  
  <button type="submit">Log In</button>
</form>

In this form, each label is linked to its input using the htmlFor attribute, making it clear for all users what information is being requested. Additionally, consider providing context or help text using the aria-describedby attribute, which can enhance understanding:

<label htmlFor="email">Email:</label>
<input type="email" id="email" aria-describedby="emailHelp" />
<span id="emailHelp">Please enter a valid email address.</span>

This approach not only guides users but also aids those using assistive technologies by providing extra context.

Buttons and Actionable Elements

Buttons play a vital role in user interaction, and ensuring they are accessible is essential. It’s important to use <button> elements for actions rather than using styled <div> or <span> elements, which may not have inherent accessibility features. Here’s an example of an accessible button:

<button onClick={handleSubmit} aria-label="Submit Form">
  Submit
</button>

In this example, the aria-label attribute provides additional information about the button’s purpose, making it clearer for screen reader users.

Focus Management

Another key aspect of creating accessible components is focus management. It’s essential to ensure that users can navigate your application using the keyboard. For instance, when a user submits a form, it’s often helpful to move the focus to a confirmation message or the next logical element. You can achieve this in React by using the ref attribute and the useEffect hook:

const confirmationRef = useRef(null);

const handleSubmit = () => {
  // Handle form submission logic
  confirmationRef.current.focus();
};

// In the return statement
<div tabIndex="-1" ref={confirmationRef} role="alert">
  Form submitted successfully!
</div>

This approach ensures that the confirmation message is focusable and alerts users when they submit the form.

By adhering to these practices and utilizing semantic HTML, you can create accessible components that enhance the usability of your React applications for all users. As we continue through this guide, we’ll explore leveraging ARIA roles and attributes to further enhance accessibility. Together, we can build web applications that are not only functional but also inclusive.


3. Leveraging ARIA Roles and Attributes

As you work to enhance accessibility in your React applications, understanding and effectively using ARIA (Accessible Rich Internet Applications) roles and attributes is essential. ARIA is a set of attributes that help bridge the gap between complex web applications and assistive technologies. By providing additional context and functionality, ARIA can make your components more accessible to users with disabilities. However, it’s important to use ARIA thoughtfully and only when necessary, as improper use can lead to confusion and degrade the user experience.

What is ARIA?

ARIA is designed to help developers improve accessibility in dynamic web applications where native HTML elements may not provide enough semantic meaning. ARIA attributes can be added to HTML elements to convey additional information about their roles, states, and properties. For example, you can use the role attribute to define the purpose of an element, like so:

<div role="dialog" aria-labelledby="dialogTitle" aria-modal="true">
  <h2 id="dialogTitle">Confirm Action</h2>
  <p>Are you sure you want to proceed?</p>
  <button onClick={handleConfirm}>Yes</button>
  <button onClick={handleCancel}>No</button>
</div>

In this example, the role attribute indicates that the div functions as a dialog, while aria-labelledby provides a reference to the element that labels the dialog, improving its clarity for screen reader users.

Using ARIA States and Properties

In addition to roles, ARIA provides a range of attributes that define the state of an element. These attributes help inform users of dynamic changes within an application. For instance, when a user interacts with a collapsible menu, you can use ARIA attributes to convey whether it’s expanded or collapsed:

<button
  aria-expanded={isExpanded}
  onClick={toggleMenu}>
  Menu
</button>
<ul role="menu" aria-hidden={!isExpanded}>
  <li role="menuitem">Option 1</li>
  <li role="menuitem">Option 2</li>
</ul>

In this code, aria-expanded indicates the state of the button, while aria-hidden communicates the visibility of the menu. When the state changes, updating these attributes ensures that assistive technologies accurately reflect the current status of the menu.

When to Use ARIA

While ARIA can significantly enhance accessibility, it’s important to remember that it should not replace native HTML features whenever possible. For example, instead of using ARIA roles for simple buttons, you should use native <button> elements, as they come with built-in accessibility features. Consider the following:

// Correct approach using native elements
<button onClick={handleClick}>Click Me</button>

// Less ideal using ARIA
<div role="button" tabIndex="0" onClick={handleClick} onKeyPress={handleKeyPress}>
  Click Me
</div>

The first example uses a native button, which is inherently accessible and provides necessary keyboard and focus behaviors. The second example, while it can work, introduces additional complexity without the benefits of using a native element.

Testing ARIA Implementation

Once you have integrated ARIA roles and attributes into your components, it’s essential to test their effectiveness. Use screen reader tools like NVDA or JAWS to experience your application as users with disabilities would. Check whether ARIA attributes are conveying the intended meaning and whether they are functioning as expected. Additionally, consider using accessibility testing tools like Axe or Lighthouse to evaluate your application’s compliance with accessibility standards.

By leveraging ARIA roles and attributes effectively, you can create dynamic, accessible experiences in your React applications. These enhancements, when combined with semantic HTML and best practices, help ensure that all users, regardless of their abilities, can interact with your applications meaningfully. In the next section, we will explore the crucial aspects of managing focus and keyboard navigation to further enhance the accessibility of your React applications.


4. Managing Focus and Keyboard Navigation

Focus management and keyboard navigation are key aspects of creating accessible React applications. Users who rely on keyboards or assistive devices often depend on focus indicators and logical navigation flows to interact with your application effectively. By managing focus and ensuring keyboard accessibility, you create a more inclusive experience for all users, especially those with motor disabilities.

Why Focus Management is Important

Focus management ensures that users know where they are on the page and can navigate through your application intuitively. In a React app, focus can be manually controlled to guide users to important sections or components. This is especially helpful in scenarios like form submission, modal dialogs, and dynamic content updates, where users might otherwise be unsure of their location within the app.

For instance, when a modal dialog opens, moving the focus to the modal’s first interactive element ensures that users don’t have to tab through the entire page to reach it. When the modal closes, the focus should ideally return to the element that triggered it.

Setting Focus with React Refs

React’s useRef hook allows you to directly access and manage focus on elements. Here’s an example where we set focus to a dialog when it opens:

import { useRef, useEffect } from 'react';

function Modal({ isOpen, onClose }) {
  const modalRef = useRef(null);

  useEffect(() => {
    if (isOpen) {
      modalRef.current.focus();
    }
  }, [isOpen]);

  return isOpen ? (
    <div 
      role="dialog" 
      aria-modal="true" 
      tabIndex="-1" 
      ref={modalRef}>
      <h2>Modal Title</h2>
      <p>This is a modal dialog.</p>
      <button onClick={onClose}>Close</button>
    </div>
  ) : null;
}

In this example, when isOpen is true, focus is set to the modal using modalRef.current.focus(). This helps screen reader and keyboard users immediately know they are in the dialog when it appears.

Implementing Keyboard Navigation

Ensuring that every interactive element is accessible via the keyboard is essential for users who rely on it to navigate. In React, this can be achieved by setting the tabIndex property and handling keyboard events for custom components. For example, if you’re creating a custom dropdown, ensure it’s navigable with both Tab and Enter keys:

function Dropdown({ options }) {
  const [isOpen, setIsOpen] = useState(false);

  const handleKeyDown = (event) => {
    if (event.key === 'Enter') {
      setIsOpen(!isOpen);
    }
  };

  return (
    <div 
      role="button" 
      tabIndex="0" 
      onKeyDown={handleKeyDown} 
      onClick={() => setIsOpen(!isOpen)}>
      Select an option
      {isOpen && (
        <ul>
          {options.map((option, index) => (
            <li key={index} tabIndex="0">{option}</li>
          ))}
        </ul>
      )}
    </div>
  );
}

Here, the role="button" and tabIndex="0" attributes make the dropdown button focusable and interactive via keyboard navigation. The onKeyDown event listens for the Enter key to toggle the dropdown, creating a more intuitive experience for keyboard users.

Skip Links and Focus Traps

For complex pages, providing skip links allows users to jump directly to the main content, skipping repetitive elements like navigation menus. This can be particularly beneficial for screen reader users. Here’s a simple skip link example:

<a href="#mainContent" className="skip-link">Skip to main content</a>
<main id="mainContent">
  <h1>Welcome to the Page</h1>
  {/* Main content here */}
</main>

Focus traps, on the other hand, are used to keep focus within a specific section of the page, such as a modal dialog. By implementing a focus trap, you prevent users from accidentally tabbing out of the dialog, which can create a confusing experience.

Testing Focus Management and Keyboard Accessibility

To ensure your focus management and keyboard navigation implementations work effectively, thorough testing is essential. Use keyboard navigation to test the tab order and confirm that focus transitions smoothly between elements. Additionally, try using screen reader tools to verify that the current focus is announced correctly when navigating through interactive elements.

By managing focus and providing intuitive keyboard navigation, you can significantly enhance the accessibility and usability of your React applications. In the next section, we’ll discuss testing tools and methods to help validate your application’s accessibility compliance, allowing you to identify and address any remaining accessibility barriers.


5. Common Accessibility Pitfalls in React

While React provides powerful tools for building dynamic web applications, it also comes with its own set of accessibility challenges. Understanding common pitfalls can help developers create more accessible experiences and avoid barriers that may hinder users with disabilities. This section highlights some frequent mistakes and offers guidance on how to overcome them.

1. Overlooking Semantic HTML

One of the most significant pitfalls is neglecting semantic HTML. React components often abstract away standard HTML elements, leading developers to use generic elements like <div> and <span> instead of appropriate semantic elements (like <header>, <main>, <nav>, and <footer>). Semantic HTML provides context to assistive technologies, improving navigation and comprehension for users relying on screen readers.

Solution: Always use semantic elements when appropriate. For example, instead of creating a navigation menu with <div> elements, use the <nav> element. Not only does this improve accessibility, but it also helps with SEO.

2. Missing Alt Text for Images

Images without proper alt attributes can create barriers for visually impaired users who rely on screen readers. If the alt text is omitted or poorly written, these users may miss crucial information or context that the image conveys.

Solution: Ensure that all images have meaningful alt text. If an image serves a decorative purpose and doesn’t add informational value, use an empty alt attribute (alt=""). For functional images (like buttons or links), the alt text should describe the function or content accurately.

3. Neglecting Keyboard Navigation

Failing to ensure that all interactive elements are keyboard accessible is a common oversight. Users who rely on keyboard navigation should be able to access and interact with every part of your application without using a mouse.

Solution: Implement proper focus management and ensure all interactive elements (buttons, links, form inputs) can be navigated using the keyboard alone. Additionally, be mindful of focus states, so users can easily see which element is currently focused.

4. Using ARIA Incorrectly

While ARIA (Accessible Rich Internet Applications) attributes can enhance accessibility, they can also lead to confusion when misused. Relying solely on ARIA to make elements accessible often results in a false sense of security, as native HTML elements already come with built-in accessibility features.

Solution: Use native HTML elements wherever possible, as they are inherently more accessible. If ARIA is necessary, ensure it is used correctly. For example, avoid using role="button" on a <div> when you can use a <button> element instead.

5. Inadequate Focus Management

Dynamic content updates, such as modals or dropdowns, require careful focus management to ensure users can navigate effectively. Failing to manage focus can leave users lost in the application or unable to interact with new content.

Solution: When opening a modal, move focus to the modal’s first interactive element. Once the modal is closed, return focus to the element that triggered it. This practice keeps users oriented within the application.

6. Ignoring Color Contrast

Poor color contrast can render text unreadable, especially for users with visual impairments. It’s essential to ensure that text is legible against its background to facilitate readability.

Solution: Follow WCAG guidelines for color contrast ratios, which recommend a minimum contrast ratio of 4.5:1 for normal text and 3:1 for large text. Tools like the WebAIM Color Contrast Checker can help evaluate color combinations.

7. Lack of Accessible Forms

Forms are critical components of many applications, yet they can pose significant accessibility challenges. Issues often arise from missing labels, unclear instructions, or complex layouts that are difficult to navigate.

Solution: Ensure every form input has a corresponding label, either through the <label> element or via an ARIA attribute. Use clear, descriptive instructions and error messages to guide users through the form. Additionally, consider implementing validation that is accessible and conveys information clearly.

8. Not Testing with Real Users

Finally, one of the most common pitfalls is not testing your application with real users, especially those who rely on assistive technologies. Automated testing tools are helpful, but they cannot replace the insights gained from real user experiences.

Solution: Conduct usability testing with individuals who have disabilities. Gather feedback on their experiences and make iterative improvements based on their input.

By being aware of these common accessibility pitfalls, you can better equip yourself to create React applications that are inclusive and user-friendly for all individuals, regardless of their abilities.


6. Testing and Validating Accessibility in React Applications

To create a truly accessible React application, it’s essential to test and validate your work continuously. Accessibility testing helps ensure that your app is usable by all users, especially those with disabilities. By using a mix of manual and automated testing, you can identify and address accessibility issues, improve user experience, and meet compliance with accessibility standards.

Automated Testing Tools for Accessibility

Automated testing tools are a great starting point for identifying common accessibility issues. These tools scan your application, highlight potential problems, and provide suggestions for fixes. Some popular automated tools for accessibility testing include:

Manual Testing Techniques

While automated tools are helpful, they can’t catch everything. Manual testing is necessary to ensure a fully accessible experience. Here are some key manual testing techniques:

Accessibility in Your Development Workflow

To maintain accessibility standards throughout your project, consider building accessibility testing into your development workflow. You can achieve this by:

Common Accessibility Issues and How to Address Them

Even with the best intentions, certain accessibility issues frequently arise. Here are a few common ones and tips on how to address them:

By combining automated tools, manual testing, and regular accessibility checks in your workflow, you can ensure a more accessible React application. In the next section, we’ll explore how to maintain accessibility as your application grows, ensuring ongoing inclusivity and usability for all users.


7. Maintaining Accessibility as Your Application Grows

Building accessibility into an application is a continuous process. As your React application evolves and features are added, accessibility considerations must remain a priority to prevent regressions and ensure usability for all users. This section covers strategies for maintaining accessibility in an expanding codebase, helping you integrate accessibility best practices into both your development and testing workflows.

Establish Accessibility Standards and Documentation

Creating a set of accessibility standards for your project provides a clear guideline for your development team to follow. These standards may include recommendations on topics like:

Documenting these standards in a style guide, codebase README, or developer documentation hub makes it easy for team members to reference and apply them as new components are created.

Using Component Libraries with Accessibility in Mind

If you’re using or building a component library, ensure that accessibility is integrated into each component by default. Many popular libraries, such as Material-UI or Reach UI, are designed with accessibility considerations in mind, making it easier to build accessible applications without reinventing the wheel. However, it’s still important to evaluate any third-party library you incorporate to confirm that it meets accessibility standards.

For instance, if your team is using a custom button component, ensure it includes focus states, keyboard interaction, and proper ARIA attributes where necessary. Consider creating a checklist for reviewing the accessibility of each component in your library, ensuring each new addition is consistent with your accessibility standards.

Implementing Regular Accessibility Audits

As your application grows, periodically auditing it for accessibility is essential. Regular audits help you identify areas that may have regressed or require improvements. Some approaches for routine audits include:

Accessibility Training and Knowledge Sharing

Creating an accessible application is a team effort, so consider organizing training sessions or workshops on accessibility best practices for your development team. Training may cover topics such as:

Consider designating an “accessibility champion” within your team—someone who is passionate about accessibility and can help review code, assist with audits, and keep the team updated on best practices and new standards.

User Feedback and Continuous Improvement

The best insights often come from real users. Providing users with a feedback channel, such as an accessibility feedback form, allows them to share their experiences and report any issues they encounter. This feedback can be invaluable in identifying issues that automated tools may overlook.

For example, if a user with visual impairments struggles to navigate a new feature, their feedback might reveal a problem with your color contrast or ARIA labeling that you hadn’t anticipated. Using this feedback, you can make iterative improvements that ensure your application stays accessible as it evolves.

Keeping Accessibility at the Forefront of Development

Integrating accessibility into your development practices ensures that it remains a priority. Some practical ways to maintain this focus include:

By adopting these practices, you can maintain accessibility even as your application grows in complexity. With a solid foundation, regular audits, and user feedback, you can ensure your application remains inclusive and usable for all users.


8. The Broader Impact of Accessibility and Ethical Responsibility

Creating accessible applications is more than just meeting compliance standards; it’s about fostering inclusivity and enhancing usability for all users. Accessibility not only opens up your app to a broader audience but also creates lasting benefits that span usability, reach, and even business impact.

Real-World Benefits of Accessible Design

Accessible applications can significantly improve user engagement and satisfaction. For example, a major retailer found that by enhancing accessibility on their website, they increased conversions among users with disabilities and gained positive feedback from all users due to improved navigation. Investing in accessible design creates a win-win scenario: it provides a better experience for all users and opens doors to market segments that may otherwise be left out.

Embedding Accessibility Into Development Practices

Integrating accessibility into your regular development practices benefits users and simplifies your workflow over time. For example, consider running quarterly accessibility audits or adding accessibility checks as standard parts of code reviews. When accessibility is considered from the start, it reduces the need for extensive rework later and helps maintain code consistency as the application grows.

Similarly, collaborating with designers to ensure accessible design patterns—such as sufficient contrast, readable font sizes, and intuitive layouts—keeps accessibility top of mind from the beginning, saving time and effort down the line.

Quantifying the ROI of Accessibility

The return on investment for accessibility can be substantial. Studies show that accessible websites typically perform better in SEO, improve overall usability, and reduce the risk of costly legal actions due to compliance issues. Accessible design also leads to cleaner, more structured code, which often enhances performance and maintainability. With more inclusive design, you also open up your application to a wider, more diverse user base, increasing potential reach and engagement.

Accessibility as a Shared Responsibility

Building accessible applications requires a team-wide commitment. Advocacy for accessibility starts with small actions: incorporating it into code reviews, setting team goals around accessibility compliance, or simply sharing user feedback related to accessibility improvements. By making accessibility a shared responsibility, you contribute to a culture of inclusivity that benefits both your users and your team.

Aligning Practical and Ethical Motivations

Ultimately, accessibility benefits all users, not only those with disabilities. While some may see accessibility as an ethical imperative, others may be motivated by the practical benefits or compliance needs. Whichever the motivation, accessible design serves as a core principle of good development, building a more equitable digital space for everyone.


Final Thoughts: Creating an Accessible, Inclusive React Application

By prioritizing accessibility throughout your React application, you’re not only meeting standards but building a digital space where all users can participate fully. From understanding the fundamentals of web accessibility to implementing screen reader compatibility, keyboard navigation, and accessible forms, each step brings you closer to an inclusive experience for every user. Integrating testing tools and regular audits helps you maintain accessibility as your app evolves, ensuring that your commitment to inclusivity remains intact.

Accessibility isn’t just a task to check off; it’s an ongoing responsibility that benefits your users and strengthens your application. Embracing accessibility makes your code more maintainable, your app more engaging, and your team more unified around a shared purpose. It’s a commitment to all users—whatever their abilities—and a testament to the power of thoughtful, inclusive design.

As you continue developing, remember that accessibility is a journey, not a destination. With each accessible feature you build, you’re helping create a more open, welcoming digital world for everyone.


References

  1. Web Content Accessibility Guidelines (WCAG
  2. React Accessibility
  3. The A11y Project
  4. Color Contrast Checker
  5. MDN ARIA Guide
  6. WebAIM: Accessible Forms
  7. React Testing Library
  8. Inclusive Components

Comments