npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@microsoft/eslint-plugin-fluentui-jsx-a11y

v3.0.0-alpha.1

Published

Static AST checker for accessibility rules on FluentUI JSX elements.

Downloads

1,194

Readme

eslint-plugin-fluentui-jsx-a11y npm version

A set of eslint rules against Fluent UI React v9 to prevent common accessibility issues.

Finally! Lint rules against React props.

Covers hard-coded string props and variables for props.

<Label htmlFor="some-id">Some Label</Label>
<Input id="some-id" />
<Label htmlFor={someId}>Some Label</Label>
<Input id={someId} />

Developed and maintained by the Microsoft Research Ireland Accessibility V-Team.

Installation

You'll first need to install ESLint:

# npm
npm install eslint --save-dev

# yarn
yarn add eslint --dev

Next, install @microsoft/eslint-plugin-fluentui-jsx-a11y:

# npm
npm install @microsoft/eslint-plugin-fluentui-jsx-a11y --save-dev

# yarn
yarn add @microsoft/eslint-plugin-fluentui-jsx-a11y --dev

Or add this package to your package.json file:

"devDependencies": {
    "@microsoft/eslint-plugin-fluentui-jsx-a11y": "1.0.0"
  }

And then you can run

  npm install

Usage

You will need to add the plugin to your .eslintrc configuration file.

Suggested Configuration:

{
  "root": true,
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 2018,
    "sourceType": "module"
  },
  "plugins": [
    "@typescript-eslint",
    "react-hooks",
    "@microsoft/fluentui-jsx-a11y"
  ],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:react/recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:@microsoft/fluentui-jsx-a11y/recommended"
  ],
  "rules": {
    "react-hooks/rules-of-hooks": "error",
    "react-hooks/exhaustive-deps": "warn",
    "react/prop-types": "off",
  },

Why?

This plugin does a static code analysis of the React JSX to spot accessibility issues in apps built with FluentUI. That way, common accessibility issues are detected before the pull request stage and will be prevented from being checked into a code base.

As the plugin can only catch errors in static source code, please use it in combination with @axe-core/react to test the accessibility of the rendered DOM. Consider these tools just as one step of a larger a11y testing process and always test your apps with assistive technology.

We also recomend that you use this plugin in conjuction with the eslint-plugin-jsx-a11y plugin. Please configure eslint-plugin-jsx-a11y to work with FluentUI components.

Example:

{
    "settings": {
        "jsx-a11y": {
            "components": {
                "Button": "button",
                "Image": "img"
            }
        }
    }
}

ESLint

This plugin was generated with The ESLint generator for Yeoman: eslint/generator-eslint.

eslint:plugin

yo eslint:plugin

eslint:rule

If you want to create a new ESLint rule, make sure you're in the top-level directory of an ESLint repo clone or an ESLint plugin and type:

yo eslint:rule

Trademarks

This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.

Rules

💼 Configurations enabled in.
⚠️ Configurations set to warn in.
✅ Set in the recommended configuration.
🔧 Automatically fixable by the --fix CLI option.

| Name                                  | Description | 💼 | ⚠️ | 🔧 | | :------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------ | :- | :- | :- | | accordion-header-needs-labelling | The accordion header is a button and it needs an accessibile name e.g. text content, aria-label, aria-labelledby. | ✅ | | | | accordion-item-needs-header-and-panel | An AccordionItem needs exactly one header and one panel | ✅ | | | | avatar-needs-name | Accessibility: Avatar must have an accessible labelling: name, aria-label, aria-labelledby | ✅ | | | | breadcrumb-needs-labelling | All interactive elements must have an accessible name | ✅ | | | | checkbox-needs-labelling | Accessibility: Checkbox without label must have an accessible and visual label: aria-labelledby | ✅ | | | | combobox-needs-labelling | All interactive elements must have an accessible name | ✅ | | | | compound-button-needs-labelling | Accessibility: Compound buttons must have accessible labelling: title, aria-label, aria-labelledby, aria-describedby | ✅ | | | | dropdown-needs-labelling | Accessibility: Dropdown menu must have an id and it needs to be linked via htmlFor of a Label | ✅ | | | | image-button-missing-aria | Accessibility: Image buttons must have accessible labelling: title, aria-label, aria-labelledby, aria-describedby | ✅ | | | | image-link-missing-aria | Accessibility: Image links must have an accessible name | ✅ | | 🔧 | | input-missing-label | Accessibility: Input fields must have accessible labelling: aria-label, aria-labelledby or an associated label | ✅ | | | | menu-item-needs-labelling | Accessibility: MenuItem without label must have an accessible and visual label: aria-labelledby | ✅ | | | | no-empty-buttons | Accessibility: Button, ToggleButton, SplitButton, MenuButton, CompoundButton must either text content or icon or child component | ✅ | | | | no-empty-components | FluentUI components should not be empty | ✅ | | | | prefer-aria-over-title-attribute | The title attribute is not consistently read by screen readers, and its behavior can vary depending on the screen reader and the user's settings. | | ✅ | 🔧 | | radio-button-missing-label | Accessibility: Radio button without label must have an accessible and visual label: aria-labelledby | ✅ | | | | radiogroup-missing-label | Accessibility: RadioGroup without label must have an accessible and visual label: aria-labelledby | ✅ | | | | spin-button-needs-labelling | Accessibility: SpinButtons must have an accessible label | ✅ | | | | spin-button-unrecommended-labelling | Accessibility: Unrecommended accessibility labelling - SpinButton | ✅ | | | | switch-needs-labelling | Accessibility: Switch must have an accessible label | ✅ | | | | text-area-missing-label | Accessibility: Textarea must have an accessible name | ✅ | | | | toolbar-missing-aria | Accessibility: Toolbars need accessible labelling: aria-label or aria-labelledby | ✅ | | | | tooltip-not-recommended | Accessibility: Prefer text content or aria over a tooltip for these components MenuItem, SpinButton | ✅ | | |