Расследование проблем с темным режимом в сводном письме об активности

_Это должно было быть короткое сообщение с несколькими картинками и простым решением. Но всё вышло из-под контроля. HTML-письма — дело сложное. Для развлечения посмотрите, как всё может пойти не так: Gmail's dark mode · Issue #68 · hteumeuleu/email-bugs · GitHub :slight_smile:

Не стесняйтесь пролистать это сообщение и посмотреть на картинки. К концу я пришёл к выводу, что из-за популярности тёмной темы, возможно, стоит переработать сводное письмо, вместо того чтобы пытаться накладывать решения на текущий код. Это не в моей власти, и, возможно, я просто слишком долго в этом копался.


Появились некоторые недавние вопросы о том, как отображаются сводные письма в почтовых клиентах, настроенных на тёмную тему. Основная проблема заключается в том, что цвет фона заголовка сводного письма инвертируется в почтовых клиентах, которые обрабатывают тёмную тему путём полной инверсии цветов (приложение Gmail для iOS, Outlook 2021 для Windows, Office 365 для Windows и почтовый клиент Windows). Это создаёт проблему контраста между цветом заголовка и логотипом сайта.

В этих почтовых клиентах также есть проблема с цветом текста в кнопках и в разделе «С момента вашего последнего визита» сводного письма.

Все изображения ниже получены из сервиса тестирования электронной почты Litmus:

Со сайта Discourse с тёмной цветовой схемой, использующим белый PNG-логотип с прозрачным фоном:

Ожидаемый результат (Gmail App Dark для Android):

Плохой результат (Gmail Dark для iOS, OL Office 365 Dark, Outlook 2021 Dark, Windows 10 Mail Dark):

Обзор мобильных клиентов (Gmail для iOS — единственный клиент с очевидными проблемами с цветом заголовка):

Вот тот же тест с письмом Meta Digest (цветовая схема по умолчанию — светлая, тёмный PNG-логотип на прозрачном фоне). Обратите внимание, что в Meta не включена настройка сайта apply custom styles to digest, поэтому для клиентов, поддерживающих тёмную тему (Apple Mail и последние версии почтового клиента iOS), не применяются мета-теги и стили тёмной темы. Если бы настройка apply custom styles to digest была включена, я подозреваю, что тесты для iPhone в тёмной теме также имели бы проблемы с контрастом логотипа и фона.

Есть несколько способов принудительно установить цвет фона заголовка письма в соответствие с цветовой схемой сайта по умолчанию:

Для приложения Gmail на iOS цвет фона заголовка можно задать с помощью фоновой картинки, созданной с помощью linear-gradient. Фоновые картинки, созданные таким образом, не подвергаются инверсии цвета. Суть трюка в том, чтобы установить оба цвета linear-gradient равными значению цвета «header background» цветовой схемы сайта Discourse по умолчанию.

Это можно сделать сейчас, добавив пользовательский CSS на вкладку Администрирование / Настройка / Стиль письма / CSS. Установите значения цветов равными значению цвета «header background» вашей цветовой схемы по умолчанию. (Обратите внимание: использовать var(--header_background) для установки цвета в редакторе CSS для писем невозможно):

.digest-header {
    background-image: linear-gradient(#111, #111);
}

Протестировав этот подход для письма Meta Digest, я начинаю сомневаться в его применимости для сайтов со светлой цветовой схемой по умолчанию. Логотип читаем, но не выглядит ли это немного странно?

Для настольных почтовых клиентов Outlook 2021 Dark и Windows 10 Mail Dark проблему инверсии цвета фона заголовка можно решить, добавив правило !important к свойству background-color, установленному для .digest-header. Это нельзя сделать через пользовательский CSS, так как Discourse уже добавляет стиль background-color к элементу без правила !important. Это правило добавляется после пользовательского CSS, поэтому оно имеет приоритет. (Обратите внимание: этот подход, похоже, работает только для принудительной установки тёмного цвета фона. Он не срабатывает, когда я пытаюсь использовать его для установки фона заголовка в #ffffff.)

Проблема с цветом текста в разделе «С момента вашего последнего визита» для почтовых клиентов, выполняющих полную инверсию цветов, не имеет простого решения. Здесь предложен хак для iOS Gmail: Fixing Gmail’s dark mode issues with CSS Blend Modes — HTeuMeuLeu.com. Он использует режимы наложения, чтобы обмануть Gmail и заставить его установить белый цвет текста. Теоретически это работает, но учитывая сложность разметки сводного письма, я не думаю, что стоит это развивать.

Подводя итог, я считаю, что для сайтов Discourse, у которых тёмная цветовая схема является схемой по умолчанию, хорошим решением на данный момент будет добавление приведённого выше CSS на вкладку Стиль письма / CSS. Это сделает логотип сайта читаемым в приложении Gmail Dark для iOS. Его добавление не вызвало никаких проблем в других протестированных почтовых клиентах. Для сайтов со светлой цветовой схемой по умолчанию я менее уверен в этом подходе. Принудительная установка белого фона заголовка на иначе тёмном экране выглядит не очень хорошо.

Сводное письмо было разработано до того, как тёмная тема стала широко использоваться. Возможно, из-за недавней популярности тёмной темы имеет смысл переработать сводное письмо с целью обеспечить его корректное отображение как в тёмной, так и в светлой теме на популярных почтовых клиентах.

Если полная переработка сводного письма выходит за рамки задач, возможно, стоит рассмотреть возможность внедрения настроек dark_mode_digest_logo и light_mode_digest_logo. По крайней мере, в некоторых почтовых клиентах можно будет определять режим и отображать соответствующий логотип.

Для улучшения тёмной темы в настольных клиентах Outlook компания Discourse могла бы оставить некоторые имена классов в HTML письма вместо того, чтобы удалять их все. Эти имена классов можно было бы использовать для таргетинга тёмной темы в Outlook: https://litmus.com/community/discussions/8256-outlook-app-vs-dark-mode-on-ios-a-disaster#comment-16402. (Обратите внимание: Outlook не поддерживает несколько имён классов для одного элемента, поэтому некоторые имена классов всё ещё придётся удалять из файла digest.html.erb.)

7 лайков

Я понял, что, возможно, недостаточно четко сформулировал самую очевидную проблему. Настройка сайта «Применять пользовательские стили к дайджесту» включена по умолчанию. Эта настройка используется для добавления мета-тегов и правил CSS, которые заставляют почтовые клиенты iOS отображать письма в темном режиме, если пользователь включил темный режим на устройстве.

Если не предпринять специальных мер для загрузки логотипа дайджеста, обеспечивающего достаточный контраст как на светлом, так и на темном фоне, дайджест-письма с сайтов, где логотип оптимизирован для светлого фона, при просмотре в темном режиме в популярных почтовых клиентах будут выглядеть примерно так:

Отключение настройки сайта «Применять пользовательские стили к дайджесту» на самом деле даст лучшие результаты. При отключенной настройке стили темного режима не будут применяться к почтовым приложениям iOS. Однако они все равно будут применяться к почтовым клиентам Android и приложению Gmail на iOS.

Возможно, в настоящее время лучшей практикой следует считать попытку загрузить в настройку сайта «Логотип дайджеста» логотип, который хорошо смотрится как на светлом, так и на темном фоне. Если это невозможно, сайтам Discourse со светлой темой по умолчанию следует отключить настройку «Применять пользовательские стили к дайджесту». Сайтам Discourse с темной темой по умолчанию следует оставить эту настройку включенной. Пока не стоит воспринимать совет касательно настройки «Применять пользовательские стили к дайджесту» как окончательный, но, судя по некоторым тестам, это, вероятно, правильный подход.

Это будет работать только для почтовых клиентов, поддерживающих @media (prefers-color-scheme): Can I email… @media (prefers-color-scheme). Существует риск того, что в других почтовых клиентах могут отобразиться обе версии логотипа.

5 лайков

Спасибо за эту тщательную работу, Саймон :+1: :exploding_head:

Это ужасно. Я сталкиваюсь с этим на своем смартфоне, и я даже не понимаю, как идея принудительной инверсии цветов независимо от содержимого могла показаться хорошей.

3 лайка

Интересно, не могло бы решением стать создание изображения в прямоугольном формате, где используется логотип сайта и фоновый цвет заголовка, применяемый на сайте в настоящее время, вместо самого логотипа?

Это нужно будет реализовать на стороне сервера, но использование блока с изображением и указанным цветом фона позволит избежать инверсии цвета фона в Gmail.

Кстати, я проверил несколько крупных брендовых писем в приложении Gmail в тёмной теме, и большинство из них тоже не решили эту проблему.

2 лайка

Без этого можно принудительно задать конкретные цвета фона в большинстве почтовых клиентов, за исключением некоторых старых десктопных клиентов Outlook. (Полагаю, что тёмная тема на десктопных клиентах используется не так часто.)

Для почтовых клиентов iOS (за исключением Gmail) Discourse уже делает это, если включена настройка «Применять пользовательские стили к дайджесту». Проблема в том, что цвет фона прописан жёстко и не учитывает «цвет фона заголовка» сайта:

Правило [dm='header'] можно изменить следующим образом:

"
[dm='header'] {
  background: ##{ColorScheme.hex_for_name('header_background')} !important;
}
"

Если это уместно, аналогичный подход можно применить к секции «С момента вашего последнего визита»:

"
[dm='body_primary'] {
  background: #{SiteSetting.email_accent_bg_color} !important;
  color: #{SiteSetting.email_accent_fg_color} !important;
}
"

Обратите внимание, что атрибут dm для стилей тёмной темы добавляется к письму здесь: discourse/lib/email/styles.rb at main · discourse/discourse · GitHub.

Подобное решение должно исправить проблему в почтовых клиентах iOS (за исключением Gmail).

Для клиента Gmail на iOS цвета фона можно принудительно задать, используя линейный градиент. Похоже, что установка фона в виде линейного градиента таким образом не вызывает никаких нежелательных побочных эффектов для всех почтовых клиентов. Поэтому можно просто добавить цвет фона в виде линейного градиента в встроенные CSS-стили, отправляемые всем почтовым клиентам.

Мое предположение: самое простое решение для секции «С момента вашего последнего визита» в почтовых клиентах, выполняющих полную инверсию цветов, — позволить клиентам выполнять инверсию, но убедиться, что между настройками email accent accent bg color и email accent fg color обеспечен достаточный контраст:

Это должно предотвратить случаи, подобные этому (при значениях по умолчанию для этих настроек):

1 лайк

Самое простое изменение, которое Discourse может внести прямо сейчас, чтобы повысить вероятность корректного отображения сводных писем в тёмной теме, — это отключить по умолчанию настройку сайта «Применять пользовательские стили к дайджесту». (Обратите внимание: это затронет только почтовые клиенты на iOS.)

Ещё одно небольшое изменение — обновить текст описания настройки сайта «Логотип дайджеста», чтобы рекомендовать загружать логотип с достаточным контрастом при отображении как на светлом, так и на тёмном фоне. Стандартный приём для тёмных логотипов — добавить белую обводку.

Возможно, на странице «Письма / Предпросмотр сводки» стоит добавить предупреждение о том, что некоторые почтовые клиенты выполняют «полную инверсию цветов» при просмотре письма в тёмной теме. Владельцам сайтов можно рекомендовать тестировать свои сводные письма в тёмной теме в тех почтовых клиентах, которые у них есть в наличии.

1 лайк

Спасибо за подробности!

В качестве быстрого решения я добавил этот CSS в настройки Электронной почты:

@media (prefers-color-scheme: dark) {
    body > div > table > tbody > tr > td > table[dm="header"] {
        background: #c89f4c !important;
    }
}

Это сделало фон заголовка светлее, и теперь мой логотип отображается корректно (по крайней мере, в предпросмотре).