Retrospring/app/helpers/theme_helper.rb

119 lines
2.7 KiB
Ruby

module ThemeHelper
ATTRIBUTE_MAP = {
'primary_color' => 'primary',
'primary_text' => 'primary-text',
'danger_color' => 'danger',
'danger_text' => 'danger-text',
'warning_color' => 'warning',
'warning_text' => 'warning-text',
'info_color' => 'info',
'info_text' => 'info-text',
'success_color' => 'success',
'success_text' => 'success-text',
'dark_color' => 'dark',
'dark_text' => 'dark-text',
'light_color' => 'light',
'light_text' => 'light-text',
'raised_background' => 'raised-bg',
'raised_accent' => 'raised-accent',
'background_color' => 'background',
'body_text' => 'body-text',
'input_color' => 'input-bg',
'input_text' => 'input-text',
'muted_text' => 'muted-text'
}.freeze
def render_theme
theme = get_active_theme
return unless theme
body = ":root {\n"
theme.attributes.each do |k, v|
next unless ATTRIBUTE_MAP.key?(k)
if k.include? 'text'
hex = get_hex_color_from_theme_value(v)
body += "\t--#{ATTRIBUTE_MAP[k]}: #{get_decimal_triplet_from_hex(hex)};\n"
else
body += "\t--#{ATTRIBUTE_MAP[k]}: ##{get_hex_color_from_theme_value(v)};\n"
end
end
body += "\t--turbolinks-progress-color: ##{lighten(theme.primary_color)}\n"
body += '}'
content_tag(:style, body)
end
def theme_color
theme = get_active_theme
if theme
theme.theme_color
else
'#5e35b1'
end
end
def mobile_theme_color
theme = get_active_theme
if theme
theme.mobile_theme_color
else
'#f0edf4'
end
end
def get_active_theme
if @user&.theme
if user_signed_in?
if current_user&.show_foreign_themes?
@user.theme
else
current_user&.theme
end
else
@user.theme
end
elsif @answer&.user&.theme
if user_signed_in?
if current_user&.show_foreign_themes?
@answer.user.theme
else
current_user&.theme
end
else
@answer.user.theme
end
elsif current_user&.theme
current_user.theme
end
end
def get_hex_color_from_theme_value(value)
("0000000#{value.to_s(16)}")[-6, 6]
end
def get_decimal_triplet_from_hex(value)
hexes = value.split(/(.{2})/).reject { |c| c.empty? }
hexes.map(&:hex).join(', ')
end
def rgb_values_from_hex(value)
[
(value & 0xFF0000) >> 16, # R
(value & 0x00FF00) >> 8, # G
value & 0x0000FF # B
]
end
def rgb_to_hex(rgb_values)
rgb_values.map.with_index { |v, i| v << (2 - i) * 8 }.reduce(&:+).to_s(16)
end
def lighten(value, amount = 0.25)
rgb_to_hex(rgb_values_from_hex(value).map { |v| [(v + 255 * amount).round, 255].min })
end
end