|
1 |
| -## Require `inline` prop on `<Link>` component inside a text block |
| 1 | +# EXPERIMENTAL: Require `inline` prop on `<Link>` in text block |
2 | 2 |
|
3 |
| -The `Link` component should have the `inline` prop when it is used inside of a text block. |
| 3 | +This is an experimental rule. If you suspect any false positives reported by this rule, please file an issue so we can make this rule better. |
4 | 4 |
|
5 | 5 | ## Rule Details
|
6 | 6 |
|
7 |
| -This rule enforces setting `inline` on the `<Link>` component when a `<Link>` is detected inside of a text block without distiguishable styling. |
| 7 | +The `Link` component should have the `inline` prop when it is used within a text block and has no styles (aside from color) to distinguish itself from surrounding plain text. |
8 | 8 |
|
9 |
| -The lint rule will essentially flag any `<Link>` without the `inline` property (equal to `true`) detected with string nodes on either side. |
| 9 | +Related: [WCAG 1.4.1 Use of Color issues](https://www.w3.org/WAI/WCAG21/Understanding/use-of-color.html) |
10 | 10 |
|
11 |
| -This rule will not catch all instances of link in text block due to the limitations of static analysis, so be sure to also have in-browser checks in place such as the [link-in-text-block Axe rule](https://dequeuniversity.com/rules/axe/4.9/link-in-text-block) for additional coverage. |
| 11 | +The lint rule will flag any `<Link>` without the `inline` property (equal to `true`) detected with string nodes on either side. |
12 | 12 |
|
13 |
| -The edge cases that the linter skips to avoid false positives will include: |
| 13 | +There are certain edge cases that the linter skips to avoid false positives including: |
14 | 14 |
|
| 15 | +- `<Link className="...">` because there may be distinguishing styles applied. |
15 | 16 | - `<Link sx={{fontWeight:...}}>` or `<Link sx={{fontFamily:...}}>` because these technically may provide sufficient distinguishing styling.
|
16 | 17 | - `<Link>` where the only adjacent text is a period, since that can't really be considered a text block.
|
17 | 18 | - `<Link>` where the children is a JSX component, rather than a string literal, because then it might be an icon link rather than a text link.
|
18 | 19 | - `<Link>` that are nested inside of headings as these have often been breadcrumbs.
|
19 | 20 |
|
| 21 | +This rule will not catch all instances of link in text block due to the limitations of static analysis, so be sure to also have in-browser checks in place such as the [link-in-text-block Axe rule](https://dequeuniversity.com/rules/axe/4.9/link-in-text-block) for additional coverage. |
| 22 | + |
20 | 23 | 👎 Examples of **incorrect** code for this rule
|
21 | 24 |
|
22 | 25 | ```jsx
|
@@ -93,8 +96,18 @@ function ExampleComponent() {
|
93 | 96 | }
|
94 | 97 | ```
|
95 | 98 |
|
| 99 | +This rule will skip `Link`s with a `className`. |
| 100 | + |
| 101 | +```jsx |
| 102 | +function ExampleComponent() { |
| 103 | + return ( |
| 104 | + Learn more at <Link className={styles.someDistinguishingStyle}>GitHub</Link> |
| 105 | + ) |
| 106 | +} |
| 107 | +``` |
| 108 | + |
96 | 109 | ## Options
|
97 | 110 |
|
98 | 111 | - `skipImportCheck` (default: `false`)
|
99 | 112 |
|
100 |
| -By default, the `a11y-explicit-heading` rule will only check for `<Heading>` components imported directly from `@primer/react`. You can disable this behavior by setting `skipImportCheck` to `true`. |
| 113 | +By default, the `a11y-link-in-text-block` rule will only check for `<Link>` components imported directly from `@primer/react`. You can disable this behavior by setting `skipImportCheck` to `true`. |
0 commit comments