Маркетинговые и документационные сайты на статическом HTML по-прежнему тащат две почти одинаковые палитры: отдельный блок внутри @media (prefers-color-scheme: dark), зеркало для светлой темы и третий слой, когда продукт требует ручной переключатель. В 2026 году light-dark() сворачивает каждую пару значений в одно объявление, а color-scheme: light dark на :root подсказывает браузеру согласовать нативные контролы, скроллбары и акценты форм с активной схемой. Этот материал для собранных статических бандлов без React-провайдера темы: покажем слой @supports-фолбэков, чек-листы контраста и почему Safari/WebKit на железе всё ещё важнее, чем один только headless. Если вы уже выводите широкую гамму бренда, перекрёстно читайте OKLCH, широкую гамму и статический HTML в Safari, чтобы перцептивные токены не расходились между светлой и тёмной поверхностью.
Ниже — матрица подходов, примеры токенов, чекпоинты доступности и чек-лист Safari, укладывающийся в спринтовую аренду Mac mini.
Почему дубли палитр ломают темы
Ручное сопровождение светлой и тёмной веток переменных даёт дрейф: дизайнер правит --text в одном месте, забывает зеркало — и контраст по WCAG падает только после заката. Дубли ещё раздувают CSS: публичные маркетинговые шаблоны в начале 2026 года нередко несут 18–32 КБ gzip только цветовых правил, которые можно схлопнуть, если токены описаны через light-dark().
JavaScript-переключатели с data-theme спорят с CDN-кэшем и дают вспышку неверной схемы на первом кадре, если серверный HTML не совпал с сохранённой настройкой. Декларативный color-scheme плюс light-dark() уменьшает число движущихся частей для Eleventy, Astro и Hugo.
Телеметрия корпоративных порталов показывает порядка 5–8 % сессий в браузерах без light-dark(): планируйте @supports, а не оставляйте пользователей на «сломанных» цветах.
Согласуйте с аналитикой: помечайте события, связанные с темой, хэшем CSS-бандла, чтобы продукт видел, как быстро уходит наследие с JS-тогглом.
Для смешанных команд полезно завести короткий RFC: какие страницы переходят первыми, какие локали отстаивают на неделю из-за кириллической пунктуации и какие KPI (Lighthouse a11y, доля FOUC) считаются успехом.
Юридические отделы иногда требуют фиксировать «эталонные» скриншоты обеих схем; храните их рядом с хэшем CSS и версией Safari, иначе аудит через квартал превращается в спор о «другом мониторе».
Авторинг light-dark() с color-scheme
Сначала объявите обе схемы, затем централизуйте токены:
:root {
color-scheme: light dark;
--bg: light-dark(#ffffff, #0b0d12);
--fg: light-dark(#0b0d12, #f5f7fb);
--border: light-dark(#d7dbe4, #2a3140);
}
body {
background: var(--bg);
color: var(--fg);
}
Сочетайте с семантикой: color-scheme на html помогает согласовать meta theme-color и нативные контролы.
Оборачивайте новинки:
@supports not (color: light-dark(white, black)) {
:root { --bg: #ffffff; --fg: #0b0d12; }
@media (prefers-color-scheme: dark) {
:root { --bg: #0b0d12; --fg: #f5f7fb; }
}
}
Статические генераторы должны выводить эти декларации рядом с типографикой: разнесение по ленивым CSS-чанкам даёт однокадровые вспышки при догрузке.
Если используете PostCSS-плагины, убедитесь, что они не «разворачивают» light-dark() в несовместимый синтаксис для целевых браузеров вашего SLA.
Матрица: light-dark() и медиазапросы
| Подход | Плюс | Риск |
|---|---|---|
light-dark() + color-scheme | Один источник правды на токен | Нужно гонять нативные контролы после каждого минорного Safari |
Только prefers-color-scheme | Широкая поддержка | Дубли и дрейф значений |
JS data-theme | Гибкий ручной тумблер | FOUC и рассинхрон с кэшем |
Нативные поля, таблицы и блоки кода
Чекбоксы, слайдеры и поля дат подхватывают UA-стили из color-scheme; проверьте, что кольца фокуса держат 3:1 к обоим значениям --bg. Подсвеченные pre часто жёстко прошиты под светлую тему — оберните их в локальный контейнер с color-scheme: dark, если сниппет рассчитан только на тёмные панели.
Когда просят «брендовый» акцент на нативных контролях, свяжите accent-color с тем же токеном ссылок через light-dark(), иначе в тёмной теме вернётся системный фиолетовый. Заложите 45 минут один раз на фикстуру со всеми контролами, которые отдаёт CMS, и переиспользуйте её каждый релиз.
Если в статику встраивают SVG-графики, помните: инлайновые fill из экспортов иногда игнорируют переменные. Предпочитайте currentColor для осей или прогоняйте SVG через сборку с заменой палитры, как для HTML-паршалов.
Зебра в таблицах лучше выводить из light-dark(), а не из пары абсолютных hex, иначе в тёмной теме сетка «исчезает».
Маркетинговые iframe могут игнорировать родительский color-scheme: задокументируйте, какие сторонние сниппеты требуют изолированной обёртки.
Для PDF-экспортов из браузера держите отдельный профиль печати: часть UA сбрасывает прозрачность и меняет восприятие границ, если вы полагались на полупрозрачные токены без запасного непрозрачного варианта.
Safari QA на облачном Mac mini
Playwright WebKit проверяет парсинг, но не все нюансы, когда включены Increase Contrast или Reduce Transparency. На Apple Silicon Safari закладывайте 20–35 минут на релиз: stable для формальных подписей, Technology Preview — когда бисектите регрессии резолва цвета.
Если закупка железа затянулась, арендуйте облачный Mac mini: у MacHTML на Apple Silicon часто выходит около $16.9/день, есть SSH для выкладки статики и VNC для интерактивного ревью темы — дешевле срочной логистики ноутбуков.
Зеркалируйте продовые font-feature-settings, URL веб-шрифтов и любые color-mix(): другой шрифт меняет субъективную яркость и ломает предположения по контрасту.
Снимайте экран при переключении системной темы на 120 fps: однокадровые расхождения между хромом навигации и фоном тела быстрее решаются записью, чем перепиской в чате.
Для мультиязычных лендингов добавьте проверку длинных строк в тёмной теме: кириллица с плотными начертаниями иногда требует чуть большего межстрочного интервала без изменения цвета.
Контраст, forced colors и прозрачность
Юристы и финансы всё чаще просят side-by-side PDF светлой и тёмной версии. Гоняйте один URL через эмуляцию prefers-color-scheme в headless Chrome и печать в PDF из Safari; если яркость расходится больше чем на 4 %, токены всё ещё завязаны на эвристики UA, которые вы не зафиксировали в CSS.
Включите macOS Increase Contrast: полупрозрачные панели схлопываются в плоские цвета и вскрывают границы, которые считались декоративными.
Уважайте prefers-reduced-transparency: заменяйте стеклянные слои на непрозрачные поверхности из тех же light-dark()-токенов.
Не полагайтесь только на цвет для состояния ошибки — добавляйте вес шрифта или иконку, чтобы пользователи forced-colors не теряли сигнал.
Для внутренних порталов заведите чек-лист VoiceOver на ссылках в обеих схемах: фокус должен оставаться читаемым, даже если фон карточки стал суше после перехода на токены.
Чек-лист выката для статических пайплайнов
Согласуйте с CDN: устаревший HTML с новыми токенами хуже устаревшего CSS — пользователь видит «голый» текст. Чистите ключи HTML и CSS вместе при смене color-scheme и держите 15-минутное окно наблюдения после purge, чтобы поймать редкие POP с рассинхроном пар.
- Стейджинг с атрибутом на
body, пока визуальный дифф не зелёный. - Снапшоты Playwright для обеих схем при одинаковой ширине вьюпорта — алерт, если дрейф пикселей > 2 % ширины.
- Документируйте порядок локалей: рынки с CJK часто раньше ловят контраст пунктуации.
- Архивируйте трассы Lighthouse и Axe с тем же session id, что и Safari-запись, для аудиторского следа.
После выката сравните долю ошибок консоли, связанных с цветом, и долю отказов на первом экране: резкий рост без изменения трафика часто указывает на кэш, а не на дизайн.
Если у вас монорепозиторий, добавьте pre-commit, который запрещает новые «сырые» hex вне токен-файла — меньше случайных регрессий от копипасты из Figma.
FAQ
Можно ли полностью убрать prefers-color-scheme?
Пока нет — держите его внутри @supports not, пока аналитика не покажет пренебрежимую долю без поддержки.
Работает ли light-dark() с OKLCH?
Да, функции вкладываются: light-dark(oklch(0.95 …), oklch(0.2 …)); сверяйтесь с заметками Safari по комбинациям OKLCH + light-dark.
Сколько времени на Safari QA?
Примерно 20–35 минут на переключение тем плюс ~10 минут VoiceOver по ссылкам.
Mac mini на Apple Silicon остаётся самым быстрым способом закрыть споры о темах WebKit: нативный цветовой менеджмент, предсказуемый нагрев при длинных сессиях и системные переключатели доступности, которых нет в Linux-ВМ. MacHTML сдаёт облачные Mac mini с SSH/VNC, чтобы команды статики проверяли light-dark(), color-scheme и липкий хром без нового CAPEX — подняли на спринт, собрали доказательства, выключили, когда зелёный свет.
Приёмка тем Safari на облачном Mac mini
Арендуйте Apple Silicon, чтобы проверить light-dark(), нативные контролы и системные режимы доступности на реальном WebKit.