diff --git a/README.md b/README.md
index 14aedd58..67bdfb84 100644
--- a/README.md
+++ b/README.md
@@ -82,28 +82,29 @@ This config will be interpreted in the following way:
π§ Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\
β Deprecated.
-| NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β | Description | πΌ | π§ | β |
-| :----------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :- | :- | :- |
-| [a11y-aria-label-is-well-formatted](docs/rules/a11y-aria-label-is-well-formatted.md) | [aria-label] text should be formatted as you would visual text. | βοΈ | | |
-| [a11y-no-generic-link-text](docs/rules/a11y-no-generic-link-text.md) | disallow generic link text | | | β |
-| [array-foreach](docs/rules/array-foreach.md) | enforce `for..of` loops over `Array.forEach` | β
| | |
-| [async-currenttarget](docs/rules/async-currenttarget.md) | disallow `event.currentTarget` calls inside of async functions | π | | |
-| [async-preventdefault](docs/rules/async-preventdefault.md) | disallow `event.preventDefault` calls inside of async functions | π | | |
-| [authenticity-token](docs/rules/authenticity-token.md) | disallow usage of CSRF tokens in JavaScript | π | | |
-| [get-attribute](docs/rules/get-attribute.md) | disallow wrong usage of attribute names | π | π§ | |
-| [js-class-name](docs/rules/js-class-name.md) | enforce a naming convention for js- prefixed classes | π | | |
-| [no-blur](docs/rules/no-blur.md) | disallow usage of `Element.prototype.blur()` | π | | |
-| [no-d-none](docs/rules/no-d-none.md) | disallow usage the `d-none` CSS class | π | | |
-| [no-dataset](docs/rules/no-dataset.md) | enforce usage of `Element.prototype.getAttribute` instead of `Element.prototype.datalist` | π | | |
-| [no-dynamic-script-tag](docs/rules/no-dynamic-script-tag.md) | disallow creating dynamic script tags | β
| | |
-| [no-implicit-buggy-globals](docs/rules/no-implicit-buggy-globals.md) | disallow implicit global variables | β
| | |
-| [no-inner-html](docs/rules/no-inner-html.md) | disallow `Element.prototype.innerHTML` in favor of `Element.prototype.textContent` | π | | |
-| [no-innerText](docs/rules/no-innerText.md) | disallow `Element.prototype.innerText` in favor of `Element.prototype.textContent` | π | π§ | |
-| [no-then](docs/rules/no-then.md) | enforce using `async/await` syntax over Promises | β
| | |
-| [no-useless-passive](docs/rules/no-useless-passive.md) | disallow marking a event handler as passive when it has no effect | π | π§ | |
-| [prefer-observers](docs/rules/prefer-observers.md) | disallow poorly performing event listeners | π | | |
-| [require-passive-events](docs/rules/require-passive-events.md) | enforce marking high frequency event handlers as passive | π | | |
-| [role-supports-aria-props](docs/rules/role-supports-aria-props.md) | Enforce that elements with explicit or implicit roles defined contain only `aria-*` properties supported by that `role`. | βοΈ | | |
-| [unescaped-html-literal](docs/rules/unescaped-html-literal.md) | disallow unescaped HTML literals | π | | |
+| NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β | Description | πΌ | π§ | β |
+| :------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :- | :- | :- |
+| [a11y-aria-label-is-well-formatted](docs/rules/a11y-aria-label-is-well-formatted.md) | [aria-label] text should be formatted as you would visual text. | βοΈ | | |
+| [a11y-no-generic-link-text](docs/rules/a11y-no-generic-link-text.md) | disallow generic link text | | | β |
+| [a11y-no-visually-hidden-interactive-element](docs/rules/a11y-no-visually-hidden-interactive-element.md) | Ensures that interactive elements are not visually hidden | βοΈ | | |
+| [array-foreach](docs/rules/array-foreach.md) | enforce `for..of` loops over `Array.forEach` | β
| | |
+| [async-currenttarget](docs/rules/async-currenttarget.md) | disallow `event.currentTarget` calls inside of async functions | π | | |
+| [async-preventdefault](docs/rules/async-preventdefault.md) | disallow `event.preventDefault` calls inside of async functions | π | | |
+| [authenticity-token](docs/rules/authenticity-token.md) | disallow usage of CSRF tokens in JavaScript | π | | |
+| [get-attribute](docs/rules/get-attribute.md) | disallow wrong usage of attribute names | π | π§ | |
+| [js-class-name](docs/rules/js-class-name.md) | enforce a naming convention for js- prefixed classes | π | | |
+| [no-blur](docs/rules/no-blur.md) | disallow usage of `Element.prototype.blur()` | π | | |
+| [no-d-none](docs/rules/no-d-none.md) | disallow usage the `d-none` CSS class | π | | |
+| [no-dataset](docs/rules/no-dataset.md) | enforce usage of `Element.prototype.getAttribute` instead of `Element.prototype.datalist` | π | | |
+| [no-dynamic-script-tag](docs/rules/no-dynamic-script-tag.md) | disallow creating dynamic script tags | β
| | |
+| [no-implicit-buggy-globals](docs/rules/no-implicit-buggy-globals.md) | disallow implicit global variables | β
| | |
+| [no-inner-html](docs/rules/no-inner-html.md) | disallow `Element.prototype.innerHTML` in favor of `Element.prototype.textContent` | π | | |
+| [no-innerText](docs/rules/no-innerText.md) | disallow `Element.prototype.innerText` in favor of `Element.prototype.textContent` | π | π§ | |
+| [no-then](docs/rules/no-then.md) | enforce using `async/await` syntax over Promises | β
| | |
+| [no-useless-passive](docs/rules/no-useless-passive.md) | disallow marking a event handler as passive when it has no effect | π | π§ | |
+| [prefer-observers](docs/rules/prefer-observers.md) | disallow poorly performing event listeners | π | | |
+| [require-passive-events](docs/rules/require-passive-events.md) | enforce marking high frequency event handlers as passive | π | | |
+| [role-supports-aria-props](docs/rules/role-supports-aria-props.md) | Enforce that elements with explicit or implicit roles defined contain only `aria-*` properties supported by that `role`. | βοΈ | | |
+| [unescaped-html-literal](docs/rules/unescaped-html-literal.md) | disallow unescaped HTML literals | π | | |
diff --git a/docs/rules/a11y-no-visually-hidden-interactive-element.md b/docs/rules/a11y-no-visually-hidden-interactive-element.md
new file mode 100644
index 00000000..24af1e8b
--- /dev/null
+++ b/docs/rules/a11y-no-visually-hidden-interactive-element.md
@@ -0,0 +1,79 @@
+# Ensures that interactive elements are not visually hidden (`github/a11y-no-visually-hidden-interactive-element`)
+
+πΌ This rule is enabled in the βοΈ `react` config.
+
+
+
+## Rule Details
+
+This rule guards against visually hiding interactive elements. If a sighted keyboard user navigates to an interactive element that is visually hidden they might become confused and assume that keyboard focus has been lost.
+
+Note: we are not guarding against visually hidden `input` elements at this time. Some visually hidden inputs might cause a false positive (e.g. some file inputs).
+
+### Why do we visually hide content?
+
+Visually hiding content can be useful when you want to provide information specifically to screen reader users or other assitive technology users while keeping content hidden from sighted users.
+
+Applying the following css will visually hide content while still making it accessible to screen reader users.
+
+```css
+clip-path: inset(50%);
+height: 1px;
+overflow: hidden;
+position: absolute;
+white-space: nowrap;
+width: 1px;
+```
+
+π Examples of **incorrect** code for this rule:
+
+```jsx
+
+```
+
+```jsx
+