contrast-ratio-checker
Version:
A package based on WCAG 2.0 to easily check contrast ratio.
145 lines (93 loc) • 3.68 kB
Markdown
# Contrast Ratio Checker
A package based on WCAG 2.0 to easily check contrast ratio.
The equations for luminance and contrast ratio are based on [WCAG 2.0](https://www.w3.org/TR/WCAG20/) as shown below:
https://www.w3.org/TR/WCAG20/#relativeluminancedef
http://www.w3.org/TR/WCAG20/#contrast-ratiodef
## Installation:
```
npm install contrast-ratio-checker
```
## Usage:
To calculate `luminance`:
```js
const crc = new ContrastRatioChecker()
const rgb = { red: 255, green: 129, blue: 0 }
crc.getLuminance(rgb) // result: 0.36960513804637335
```
To calculate `contrast ratio by luminance`:
```js
const crc = new ContrastRatioChecker()
const rgb1 = { red: 255, green: 129, blue: 0 }
const rgb2 = { red: 100, green: 0, blue: 58 }
const l1 = crc.getLuminance(rgb1)
const l2 = crc.getLuminance(rgb2)
//luminance order doesnt matter
crc.getContrastRatioByLuminance(l1, l2) // result: 5.235369975583679
```
To calculate `contrast ratio by RGB Object`:
```js
const crc = new ContrastRatioChecker()
const rgb1 = { red: 255, green: 129, blue: 0 }
const rgb2 = { red: 100, green: 0, blue: 58 }
crc.getContrastRatioByRgb(rgb1, rgb2) // result: 5.235369975583679
```
To calculate `contrast ratio by HEX string`:
```js
const crc = new ContrastRatioChecker()
const hex1 = "#e5e5e5"
const hex2 = "#ab0" //shorthands are accepted
crc.getContrastRatioByHex(hex1, hex2) // result: 1.698093107780376
```
### Validation
> WCAG 2.0 says that to a text be considered large, it needs 18pt or 14pt bold.
>
> `level AA (minimum)` says that if text is large, ratio needs to be `>= 3, otherwise >= 4.5`.
>
> `level AAA (enhanced)` says that if text is large, ratio needs to be `>= 4.5, otherwise >= 7`.
>
> **Source**:
>
> https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html
>
> https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast7.html
To get validation using `contrast ratio` as input:
```js
const crc = new ContrastRatioChecker()
const ratio = 4.7
crc.getWcagRatioValidation(ratio) // result: { WCAG_AA: true, WCAG_AAA: false }
//accepts as args: ratio, font size in px and bold (boolean)
crc.getWcagRatioValidation(ratio, 30) // result: { WCAG_AA: true, WCAG_AAA: true }
```
To get validation using `hex string` as input:
```js
const crc = new ContrastRatioChecker()
const hex1 = "#e5e5e5"
const hex2 = "#555" //shorthands are accepted
// ratio ~5.91
crc.getRatioValidationByHex(hex1, hex2) // result: { WCAG_AA: true, WCAG_AAA: false }
crc.getRatioValidationByHex(hex1, hex2, { fontSizePx: 19, bold: true }) // result: { WCAG_AA: true, WCAG_AAA: true }
// using custom ratios:
crc.getRatioValidationByHex(hex1, hex2, {
fontSizePx: 19,
bold: true,
custom: 6,
}) // result: { WCAG_AA: true, WCAG_AAA: true, CUSTOM: false }
```
To get validation using `RGB Object` as input:
```js
const crc = new ContrastRatioChecker()
const rgb1 = { red: 255, green: 184, blue: 202 }
const rgb2 = { red: 120, green: 0, blue: 122 }
// ratio ~6.23
crc.getRatioValidationByRgb(rgb1, rgb2) // result: { WCAG_AA: true, WCAG_AAA: false }
crc.getRatioValidationByRgb(rgb1, rgb2, { fontSizePx: 19, bold: true }) // result: { WCAG_AA: true, WCAG_AAA: true }
// using custom ratios:
crc.getRatioValidationByRgb(rgb1, rgb2, {
fontSizePx: 19,
bold: true,
custom: 6,
}) // result: { WCAG_AA: true, WCAG_AAA: true, CUSTOM: true }
```
### License
Copyright © 2023, [Vinícius R. Vieira](https://github.com/viniciusrvieira). Released under the [MIT License](/LICENSE).