Finalized theme loading and stuff
This commit is contained in:
		
							parent
							
								
									321fa41930
								
							
						
					
					
						commit
						bdbbd06dad
					
				| @ -1,6 +1,7 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class AboutController < ApplicationController | class AboutController < ApplicationController | ||||||
|  |   before_action :set_pack | ||||||
|   before_action :set_body_classes |   before_action :set_body_classes | ||||||
|   before_action :set_instance_presenter, only: [:show, :more, :terms] |   before_action :set_instance_presenter, only: [:show, :more, :terms] | ||||||
| 
 | 
 | ||||||
| @ -21,6 +22,10 @@ class AboutController < ApplicationController | |||||||
| 
 | 
 | ||||||
|   helper_method :new_user |   helper_method :new_user | ||||||
| 
 | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack action_name == 'show' ? 'about' : 'common' | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def set_instance_presenter |   def set_instance_presenter | ||||||
|     @instance_presenter = InstancePresenter.new |     @instance_presenter = InstancePresenter.new | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ class AccountsController < ApplicationController | |||||||
|   def show |   def show | ||||||
|     respond_to do |format| |     respond_to do |format| | ||||||
|       format.html do |       format.html do | ||||||
|  |         use_pack 'public' | ||||||
|         @pinned_statuses = [] |         @pinned_statuses = [] | ||||||
| 
 | 
 | ||||||
|         if current_account && @account.blocking?(current_account) |         if current_account && @account.blocking?(current_account) | ||||||
|  | |||||||
| @ -4,8 +4,13 @@ module Admin | |||||||
|   class BaseController < ApplicationController |   class BaseController < ApplicationController | ||||||
|     include Authorization |     include Authorization | ||||||
| 
 | 
 | ||||||
|     before_action :require_staff! |  | ||||||
| 
 |  | ||||||
|     layout 'admin' |     layout 'admin' | ||||||
|  | 
 | ||||||
|  |     before_action :require_staff! | ||||||
|  |     before_action :set_pack | ||||||
|  | 
 | ||||||
|  |     def set_pack | ||||||
|  |       use_pack 'admin' | ||||||
|  |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | |||||||
| @ -12,8 +12,6 @@ class ApplicationController < ActionController::Base | |||||||
| 
 | 
 | ||||||
|   helper_method :current_account |   helper_method :current_account | ||||||
|   helper_method :current_session |   helper_method :current_session | ||||||
|   helper_method :current_theme |  | ||||||
|   helper_method :theme_data |  | ||||||
|   helper_method :single_user_mode? |   helper_method :single_user_mode? | ||||||
| 
 | 
 | ||||||
|   rescue_from ActionController::RoutingError, with: :not_found |   rescue_from ActionController::RoutingError, with: :not_found | ||||||
| @ -54,6 +52,69 @@ class ApplicationController < ActionController::Base | |||||||
|     new_user_session_path |     new_user_session_path | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   def pack(data, pack_name) | ||||||
|  |     return nil unless pack?(data, pack_name) | ||||||
|  |     pack_data = { | ||||||
|  |       common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), | ||||||
|  |       name: data['name'], | ||||||
|  |       pack: pack_name, | ||||||
|  |       preload: nil, | ||||||
|  |       stylesheet: false | ||||||
|  |     } | ||||||
|  |     if data['pack'][pack_name].is_a?(Hash) | ||||||
|  |       pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false | ||||||
|  |       pack_data[:pack] = nil unless data['pack'][pack_name]['filename'] | ||||||
|  |       if data['pack'][pack_name]['preload'] | ||||||
|  |         pack_data[:preload] = [data['pack'][pack_name]['preload']] if data['pack'][pack_name]['preload'].is_a?(String) | ||||||
|  |         pack_data[:preload] = data['pack'][pack_name]['preload'] if data['pack'][pack_name]['preload'].is_a?(Array) | ||||||
|  |       end | ||||||
|  |       pack_data[:stylesheet] = true if data['pack'][pack_name]['stylesheet'] | ||||||
|  |     end | ||||||
|  |     pack_data | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def pack?(data, pack_name) | ||||||
|  |     if data['pack'].is_a?(Hash) && data['pack'].key?(pack_name) | ||||||
|  |       return true if data['pack'][pack_name].is_a?(String) || data['pack'][pack_name].is_a?(Hash) | ||||||
|  |     end | ||||||
|  |     false | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def nil_pack(data, pack_name) | ||||||
|  |     { | ||||||
|  |       common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), | ||||||
|  |       name: data['name'], | ||||||
|  |       pack: nil, | ||||||
|  |       preload: nil, | ||||||
|  |       stylesheet: false | ||||||
|  |     } | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def resolve_pack(data, pack_name) | ||||||
|  |     result = pack(data, pack_name) | ||||||
|  |     unless result | ||||||
|  |       if data['name'] && data.key?('fallback') | ||||||
|  |         if data['fallback'].nil? | ||||||
|  |           return nil_pack(data, pack_name) | ||||||
|  |         elsif data['fallback'].is_a?(String) && Themes.instance.get(data['fallback']) | ||||||
|  |           return resolve_pack(Themes.instance.get(data['fallback']), pack_name) | ||||||
|  |         elsif data['fallback'].is_a?(Array) | ||||||
|  |           data['fallback'].each do |fallback| | ||||||
|  |             return resolve_pack(Themes.instance.get(fallback), pack_name) if Themes.instance.get(fallback) | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  |         return nil_pack(data, pack_name) | ||||||
|  |       end | ||||||
|  |       return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name) : nil_pack(data, pack_name) | ||||||
|  |     end | ||||||
|  |     result | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def use_pack(pack_name) | ||||||
|  |     @core = resolve_pack(Themes.instance.core, pack_name) | ||||||
|  |     @theme = resolve_pack(Themes.instance.get(current_theme), pack_name) | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   protected |   protected | ||||||
| 
 | 
 | ||||||
|   def forbidden |   def forbidden | ||||||
| @ -84,13 +145,13 @@ class ApplicationController < ActionController::Base | |||||||
|     @current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id']) |     @current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id']) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def current_theme |   def default_theme | ||||||
|     return Setting.default_settings['theme'] unless Themes.instance.names.include? current_user&.setting_theme |     Setting.default_settings['theme'] | ||||||
|     current_user.setting_theme |  | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def theme_data |   def current_theme | ||||||
|     Themes.instance.get(current_theme) |     return default_theme unless Themes.instance.names.include? current_user&.setting_theme | ||||||
|  |     current_user.setting_theme | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def cache_collection(raw, klass) |   def cache_collection(raw, klass) | ||||||
|  | |||||||
| @ -2,10 +2,17 @@ | |||||||
| 
 | 
 | ||||||
| class Auth::ConfirmationsController < Devise::ConfirmationsController | class Auth::ConfirmationsController < Devise::ConfirmationsController | ||||||
|   layout 'auth' |   layout 'auth' | ||||||
|  |   before_action :set_pack | ||||||
| 
 | 
 | ||||||
|   def show |   def show | ||||||
|     super do |user| |     super do |user| | ||||||
|       BootstrapTimelineWorker.perform_async(user.account_id) if user.errors.empty? |       BootstrapTimelineWorker.perform_async(user.account_id) if user.errors.empty? | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |    | ||||||
|  |   private | ||||||
|  | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack 'auth' | ||||||
|  |   end | ||||||
| end | end | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| class Auth::PasswordsController < Devise::PasswordsController | class Auth::PasswordsController < Devise::PasswordsController | ||||||
|   before_action :check_validity_of_reset_password_token, only: :edit |   before_action :check_validity_of_reset_password_token, only: :edit | ||||||
|  |   before_action :set_pack | ||||||
| 
 | 
 | ||||||
|   layout 'auth' |   layout 'auth' | ||||||
| 
 | 
 | ||||||
| @ -17,4 +18,8 @@ class Auth::PasswordsController < Devise::PasswordsController | |||||||
|   def reset_password_token_is_valid? |   def reset_password_token_is_valid? | ||||||
|     resource_class.with_reset_password_token(params[:reset_password_token]).present? |     resource_class.with_reset_password_token(params[:reset_password_token]).present? | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack 'auth' | ||||||
|  |   end | ||||||
| end | end | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController | |||||||
| 
 | 
 | ||||||
|   before_action :check_enabled_registrations, only: [:new, :create] |   before_action :check_enabled_registrations, only: [:new, :create] | ||||||
|   before_action :configure_sign_up_params, only: [:create] |   before_action :configure_sign_up_params, only: [:create] | ||||||
|  |   before_action :set_path | ||||||
|   before_action :set_sessions, only: [:edit, :update] |   before_action :set_sessions, only: [:edit, :update] | ||||||
|   before_action :set_instance_presenter, only: [:new, :create, :update] |   before_action :set_instance_presenter, only: [:new, :create, :update] | ||||||
| 
 | 
 | ||||||
| @ -40,6 +41,10 @@ class Auth::RegistrationsController < Devise::RegistrationsController | |||||||
| 
 | 
 | ||||||
|   private |   private | ||||||
| 
 | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack %w(edit update).include?(action_name) ? 'admin' : 'auth' | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def set_instance_presenter |   def set_instance_presenter | ||||||
|     @instance_presenter = InstancePresenter.new |     @instance_presenter = InstancePresenter.new | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ class Auth::SessionsController < Devise::SessionsController | |||||||
|   skip_before_action :check_suspension, only: [:destroy] |   skip_before_action :check_suspension, only: [:destroy] | ||||||
|   prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create] |   prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create] | ||||||
|   before_action :set_instance_presenter, only: [:new] |   before_action :set_instance_presenter, only: [:new] | ||||||
|  |   before_action :set_pack | ||||||
| 
 | 
 | ||||||
|   def create |   def create | ||||||
|     super do |resource| |     super do |resource| | ||||||
| @ -85,6 +86,10 @@ class Auth::SessionsController < Devise::SessionsController | |||||||
| 
 | 
 | ||||||
|   private |   private | ||||||
| 
 | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack 'auth' | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def set_instance_presenter |   def set_instance_presenter | ||||||
|     @instance_presenter = InstancePresenter.new |     @instance_presenter = InstancePresenter.new | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ class AuthorizeFollowsController < ApplicationController | |||||||
|   layout 'modal' |   layout 'modal' | ||||||
| 
 | 
 | ||||||
|   before_action :authenticate_user! |   before_action :authenticate_user! | ||||||
|  |   before_action :set_pack | ||||||
| 
 | 
 | ||||||
|   def show |   def show | ||||||
|     @account = located_account || render(:error) |     @account = located_account || render(:error) | ||||||
| @ -23,6 +24,10 @@ class AuthorizeFollowsController < ApplicationController | |||||||
| 
 | 
 | ||||||
|   private |   private | ||||||
| 
 | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack 'modal' | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def follow_attempt |   def follow_attempt | ||||||
|     FollowService.new.call(current_account, acct_without_prefix) |     FollowService.new.call(current_account, acct_without_prefix) | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -7,7 +7,9 @@ class FollowerAccountsController < ApplicationController | |||||||
|     @follows = Follow.where(target_account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:account) |     @follows = Follow.where(target_account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:account) | ||||||
| 
 | 
 | ||||||
|     respond_to do |format| |     respond_to do |format| | ||||||
|       format.html |       format.html do | ||||||
|  |         use_pack 'public' | ||||||
|  |       end | ||||||
| 
 | 
 | ||||||
|       format.json do |       format.json do | ||||||
|         render json: collection_presenter, |         render json: collection_presenter, | ||||||
|  | |||||||
| @ -7,7 +7,9 @@ class FollowingAccountsController < ApplicationController | |||||||
|     @follows = Follow.where(account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:target_account) |     @follows = Follow.where(account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:target_account) | ||||||
| 
 | 
 | ||||||
|     respond_to do |format| |     respond_to do |format| | ||||||
|       format.html |       format.html do | ||||||
|  |         use_pack 'public' | ||||||
|  |       end | ||||||
| 
 | 
 | ||||||
|       format.json do |       format.json do | ||||||
|         render json: collection_presenter, |         render json: collection_presenter, | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| class HomeController < ApplicationController | class HomeController < ApplicationController | ||||||
|   before_action :authenticate_user! |   before_action :authenticate_user! | ||||||
|  |   before_action :set_pack | ||||||
|   before_action :set_initial_state_json |   before_action :set_initial_state_json | ||||||
| 
 | 
 | ||||||
|   def index |   def index | ||||||
| @ -37,6 +38,10 @@ class HomeController < ApplicationController | |||||||
|     redirect_to(default_redirect_path) |     redirect_to(default_redirect_path) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack 'home' | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def set_initial_state_json |   def set_initial_state_json | ||||||
|     serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) |     serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) | ||||||
|     @initial_state_json   = serializable_resource.to_json |     @initial_state_json   = serializable_resource.to_json | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ class RemoteFollowController < ApplicationController | |||||||
|   layout 'modal' |   layout 'modal' | ||||||
| 
 | 
 | ||||||
|   before_action :set_account |   before_action :set_account | ||||||
|  |   before_action :set_pack | ||||||
|   before_action :gone, if: :suspended_account? |   before_action :gone, if: :suspended_account? | ||||||
| 
 | 
 | ||||||
|   def new |   def new | ||||||
| @ -31,6 +32,10 @@ class RemoteFollowController < ApplicationController | |||||||
|     { acct: session[:remote_follow] } |     { acct: session[:remote_follow] } | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack 'modal' | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def set_account |   def set_account | ||||||
|     @account = Account.find_local!(params[:account_username]) |     @account = Account.find_local!(params[:account_username]) | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -1,9 +1,7 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class Settings::ApplicationsController < ApplicationController | class Settings::ApplicationsController < Settings::BaseController | ||||||
|   layout 'admin' |  | ||||||
| 
 | 
 | ||||||
|   before_action :authenticate_user! |  | ||||||
|   before_action :set_application, only: [:show, :update, :destroy, :regenerate] |   before_action :set_application, only: [:show, :update, :destroy, :regenerate] | ||||||
|   before_action :prepare_scopes, only: [:create, :update] |   before_action :prepare_scopes, only: [:create, :update] | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								app/controllers/settings/base_controller.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								app/controllers/settings/base_controller.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | class Settings::BaseController < ApplicationController | ||||||
|  |   layout 'admin' | ||||||
|  | 
 | ||||||
|  |   before_action :authenticate_user! | ||||||
|  |   before_action :set_pack | ||||||
|  | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack 'settings' | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -1,10 +1,8 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class Settings::DeletesController < ApplicationController | class Settings::DeletesController < Settings::BaseController | ||||||
|   layout 'admin' |  | ||||||
| 
 | 
 | ||||||
|   before_action :check_enabled_deletion |   before_action :check_enabled_deletion | ||||||
|   before_action :authenticate_user! |  | ||||||
| 
 | 
 | ||||||
|   def show |   def show | ||||||
|     @confirmation = Form::DeleteConfirmation.new |     @confirmation = Form::DeleteConfirmation.new | ||||||
|  | |||||||
| @ -1,10 +1,6 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class Settings::ExportsController < ApplicationController | class Settings::ExportsController < Settings::BaseController | ||||||
|   layout 'admin' |  | ||||||
| 
 |  | ||||||
|   before_action :authenticate_user! |  | ||||||
| 
 |  | ||||||
|   def show |   def show | ||||||
|     @export = Export.new(current_account) |     @export = Export.new(current_account) | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -2,11 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| require 'sidekiq-bulk' | require 'sidekiq-bulk' | ||||||
| 
 | 
 | ||||||
| class Settings::FollowerDomainsController < ApplicationController | class Settings::FollowerDomainsController < Settings::BaseController | ||||||
|   layout 'admin' |  | ||||||
| 
 |  | ||||||
|   before_action :authenticate_user! |  | ||||||
| 
 |  | ||||||
|   def show |   def show | ||||||
|     @account = current_account |     @account = current_account | ||||||
|     @domains = current_account.followers.reorder('MIN(follows.id) DESC').group('accounts.domain').select('accounts.domain, count(accounts.id) as accounts_from_domain').page(params[:page]).per(10) |     @domains = current_account.followers.reorder('MIN(follows.id) DESC').group('accounts.domain').select('accounts.domain, count(accounts.id) as accounts_from_domain').page(params[:page]).per(10) | ||||||
|  | |||||||
| @ -1,9 +1,6 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class Settings::ImportsController < ApplicationController | class Settings::ImportsController < Settings::BaseController | ||||||
|   layout 'admin' |  | ||||||
| 
 |  | ||||||
|   before_action :authenticate_user! |  | ||||||
|   before_action :set_account |   before_action :set_account | ||||||
| 
 | 
 | ||||||
|   def show |   def show | ||||||
|  | |||||||
| @ -1,9 +1,6 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class Settings::KeywordMutesController < ApplicationController | class Settings::KeywordMutesController < Settings::BaseController | ||||||
|   layout 'admin' |  | ||||||
| 
 |  | ||||||
|   before_action :authenticate_user! |  | ||||||
|   before_action :load_keyword_mute, only: [:edit, :update, :destroy] |   before_action :load_keyword_mute, only: [:edit, :update, :destroy] | ||||||
| 
 | 
 | ||||||
|   def index |   def index | ||||||
|  | |||||||
| @ -1,10 +1,6 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class Settings::NotificationsController < ApplicationController | class Settings::NotificationsController < Settings::BaseController | ||||||
|   layout 'admin' |  | ||||||
| 
 |  | ||||||
|   before_action :authenticate_user! |  | ||||||
| 
 |  | ||||||
|   def show; end |   def show; end | ||||||
| 
 | 
 | ||||||
|   def update |   def update | ||||||
|  | |||||||
| @ -1,10 +1,6 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class Settings::PreferencesController < ApplicationController | class Settings::PreferencesController < Settings::BaseController | ||||||
|   layout 'admin' |  | ||||||
| 
 |  | ||||||
|   before_action :authenticate_user! |  | ||||||
| 
 |  | ||||||
|   def show; end |   def show; end | ||||||
| 
 | 
 | ||||||
|   def update |   def update | ||||||
|  | |||||||
| @ -1,11 +1,8 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class Settings::ProfilesController < ApplicationController | class Settings::ProfilesController < Settings::BaseController | ||||||
|   include ObfuscateFilename |   include ObfuscateFilename | ||||||
| 
 | 
 | ||||||
|   layout 'admin' |  | ||||||
| 
 |  | ||||||
|   before_action :authenticate_user! |  | ||||||
|   before_action :set_account |   before_action :set_account | ||||||
| 
 | 
 | ||||||
|   obfuscate_filename [:account, :avatar] |   obfuscate_filename [:account, :avatar] | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
|  | #  Intentionally does not inherit from BaseController | ||||||
| class Settings::SessionsController < ApplicationController | class Settings::SessionsController < ApplicationController | ||||||
|   before_action :set_session, only: :destroy |   before_action :set_session, only: :destroy | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,10 +1,7 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| module Settings | module Settings | ||||||
|   class TwoFactorAuthenticationsController < ApplicationController |   class TwoFactorAuthenticationsController < BaseController | ||||||
|     layout 'admin' |  | ||||||
| 
 |  | ||||||
|     before_action :authenticate_user! |  | ||||||
|     before_action :verify_otp_required, only: [:create] |     before_action :verify_otp_required, only: [:create] | ||||||
| 
 | 
 | ||||||
|     def show |     def show | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ class SharesController < ApplicationController | |||||||
|   layout 'modal' |   layout 'modal' | ||||||
| 
 | 
 | ||||||
|   before_action :authenticate_user! |   before_action :authenticate_user! | ||||||
|  |   before_action :set_pack | ||||||
|   before_action :set_body_classes |   before_action :set_body_classes | ||||||
| 
 | 
 | ||||||
|   def show |   def show | ||||||
| @ -24,6 +25,10 @@ class SharesController < ApplicationController | |||||||
|     } |     } | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   def set_pack | ||||||
|  |     use_pack 'share' | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def set_body_classes |   def set_body_classes | ||||||
|     @body_classes = 'compose-standalone' |     @body_classes = 'compose-standalone' | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -14,6 +14,7 @@ class StatusesController < ApplicationController | |||||||
|   def show |   def show | ||||||
|     respond_to do |format| |     respond_to do |format| | ||||||
|       format.html do |       format.html do | ||||||
|  |         use_pack 'public' | ||||||
|         @ancestors   = @status.reply? ? cache_collection(@status.ancestors(current_account), Status) : [] |         @ancestors   = @status.reply? ? cache_collection(@status.ancestors(current_account), Status) : [] | ||||||
|         @descendants = cache_collection(@status.descendants(current_account), Status) |         @descendants = cache_collection(@status.descendants(current_account), Status) | ||||||
| 
 | 
 | ||||||
| @ -37,6 +38,7 @@ class StatusesController < ApplicationController | |||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def embed |   def embed | ||||||
|  |     use_pack 'embed' | ||||||
|     response.headers['X-Frame-Options'] = 'ALLOWALL' |     response.headers['X-Frame-Options'] = 'ALLOWALL' | ||||||
|     render 'stream_entries/embed', layout: 'embedded' |     render 'stream_entries/embed', layout: 'embedded' | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -14,6 +14,7 @@ class StreamEntriesController < ApplicationController | |||||||
|   def show |   def show | ||||||
|     respond_to do |format| |     respond_to do |format| | ||||||
|       format.html do |       format.html do | ||||||
|  |         use_pack 'public' | ||||||
|         @ancestors   = @stream_entry.activity.reply? ? cache_collection(@stream_entry.activity.ancestors(current_account), Status) : [] |         @ancestors   = @stream_entry.activity.reply? ? cache_collection(@stream_entry.activity.ancestors(current_account), Status) : [] | ||||||
|         @descendants = cache_collection(@stream_entry.activity.descendants(current_account), Status) |         @descendants = cache_collection(@stream_entry.activity.descendants(current_account), Status) | ||||||
|       end |       end | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ class TagsController < ApplicationController | |||||||
| 
 | 
 | ||||||
|     respond_to do |format| |     respond_to do |format| | ||||||
|       format.html do |       format.html do | ||||||
|  |         use_pack 'about' | ||||||
|         serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) |         serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) | ||||||
|         @initial_state_json   = serializable_resource.to_json |         @initial_state_json   = serializable_resource.to_json | ||||||
|       end |       end | ||||||
|  | |||||||
| @ -1 +0,0 @@ | |||||||
| //  This file will be loaded on about pages, regardless of theme.
 |  | ||||||
| @ -13,7 +13,7 @@ window.addEventListener('message', e => { | |||||||
|       id: data.id, |       id: data.id, | ||||||
|       height: document.getElementsByTagName('html')[0].scrollHeight, |       height: document.getElementsByTagName('html')[0].scrollHeight, | ||||||
|     }, '*'); |     }, '*'); | ||||||
|   }); |   }; | ||||||
| 
 | 
 | ||||||
|   if (['interactive', 'complete'].includes(document.readyState)) { |   if (['interactive', 'complete'].includes(document.readyState)) { | ||||||
|     setEmbedHeight(); |     setEmbedHeight(); | ||||||
|  | |||||||
| @ -1 +0,0 @@ | |||||||
| //  This file will be loaded on home pages, regardless of theme.
 |  | ||||||
| @ -1 +1,25 @@ | |||||||
| //  This file will be loaded on public pages, regardless of theme.
 | //  This file will be loaded on public pages, regardless of theme.
 | ||||||
|  | 
 | ||||||
|  | const { delegate } = require('rails-ujs'); | ||||||
|  | 
 | ||||||
|  | delegate(document, '.webapp-btn', 'click', ({ target, button }) => { | ||||||
|  |   if (button !== 0) { | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |   window.location.href = target.href; | ||||||
|  |   return false; | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { | ||||||
|  |   const contentEl = target.parentNode.parentNode.querySelector('.e-content'); | ||||||
|  | 
 | ||||||
|  |   if (contentEl.style.display === 'block') { | ||||||
|  |     contentEl.style.display = 'none'; | ||||||
|  |     target.parentNode.style.marginBottom = 0; | ||||||
|  |   } else { | ||||||
|  |     contentEl.style.display = 'block'; | ||||||
|  |     target.parentNode.style.marginBottom = null; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return false; | ||||||
|  | }); | ||||||
|  | |||||||
| @ -1,65 +1,37 @@ | |||||||
| //  This file will be loaded on settings pages, regardless of theme.
 | //  This file will be loaded on settings pages, regardless of theme.
 | ||||||
| 
 | 
 | ||||||
| function main() { | const { length } = require('stringz'); | ||||||
|   const { length } = require('stringz'); | const { delegate } = require('rails-ujs'); | ||||||
|   const { delegate } = require('rails-ujs'); |  | ||||||
| 
 | 
 | ||||||
|   delegate(document, '.webapp-btn', 'click', ({ target, button }) => { | delegate(document, '.account_display_name', 'input', ({ target }) => { | ||||||
|     if (button !== 0) { |   const nameCounter = document.querySelector('.name-counter'); | ||||||
|       return true; |  | ||||||
|     } |  | ||||||
|     window.location.href = target.href; |  | ||||||
|     return false; |  | ||||||
|   }); |  | ||||||
| 
 | 
 | ||||||
|   delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { |   if (nameCounter) { | ||||||
|     const contentEl = target.parentNode.parentNode.querySelector('.e-content'); |     nameCounter.textContent = 30 - length(target.value); | ||||||
| 
 |   } | ||||||
|     if (contentEl.style.display === 'block') { | }); | ||||||
|       contentEl.style.display = 'none'; | 
 | ||||||
|       target.parentNode.style.marginBottom = 0; | delegate(document, '.account_note', 'input', ({ target }) => { | ||||||
|     } else { |   const noteCounter = document.querySelector('.note-counter'); | ||||||
|       contentEl.style.display = 'block'; | 
 | ||||||
|       target.parentNode.style.marginBottom = null; |   if (noteCounter) { | ||||||
|     } |     const noteWithoutMetadata = processBio(target.value).text; | ||||||
| 
 |     noteCounter.textContent = 500 - length(noteWithoutMetadata); | ||||||
|     return false; |   } | ||||||
|   }); | }); | ||||||
| 
 | 
 | ||||||
|   delegate(document, '.account_display_name', 'input', ({ target }) => { | delegate(document, '#account_avatar', 'change', ({ target }) => { | ||||||
|     const nameCounter = document.querySelector('.name-counter'); |   const avatar = document.querySelector('.card.compact .avatar img'); | ||||||
| 
 |   const [file] = target.files || []; | ||||||
|     if (nameCounter) { |   const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; | ||||||
|       nameCounter.textContent = 30 - length(target.value); | 
 | ||||||
|     } |   avatar.src = url; | ||||||
|   }); | }); | ||||||
| 
 | 
 | ||||||
|   delegate(document, '.account_note', 'input', ({ target }) => { | delegate(document, '#account_header', 'change', ({ target }) => { | ||||||
|     const noteCounter = document.querySelector('.note-counter'); |   const header = document.querySelector('.card.compact'); | ||||||
| 
 |   const [file] = target.files || []; | ||||||
|     if (noteCounter) { |   const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; | ||||||
|       const noteWithoutMetadata = processBio(target.value).text; | 
 | ||||||
|       noteCounter.textContent = 500 - length(noteWithoutMetadata); |   header.style.backgroundImage = `url(${url})`; | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   delegate(document, '#account_avatar', 'change', ({ target }) => { |  | ||||||
|     const avatar = document.querySelector('.card.compact .avatar img'); |  | ||||||
|     const [file] = target.files || []; |  | ||||||
|     const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; |  | ||||||
| 
 |  | ||||||
|     avatar.src = url; |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   delegate(document, '#account_header', 'change', ({ target }) => { |  | ||||||
|     const header = document.querySelector('.card.compact'); |  | ||||||
|     const [file] = target.files || []; |  | ||||||
|     const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; |  | ||||||
| 
 |  | ||||||
|     header.style.backgroundImage = `url(${url})`; |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| loadPolyfills().then(main).catch(error => { |  | ||||||
|   console.error(error); |  | ||||||
| }); | }); | ||||||
|  | |||||||
| @ -1 +0,0 @@ | |||||||
| //  This file will be loaded on share pages, regardless of theme.
 |  | ||||||
							
								
								
									
										14
									
								
								app/javascript/core/theme.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								app/javascript/core/theme.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | #  These packs will be loaded on every appropriate page, regardless of | ||||||
|  | #  theme. | ||||||
|  | pack: | ||||||
|  |   about: | ||||||
|  |   admin: admin.js | ||||||
|  |   auth: | ||||||
|  |   common: common.js | ||||||
|  |   embed: embed.js | ||||||
|  |   error: | ||||||
|  |   home: | ||||||
|  |   modal: | ||||||
|  |   public: public.js | ||||||
|  |   settings: settings.js | ||||||
|  |   share: | ||||||
							
								
								
									
										9
									
								
								app/javascript/locales/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/javascript/locales/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | let theLocale; | ||||||
|  | 
 | ||||||
|  | export function setLocale(locale) { | ||||||
|  |   theLocale = locale; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function getLocale() { | ||||||
|  |   return theLocale; | ||||||
|  | } | ||||||
| @ -1,9 +1 @@ | |||||||
| let theLocale; | export * from 'locales'; | ||||||
| 
 |  | ||||||
| export function setLocale(locale) { |  | ||||||
|   theLocale = locale; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export function getLocale() { |  | ||||||
|   return theLocale; |  | ||||||
| } |  | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								app/javascript/packs/about.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								app/javascript/packs/about.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | import loadPolyfills from '../mastodon/load_polyfills'; | ||||||
|  | 
 | ||||||
|  | function loaded() { | ||||||
|  |   const TimelineContainer = require('../mastodon/containers/timeline_container').default; | ||||||
|  |   const React             = require('react'); | ||||||
|  |   const ReactDOM          = require('react-dom'); | ||||||
|  |   const mountNode         = document.getElementById('mastodon-timeline'); | ||||||
|  | 
 | ||||||
|  |   if (mountNode !== null) { | ||||||
|  |     const props = JSON.parse(mountNode.getAttribute('data-props')); | ||||||
|  |     ReactDOM.render(<TimelineContainer {...props} />, mountNode); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function main() { | ||||||
|  |   const ready = require('../mastodon/ready').default; | ||||||
|  |   ready(loaded); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | loadPolyfills().then(main).catch(error => { | ||||||
|  |   console.error(error); | ||||||
|  | }); | ||||||
| @ -1,15 +1,5 @@ | |||||||
| //  THIS IS THE `vanilla` THEME PACK FILE!!
 |  | ||||||
| //  IT'S HERE FOR UPSTREAM COMPATIBILITY!!
 |  | ||||||
| //  THE `glitch` PACK FILE IS IN `themes/glitch/index.js`!!
 |  | ||||||
| 
 |  | ||||||
| import loadPolyfills from '../mastodon/load_polyfills'; | import loadPolyfills from '../mastodon/load_polyfills'; | ||||||
| 
 | 
 | ||||||
| // import default stylesheet with variables
 |  | ||||||
| import 'font-awesome/css/font-awesome.css'; |  | ||||||
| import '../styles/application.scss'; |  | ||||||
| 
 |  | ||||||
| require.context('../images/', true); |  | ||||||
| 
 |  | ||||||
| loadPolyfills().then(() => { | loadPolyfills().then(() => { | ||||||
|   require('../mastodon/main').default(); |   require('../mastodon/main').default(); | ||||||
| }).catch(e => { | }).catch(e => { | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								app/javascript/packs/common.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								app/javascript/packs/common.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | import 'font-awesome/css/font-awesome.css'; | ||||||
|  | import 'styles/application.scss' | ||||||
|  | require.context('../images/', true); | ||||||
							
								
								
									
										75
									
								
								app/javascript/packs/public.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								app/javascript/packs/public.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | |||||||
|  | import loadPolyfills from '../mastodon/load_polyfills'; | ||||||
|  | import ready from '../mastodon/ready'; | ||||||
|  | 
 | ||||||
|  | function main() { | ||||||
|  |   const IntlRelativeFormat = require('intl-relativeformat').default; | ||||||
|  |   const emojify = require('../mastodon/features/emoji/emoji').default; | ||||||
|  |   const { getLocale } = require('../mastodon/locales'); | ||||||
|  |   const { localeData } = getLocale(); | ||||||
|  |   const VideoContainer = require('../mastodon/containers/video_container').default; | ||||||
|  |   const MediaGalleryContainer = require('../mastodon/containers/media_gallery_container').default; | ||||||
|  |   const CardContainer = require('../mastodon/containers/card_container').default; | ||||||
|  |   const React = require('react'); | ||||||
|  |   const ReactDOM = require('react-dom'); | ||||||
|  | 
 | ||||||
|  |   localeData.forEach(IntlRelativeFormat.__addLocaleData); | ||||||
|  | 
 | ||||||
|  |   ready(() => { | ||||||
|  |     const locale = document.documentElement.lang; | ||||||
|  | 
 | ||||||
|  |     const dateTimeFormat = new Intl.DateTimeFormat(locale, { | ||||||
|  |       year: 'numeric', | ||||||
|  |       month: 'long', | ||||||
|  |       day: 'numeric', | ||||||
|  |       hour: 'numeric', | ||||||
|  |       minute: 'numeric', | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     const relativeFormat = new IntlRelativeFormat(locale); | ||||||
|  | 
 | ||||||
|  |     [].forEach.call(document.querySelectorAll('.emojify'), (content) => { | ||||||
|  |       content.innerHTML = emojify(content.innerHTML); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     [].forEach.call(document.querySelectorAll('time.formatted'), (content) => { | ||||||
|  |       const datetime = new Date(content.getAttribute('datetime')); | ||||||
|  |       const formattedDate = dateTimeFormat.format(datetime); | ||||||
|  | 
 | ||||||
|  |       content.title = formattedDate; | ||||||
|  |       content.textContent = formattedDate; | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     [].forEach.call(document.querySelectorAll('time.time-ago'), (content) => { | ||||||
|  |       const datetime = new Date(content.getAttribute('datetime')); | ||||||
|  | 
 | ||||||
|  |       content.title = dateTimeFormat.format(datetime); | ||||||
|  |       content.textContent = relativeFormat.format(datetime); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     [].forEach.call(document.querySelectorAll('.logo-button'), (content) => { | ||||||
|  |       content.addEventListener('click', (e) => { | ||||||
|  |         e.preventDefault(); | ||||||
|  |         window.open(e.target.href, 'mastodon-intent', 'width=400,height=400,resizable=no,menubar=no,status=no,scrollbars=yes'); | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     [].forEach.call(document.querySelectorAll('[data-component="Video"]'), (content) => { | ||||||
|  |       const props = JSON.parse(content.getAttribute('data-props')); | ||||||
|  |       ReactDOM.render(<VideoContainer locale={locale} {...props} />, content); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     [].forEach.call(document.querySelectorAll('[data-component="MediaGallery"]'), (content) => { | ||||||
|  |       const props = JSON.parse(content.getAttribute('data-props')); | ||||||
|  |       ReactDOM.render(<MediaGalleryContainer locale={locale} {...props} />, content); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     [].forEach.call(document.querySelectorAll('[data-component="Card"]'), (content) => { | ||||||
|  |       const props = JSON.parse(content.getAttribute('data-props')); | ||||||
|  |       ReactDOM.render(<CardContainer locale={locale} {...props} />, content); | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | loadPolyfills().then(main).catch(error => { | ||||||
|  |   console.error(error); | ||||||
|  | }); | ||||||
							
								
								
									
										22
									
								
								app/javascript/packs/share.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								app/javascript/packs/share.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | import loadPolyfills from '../mastodon/load_polyfills'; | ||||||
|  | 
 | ||||||
|  | function loaded() { | ||||||
|  |   const ComposeContainer = require('../mastodon/containers/compose_container').default; | ||||||
|  |   const React = require('react'); | ||||||
|  |   const ReactDOM = require('react-dom'); | ||||||
|  |   const mountNode = document.getElementById('mastodon-compose'); | ||||||
|  | 
 | ||||||
|  |   if (mountNode !== null) { | ||||||
|  |     const props = JSON.parse(mountNode.getAttribute('data-props')); | ||||||
|  |     ReactDOM.render(<ComposeContainer {...props} />, mountNode); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function main() { | ||||||
|  |   const ready = require('../mastodon/ready').default; | ||||||
|  |   ready(loaded); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | loadPolyfills().then(main).catch(error => { | ||||||
|  |   console.error(error); | ||||||
|  | }); | ||||||
| @ -1,5 +0,0 @@ | |||||||
| // This makes our fonts available everywhere. |  | ||||||
| 
 |  | ||||||
| @import 'fonts/roboto'; |  | ||||||
| @import 'fonts/roboto-mono'; |  | ||||||
| @import 'fonts/montserrat'; |  | ||||||
| @ -1,3 +1,8 @@ | |||||||
|  | //  win95 theme from cybrespace. | ||||||
|  | 
 | ||||||
|  | //  Modified to inherit glitch styles (themes/glitch/styles/index.scss) | ||||||
|  | //  instead of vanilla ones (./application.scss) | ||||||
|  | 
 | ||||||
| $win95-bg: #bfbfbf; | $win95-bg: #bfbfbf; | ||||||
| $win95-dark-grey: #404040; | $win95-dark-grey: #404040; | ||||||
| $win95-mid-grey: #808080; | $win95-mid-grey: #808080; | ||||||
| @ -17,7 +22,7 @@ $ui-highlight-color: $win95-window-header; | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @mixin win95-outset() { | @mixin win95-outset() { | ||||||
|   box-shadow: inset -1px -1px 0px #000000,  |   box-shadow: inset -1px -1px 0px #000000, | ||||||
|               inset 1px 1px 0px #ffffff, |               inset 1px 1px 0px #ffffff, | ||||||
|               inset -2px -2px 0px #808080, |               inset -2px -2px 0px #808080, | ||||||
|               inset 2px 2px 0px #dfdfdf; |               inset 2px 2px 0px #dfdfdf; | ||||||
| @ -41,7 +46,7 @@ $ui-highlight-color: $win95-window-header; | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @mixin win95-inset() { | @mixin win95-inset() { | ||||||
|   box-shadow: inset 1px 1px 0px #000000,  |   box-shadow: inset 1px 1px 0px #000000, | ||||||
|               inset -1px -1px 0px #ffffff, |               inset -1px -1px 0px #ffffff, | ||||||
|               inset 2px 2px 0px #808080, |               inset 2px 2px 0px #808080, | ||||||
|               inset -2px -2px 0px #dfdfdf; |               inset -2px -2px 0px #dfdfdf; | ||||||
| @ -51,7 +56,7 @@ $ui-highlight-color: $win95-window-header; | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @mixin win95-tab() { | @mixin win95-tab() { | ||||||
|   box-shadow: inset -1px 0px 0px #000000,  |   box-shadow: inset -1px 0px 0px #000000, | ||||||
|               inset 1px 0px 0px #ffffff, |               inset 1px 0px 0px #ffffff, | ||||||
|               inset 0px 1px 0px #ffffff, |               inset 0px 1px 0px #ffffff, | ||||||
|               inset 0px 2px 0px #dfdfdf, |               inset 0px 2px 0px #dfdfdf, | ||||||
| @ -71,7 +76,7 @@ $ui-highlight-color: $win95-window-header; | |||||||
|   src: url('../fonts/premillenium/MSSansSerif.ttf') format('truetype'); |   src: url('../fonts/premillenium/MSSansSerif.ttf') format('truetype'); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @import 'application'; | @import '../themes/glitch/styles/index';  //  Imports glitch themes | ||||||
| 
 | 
 | ||||||
| /* borrowed from cybrespace style: wider columns and full column width images */ | /* borrowed from cybrespace style: wider columns and full column width images */ | ||||||
| 
 | 
 | ||||||
| @ -174,7 +179,7 @@ body.admin { | |||||||
|   font-size:0px; |   font-size:0px; | ||||||
|   color:$win95-bg; |   color:$win95-bg; | ||||||
| 
 | 
 | ||||||
|   background-image: url("../images/start.png");  |   background-image: url("../images/start.png"); | ||||||
|   background-repeat:no-repeat; |   background-repeat:no-repeat; | ||||||
|   background-position:8%; |   background-position:8%; | ||||||
|   background-clip:padding-box; |   background-clip:padding-box; | ||||||
| @ -336,7 +341,7 @@ body.admin { | |||||||
|   border-radius:0px; |   border-radius:0px; | ||||||
|   background-color:white; |   background-color:white; | ||||||
|   @include win95-border-inset(); |   @include win95-border-inset(); | ||||||
|    | 
 | ||||||
|   width:12px; |   width:12px; | ||||||
|   height:12px; |   height:12px; | ||||||
| } | } | ||||||
| @ -515,9 +520,9 @@ body.admin { | |||||||
|   color:black; |   color:black; | ||||||
|   font-weight:bold; |   font-weight:bold; | ||||||
| } | } | ||||||
| .account__avatar,  | .account__avatar, | ||||||
| .account__avatar-overlay-base,  | .account__avatar-overlay-base, | ||||||
| .account__header__avatar,  | .account__header__avatar, | ||||||
| .account__avatar-overlay-overlay { | .account__avatar-overlay-overlay { | ||||||
|   @include win95-border-slight-inset(); |   @include win95-border-slight-inset(); | ||||||
|   clip-path:none; |   clip-path:none; | ||||||
| @ -627,7 +632,7 @@ body.admin { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .status-card__description { | .status-card__description { | ||||||
|  color:black;  |  color:black; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .account__display-name strong, .status__display-name strong { | .account__display-name strong, .status__display-name strong { | ||||||
| @ -710,8 +715,8 @@ body.admin { | |||||||
|   width:40px; |   width:40px; | ||||||
|   font-size:0px; |   font-size:0px; | ||||||
|   color:$win95-bg; |   color:$win95-bg; | ||||||
|    | 
 | ||||||
|   background-image: url("../images/start.png");  |   background-image: url("../images/start.png"); | ||||||
|   background-repeat:no-repeat; |   background-repeat:no-repeat; | ||||||
|   background-position:8%; |   background-position:8%; | ||||||
|   background-clip:padding-box; |   background-clip:padding-box; | ||||||
| @ -723,7 +728,7 @@ body.admin { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .drawer__header a:first-child:hover { | .drawer__header a:first-child:hover { | ||||||
|   background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=");  |   background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); | ||||||
|   background-repeat:no-repeat; |   background-repeat:no-repeat; | ||||||
|   background-position:8%; |   background-position:8%; | ||||||
|   background-clip:padding-box; |   background-clip:padding-box; | ||||||
| @ -732,7 +737,7 @@ body.admin { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .drawer__tab:first-child { | .drawer__tab:first-child { | ||||||
|    | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .search { | .search { | ||||||
| @ -844,7 +849,7 @@ body.admin { | |||||||
|   padding:4px 8px; |   padding:4px 8px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .privacy-dropdown.active  | .privacy-dropdown.active | ||||||
| .privacy-dropdown__value { | .privacy-dropdown__value { | ||||||
|   background: $win95-bg; |   background: $win95-bg; | ||||||
|   box-shadow:unset; |   box-shadow:unset; | ||||||
| @ -935,7 +940,7 @@ body.admin { | |||||||
|   background-color:$win95-bg; |   background-color:$win95-bg; | ||||||
|   border:1px solid black; |   border:1px solid black; | ||||||
|   box-sizing:content-box; |   box-sizing:content-box; | ||||||
|    | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .emoji-dialog .emoji-search { | .emoji-dialog .emoji-search { | ||||||
| @ -1010,8 +1015,8 @@ body.admin { | |||||||
|   width:60px; |   width:60px; | ||||||
|   font-size:0px; |   font-size:0px; | ||||||
|   color:$win95-bg; |   color:$win95-bg; | ||||||
|    | 
 | ||||||
|   background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=");  |   background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); | ||||||
|   background-repeat:no-repeat; |   background-repeat:no-repeat; | ||||||
|   background-position:8%; |   background-position:8%; | ||||||
|   background-clip:padding-box; |   background-clip:padding-box; | ||||||
| @ -1049,40 +1054,40 @@ body.admin { | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .column-link[href="/web/timelines/public"] {  | .column-link[href="/web/timelines/public"] { | ||||||
|   background-image: url("../images/icon_public.png");  |   background-image: url("../images/icon_public.png"); | ||||||
|   &:hover { background-image: url("../images/icon_public.png"); } |   &:hover { background-image: url("../images/icon_public.png"); } | ||||||
| } | } | ||||||
| .column-link[href="/web/timelines/public/local"] {  | .column-link[href="/web/timelines/public/local"] { | ||||||
|   background-image: url("../images/icon_local.png");  |   background-image: url("../images/icon_local.png"); | ||||||
|   &:hover { background-image: url("../images/icon_local.png"); } |   &:hover { background-image: url("../images/icon_local.png"); } | ||||||
| } | } | ||||||
| .column-link[href="/web/pinned"] {  | .column-link[href="/web/pinned"] { | ||||||
|   background-image: url("../images/icon_pin.png");  |   background-image: url("../images/icon_pin.png"); | ||||||
|   &:hover { background-image: url("../images/icon_pin.png"); } |   &:hover { background-image: url("../images/icon_pin.png"); } | ||||||
| } | } | ||||||
| .column-link[href="/web/favourites"] {  | .column-link[href="/web/favourites"] { | ||||||
|   background-image: url("../images/icon_likes.png");  |   background-image: url("../images/icon_likes.png"); | ||||||
|   &:hover { background-image: url("../images/icon_likes.png"); } |   &:hover { background-image: url("../images/icon_likes.png"); } | ||||||
| } | } | ||||||
| .column-link[href="/web/blocks"] {  | .column-link[href="/web/blocks"] { | ||||||
|   background-image: url("../images/icon_blocks.png");  |   background-image: url("../images/icon_blocks.png"); | ||||||
|   &:hover { background-image: url("../images/icon_blocks.png"); } |   &:hover { background-image: url("../images/icon_blocks.png"); } | ||||||
| } | } | ||||||
| .column-link[href="/web/mutes"] {  | .column-link[href="/web/mutes"] { | ||||||
|   background-image: url("../images/icon_mutes.png");  |   background-image: url("../images/icon_mutes.png"); | ||||||
|   &:hover { background-image: url("../images/icon_mutes.png"); } |   &:hover { background-image: url("../images/icon_mutes.png"); } | ||||||
| } | } | ||||||
| .column-link[href="/settings/preferences"] {  | .column-link[href="/settings/preferences"] { | ||||||
|   background-image: url("../images/icon_settings.png");  |   background-image: url("../images/icon_settings.png"); | ||||||
|   &:hover { background-image: url("../images/icon_settings.png"); } |   &:hover { background-image: url("../images/icon_settings.png"); } | ||||||
| } | } | ||||||
| .column-link[href="/about/more"] {  | .column-link[href="/about/more"] { | ||||||
|   background-image: url("../images/icon_about.png");  |   background-image: url("../images/icon_about.png"); | ||||||
|   &:hover { background-image: url("../images/icon_about.png"); } |   &:hover { background-image: url("../images/icon_about.png"); } | ||||||
| } | } | ||||||
| .column-link[href="/auth/sign_out"] {  | .column-link[href="/auth/sign_out"] { | ||||||
|   background-image: url("../images/icon_logout.png");  |   background-image: url("../images/icon_logout.png"); | ||||||
|   &:hover { background-image: url("../images/icon_logout.png"); } |   &:hover { background-image: url("../images/icon_logout.png"); } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1098,7 +1103,7 @@ body.admin { | |||||||
|   line-height:30px; |   line-height:30px; | ||||||
|   padding-left:20px; |   padding-left:20px; | ||||||
|   padding-right:40px; |   padding-right:40px; | ||||||
|    | 
 | ||||||
|   left:0px; |   left:0px; | ||||||
|   bottom:-30px; |   bottom:-30px; | ||||||
|   display:block; |   display:block; | ||||||
| @ -1106,9 +1111,9 @@ body.admin { | |||||||
|   background-color:#7f7f7f; |   background-color:#7f7f7f; | ||||||
|   width:200%; |   width:200%; | ||||||
|   height:30px; |   height:30px; | ||||||
|    | 
 | ||||||
|   -ms-transform: rotate(-90deg); |   -ms-transform: rotate(-90deg); | ||||||
|    | 
 | ||||||
|   -webkit-transform: rotate(-90deg); |   -webkit-transform: rotate(-90deg); | ||||||
|   transform: rotate(-90deg); |   transform: rotate(-90deg); | ||||||
|   transform-origin:top left; |   transform-origin:top left; | ||||||
| @ -1189,7 +1194,7 @@ body.admin { | |||||||
|   left:unset; |   left:unset; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .dropdown > .icon-button, .detailed-status__button > .icon-button,  | .dropdown > .icon-button, .detailed-status__button > .icon-button, | ||||||
| .status__action-bar > .icon-button, .star-icon i { | .status__action-bar > .icon-button, .star-icon i { | ||||||
|     /* i don't know what's going on with the inline |     /* i don't know what's going on with the inline | ||||||
|        styles someone should look at the react code */ |        styles someone should look at the react code */ | ||||||
| @ -1239,8 +1244,8 @@ body.admin { | |||||||
|   background:$win95-bg; |   background:$win95-bg; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .actions-modal::before,  | .actions-modal::before, | ||||||
| .boost-modal::before,  | .boost-modal::before, | ||||||
| .confirmation-modal::before, | .confirmation-modal::before, | ||||||
| .report-modal::before { | .report-modal::before { | ||||||
|   content: "Confirmation"; |   content: "Confirmation"; | ||||||
| @ -1278,8 +1283,8 @@ body.admin { | |||||||
|   .confirmation-modal__cancel-button { |   .confirmation-modal__cancel-button { | ||||||
|     color:black; |     color:black; | ||||||
| 
 | 
 | ||||||
|     &:active,  |     &:active, | ||||||
|     &:focus,  |     &:focus, | ||||||
|     &:hover { |     &:hover { | ||||||
|       color:black; |       color:black; | ||||||
|     } |     } | ||||||
| @ -1566,10 +1571,10 @@ a.table-action-link:hover, | |||||||
|   background-color:white; |   background-color:white; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .simple_form input[type=text],  | .simple_form input[type=text], | ||||||
| .simple_form input[type=number],  | .simple_form input[type=number], | ||||||
| .simple_form input[type=email],  | .simple_form input[type=email], | ||||||
| .simple_form input[type=password],  | .simple_form input[type=password], | ||||||
| .simple_form textarea { | .simple_form textarea { | ||||||
|   color:black; |   color:black; | ||||||
|   background-color:white; |   background-color:white; | ||||||
| @ -1580,8 +1585,8 @@ a.table-action-link:hover, | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .simple_form button,  | .simple_form button, | ||||||
| .simple_form .button,  | .simple_form .button, | ||||||
| .simple_form .block-button | .simple_form .block-button | ||||||
| { | { | ||||||
|   background: $win95-bg; |   background: $win95-bg; | ||||||
| @ -1608,8 +1613,8 @@ a.table-action-link:hover, | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .simple_form button.negative,  | .simple_form button.negative, | ||||||
| .simple_form .button.negative,  | .simple_form .button.negative, | ||||||
| .simple_form .block-button.negative | .simple_form .block-button.negative | ||||||
| { | { | ||||||
|   background: $win95-bg; |   background: $win95-bg; | ||||||
| @ -1631,8 +1636,8 @@ a.table-action-link:hover, | |||||||
|   border-right-color:#f5f5f5; |   border-right-color:#f5f5f5; | ||||||
|   width:12px; |   width:12px; | ||||||
|   height:12px; |   height:12px; | ||||||
|   display:inline-block;  |   display:inline-block; | ||||||
|   vertical-align:middle;  |   vertical-align:middle; | ||||||
|   margin-right:2px; |   margin-right:2px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ import UI from 'themes/glitch/features/ui'; | |||||||
| import { hydrateStore } from 'themes/glitch/actions/store'; | import { hydrateStore } from 'themes/glitch/actions/store'; | ||||||
| import { connectUserStream } from 'themes/glitch/actions/streaming'; | import { connectUserStream } from 'themes/glitch/actions/streaming'; | ||||||
| import { IntlProvider, addLocaleData } from 'react-intl'; | import { IntlProvider, addLocaleData } from 'react-intl'; | ||||||
| import { getLocale } from 'mastodon/locales'; | import { getLocale } from 'locales'; | ||||||
| import initialState from 'themes/glitch/util/initial_state'; | import initialState from 'themes/glitch/util/initial_state'; | ||||||
| 
 | 
 | ||||||
| const { localeData, messages } = getLocale(); | const { localeData, messages } = getLocale(); | ||||||
|  | |||||||
| @ -1,3 +1,3 @@ | |||||||
| import 'font-awesome/css/font-awesome.css'; | import 'font-awesome/css/font-awesome.css'; | ||||||
| require.context('../../images/', true); | require.context('images/', true); | ||||||
| import './styles/index.scss'; | import 'themes/glitch/styles/index.scss'; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import loadPolyfills from './util/load_polyfills'; | import loadPolyfills from 'themes/glitch/util/load_polyfills'; | ||||||
| 
 | 
 | ||||||
| loadPolyfills().then(() => { | loadPolyfills().then(() => { | ||||||
|   require('./util/main').default(); |   require('themes/glitch/util/main').default(); | ||||||
| }).catch(e => { | }).catch(e => { | ||||||
|   console.error(e); |   console.error(e); | ||||||
| }); | }); | ||||||
|  | |||||||
| @ -2,32 +2,14 @@ import loadPolyfills from 'themes/glitch/util/load_polyfills'; | |||||||
| import { processBio } from 'themes/glitch/util/bio_metadata'; | import { processBio } from 'themes/glitch/util/bio_metadata'; | ||||||
| import ready from 'themes/glitch/util/ready'; | import ready from 'themes/glitch/util/ready'; | ||||||
| 
 | 
 | ||||||
| window.addEventListener('message', e => { |  | ||||||
|   const data = e.data || {}; |  | ||||||
| 
 |  | ||||||
|   if (!window.parent || data.type !== 'setHeight') { |  | ||||||
|     return; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   ready(() => { |  | ||||||
|     window.parent.postMessage({ |  | ||||||
|       type: 'setHeight', |  | ||||||
|       id: data.id, |  | ||||||
|       height: document.getElementsByTagName('html')[0].scrollHeight, |  | ||||||
|     }, '*'); |  | ||||||
|   }); |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| function main() { | function main() { | ||||||
|   const { length } = require('stringz'); |  | ||||||
|   const IntlRelativeFormat = require('intl-relativeformat').default; |   const IntlRelativeFormat = require('intl-relativeformat').default; | ||||||
|   const { delegate } = require('rails-ujs'); |   const emojify = require('themes/glitch/util/emoji').default; | ||||||
|   const emojify = require('../themes/glitch/util/emoji').default; |   const { getLocale } = require('locales'); | ||||||
|   const { getLocale } = require('mastodon/locales'); |  | ||||||
|   const { localeData } = getLocale(); |   const { localeData } = getLocale(); | ||||||
|   const VideoContainer = require('../themes/glitch/containers/video_container').default; |   const VideoContainer = require('themes/glitch/containers/video_container').default; | ||||||
|   const MediaGalleryContainer = require('../themes/glitch/containers/media_gallery_container').default; |   const MediaGalleryContainer = require('themes/glitch/containers/media_gallery_container').default; | ||||||
|   const CardContainer = require('../themes/glitch/containers/card_container').default; |   const CardContainer = require('themes/glitch/containers/card_container').default; | ||||||
|   const React = require('react'); |   const React = require('react'); | ||||||
|   const ReactDOM = require('react-dom'); |   const ReactDOM = require('react-dom'); | ||||||
| 
 | 
 | ||||||
| @ -87,61 +69,6 @@ function main() { | |||||||
|       ReactDOM.render(<CardContainer locale={locale} {...props} />, content); |       ReactDOM.render(<CardContainer locale={locale} {...props} />, content); | ||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
| 
 |  | ||||||
|   delegate(document, '.webapp-btn', 'click', ({ target, button }) => { |  | ||||||
|     if (button !== 0) { |  | ||||||
|       return true; |  | ||||||
|     } |  | ||||||
|     window.location.href = target.href; |  | ||||||
|     return false; |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { |  | ||||||
|     const contentEl = target.parentNode.parentNode.querySelector('.e-content'); |  | ||||||
| 
 |  | ||||||
|     if (contentEl.style.display === 'block') { |  | ||||||
|       contentEl.style.display = 'none'; |  | ||||||
|       target.parentNode.style.marginBottom = 0; |  | ||||||
|     } else { |  | ||||||
|       contentEl.style.display = 'block'; |  | ||||||
|       target.parentNode.style.marginBottom = null; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return false; |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   delegate(document, '.account_display_name', 'input', ({ target }) => { |  | ||||||
|     const nameCounter = document.querySelector('.name-counter'); |  | ||||||
| 
 |  | ||||||
|     if (nameCounter) { |  | ||||||
|       nameCounter.textContent = 30 - length(target.value); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   delegate(document, '.account_note', 'input', ({ target }) => { |  | ||||||
|     const noteCounter = document.querySelector('.note-counter'); |  | ||||||
| 
 |  | ||||||
|     if (noteCounter) { |  | ||||||
|       const noteWithoutMetadata = processBio(target.value).text; |  | ||||||
|       noteCounter.textContent = 500 - length(noteWithoutMetadata); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   delegate(document, '#account_avatar', 'change', ({ target }) => { |  | ||||||
|     const avatar = document.querySelector('.card.compact .avatar img'); |  | ||||||
|     const [file] = target.files || []; |  | ||||||
|     const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; |  | ||||||
| 
 |  | ||||||
|     avatar.src = url; |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   delegate(document, '#account_header', 'change', ({ target }) => { |  | ||||||
|     const header = document.querySelector('.card.compact'); |  | ||||||
|     const [file] = target.files || []; |  | ||||||
|     const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; |  | ||||||
| 
 |  | ||||||
|     header.style.backgroundImage = `url(${url})`; |  | ||||||
|   }); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| loadPolyfills().then(main).catch(error => { | loadPolyfills().then(main).catch(error => { | ||||||
|  | |||||||
| @ -1,25 +1,34 @@ | |||||||
| #  (REQUIRED) The location of the pack files. | #  (REQUIRED) The location of the pack files. | ||||||
| pack: | pack: | ||||||
|   about: packs/about.js |   about: packs/about.js | ||||||
|   admin: null |   admin: | ||||||
|   common: packs/common.js |   auth: | ||||||
|   embed: null |   common: | ||||||
|   home: packs/home.js |     filename: packs/common.js | ||||||
|  |     stylesheet: true | ||||||
|  |   embed: packs/public.js | ||||||
|  |   error: | ||||||
|  |   home: | ||||||
|  |     filename: packs/home.js | ||||||
|  |     preload: | ||||||
|  |     - themes/glitch/async/getting_started | ||||||
|  |     - themes/glitch/async/compose | ||||||
|  |     - themes/glitch/async/home_timeline | ||||||
|  |     - themes/glitch/async/notifications | ||||||
|  |     stylesheet: true | ||||||
|  |   modal: | ||||||
|   public: packs/public.js |   public: packs/public.js | ||||||
|   settings: null |   settings: | ||||||
|   share: packs/share.js |   share: packs/share.js | ||||||
| 
 | 
 | ||||||
| #  (OPTIONAL) The directory which contains the pack files. | #  (OPTIONAL) The directory which contains the pack files. | ||||||
| #  Defaults to the theme directory (`app/javascript/themes/[theme]`), | #  Defaults to the theme directory (`app/javascript/themes/[theme]`), | ||||||
| #  which should be sufficient for like 99% of use-cases lol. | #  which should be sufficient for like 99% of use-cases lol. | ||||||
| #    pack_directory: app/javascript/packs |  | ||||||
| 
 | 
 | ||||||
| #  (OPTIONAL) Additional javascript resources to preload, for use with | #      pack_directory: app/javascript/packs | ||||||
| #  lazy-loaded components. It is **STRONGLY RECOMMENDED** that you | 
 | ||||||
| #  derive these pathnames from `themes/[your-theme]` to ensure that | #  (OPTIONAL) By default the theme will fallback to the default theme | ||||||
| #  they stay unique. | #  if a particular pack is not provided. You can specify different | ||||||
| preload: | #  fallbacks here, or disable fallback behaviours altogether by | ||||||
| - themes/glitch/async/getting_started | #  specifying a `null` value. | ||||||
| - themes/glitch/async/compose | fallback: | ||||||
| - themes/glitch/async/home_timeline |  | ||||||
| - themes/glitch/async/notifications |  | ||||||
|  | |||||||
| @ -1,12 +1,23 @@ | |||||||
| #  (REQUIRED) The location of the pack files inside `pack_directory`. | #  (REQUIRED) The location of the pack files inside `pack_directory`. | ||||||
| pack: | pack: | ||||||
|   about: about.js |   about: about.js | ||||||
|   admin: null |   admin: | ||||||
|   common: common.js |   auth: | ||||||
|   embed: null |   common: | ||||||
|   home: application.js |     filename: common.js | ||||||
|  |     stylesheet: true | ||||||
|  |   embed: public.js | ||||||
|  |   error: | ||||||
|  |   home: | ||||||
|  |     filename: application.js | ||||||
|  |     preload: | ||||||
|  |     - features/getting_started | ||||||
|  |     - features/compose | ||||||
|  |     - features/home_timeline | ||||||
|  |     - features/notifications | ||||||
|  |   modal: | ||||||
|   public: public.js |   public: public.js | ||||||
|   settings: null |   settings: | ||||||
|   share: share.js |   share: share.js | ||||||
| 
 | 
 | ||||||
| #  (OPTIONAL) The directory which contains the pack files. | #  (OPTIONAL) The directory which contains the pack files. | ||||||
| @ -15,12 +26,8 @@ pack: | |||||||
| #  somewhere else. | #  somewhere else. | ||||||
| pack_directory: app/javascript/packs | pack_directory: app/javascript/packs | ||||||
| 
 | 
 | ||||||
| #  (OPTIONAL) Additional javascript resources to preload, for use with | #  (OPTIONAL) By default the theme will fallback to the default theme | ||||||
| #  lazy-loaded components. It is **STRONGLY RECOMMENDED** that you | #  if a particular pack is not provided. You can specify different | ||||||
| #  derive these pathnames from `themes/[your-theme]` to ensure that | #  fallbacks here, or disable fallback behaviours altogether by | ||||||
| #  they stay unique. (Of course, vanilla doesn't do this ^^;;) | #  specifying a `null` value. | ||||||
| preload: | fallback: | ||||||
| - features/getting_started |  | ||||||
| - features/compose |  | ||||||
| - features/home_timeline |  | ||||||
| - features/notifications |  | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								app/javascript/themes/win95/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/javascript/themes/win95/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | //  These lines are the same as in glitch:
 | ||||||
|  | import 'font-awesome/css/font-awesome.css'; | ||||||
|  | require.context('../../images/', true); | ||||||
|  | 
 | ||||||
|  | //  …But we want to use our own styles instead.
 | ||||||
|  | import 'styles/win95.scss'; | ||||||
|  | 
 | ||||||
|  | //  Be sure to make this style file import from
 | ||||||
|  | //  `themes/glitch/styles/index.scss` (the glitch styling), and not
 | ||||||
|  | //  `application.scss` (which are the vanilla styles).
 | ||||||
							
								
								
									
										23
									
								
								app/javascript/themes/win95/theme.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/javascript/themes/win95/theme.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | #  win95 theme. | ||||||
|  | 
 | ||||||
|  | #  Ported over from `cybrespace:mastodon/theme_win95`. | ||||||
|  | #  <https://github.com/cybrespace/mastodon/tree/theme_win95> | ||||||
|  | 
 | ||||||
|  | #  You can use this theme file as inspiration for porting over | ||||||
|  | #  a preëxisting Mastodon theme. | ||||||
|  | 
 | ||||||
|  | #  We only modify the `common` pack, which contains our styling. | ||||||
|  | pack: | ||||||
|  |   common: | ||||||
|  |     filename: index.js | ||||||
|  |     stylesheet: true | ||||||
|  |   #  All unspecified packs will inherit from glitch. | ||||||
|  | 
 | ||||||
|  | #  By default, the glitch preloads will also be used here. You can | ||||||
|  | #  disable them by setting `preload` to `null`. | ||||||
|  | 
 | ||||||
|  | #      preload: | ||||||
|  | 
 | ||||||
|  | #  The `fallback` parameter tells us to use glitch files for everything | ||||||
|  | #  we haven't specified. | ||||||
|  | fallback: glitch | ||||||
| @ -7,15 +7,27 @@ class Themes | |||||||
|   include Singleton |   include Singleton | ||||||
| 
 | 
 | ||||||
|   def initialize |   def initialize | ||||||
|  | 
 | ||||||
|  |     core = YAML.load_file(Rails.root.join('app', 'javascript', 'core', 'theme.yml')) | ||||||
|  |     core['pack'] = Hash.new unless core['pack'] | ||||||
|  | 
 | ||||||
|     result = Hash.new |     result = Hash.new | ||||||
|     Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path| |     Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path| | ||||||
|       data = YAML.load_file(path) |       data = YAML.load_file(path) | ||||||
|       name = File.basename(File.dirname(path)) |       name = File.basename(File.dirname(path)) | ||||||
|       if data['pack'] |       if data['pack'] | ||||||
|  |         data['name'] = name | ||||||
|         result[name] = data |         result[name] = data | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  | 
 | ||||||
|  |     @core = core | ||||||
|     @conf = result |     @conf = result | ||||||
|  | 
 | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def core | ||||||
|  |     @core | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def get(name) |   def get(name) | ||||||
|  | |||||||
| @ -2,7 +2,6 @@ | |||||||
|   = site_hostname |   = site_hostname | ||||||
| 
 | 
 | ||||||
| - content_for :header_tags do | - content_for :header_tags do | ||||||
|   = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' |  | ||||||
|   = render partial: 'shared/og' |   = render partial: 'shared/og' | ||||||
| 
 | 
 | ||||||
| .landing-page | .landing-page | ||||||
|  | |||||||
| @ -3,7 +3,6 @@ | |||||||
| 
 | 
 | ||||||
| - content_for :header_tags do | - content_for :header_tags do | ||||||
|   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) |   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) | ||||||
|   = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' |  | ||||||
|   = render partial: 'shared/og' |   = render partial: 'shared/og' | ||||||
| 
 | 
 | ||||||
| .landing-page | .landing-page | ||||||
|  | |||||||
| @ -1,6 +1,3 @@ | |||||||
| - content_for :header_tags do |  | ||||||
|   = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous' |  | ||||||
| 
 |  | ||||||
| - content_for :page_title do | - content_for :page_title do | ||||||
|   = t('admin.reports.report', id: @report.id) |   = t('admin.reports.report', id: @report.id) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,3 @@ | |||||||
| - content_for :header_tags do |  | ||||||
|   = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous' |  | ||||||
| 
 |  | ||||||
| - content_for :page_title do | - content_for :page_title do | ||||||
|   = t('admin.statuses.title') |   = t('admin.statuses.title') | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,13 +1,7 @@ | |||||||
| - content_for :header_tags do | - content_for :header_tags do | ||||||
|   - if theme_data['preload'] |  | ||||||
|     - theme_data['preload'].each do |link| |  | ||||||
|       %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ |  | ||||||
|   %meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key} |   %meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key} | ||||||
|   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) |   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) | ||||||
| 
 | 
 | ||||||
|   = 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) } } | .app-holder#mastodon{ data: { props: Oj.dump(default_props) } } | ||||||
|   %noscript |   %noscript | ||||||
|     = image_tag asset_pack_path('logo.svg'), alt: 'Mastodon' |     = image_tag asset_pack_path('logo.svg'), alt: 'Mastodon' | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								app/views/layouts/_theme.html.haml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/views/layouts/_theme.html.haml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | - if theme | ||||||
|  |   - if theme[:pack] != 'common' && theme[:common] | ||||||
|  |     = render partial: 'layouts/theme', object: theme[:common] | ||||||
|  |   - if theme[:pack] | ||||||
|  |     = javascript_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous' | ||||||
|  |     - if theme[:stylesheet] | ||||||
|  |       = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' | ||||||
|  |     - if theme[:preload] | ||||||
|  |       - theme[:preload].each do |link| | ||||||
|  |         %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ | ||||||
| @ -1,6 +1,3 @@ | |||||||
| - content_for :header_tags do |  | ||||||
|   = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' |  | ||||||
| 
 |  | ||||||
| - content_for :content do | - content_for :content do | ||||||
|   .admin-wrapper |   .admin-wrapper | ||||||
|     .sidebar-wrapper |     .sidebar-wrapper | ||||||
|  | |||||||
| @ -18,16 +18,16 @@ | |||||||
|         = ' - ' |         = ' - ' | ||||||
|       = title |       = title | ||||||
| 
 | 
 | ||||||
|     = stylesheet_pack_tag 'common', media: 'all' |     = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous' | ||||||
|     = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' |  | ||||||
|     = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' |     = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' | ||||||
|     = csrf_meta_tags |     = csrf_meta_tags | ||||||
| 
 | 
 | ||||||
|     - if controller_name != 'home' |  | ||||||
|       = stylesheet_pack_tag 'application', integrity: true, media: 'all' |  | ||||||
| 
 |  | ||||||
|     = yield :header_tags |     = yield :header_tags | ||||||
| 
 | 
 | ||||||
|  |     -#  These must come after :header_tags to ensure our initial state has been defined. | ||||||
|  |     = render partial: 'layouts/theme', object: @core | ||||||
|  |     = render partial: 'layouts/theme', object: @theme | ||||||
|  | 
 | ||||||
|   - body_classes ||= @body_classes || '' |   - body_classes ||= @body_classes || '' | ||||||
|   - body_classes += ' system-font' if current_account&.user&.setting_system_font_ui |   - body_classes += ' system-font' if current_account&.user&.setting_system_font_ui | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,3 @@ | |||||||
| - content_for :header_tags do |  | ||||||
|   = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' |  | ||||||
| 
 |  | ||||||
| - content_for :content do | - content_for :content do | ||||||
|   .container |   .container | ||||||
|     .logo-container |     .logo-container | ||||||
|  | |||||||
| @ -4,10 +4,9 @@ | |||||||
|     %meta{ charset: 'utf-8' }/ |     %meta{ charset: 'utf-8' }/ | ||||||
|     %meta{ name: 'robots', content: 'noindex' }/ |     %meta{ name: 'robots', content: 'noindex' }/ | ||||||
| 
 | 
 | ||||||
|     = stylesheet_pack_tag 'common', media: 'all' |  | ||||||
|     = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' |     = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' | ||||||
|     = stylesheet_pack_tag 'application', integrity: true, media: 'all' |     = javascript_pack_tag 'embed', integrity: true, crossorigin: 'anonymous' | ||||||
|     = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' |     = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' | ||||||
|     = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' |     = render partial: 'layouts/theme', object: @core | ||||||
|   %body.embed |     = render partial: 'layouts/theme', object: @theme | ||||||
|     = yield |     = yield | ||||||
|  | |||||||
| @ -5,8 +5,8 @@ | |||||||
|     %meta{ charset: 'utf-8' }/ |     %meta{ charset: 'utf-8' }/ | ||||||
|     %title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ') |     %title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ') | ||||||
|     %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/ |     %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/ | ||||||
|     = stylesheet_pack_tag 'common', media: 'all' |     = render partial: 'layouts/theme', object: @core | ||||||
|     = stylesheet_pack_tag 'application', integrity: true, media: 'all' |     = render partial: 'layouts/theme', object: @theme | ||||||
|   %body.error |   %body.error | ||||||
|     .dialog |     .dialog | ||||||
|       %img{ alt: Setting.default_settings['site_title'], src: '/oops.gif' }/ |       %img{ alt: Setting.default_settings['site_title'], src: '/oops.gif' }/ | ||||||
|  | |||||||
| @ -1,6 +1,3 @@ | |||||||
| - content_for :header_tags do |  | ||||||
|   = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' |  | ||||||
| 
 |  | ||||||
| - content_for :content do | - content_for :content do | ||||||
|   - if user_signed_in? |   - if user_signed_in? | ||||||
|     .account-header |     .account-header | ||||||
|  | |||||||
| @ -1,6 +1,3 @@ | |||||||
| - content_for :header_tags do |  | ||||||
|   = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' |  | ||||||
| 
 |  | ||||||
| - content_for :content do | - content_for :content do | ||||||
|   .container= yield |   .container= yield | ||||||
|   .footer |   .footer | ||||||
|  | |||||||
| @ -1,5 +1,4 @@ | |||||||
| - content_for :header_tags do | - content_for :header_tags do | ||||||
|   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) |   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) | ||||||
|   = javascript_pack_tag 'share', integrity: true, crossorigin: 'anonymous' |  | ||||||
| 
 | 
 | ||||||
| #mastodon-compose{ data: { props: Oj.dump(default_props) } } | #mastodon-compose{ data: { props: Oj.dump(default_props) } } | ||||||
|  | |||||||
| @ -3,7 +3,6 @@ | |||||||
| 
 | 
 | ||||||
| - content_for :header_tags do | - content_for :header_tags do | ||||||
|   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) |   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) | ||||||
|   = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' |  | ||||||
|   = render 'og' |   = render 'og' | ||||||
| 
 | 
 | ||||||
| .landing-page.tag-page | .landing-page.tag-page | ||||||
|  | |||||||
| @ -12,14 +12,24 @@ const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV]; | |||||||
| const themeFiles = glob.sync('app/javascript/themes/*/theme.yml'); | const themeFiles = glob.sync('app/javascript/themes/*/theme.yml'); | ||||||
| const themes = {}; | const themes = {}; | ||||||
| 
 | 
 | ||||||
|  | const core = function () { | ||||||
|  |   const coreFile = resolve('app', 'javascript', 'core', 'theme.yml'); | ||||||
|  |   const data = safeLoad(readFileSync(coreFile), 'utf8'); | ||||||
|  |   if (!data.pack_directory) { | ||||||
|  |     data.pack_directory = dirname(coreFile); | ||||||
|  |   } | ||||||
|  |   return data.pack ? data : {}; | ||||||
|  | }(); | ||||||
|  | 
 | ||||||
| for (let i = 0; i < themeFiles.length; i++) { | for (let i = 0; i < themeFiles.length; i++) { | ||||||
|   const themeFile = themeFiles[i]; |   const themeFile = themeFiles[i]; | ||||||
|   const data = safeLoad(readFileSync(themeFile), 'utf8'); |   const data = safeLoad(readFileSync(themeFile), 'utf8'); | ||||||
|  |   data.name = basename(dirname(themeFile)); | ||||||
|   if (!data.pack_directory) { |   if (!data.pack_directory) { | ||||||
|     data.pack_directory = dirname(themeFile); |     data.pack_directory = dirname(themeFile); | ||||||
|   } |   } | ||||||
|   if (data.pack) { |   if (data.pack) { | ||||||
|     themes[basename(dirname(themeFile))] = data; |     themes[data.name] = data; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -43,6 +53,7 @@ const output = { | |||||||
| 
 | 
 | ||||||
| module.exports = { | module.exports = { | ||||||
|   settings, |   settings, | ||||||
|  |   core, | ||||||
|   themes, |   themes, | ||||||
|   env, |   env, | ||||||
|   loadersDir, |   loadersDir, | ||||||
|  | |||||||
| @ -57,7 +57,7 @@ Object.keys(glitchMessages).forEach(function (key) { | |||||||
| //
 | //
 | ||||||
| import messages from '../../app/javascript/mastodon/locales/${locale}.json'; | import messages from '../../app/javascript/mastodon/locales/${locale}.json'; | ||||||
| import localeData from ${JSON.stringify(localeDataPath)}; | import localeData from ${JSON.stringify(localeDataPath)}; | ||||||
| import { setLocale } from '../../app/javascript/mastodon/locales'; | import { setLocale } from 'locales'; | ||||||
| ${glitchInject} | ${glitchInject} | ||||||
| setLocale({messages: mergedMessages, localeData: localeData}); | setLocale({messages: mergedMessages, localeData: localeData}); | ||||||
| `;
 | `;
 | ||||||
|  | |||||||
| @ -6,33 +6,37 @@ const { sync } = require('glob'); | |||||||
| const ExtractTextPlugin = require('extract-text-webpack-plugin'); | const ExtractTextPlugin = require('extract-text-webpack-plugin'); | ||||||
| const ManifestPlugin = require('webpack-manifest-plugin'); | const ManifestPlugin = require('webpack-manifest-plugin'); | ||||||
| const extname = require('path-complete-extname'); | const extname = require('path-complete-extname'); | ||||||
| const { env, settings, themes, output, loadersDir } = require('./configuration.js'); | const { env, settings, core, themes, output, loadersDir } = require('./configuration.js'); | ||||||
| const localePackPaths = require('./generateLocalePacks'); | const localePackPaths = require('./generateLocalePacks'); | ||||||
| 
 | 
 | ||||||
| const extensionGlob = `**/*{${settings.extensions.join(',')}}*`; | function reducePacks (data, into = {}) { | ||||||
| const entryPath = join(settings.source_path, settings.source_entry_path); |   if (!data.pack) { | ||||||
| const packPaths = sync(join(entryPath, extensionGlob)); |     return into; | ||||||
|  |   } | ||||||
|  |   Object.keys(data.pack).reduce((map, entry) => { | ||||||
|  |     const pack = data.pack[entry]; | ||||||
|  |     if (!pack) { | ||||||
|  |       return map; | ||||||
|  |     } | ||||||
|  |     const packFile = typeof pack === 'string' ? pack : pack.filename; | ||||||
|  |     if (packFile) { | ||||||
|  |       map[data.name ? `themes/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile); | ||||||
|  |     } | ||||||
|  |     return map; | ||||||
|  |   }, into); | ||||||
|  |   return into; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| module.exports = { | module.exports = { | ||||||
|   entry: Object.assign( |   entry: Object.assign( | ||||||
|     packPaths.reduce((map, entry) => { |     { locales: resolve('app', 'javascript', 'locales') }, | ||||||
|       const localMap = map; |  | ||||||
|       const namespace = relative(join(entryPath), dirname(entry)); |  | ||||||
|       localMap[join(namespace, basename(entry, extname(entry)))] = resolve(entry); |  | ||||||
|       return localMap; |  | ||||||
|     }, {}), |  | ||||||
|     localePackPaths.reduce((map, entry) => { |     localePackPaths.reduce((map, entry) => { | ||||||
|       const localMap = map; |       const localMap = map; | ||||||
|       localMap[basename(entry, extname(entry, extname(entry)))] = resolve(entry); |       localMap[basename(entry, extname(entry, extname(entry)))] = resolve(entry); | ||||||
|       return localMap; |       return localMap; | ||||||
|     }, {}), |     }, {}), | ||||||
|     Object.keys(themes).reduce( |     reducePacks(core), | ||||||
|       (themePaths, name) => { |     Object.keys(themes).reduce((map, entry) => reducePacks(themes[entry], map), {}) | ||||||
|         const themeData = themes[name]; |  | ||||||
|         themePaths[`themes/${name}`] = resolve(themeData.pack_directory, themeData.pack); |  | ||||||
|         return themePaths; |  | ||||||
|       }, {} |  | ||||||
|     ) |  | ||||||
|   ), |   ), | ||||||
| 
 | 
 | ||||||
|   output: { |   output: { | ||||||
| @ -64,7 +68,7 @@ module.exports = { | |||||||
|       writeToFileEmit: true, |       writeToFileEmit: true, | ||||||
|     }), |     }), | ||||||
|     new webpack.optimize.CommonsChunkPlugin({ |     new webpack.optimize.CommonsChunkPlugin({ | ||||||
|       name: 'common', |       name: 'locales', | ||||||
|       minChunks: Infinity, // It doesn't make sense to use common chunks with multiple frontend support.
 |       minChunks: Infinity, // It doesn't make sense to use common chunks with multiple frontend support.
 | ||||||
|     }), |     }), | ||||||
|   ], |   ], | ||||||
|  | |||||||
| @ -2,7 +2,6 @@ | |||||||
| 
 | 
 | ||||||
| default: &default | default: &default | ||||||
|   source_path: app/javascript |   source_path: app/javascript | ||||||
|   source_entry_path: packs |  | ||||||
|   public_output_path: packs |   public_output_path: packs | ||||||
|   cache_path: tmp/cache/webpacker |   cache_path: tmp/cache/webpacker | ||||||
| 
 | 
 | ||||||
| @ -13,17 +12,6 @@ default: &default | |||||||
|   # Reload manifest.json on all requests so we reload latest compiled packs |   # Reload manifest.json on all requests so we reload latest compiled packs | ||||||
|   cache_manifest: false |   cache_manifest: false | ||||||
| 
 | 
 | ||||||
|   extensions: |  | ||||||
|     - .js |  | ||||||
|     - .sass |  | ||||||
|     - .scss |  | ||||||
|     - .css |  | ||||||
|     - .png |  | ||||||
|     - .svg |  | ||||||
|     - .gif |  | ||||||
|     - .jpeg |  | ||||||
|     - .jpg |  | ||||||
| 
 |  | ||||||
| development: | development: | ||||||
|   <<: *default |   <<: *default | ||||||
|   compile: true |   compile: true | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user