Investigando problemas de modo escuro no e-mail de resumo de atividade

Esta era para ser uma postagem curta com algumas imagens e uma solução fácil de aplicar. Ficou fora de controle. E-mail HTML é difícil. Para se divertir, veja como isso pode dar errado: Gmail's dark mode · Issue #68 · hteumeuleu/email-bugs · GitHub :slight_smile:

Sinta-se à vontade para dar uma olhada nesta postagem e nas imagens. Ao final da postagem, eu teria chegado mais ou menos à conclusão de que, devido à popularidade do modo escuro, talvez valesse a pena refazer o e-mail de resumo, em vez de tentar aplicar soluções improvisadas ao seu código atual. Isso não depende de mim, e talvez eu esteja olhando para isso há muito tempo.


Houve algumas perguntas recentes sobre como os e-mails de resumo são renderizados em clientes de e-mail configurados para o modo escuro. O principal problema é que a cor de fundo do cabeçalho do resumo é invertida em clientes de e-mail que lidam com o modo escuro invertendo completamente as cores (aplicativo Gmail (iOS), Outlook 2021 (Windows), Office 365 (Windows) e Windows Mail). Isso cria um problema de contraste entre a cor do cabeçalho e o logotipo do site.

Esses clientes de e-mail também têm problemas com a cor do texto nos botões e na seção “Desde sua última visita” do resumo.

Todas as imagens abaixo são do serviço de teste de e-mail Litmus:

De um site Discourse com um esquema de cores escuro, usando um logotipo PNG branco com fundo transparente:

Esperado (Gmail App Dark para Android):

Ruim (Gmail Dark para iOS, OL Office 365 Dark, Outlook 2021 Dark, Windows 10 Mail Dark):

Visão geral do cliente móvel (o Gmail para iOS é o único cliente com problemas óbvios com a cor do cabeçalho):

Aqui está o mesmo teste com o e-mail de resumo do Meta (esquema de cores claro padrão, logotipo PNG escuro em fundo transparente). Observe que o Meta não tem a configuração do site apply custom styles to digest ativada, portanto, não está recebendo as meta tags e estilos do modo escuro para clientes que os suportam (Apple Mail e versões recentes do Mail do iOS). Se a configuração apply custom styles to digest estivesse ativada, suspeito que os testes do iPhone Dark também teriam problemas de contraste entre o logotipo e a cor de fundo.

Existem algumas maneiras de forçar a cor de fundo do cabeçalho do e-mail a corresponder à cor do esquema de cores padrão do site:

Para o aplicativo Gmail para iOS, a cor de fundo do cabeçalho pode ser definida com uma imagem de fundo criada com um linear-gradient. Imagens de fundo criadas dessa forma não têm sua cor invertida. O truque é definir ambas as cores do linear-gradient para o valor da cor “header background” do esquema de cores padrão do site Discourse.

Isso pode ser feito agora adicionando CSS personalizado na aba Admin / Customize / Email Style / CSS. Defina os valores de cor para o valor da cor “header background” do esquema de cores padrão. (Observe que não é possível usar var(--header_background) para definir a cor no editor de CSS de e-mail):

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

Testando essa abordagem para o e-mail de resumo do Meta, estou começando a ter algumas dúvidas sobre ela como uma solução para sites que têm um esquema de cores padrão claro. O logotipo é legível, mas isso parece um pouco estranho?

Para os clientes de e-mail de desktop Outlook 2021 Dark e Windows 10 Mail Dark, o problema com a inversão da cor de fundo do cabeçalho pode ser corrigido adicionando uma regra !important à background-color definida para o .digest-header. Isso não pode ser feito via CSS personalizado porque o Discourse já está adicionando um estilo background-color ao elemento sem a regra !important. Essa regra é adicionada após o CSS personalizado, portanto, tem precedência. (Observe que essa abordagem parece funcionar apenas para forçar a cor de fundo para uma cor escura. Ela falha quando tento usá-la para forçar o fundo do cabeçalho para #ffffff.)

O problema com a cor do texto na seção “Desde sua última visita” para clientes de e-mail que realizam uma inversão completa de cores não parece ter uma solução fácil. Existe um hack para o Gmail iOS sugerido aqui: Fixing Gmail’s dark mode issues with CSS Blend Modes — HTeuMeuLeu.com. Ele usa modos de mesclagem para enganar o Gmail a definir uma cor de texto branca. Funciona na teoria, mas dada a complexidade da marcação do e-mail de resumo, não acho que valha a pena prosseguir.

Resumindo, acho que para sites Discourse que têm um esquema de cores escuro como seu esquema de cores padrão, uma boa solução por enquanto seria adicionar o CSS que postei acima à sua aba Email Style / CSS. Isso tornará o logotipo do site legível no aplicativo Gmail Dark do iOS. Adicioná-lo não causou problemas com outros clientes de e-mail que testei. Para sites que têm um esquema de cores claro padrão, estou menos certo sobre essa abordagem. Forçar um fundo de cabeçalho branco em uma tela escura não fica bom.

O e-mail de resumo foi desenvolvido antes que o modo escuro fosse comumente usado. Talvez, devido à popularidade recente do modo escuro, faça sentido refazer o e-mail de resumo com o objetivo de exibi-lo bem em modo escuro e claro em clientes de e-mail populares.

Se refazer completamente o e-mail de resumo estiver fora do escopo, talvez valha a pena considerar fornecer configurações dark_mode_digest_logo e light_mode_digest_logo. Em pelo menos alguns clientes de e-mail, será possível detectar o modo e exibir o logotipo apropriado.

Para melhorar o modo escuro em clientes desktop Outlook, o Discourse poderia deixar alguns nomes de classe no HTML do e-mail em vez de removê-los todos. Esses nomes de classe poderiam ser usados para segmentar o modo escuro no Outlook: https://litmus.com/community/discussions/8256-outlook-app-vs-dark-mode-on-ios-a-disaster#comment-16402. (Observe que o Outlook não consegue lidar com vários nomes de classe em um elemento, então alguns nomes de classe ainda precisariam ser removidos do arquivo digest.html.erb.)

7 curtidas

Percebi que talvez eu não tenha declarado o problema mais óbvio com clareza suficiente. A configuração do site apply custom styles to digest (aplicar estilos personalizados ao resumo) está habilitada por padrão. Essa configuração é usada para adicionar meta tags e regras de CSS que fazem com que os clientes de e-mail do iOS exibam e-mails no modo escuro se o usuário tiver habilitado o modo escuro no dispositivo.

A menos que cuidados especiais sejam tomados para fazer o upload de um logotipo de resumo que tenha contraste suficiente contra fundos claros e escuros, os e-mails de resumo de sites que têm um logotipo otimizado para fundos claros, visualizados no modo escuro em clientes de e-mail populares, ficarão semelhantes a isto:

Desabilitar a configuração do site apply custom styles to digest (aplicar estilos personalizados ao resumo) produzirá, na verdade, melhores resultados. Com essa configuração desabilitada, os estilos do modo escuro não serão aplicados aos aplicativos de e-mail do iOS. Eles ainda serão aplicados aos clientes de e-mail do Android e ao aplicativo Gmail do iOS.

Possivelmente, a melhor prática atual deveria ser tentar fazer o upload de um logotipo para a configuração do site digest logo (logotipo do resumo) que seja exibido bem contra fundos claros e escuros. Se isso não puder ser feito, sites do Discourse com um esquema de cores padrão claro devem desabilitar a configuração do site apply custom styles to digest (aplicar estilos personalizados ao resumo). Sites do Discourse com um esquema de cores padrão escuro devem manter a configuração habilitada. Não tome o conselho sobre a configuração do site apply custom styles to digest (aplicar estilos personalizados ao resumo) como definitivo ainda, mas com base em alguns testes, parece ser a abordagem correta.

Isso funcionaria apenas para clientes de e-mail que suportam @media (prefers-color-scheme): Can I email… @media (prefers-color-scheme). Haveria algum risco de fazer com que ambas as versões do logotipo aparecessem em outros clientes de e-mail.

5 curtidas

Obrigado por este trabalho minucioso, Simon :+1: :exploding_head:

Isso é terrível. Eu experimento isso no meu smartphone e nem entendo como inverter cores à força, independentemente do conteúdo, foi visto como uma boa ideia.

3 curtidas

Eu me pergunto se uma possível solução seria, em vez de usar o logotipo, criarmos uma imagem em formato retangular usando o logotipo do site e a cor de fundo do cabeçalho que o site usa atualmente.

Precisaríamos fazer isso no backend, mas usar um bloco de imagem com a cor incluída como fundo impediria que o Gmail invertesse a cor do fundo.

Para que valha a pena, testei vários e-mails de grandes marcas no meu aplicativo do Gmail enquanto configurado no modo escuro, e a maioria deles também não resolveu isso.

2 curtidas

Sem fazer isso, é possível forçar cores de fundo específicas na maioria dos clientes de e-mail, as exceções parecem ser alguns dos clientes de e-mail desktop mais antigos do Outlook. (Eu acho que o modo escuro não é muito usado em clientes desktop.)

Para clientes de e-mail iOS (excluindo Gmail), o Discourse já está fazendo isso se a configuração apply custom styles to digest estiver habilitada. O problema é que ele está codificando a cor de fundo e não respeitando a cor “header background” do site:

A regra [dm='header'] poderia ser alterada para:

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

Se fizesse sentido, uma abordagem semelhante poderia ser tomada para a seção “Since your last visit”:

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

Note que o atributo dm para estilos de modo escuro é adicionado ao e-mail aqui: discourse/lib/email/styles.rb at main · discourse/discourse · GitHub.

Algo assim deve funcionar para corrigir o problema em clientes de e-mail iOS (excluindo Gmail).

Para o cliente Gmail do iOS, as cores de fundo podem ser forçadas definindo-as com um gradiente linear. Não parecem haver efeitos colaterais indesejados de definir uma cor de fundo em gradiente linear desta forma para todos os clientes de e-mail. Portanto, deve ser bom apenas adicionar uma cor de fundo em gradiente linear ao CSS inline que é enviado para todos os clientes de e-mail.

Minha suspeita é que a solução mais fácil para lidar com a seção “Since your last visit” para clientes de e-mail que realizam uma inversão completa de cores seria apenas deixar os clientes realizarem a inversão, mas garantir que haja muito contraste entre as configurações de email accent accent bg color e email accent fg color:

Isso deve evitar casos como este (com os valores padrão dessas configurações):

1 curtida

A alteração mais fácil que o Discourse poderia fazer agora para aumentar a probabilidade de que os e-mails de resumo sejam exibidos corretamente no modo escuro seria não habilitar a configuração do site apply custom styles to digest por padrão. (Observação: isso afetará apenas os clientes de e-mail do iOS.)

Outra pequena alteração seria atualizar o texto da configuração do site digest logo para incentivar o upload de um logotipo que tenha contraste suficiente ao ser exibido contra uma cor de fundo clara ou escura. O truque principal para logotipos escuros é adicionar um contorno branco ao logotipo.

Possivelmente, a página Emails / Preview summary deveria exibir um aviso de que alguns clientes de e-mail realizarão uma “inversão completa de cores” quando o e-mail for visualizado no modo escuro. Os proprietários do site poderiam ser incentivados a testar seus e-mails de resumo no modo escuro nos clientes de e-mail aos quais têm acesso.

1 curtida

Obrigado pelos detalhes!

Como uma solução rápida, adicionei este CSS nas configurações de E-mails:

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

Isso torna o fundo do cabeçalho mais claro e meu logotipo agora é exibido corretamente (pelo menos na visualização).