Манипуляции и интерполяция
Манипуляции
lighten(color, amount)
string — цвет #rrggbb
Увеличивает светлоту HSL на amount (0–100), с ограничением сверху в 100.
darken(color, amount)
string — цвет #rrggbb
Уменьшает светлоту HSL на amount (0–100), с ограничением снизу в 0.
saturate(color, amount)
string — цвет #rrggbb
Увеличивает насыщенность HSL на amount (0–100), с ограничением сверху в 100.
desaturate(color, amount)
string — цвет #rrggbb
Уменьшает насыщенность HSL на amount (0–100), с ограничением снизу в 0.
setAlpha(color, alpha)
string — строка rgba(r, g, b, alpha)
Устанавливает альфа-канал (0–1) любого цвета, независимо от исходного формата.
getAlpha(color)
number — 0–1
Читает альфа-канал любого цвета; возвращает 1, если у цвета нет явной альфы.
invertColor(color)
string — цвет #rrggbb
Инвертирует все три канала RGB (255 - канал).
grayscale(color)
string — цвет #rrggbb
Конвертирует в оттенки серого по перцептивным весам ITU-R BT.709 (0.2126×r + 0.7152×g + 0.0722×b).
rotateHue(hex, degrees)
string — цвет #rrggbb
Поворачивает оттенок на заданное число градусов (поддерживает отрицательные значения, оборачивается в диапазон 0–360), оставляя насыщенность и светлоту без изменений.
adjustHexBrightness(hex, offsetPercent)
string — цвет #rrggbb
Осветляет (положительный offsetPercent, от -100 до 100) или затемняет (отрицательный) каждый канал RGB, линейно смешивая его в сторону 255 или 0.
mixColors(c1, c2, t, opts?)
function mixColors(
c1: string,
c2: string,
t: number,
opts?: {
mode?: 'rgb' | 'hsl' | 'lab' | 'lch' | 'oklab' | 'oklch' // по умолчанию: 'rgb'
format?: 'hex' | 'rgb' | 'rgba' | 'hsl' // по умолчанию: 'hex'
hueInterpolation?: 'shorter' | 'longer' | 'increasing' | 'decreasing' // по умолчанию: 'shorter'
},
): stringstring — отформатировано согласно opts.format
Интерполирует между двумя цветами (c1, c2) в заданном цветовом пространстве, в позиции t (0–1) между ними. opts задаёт режим смешивания, формат вывода и (для режимов на основе оттенка) направление интерполяции по цветовому кругу.
import { mixColors } from 'color-value-tools'
// RGB-смешивание в середине
mixColors('#e74c3c', '#3498db', 0.5)
// → '#8e728c'
// Перцептивно равномерное смешивание в Oklab
mixColors('#e74c3c', '#3498db', 0.5, { mode: 'oklab', format: 'hex' })
// HSL с «длинным» путём по оттенку
mixColors('#e74c3c', '#3498db', 0.5, { mode: 'hsl', hueInterpolation: 'longer' })
// Получить вывод в виде строки rgba
mixColors('#ff0000', '#0000ff', 0.25, { mode: 'lab', format: 'rgba' })Интерполяция и шкалы
interpolateColors(c1, c2, steps, opts?)
string[] — steps цветов от c1 до c2, равномерно распределённых по t
Версия mixColors, возвращающая массив (opts — та же форма mode/format/hueInterpolation) — см. generateGradientColors ниже для ленивого, генераторного эквивалента.
createColorScale(anchors, steps, opts?)
string[] — шкала из steps цветов, вычисленная по всем опорным точкам
Генерирует многоточечную шкалу-градиент — полезно для всего, что выходит за рамки простого смешивания двух цветов. anchors принимает либо обычные цвета (равномерно распределённые), либо пары { color, position } для явных позиций (0–1); opts: { space?: 'rgb' | 'hsl' | 'oklab' | 'oklch'; format?: 'hex' | 'rgb' | 'hsl' } — более узкий набор пространств, чем у mixColors (без lab/lch).
import { createColorScale } from 'color-value-tools'
// Равномерно распределённые опорные точки
createColorScale(['#ff0000', '#ffff00', '#00ff00'], 9)
// С явными позициями
createColorScale(
[
{ color: '#1a1a2e', position: 0 },
{ color: '#e94560', position: 0.4 },
{ color: '#f5a623', position: 1 },
],
12,
{ space: 'oklch' },
)midpointColor(c1, c2, opts?)
string — цвет #rrggbb
Сокращение для mixColors(c1, c2, 0.5, { mode: opts.space }) — перцептивная середина между двумя цветами. opts: { space?: 'lab' | 'lch' | 'oklab' | 'oklch' }, по умолчанию 'oklab' — эта опция принимает только 4 перцептивных пространства, не rgb/hsl.
Ленивая генерация
generateGradientColors(start, end, steps, opts?)
Generator<string>
Ленивый, генераторный эквивалент interpolateColors — выдаёт по одному цвету за раз вместо построения всего массива заранее. Полезно при большом числе шагов или покадровой обработке. Принимает те же start/end/steps, что и interpolateColors; opts: { mode?: 'rgb' | 'hsl' | 'oklab' | 'oklch'; format?: 'hex' | 'rgb' | 'hsl' } — более узкий набор опций, чем у mixColors/interpolateColors (без режимов lab/lch, без формата rgba, без hueInterpolation).
import { generateGradientColors } from 'color-value-tools'
// Обрабатываем по одному цвету за раз — без промежуточного массива
for (const color of generateGradientColors('#ff0000', '#0000ff', 1000, { mode: 'oklch' })) {
renderPixel(color)
}