mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-11-29 10:24:20 +01:00
131 lines
3.2 KiB
Ruby
131 lines
3.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Stylesheet is a cached CSS file that allows to easily customize the interface of Fab-manager with some configurable colors and
|
|
# a picture for the background of the user's profile.
|
|
# There's only one stylesheet record in the database, which is updated on each colour change.
|
|
class Stylesheet < ApplicationRecord
|
|
# brightness limits to change the font color to black or white
|
|
BRIGHTNESS_HIGH_LIMIT = 160
|
|
BRIGHTNESS_LOW_LIMIT = 40
|
|
|
|
validates :contents, presence: true
|
|
|
|
## ===== COMMON =====
|
|
|
|
def rebuild!
|
|
if Stylesheet.primary && Stylesheet.secondary && name == 'theme'
|
|
update(contents: Stylesheet.theme_css)
|
|
elsif name == 'home_page'
|
|
update(contents: Stylesheet.home_page_css)
|
|
end
|
|
end
|
|
|
|
## ===== THEME =====
|
|
|
|
def self.build_theme!
|
|
return unless Stylesheet.primary && Stylesheet.secondary
|
|
|
|
if Stylesheet.theme
|
|
Stylesheet.theme.rebuild!
|
|
else
|
|
Stylesheet.create!(contents: Stylesheet.theme_css, name: 'theme')
|
|
end
|
|
end
|
|
|
|
def self.primary
|
|
Setting.get('main_color')
|
|
end
|
|
|
|
def self.secondary
|
|
Setting.get('secondary_color')
|
|
end
|
|
|
|
def self.primary_lightest
|
|
Stylesheet.primary_light.paint.lighten(60)
|
|
end
|
|
|
|
def self.primary_light
|
|
Stylesheet.primary.paint.lighten(10)
|
|
end
|
|
|
|
def self.primary_dark
|
|
Stylesheet.primary.paint.darken(20)
|
|
end
|
|
|
|
def self.primary_darkest
|
|
Stylesheet.primary_dark.paint.darken(20)
|
|
end
|
|
|
|
def self.secondary_lightest
|
|
Stylesheet.secondary_light.paint.lighten(60)
|
|
end
|
|
|
|
def self.secondary_light
|
|
Stylesheet.secondary.paint.lighten(10)
|
|
end
|
|
|
|
def self.secondary_dark
|
|
Stylesheet.secondary.paint.darken(20)
|
|
end
|
|
|
|
def self.secondary_darkest
|
|
Stylesheet.secondary_dark.paint.darken(20)
|
|
end
|
|
|
|
def self.primary_with_alpha(alpha)
|
|
Stylesheet.primary.paint.to_rgb.insert(3, 'a').insert(-2, ", #{alpha}")
|
|
end
|
|
|
|
def self.theme
|
|
Stylesheet.find_by(name: 'theme')
|
|
end
|
|
|
|
def self.primary_text_color
|
|
Stylesheet.primary.paint.brightness >= BRIGHTNESS_HIGH_LIMIT ? 'black' : 'white'
|
|
end
|
|
|
|
def self.primary_decoration_color
|
|
Stylesheet.primary.paint.brightness <= BRIGHTNESS_LOW_LIMIT ? 'white' : 'black'
|
|
end
|
|
|
|
def self.secondary_text_color
|
|
Stylesheet.secondary.paint.brightness <= BRIGHTNESS_LOW_LIMIT ? 'white' : 'black'
|
|
end
|
|
|
|
def self.theme_css
|
|
erb_files = Dir['app/themes/casemate/**/*.scss.erb']
|
|
scss_files = Dir['app/themes/casemate/**/*.scss']
|
|
|
|
templates = ''
|
|
erb_files.each { |erb_file| templates += ERB.new(File.read(erb_file)).result }
|
|
scss_files.each { |scss_file| templates += File.read(scss_file) }
|
|
|
|
engine = SassC::Engine.new(templates, style: :compressed)
|
|
engine.render.presence
|
|
end
|
|
|
|
## ===== HOME PAGE =====
|
|
|
|
def self.home_style
|
|
style = Setting.get('home_css')
|
|
".home-page { #{style} }"
|
|
end
|
|
|
|
def self.build_home!
|
|
if Stylesheet.home_page
|
|
Stylesheet.home_page.rebuild!
|
|
else
|
|
Stylesheet.create!(contents: Stylesheet.home_page_css, name: 'home_page')
|
|
end
|
|
end
|
|
|
|
def self.home_page
|
|
Stylesheet.find_by(name: 'home_page')
|
|
end
|
|
|
|
def self.home_page_css
|
|
engine = SassC::Engine.new(home_style, style: :compressed)
|
|
engine.render.presence || '.home-page {}'
|
|
end
|
|
end
|