Merge remote-tracking branch 'origin/better-themeing' into merging-upstream
This commit is contained in:
@@ -12,6 +12,7 @@ class ApplicationController < ActionController::Base
|
||||
|
||||
helper_method :current_account
|
||||
helper_method :current_session
|
||||
helper_method :current_theme
|
||||
helper_method :single_user_mode?
|
||||
|
||||
rescue_from ActionController::RoutingError, with: :not_found
|
||||
@@ -77,6 +78,11 @@ class ApplicationController < ActionController::Base
|
||||
@current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id'])
|
||||
end
|
||||
|
||||
def current_theme
|
||||
return Setting.default_settings['theme'] unless Themes.instance.names.include? current_user&.setting_theme
|
||||
current_user.setting_theme
|
||||
end
|
||||
|
||||
def cache_collection(raw, klass)
|
||||
return raw unless klass.respond_to?(:with_includes)
|
||||
|
||||
|
@@ -41,6 +41,7 @@ class Settings::PreferencesController < ApplicationController
|
||||
:setting_auto_play_gif,
|
||||
:setting_system_font_ui,
|
||||
:setting_noindex,
|
||||
:setting_theme,
|
||||
notification_emails: %i(follow follow_request reblog favourite mention digest),
|
||||
interactions: %i(must_be_follower must_be_following)
|
||||
)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
@import 'variables';
|
||||
@import 'styles/variables';
|
||||
|
||||
.glitch.local-settings__navigation__item {
|
||||
display: block;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
@import 'variables';
|
||||
@import 'styles/variables';
|
||||
|
||||
.glitch.local-settings__navigation {
|
||||
background: $primary-text-color;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
@import 'variables';
|
||||
@import 'styles/variables';
|
||||
|
||||
.glitch.local-settings__page__item {
|
||||
select {
|
||||
|
@@ -1,4 +1,4 @@
|
||||
@import 'variables';
|
||||
@import 'styles/variables';
|
||||
|
||||
.glitch.local-settings__page {
|
||||
display: block;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
@import 'variables';
|
||||
@import 'styles/variables';
|
||||
|
||||
.glitch.local-settings {
|
||||
position: relative;
|
||||
|
@@ -2,7 +2,7 @@ import loadPolyfills from '../mastodon/load_polyfills';
|
||||
|
||||
// import default stylesheet with variables
|
||||
require('font-awesome/css/font-awesome.css');
|
||||
require('mastodon-application-style');
|
||||
import 'styles/application';
|
||||
|
||||
require.context('../images/', true);
|
||||
|
||||
|
@@ -1,16 +0,0 @@
|
||||
// This file replaces `app/javascript/packs/application.js` for use
|
||||
// with multiple frontends.
|
||||
|
||||
import loadPolyfills from '../../mastodon/load_polyfills';
|
||||
|
||||
// import default stylesheet with variables
|
||||
require('font-awesome/css/font-awesome.css');
|
||||
require('mastodon-application-style');
|
||||
|
||||
require.context('../../images/', true);
|
||||
|
||||
loadPolyfills().then(() => {
|
||||
require('../../mastodon/main').default();
|
||||
}).catch(e => {
|
||||
console.error(e);
|
||||
});
|
@@ -1 +0,0 @@
|
||||
@import 'application';
|
9
app/javascript/themes/default/theme.yml
Normal file
9
app/javascript/themes/default/theme.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
# (REQUIRED) Name must be unique across all installed themes.
|
||||
name: default
|
||||
|
||||
# (REQUIRED) The location of the pack file inside `pack_directory`.
|
||||
pack: application.js
|
||||
|
||||
# (OPTIONAL) The directory which contains the pack file.
|
||||
# Defaults to the theme directory (`app/javascript/themes/[theme]`).
|
||||
pack_directory: app/javascript/packs
|
2
app/javascript/themes/spin/pack.js
Normal file
2
app/javascript/themes/spin/pack.js
Normal file
@@ -0,0 +1,2 @@
|
||||
import 'packs/application';
|
||||
import 'themes/spin/style';
|
14
app/javascript/themes/spin/style.scss
Normal file
14
app/javascript/themes/spin/style.scss
Normal file
@@ -0,0 +1,14 @@
|
||||
:root:root:root {
|
||||
.button, .icon-button, .emoji-button, .account__avatar, .account__avatar-overlay {
|
||||
animation: spin 4s linear infinite;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
2
app/javascript/themes/spin/theme.yml
Normal file
2
app/javascript/themes/spin/theme.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
name: spin
|
||||
pack: pack.js
|
23
app/lib/themes.rb
Normal file
23
app/lib/themes.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'singleton'
|
||||
require 'yaml'
|
||||
|
||||
class Themes
|
||||
include Singleton
|
||||
|
||||
def initialize
|
||||
result = Hash.new
|
||||
Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path|
|
||||
data = YAML.load_file(path)
|
||||
if data['pack'] && data['name']
|
||||
result[data['name']] = data
|
||||
end
|
||||
end
|
||||
@conf = result
|
||||
end
|
||||
|
||||
def names
|
||||
@conf.keys
|
||||
end
|
||||
end
|
@@ -25,6 +25,7 @@ class UserSettingsDecorator
|
||||
user.settings['auto_play_gif'] = auto_play_gif_preference
|
||||
user.settings['system_font_ui'] = system_font_ui_preference
|
||||
user.settings['noindex'] = noindex_preference
|
||||
user.settings['theme'] = theme_preference
|
||||
end
|
||||
|
||||
def merged_notification_emails
|
||||
@@ -67,6 +68,10 @@ class UserSettingsDecorator
|
||||
boolean_cast_setting 'setting_noindex'
|
||||
end
|
||||
|
||||
def theme_preference
|
||||
settings['setting_theme']
|
||||
end
|
||||
|
||||
def boolean_cast_setting(key)
|
||||
settings[key] == '1'
|
||||
end
|
||||
|
@@ -110,6 +110,10 @@ class User < ApplicationRecord
|
||||
settings.noindex
|
||||
end
|
||||
|
||||
def setting_theme
|
||||
settings.theme
|
||||
end
|
||||
|
||||
def token_for_app(a)
|
||||
return nil if a.nil? || a.owner != self
|
||||
Doorkeeper::AccessToken
|
||||
|
@@ -2,8 +2,8 @@
|
||||
%meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key}
|
||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
|
||||
|
||||
= javascript_pack_tag "frontends/#{@frontend}", integrity: true, crossorigin: 'anonymous'
|
||||
= stylesheet_pack_tag "frontends/#{@frontend}", integrity: true, media: 'all'
|
||||
= javascript_pack_tag "themes/#{current_theme}", integrity: true, crossorigin: 'anonymous'
|
||||
= stylesheet_pack_tag "themes/#{current_theme}", integrity: true, media: 'all'
|
||||
|
||||
.app-holder#mastodon{ data: { props: Oj.dump(default_props) } }
|
||||
%noscript
|
||||
|
@@ -5,6 +5,8 @@
|
||||
= render 'shared/error_messages', object: current_user
|
||||
|
||||
.fields-group
|
||||
= f.input :setting_theme, collection: Themes.instance.names, label_method: lambda { |theme| safe_join([I18n.t("themes.#{theme}", default: theme)])}, wrapper: :with_label, include_blank: false
|
||||
|
||||
= f.input :locale,
|
||||
collection: I18n.available_locales,
|
||||
wrapper: :with_label,
|
||||
|
Reference in New Issue
Block a user