Ember: открытые цветовые палитры, которые не сливаются под ночным фильтром экрана

На Hacker News опубликовали проект Ember, набор цветовых палитр для терминалов, графиков, тепловых карт и интерфейсов, которые остаются различимыми как при обычном экране, так и при включённом «тёплом» ночном фильтре (вроде Night Shift). Проблема, которую решает Ember: обычные палитры теряют различимость цветов после включения такого фильтра, потому что он не просто накладывает цветную плёнку, а умножает каждый канал RGB (красный, зелёный, синий) на свой собственный коэффициент усиления. При самом глубоком профиле Ember (1200 К) коэффициент усиления синего канала равен нулю, то есть цвета, различающиеся только по синему, после фильтра становятся полностью неотличимы; при 2000 К через синий канал проходит лишь 9% исходного значения.
Проект включает четыре палитры: «3400K Dark», «3400K Light», «2000K Dark» и «1200K Dark». Палитры на 3400 К рассчитаны на общее использование и примерно соответствуют максимальному эффекту Night Shift на MacBook. Палитры на 2000 К и 1200 К, для экстремального ночного фильтра и рассчитаны в первую очередь на астрономов; они выпускаются только в тёмном варианте, потому что при светлом фоне такой сильный фильтр превращает экран в сплошное оранжево-красное поле. Из-за экстремального сдвига эти палитры поддерживают меньше различимых цветов: по данным релизных проверок, число категориальных (то есть цветов для разных серий данных на графике) цветов равно шести на 3400 К, четырём на 2000 К и трём на 1200 К; для терминала те же ограничения повторяются во всех шестнадцати слотах ANSI.
Каждая палитра выпускается в виде готовых тем для терминалов (Alacritty, iTerm2, Windows Terminal), набора ролей для интерфейсных поверхностей, категориальных цветов для графиков, последовательной шкалы из 256 образцов и артефактов для Matplotlib, CSS, JSON и Python. Сам Ember фильтр не применяет, он лишь подбирает цвета так, чтобы они оставались различимыми под уже существующим у пользователя фильтром. Установка возможна клонированием репозитория с GitHub или через pip напрямую из репозитория; для веба есть готовый файл ember.css с CSS-переменными под каждую палитру.
Каждый цвет верифицирован по модели теплового фильтра в цветовом пространстве Oklab, а автоматические релизные проверки жёстко ограничивают параметры: отклонение сериализованного акцентного цвета от заданной цели после фильтра не должно превышать 0,15 ΔEOK (это инженерная метрика на основе евклидова расстояния в Oklab, а не стандартная формула CIE ΔE), каждый акцентный цвет терминала обязан сохранять контраст не менее 4,5:1 к фону терминала после фильтра, а средняя цветность категориальных цветов в Oklab должна лежать в диапазоне от 0,09 до 0,105 и не превышать 0,111 ни для одного цвета. Проверки также требуют, чтобы существовало ровно четыре семейства палитр с категориальными ёмкостями 6, 6, 4 и 3.
В документации отдельно подчёркивается: приведённые цифры, это программная модель сигнала, а не калиброванное физическое измерение цветовой температуры, и то, что реально увидит пользователь, дополнительно зависит от дисплея, операционной системы, калибровки, яркости и освещения в комнате. Авторы также предупреждают, что даже хорошей различимости цвета недостаточно для критичных обозначений на графиках, её стоит дополнять подписями, положением, формой маркера или штриховкой.
Ключевые факты
- Ember, четыре цветовые палитры (3400K Dark, 3400K Light, 2000K Dark, 1200K Dark) для терминала, графиков, тепловых карт и интерфейсов, устойчивые к «тёплому» ночному фильтру экрана
- При профиле 1200 К усиление синего канала равно нулю, при 2000 К через синий канал проходит лишь 9%, из-за этого более глубокие палитры поддерживают меньше различимых цветов: 6 на 3400 К, 4 на 2000 К, 3 на 1200 К
- Автоматические релизные проверки задают жёсткие пороги: контраст не ниже 4,5:1, отклонение цвета от цели не больше 0,15 ΔEOK, средняя цветность категориальных цветов от 0,09 до 0,105 (не выше 0,111)
- Готовые темы для Alacritty, iTerm2 и Windows Terminal, файл CSS с переменными и пакет для Python/Matplotlib; установка через git-клон репозитория или pip
- В тексте не назван автор или мейнтейнер проекта, версия и лицензия, только сам механизм и результаты измерений
Почему это важно
Обычные цветовые палитры для терминалов, графиков и интерфейсов проектируются без учёта «тёплых» ночных фильтров экрана (вроде Night Shift), которые применяют разные коэффициенты усиления к каждому цветовому каналу. В результате цвета, хорошо различимые днём, после включения фильтра могут стать неотличимы друг от друга, особенно если они отличаются только по синему каналу, который такие фильтры «срезают» сильнее всего. Ember решает именно эту проблему инженерно: цвета подбираются и проверяются автоматическими тестами так, чтобы оставаться различимыми в обоих состояниях, и до, и после фильтра.
Кому это важно
Разработчикам, которые настраивают тему терминала или графики для собственного использования по вечерам; авторам инструментов для данных и дашбордов, которым нужны палитры для графиков и тепловых карт, устойчивые к ночному режиму пользователей; астрономам и другим людям, которые постоянно работают с экстремальными «тёплыми» фильтрами, профили 2000 К и 1200 К созданы именно для них.
Как это применить
Проект открытый и бесплатный, репозиторий лежит на GitHub. Устанавливается клонированием репозитория или через pip напрямую из него. Для терминала достаточно скопировать готовый файл темы (Alacritty, iTerm2 или Windows Terminal) в конфигурацию. Для веба есть файл ember.css с CSS-переменными под каждую палитру. Для графиков в Python есть пакет с функциями categorical(), sequential() и surfaces() для интеграции с Matplotlib. Начинать стоит с профиля «3400K Dark», если пользователь не запускает специально более глубокий фильтр.
Можно ли доверять
Разработка выглядит методологически строгой: авторы описывают точную модель теплового фильтра (умножение каждого канала RGB на измеренный коэффициент), приводят численные пороги для контраста и цветовых расстояний в пространстве Oklab и утверждают, что автоматические релизные проверки следят за их соблюдением при каждой сборке. При этом в тексте не указаны ни имя автора или мейнтейнера проекта, ни версия, ни лицензия, ни данные о том, сколько людей уже используют Ember, поэтому оценить масштаб внедрения или репутацию разработчика по одному только тексту нельзя.
Риски и подводные камни
Авторы сами предупреждают, что приведённые измерения, это модель сигнала, а не калиброванное физическое измерение: то, что реально увидит пользователь, зависит от конкретного дисплея, операционной системы, калибровки, яркости и освещения в комнате, так что заявленные пороги контраста и различимости могут не полностью совпадать с тем, что видно на конкретном экране. Также отдельно отмечено, что для критичных обозначений на графиках одного цвета всё равно недостаточно, его стоит дублировать подписями, положением, формой маркера или штриховкой.
«Мы рассматриваем день и ночь как два состояния одного и того же заданного цвета и не усредняем их качество в одну оценку, потому что отличная различимость днём не компенсирует коллизию ночью.»
— документация проекта Ember