discourse/app/helpers/email_helper.rb
Isaac Janzen 692e0140e2
FEATURE: Enables support for dark mode emails (#16520)
This PR enables custom email dark mode styles by default that were added here.

There is currently poor support for dark mode queries in mail clients. The main beneficiary of these changes will be Apple Mail and Outlook.

Enjoy the darkness 🕶️
2022-04-20 13:00:04 -05:00

119 lines
2.5 KiB
Ruby

# frozen_string_literal: true
require 'erb'
module EmailHelper
def mailing_list_topic(topic, post_count)
render(
partial: partial_for("mailing_list_post"),
locals: { topic: topic, post_count: post_count }
)
end
def mailing_list_topic_text(topic)
url, title = extract_details(topic)
raw(@markdown_linker.create(title, url))
end
def private_topic_title(topic)
I18n.t("system_messages.private_topic_title", id: topic.id)
end
def email_topic_link(topic)
url, title = extract_details(topic)
raw "<a href='#{Discourse.base_url}#{url}' style='color: ##{@anchor_color}'>#{title}</a>"
end
def email_html_template
EmailStyle.new.html
.sub('%{email_content}') { capture { yield } }
.gsub('%{html_lang}', html_lang)
.gsub('%{dark_mode_meta_tags}', dark_mode_meta_tags)
.gsub('%{dark_mode_styles}', dark_mode_styles)
.html_safe
end
protected
def dark_mode_meta_tags
"
<meta name='color-scheme' content='light dark' />
<meta name='supported-color-schemes' content='light dark' />
"
end
def dark_mode_styles
"
<style>
@media (prefers-color-scheme: dark) {
html {
background: #151515 !important;
}
h1,
h2,
h3,
h4,
h5,
h6,
p,
span,
td {
color: #dddddd !important;
}
[data-stripped-secure-media] {
border-color: #454545 !important;
}
[dm='text-color'] {
color: #dddddd;
}
[dm='header'] {
background: #151515 !important;
}
[dm='topic-body'] {
background: #151515 !important;
border-bottom: 1px solid #454545 !important;
}
[dm='triangle'] {
border-top-color: #151515 !important;
}
[dm='body'] {
background: #222222 !important;
color: #dddddd !important;
}
[dm='body_primary'] {
background: #062e3d !important;
color: #dddddd !important;
}
[dm='bg'] {
background: #323232 !important;
border-color: #454545 !important;
}
}
</style>
"
end
def extract_details(topic)
if SiteSetting.private_email?
[topic.slugless_url, private_topic_title(topic)]
else
[topic.relative_url, format_topic_title(topic.title)]
end
end
def partial_for(name)
SiteSetting.private_email? ? "email/secure_#{name}" : "email/#{name}"
end
end