Доступность
Доступность (WCAG)
relativeLuminance(color)
number — 0–1
Относительная светимость по WCAG, по стандартной формуле линеаризации sRGB.
contrastRatio(c1, c2)
number — 1–21
Коэффициент контрастности по WCAG между двумя цветами: (светлее + 0.05) / (темнее + 0.05).
wcagLevel(fg, bg)
WcagLevel — 'AAA' | 'AA' | 'AA-large' | 'fail'
Классифицирует коэффициент контрастности между текстом и фоном по порогам WCAG (≥7 AAA, ≥4.5 AA, ≥3 AA-large, иначе fail).
bestTextColor(bg)
'#000000' | '#ffffff'
Выбирает то из чистого чёрного или чистого белого, у которого выше коэффициент контрастности к bg.
bestContrastColor(bg, candidates)
string — кандидат с наивысшим коэффициентом контрастности к bg
Выбирает наиболее читаемый цвет из произвольного списка candidates, не только чёрный/белый.
bestContrastPalette(bg, palettes, opts?)
PaletteScore & { paletteIndex: number } — { paletteIndex, palette, minContrastRatio, avgContrastRatio }
Оценивает каждую из palettes (список палитр-кандидатов) по формуле avgContrastRatio × 0.4 + minContrastRatio × 0.6 (с сильным штрафом за самый слабый цвет) и возвращает палитру с наивысшей оценкой. opts.weights задаёт веса по позиции для каждого цвета, используемые при усреднении коэффициентов контрастности палитры — по умолчанию все цвета имеют равный вес.
import { bestContrastPalette } from 'color-value-tools'
const result = bestContrastPalette('#1a1a2e', [
['#ffffff', '#f0f0f0', '#cccccc'],
['#ffff00', '#ffd700', '#ff8c00'],
])
// → { paletteIndex: 0, palette: [...], minContrastRatio: 10.62, avgContrastRatio: 14.22 }isReadableOnBackground(text, bg, opts?)
{ readable, minContrastRatio, wcagLevel }
Проверяет читаемость на сплошном, полупрозрачном или градиентном фоне. bg принимает обычную строку цвета, спецификацию полупрозрачности или многоточечный градиент — полупрозрачный фон альфа-композитится поверх своего underlay перед вычислением контраста, а градиент оценивается в каждой точке, используется худший (наименьший) коэффициент. Возвращаемый wcagLevel всегда вычисляется от того же эффективного цвета фона (скомпозированного цвета для полупрозрачной спецификации, худшей точки для градиента), поэтому он никогда не расходится с minContrastRatio/readable. opts: { level?: 'AA' | 'AAA'; largeText?: boolean }, по умолчанию level: 'AA', largeText: false.
import { isReadableOnBackground } from 'color-value-tools'
// Сплошной фон
isReadableOnBackground('#ffffff', '#3498db')
// → { readable: false, minContrastRatio: 3.15, wcagLevel: 'AA-large' }
// Полупрозрачный оверлей поверх белого
isReadableOnBackground('#ffffff', {
type: 'semi-transparent',
color: 'rgba(52, 152, 219, 0.5)',
underlay: '#f0f0f0',
})
// Градиент — для результата используется худшая точка
isReadableOnBackground('#ffffff', {
type: 'gradient',
stops: ['#1a1a2e', '#e94560', '#f5a623'],
})
// AAA + крупный текст
isReadableOnBackground('#000000', '#f0f0f0', { level: 'AAA', largeText: true })isDark(color, threshold?)
boolean — true, если relativeLuminance(color) ниже threshold (по умолчанию 0.5)
isLight(color, threshold?)
boolean — противоположность isDark, тот же threshold по умолчанию
Симуляция дальтонизма
Симулирует восприятие с помощью матриц Vienot 1999, применённых к линеаризованному RGB.
simulateProtanopia(color)
string — цвет #rrggbb
Симулирует отсутствие L-колбочек (не различает красный).
simulateDeuteranopia(color)
string — цвет #rrggbb
Симулирует отсутствие M-колбочек (не различает зелёный).
simulateTritanopia(color)
string — цвет #rrggbb
Симулирует отсутствие S-колбочек (не различает синий).
simulateColorBlindness(color, type)
string — цвет #rrggbb
Универсальная точка входа, вызывающая одну из трёх функций выше по type — 'protanopia' | 'deuteranopia' | 'tritanopia'.
import { simulateColorBlindness } from 'color-value-tools'
simulateColorBlindness('#e74c3c', 'deuteranopia') // '#c0c941'
simulateColorBlindness('#3498db', 'protanopia') // '#6e6fcd'