mirror of
https://github.com/discourse/discourse.git
synced 2025-06-01 02:04:53 +08:00
FEATURE: Native theme support
This feature introduces the concept of themes. Themes are an evolution of site customizations. Themes introduce two very big conceptual changes: - A theme may include other "child themes", children can include grand children and so on. - A theme may specify a color scheme The change does away with the idea of "enabled" color schemes. It also adds a bunch of big niceties like - You can source a theme from a git repo - History for themes is much improved - You can only have a single enabled theme. Themes can be selected by users, if you opt for it. On a technical level this change comes with a whole bunch of goodies - All CSS is now compiled using a custom pipeline that uses libsass see /lib/stylesheet - There is a single pipeline for css compilation (in the past we used one for customizations and another one for the rest of the app - The stylesheet pipeline is now divorced of sprockets, there is no reliance on sprockets for CSS bundling - CSS is generated with source maps everywhere (including themes) this makes debugging much easier - Our "live reloader" is smarter and avoid a flash of unstyled content we run a file watcher in "puma" in dev so you no longer need to run rake autospec to watch for CSS changes
This commit is contained in:
57
spec/components/stylesheet/manager_spec.rb
Normal file
57
spec/components/stylesheet/manager_spec.rb
Normal file
@ -0,0 +1,57 @@
|
||||
require 'rails_helper'
|
||||
require 'stylesheet/compiler'
|
||||
|
||||
describe Stylesheet::Manager do
|
||||
it 'can correctly compile theme css' do
|
||||
theme = Theme.new(
|
||||
name: 'parent',
|
||||
user_id: -1
|
||||
)
|
||||
|
||||
theme.set_field(:common, "scss", ".common{.scss{color: red;}}")
|
||||
theme.set_field(:desktop, "scss", ".desktop{.scss{color: red;}}")
|
||||
theme.set_field(:mobile, "scss", ".mobile{.scss{color: red;}}")
|
||||
theme.set_field(:common, "embedded_scss", ".embedded{.scss{color: red;}}")
|
||||
|
||||
theme.save!
|
||||
|
||||
|
||||
child_theme = Theme.new(
|
||||
name: 'parent',
|
||||
user_id: -1,
|
||||
)
|
||||
|
||||
child_theme.set_field(:common, "scss", ".child_common{.scss{color: red;}}")
|
||||
child_theme.set_field(:desktop, "scss", ".child_desktop{.scss{color: red;}}")
|
||||
child_theme.set_field(:mobile, "scss", ".child_mobile{.scss{color: red;}}")
|
||||
child_theme.set_field(:common, "embedded_scss", ".child_embedded{.scss{color: red;}}")
|
||||
child_theme.save!
|
||||
|
||||
theme.add_child_theme!(child_theme)
|
||||
|
||||
old_link = Stylesheet::Manager.stylesheet_link_tag(:desktop_theme, 'all', theme.key)
|
||||
|
||||
manager = Stylesheet::Manager.new(:desktop_theme, theme.key)
|
||||
manager.compile(force: true)
|
||||
|
||||
css = File.read(manager.stylesheet_fullpath)
|
||||
_source_map = File.read(manager.source_map_fullpath)
|
||||
|
||||
expect(css).to match(/child_common/)
|
||||
expect(css).to match(/child_desktop/)
|
||||
expect(css).to match(/\.common/)
|
||||
expect(css).to match(/\.desktop/)
|
||||
|
||||
|
||||
child_theme.set_field(:desktop, :scss, ".nothing{color: green;}")
|
||||
child_theme.save!
|
||||
|
||||
new_link = Stylesheet::Manager.stylesheet_link_tag(:desktop_theme, 'all', theme.key)
|
||||
|
||||
expect(new_link).not_to eq(old_link)
|
||||
|
||||
# our theme better have a name with the theme_id as part of it
|
||||
expect(new_link).to include("/stylesheets/desktop_theme_#{theme.id}_")
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user