From f91a18606f9b47e8c803d37a7a7d9c003ea2727d Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Tue, 10 Apr 2018 22:13:15 +0200 Subject: [PATCH 001/200] Add backend support for bookmarks Bookmarks behave like favourites, except they aren't shared with other users and do not have an associated counter. --- .../api/v1/bookmarks_controller.rb | 71 +++++++++++++++++++ .../api/v1/statuses/bookmarks_controller.rb | 39 ++++++++++ app/models/bookmark.rb | 26 +++++++ app/models/concerns/account_associations.rb | 1 + app/models/concerns/account_interactions.rb | 4 ++ app/models/status.rb | 5 ++ .../status_relationships_presenter.rb | 2 + app/serializers/rest/status_serializer.rb | 9 +++ config/routes.rb | 4 ++ db/migrate/20180831171112_create_bookmarks.rb | 14 ++++ db/schema.rb | 12 ++++ 11 files changed, 187 insertions(+) create mode 100644 app/controllers/api/v1/bookmarks_controller.rb create mode 100644 app/controllers/api/v1/statuses/bookmarks_controller.rb create mode 100644 app/models/bookmark.rb create mode 100644 db/migrate/20180831171112_create_bookmarks.rb diff --git a/app/controllers/api/v1/bookmarks_controller.rb b/app/controllers/api/v1/bookmarks_controller.rb new file mode 100644 index 000000000..49038807d --- /dev/null +++ b/app/controllers/api/v1/bookmarks_controller.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +class Api::V1::BookmarksController < Api::BaseController + before_action -> { doorkeeper_authorize! :read } + before_action :require_user! + after_action :insert_pagination_headers + + respond_to :json + + def index + @statuses = load_statuses + render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id) + end + + private + + def load_statuses + cached_bookmarks + end + + def cached_bookmarks + cache_collection( + Status.reorder(nil).joins(:bookmarks).merge(results), + Status + ) + end + + def results + @_results ||= account_bookmarks.paginate_by_max_id( + limit_param(DEFAULT_STATUSES_LIMIT), + params[:max_id], + params[:since_id] + ) + end + + def account_bookmarks + current_account.bookmarks + end + + def insert_pagination_headers + set_pagination_headers(next_path, prev_path) + end + + def next_path + if records_continue? + api_v1_bookmarks_url pagination_params(max_id: pagination_max_id) + end + end + + def prev_path + unless results.empty? + api_v1_bookmarks_url pagination_params(since_id: pagination_since_id) + end + end + + def pagination_max_id + results.last.id + end + + def pagination_since_id + results.first.id + end + + def records_continue? + results.size == limit_param(DEFAULT_STATUSES_LIMIT) + end + + def pagination_params(core_params) + params.slice(:limit).permit(:limit).merge(core_params) + end +end diff --git a/app/controllers/api/v1/statuses/bookmarks_controller.rb b/app/controllers/api/v1/statuses/bookmarks_controller.rb new file mode 100644 index 000000000..d7def5f1f --- /dev/null +++ b/app/controllers/api/v1/statuses/bookmarks_controller.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +class Api::V1::Statuses::BookmarksController < Api::BaseController + include Authorization + + before_action -> { doorkeeper_authorize! :write } + before_action :require_user! + + respond_to :json + + def create + @status = bookmarked_status + render json: @status, serializer: REST::StatusSerializer + end + + def destroy + @status = requested_status + @bookmarks_map = { @status.id => false } + + bookmark = Bookmark.find_by!(account: current_user.account, status: @status) + bookmark.destroy! + + render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_user&.account_id, bookmarks_map: @bookmarks_map) + end + + private + + def bookmarked_status + authorize_with current_user.account, requested_status, :show? + + bookmark = Bookmark.find_or_create_by!(account: current_user.account, status: requested_status) + + bookmark.status.reload + end + + def requested_status + Status.find(params[:status_id]) + end +end diff --git a/app/models/bookmark.rb b/app/models/bookmark.rb new file mode 100644 index 000000000..01dc48ee7 --- /dev/null +++ b/app/models/bookmark.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true +# == Schema Information +# +# Table name: bookmarks +# +# id :integer not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# account_id :integer not null +# status_id :integer not null +# + +class Bookmark < ApplicationRecord + include Paginable + + update_index('statuses#status', :status) if Chewy.enabled? + + belongs_to :account, inverse_of: :bookmarks + belongs_to :status, inverse_of: :bookmarks + + validates :status_id, uniqueness: { scope: :account_id } + + before_validation do + self.status = status.reblog if status&.reblog? + end +end diff --git a/app/models/concerns/account_associations.rb b/app/models/concerns/account_associations.rb index 7dafeee34..4e730451a 100644 --- a/app/models/concerns/account_associations.rb +++ b/app/models/concerns/account_associations.rb @@ -11,6 +11,7 @@ module AccountAssociations has_many :stream_entries, inverse_of: :account, dependent: :destroy has_many :statuses, inverse_of: :account, dependent: :destroy has_many :favourites, inverse_of: :account, dependent: :destroy + has_many :bookmarks, inverse_of: :account, dependent: :destroy has_many :mentions, inverse_of: :account, dependent: :destroy has_many :notifications, inverse_of: :account, dependent: :destroy has_many :conversations, class_name: 'AccountConversation', dependent: :destroy, inverse_of: :account diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index ad2909d91..f27d39483 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -186,6 +186,10 @@ module AccountInteractions status.proper.favourites.where(account: self).exists? end + def bookmarked?(status) + status.proper.bookmarks.where(account: self).exists? + end + def reblogged?(status) status.proper.reblogs.where(account: self).exists? end diff --git a/app/models/status.rb b/app/models/status.rb index 035423b40..bd52c3387 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -49,6 +49,7 @@ class Status < ApplicationRecord belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true has_many :favourites, inverse_of: :status, dependent: :destroy + has_many :bookmarks, inverse_of: :status, dependent: :destroy has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread has_many :mentions, dependent: :destroy, inverse_of: :status @@ -324,6 +325,10 @@ class Status < ApplicationRecord Favourite.select('status_id').where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true } end + def bookmarks_map(status_ids, account_id) + Bookmark.select('status_id').where(status_id: status_ids).where(account_id: account_id).map { |f| [f.status_id, true] }.to_h + end + def reblogs_map(status_ids, account_id) select('reblog_of_id').where(reblog_of_id: status_ids).where(account_id: account_id).reorder(nil).each_with_object({}) { |s, h| h[s.reblog_of_id] = true } end diff --git a/app/presenters/status_relationships_presenter.rb b/app/presenters/status_relationships_presenter.rb index b04e10e2f..64e688d87 100644 --- a/app/presenters/status_relationships_presenter.rb +++ b/app/presenters/status_relationships_presenter.rb @@ -7,6 +7,7 @@ class StatusRelationshipsPresenter if current_account_id.nil? @reblogs_map = {} @favourites_map = {} + @bookmarks_map = {} @mutes_map = {} @pins_map = {} else @@ -17,6 +18,7 @@ class StatusRelationshipsPresenter @reblogs_map = Status.reblogs_map(status_ids, current_account_id).merge(options[:reblogs_map] || {}) @favourites_map = Status.favourites_map(status_ids, current_account_id).merge(options[:favourites_map] || {}) + @bookmarks_map = Status.bookmarks_map(status_ids, current_account_id).merge(options[:bookmarks_map] || {}) @mutes_map = Status.mutes_map(conversation_ids, current_account_id).merge(options[:mutes_map] || {}) @pins_map = Status.pins_map(pinnable_status_ids, current_account_id).merge(options[:pins_map] || {}) end diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index bfc2d78b4..8a61c1056 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -9,6 +9,7 @@ class REST::StatusSerializer < ActiveModel::Serializer attribute :favourited, if: :current_user? attribute :reblogged, if: :current_user? attribute :muted, if: :current_user? + attribute :bookmarked, if: :current_user? attribute :pinned, if: :pinnable? belongs_to :reblog, serializer: REST::StatusSerializer @@ -85,6 +86,14 @@ class REST::StatusSerializer < ActiveModel::Serializer end end + def bookmarked + if instance_options && instance_options[:bookmarks] + instance_options[:bookmarks].bookmarks_map[object.id] || false + else + current_user.account.bookmarked?(object) + end + end + def pinned if instance_options && instance_options[:relationships] instance_options[:relationships].pins_map[object.id] || false diff --git a/config/routes.rb b/config/routes.rb index af49845cc..d077f1643 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -255,6 +255,9 @@ Rails.application.routes.draw do resource :favourite, only: :create post :unfavourite, to: 'favourites#destroy' + resource :bookmark, only: :create + post :unbookmark, to: 'bookmarks#destroy' + resource :mute, only: :create post :unmute, to: 'mutes#destroy' @@ -294,6 +297,7 @@ Rails.application.routes.draw do resources :blocks, only: [:index] resources :mutes, only: [:index] resources :favourites, only: [:index] + resources :bookmarks, only: [:index] resources :reports, only: [:create] resources :filters, only: [:index, :create, :show, :update, :destroy] resources :endorsements, only: [:index] diff --git a/db/migrate/20180831171112_create_bookmarks.rb b/db/migrate/20180831171112_create_bookmarks.rb new file mode 100644 index 000000000..208da452b --- /dev/null +++ b/db/migrate/20180831171112_create_bookmarks.rb @@ -0,0 +1,14 @@ +class CreateBookmarks < ActiveRecord::Migration[5.1] + def change + create_table :bookmarks do |t| + t.references :account, null: false + t.references :status, null: false + + t.timestamps + end + + add_foreign_key :bookmarks, :accounts, column: :account_id, on_delete: :cascade + add_foreign_key :bookmarks, :statuses, column: :status_id, on_delete: :cascade + add_index :bookmarks, [:account_id, :status_id], unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 3487adf08..2dcdf1f0e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -182,6 +182,16 @@ ActiveRecord::Schema.define(version: 2019_01_17_114553) do t.index ["target_account_id"], name: "index_blocks_on_target_account_id" end + create_table "bookmarks", force: :cascade do |t| + t.bigint "account_id", null: false + t.bigint "status_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id", "status_id"], name: "index_bookmarks_on_account_id_and_status_id", unique: true + t.index ["account_id"], name: "index_bookmarks_on_account_id" + t.index ["status_id"], name: "index_bookmarks_on_status_id" + end + create_table "conversation_mutes", force: :cascade do |t| t.bigint "conversation_id", null: false t.bigint "account_id", null: false @@ -702,6 +712,8 @@ ActiveRecord::Schema.define(version: 2019_01_17_114553) do add_foreign_key "backups", "users", on_delete: :nullify add_foreign_key "blocks", "accounts", column: "target_account_id", name: "fk_9571bfabc1", on_delete: :cascade add_foreign_key "blocks", "accounts", name: "fk_4269e03e65", on_delete: :cascade + add_foreign_key "bookmarks", "accounts", on_delete: :cascade + add_foreign_key "bookmarks", "statuses", on_delete: :cascade add_foreign_key "conversation_mutes", "accounts", name: "fk_225b4212bb", on_delete: :cascade add_foreign_key "conversation_mutes", "conversations", on_delete: :cascade add_foreign_key "custom_filters", "accounts", on_delete: :cascade From 4add8797574ca6034886ebe59c1c19346b019f5f Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Wed, 11 Apr 2018 21:05:08 +0200 Subject: [PATCH 002/200] Add spec for bookmark endpoints --- .../api/v1/bookmarks_controller_spec.rb | 78 +++++++++++++++++++ .../v1/statuses/bookmarks_controller_spec.rb | 57 ++++++++++++++ spec/fabricators/bookmark_fabricator.rb | 4 + 3 files changed, 139 insertions(+) create mode 100644 spec/controllers/api/v1/bookmarks_controller_spec.rb create mode 100644 spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb create mode 100644 spec/fabricators/bookmark_fabricator.rb diff --git a/spec/controllers/api/v1/bookmarks_controller_spec.rb b/spec/controllers/api/v1/bookmarks_controller_spec.rb new file mode 100644 index 000000000..26130e71b --- /dev/null +++ b/spec/controllers/api/v1/bookmarks_controller_spec.rb @@ -0,0 +1,78 @@ +require 'rails_helper' + +RSpec.describe Api::V1::BookmarksController, type: :controller do + render_views + + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + + describe 'GET #index' do + context 'without token' do + it 'returns http unauthorized' do + get :index + expect(response).to have_http_status :unauthorized + end + end + + context 'with token' do + context 'without read scope' do + before do + allow(controller).to receive(:doorkeeper_token) do + Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: '') + end + end + + it 'returns http forbidden' do + get :index + expect(response).to have_http_status :forbidden + end + end + + context 'without valid resource owner' do + before do + token = Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') + user.destroy! + + allow(controller).to receive(:doorkeeper_token) { token } + end + + it 'returns http unprocessable entity' do + get :index + expect(response).to have_http_status :unprocessable_entity + end + end + + context 'with read scope and valid resource owner' do + before do + allow(controller).to receive(:doorkeeper_token) do + Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') + end + end + + it 'shows bookmarks owned by the user' do + bookmarked_by_user = Fabricate(:bookmark, account: user.account) + bookmarked_by_others = Fabricate(:bookmark) + + get :index + + expect(assigns(:statuses)).to match_array [bookmarked_by_user.status] + end + + it 'adds pagination headers if necessary' do + bookmark = Fabricate(:bookmark, account: user.account) + + get :index, params: { limit: 1 } + + expect(response.headers['Link'].find_link(['rel', 'next']).href).to eq "http://test.host/api/v1/bookmarks?limit=1&max_id=#{bookmark.id}" + expect(response.headers['Link'].find_link(['rel', 'prev']).href).to eq "http://test.host/api/v1/bookmarks?limit=1&since_id=#{bookmark.id}" + end + + it 'does not add pagination headers if not necessary' do + get :index + + expect(response.headers['Link']).to eq nil + end + end + end + end +end diff --git a/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb b/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb new file mode 100644 index 000000000..d881e22ed --- /dev/null +++ b/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Api::V1::Statuses::BookmarksController do + render_views + + let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) } + + context 'with an oauth token' do + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'POST #create' do + let(:status) { Fabricate(:status, account: user.account) } + + before do + post :create, params: { status_id: status.id } + end + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + + it 'updates the bookmarked attribute' do + expect(user.account.bookmarked?(status)).to be true + end + + it 'return json with updated attributes' do + hash_body = body_as_json + + expect(hash_body[:id]).to eq status.id.to_s + expect(hash_body[:bookmarked]).to be true + end + end + + describe 'POST #destroy' do + let(:status) { Fabricate(:status, account: user.account) } + + before do + Bookmark.find_or_create_by!(account: user.account, status: status) + post :destroy, params: { status_id: status.id } + end + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + + it 'updates the bookmarked attribute' do + expect(user.account.bookmarked?(status)).to be false + end + end + end +end diff --git a/spec/fabricators/bookmark_fabricator.rb b/spec/fabricators/bookmark_fabricator.rb new file mode 100644 index 000000000..12cbc5bfa --- /dev/null +++ b/spec/fabricators/bookmark_fabricator.rb @@ -0,0 +1,4 @@ +Fabricator(:bookmark) do + account + status +end From 04c114866f962f2eea03f0e7f94f731a6eefed93 Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Wed, 11 Apr 2018 20:24:54 +0200 Subject: [PATCH 003/200] Add front-end support for bookmarks --- app/javascript/mastodon/actions/bookmarks.js | 90 +++++++++++++++++ .../mastodon/actions/interactions.js | 78 +++++++++++++++ .../mastodon/components/status_action_bar.js | 7 ++ .../mastodon/containers/status_container.js | 10 ++ .../features/bookmarked_statuses/index.js | 98 +++++++++++++++++++ .../features/getting_started/index.js | 2 + .../features/status/components/action_bar.js | 7 ++ .../mastodon/features/status/index.js | 11 +++ .../features/ui/components/columns_area.js | 3 +- app/javascript/mastodon/features/ui/index.js | 2 + .../features/ui/util/async-components.js | 4 + .../mastodon/reducers/status_lists.js | 29 ++++++ app/javascript/mastodon/reducers/statuses.js | 6 ++ 13 files changed, 346 insertions(+), 1 deletion(-) create mode 100644 app/javascript/mastodon/actions/bookmarks.js create mode 100644 app/javascript/mastodon/features/bookmarked_statuses/index.js diff --git a/app/javascript/mastodon/actions/bookmarks.js b/app/javascript/mastodon/actions/bookmarks.js new file mode 100644 index 000000000..544ed2ff2 --- /dev/null +++ b/app/javascript/mastodon/actions/bookmarks.js @@ -0,0 +1,90 @@ +import api, { getLinks } from '../api'; +import { importFetchedStatuses } from './importer'; + +export const BOOKMARKED_STATUSES_FETCH_REQUEST = 'BOOKMARKED_STATUSES_FETCH_REQUEST'; +export const BOOKMARKED_STATUSES_FETCH_SUCCESS = 'BOOKMARKED_STATUSES_FETCH_SUCCESS'; +export const BOOKMARKED_STATUSES_FETCH_FAIL = 'BOOKMARKED_STATUSES_FETCH_FAIL'; + +export const BOOKMARKED_STATUSES_EXPAND_REQUEST = 'BOOKMARKED_STATUSES_EXPAND_REQUEST'; +export const BOOKMARKED_STATUSES_EXPAND_SUCCESS = 'BOOKMARKED_STATUSES_EXPAND_SUCCESS'; +export const BOOKMARKED_STATUSES_EXPAND_FAIL = 'BOOKMARKED_STATUSES_EXPAND_FAIL'; + +export function fetchBookmarkedStatuses() { + return (dispatch, getState) => { + if (getState().getIn(['status_lists', 'bookmarks', 'isLoading'])) { + return; + } + + dispatch(fetchBookmarkedStatusesRequest()); + + api(getState).get('/api/v1/bookmarks').then(response => { + const next = getLinks(response).refs.find(link => link.rel === 'next'); + dispatch(importFetchedStatuses(response.data)); + dispatch(fetchBookmarkedStatusesSuccess(response.data, next ? next.uri : null)); + }).catch(error => { + dispatch(fetchBookmarkedStatusesFail(error)); + }); + }; +}; + +export function fetchBookmarkedStatusesRequest() { + return { + type: BOOKMARKED_STATUSES_FETCH_REQUEST, + }; +}; + +export function fetchBookmarkedStatusesSuccess(statuses, next) { + return { + type: BOOKMARKED_STATUSES_FETCH_SUCCESS, + statuses, + next, + }; +}; + +export function fetchBookmarkedStatusesFail(error) { + return { + type: BOOKMARKED_STATUSES_FETCH_FAIL, + error, + }; +}; + +export function expandBookmarkedStatuses() { + return (dispatch, getState) => { + const url = getState().getIn(['status_lists', 'bookmarks', 'next'], null); + + if (url === null || getState().getIn(['status_lists', 'bookmarks', 'isLoading'])) { + return; + } + + dispatch(expandBookmarkedStatusesRequest()); + + api(getState).get(url).then(response => { + const next = getLinks(response).refs.find(link => link.rel === 'next'); + dispatch(importFetchedStatuses(response.data)); + dispatch(expandBookmarkedStatusesSuccess(response.data, next ? next.uri : null)); + }).catch(error => { + dispatch(expandBookmarkedStatusesFail(error)); + }); + }; +}; + +export function expandBookmarkedStatusesRequest() { + return { + type: BOOKMARKED_STATUSES_EXPAND_REQUEST, + }; +}; + +export function expandBookmarkedStatusesSuccess(statuses, next) { + return { + type: BOOKMARKED_STATUSES_EXPAND_SUCCESS, + statuses, + next, + }; +}; + +export function expandBookmarkedStatusesFail(error) { + return { + type: BOOKMARKED_STATUSES_EXPAND_FAIL, + error, + }; +}; diff --git a/app/javascript/mastodon/actions/interactions.js b/app/javascript/mastodon/actions/interactions.js index 2dc4c574c..3682370fc 100644 --- a/app/javascript/mastodon/actions/interactions.js +++ b/app/javascript/mastodon/actions/interactions.js @@ -33,6 +33,14 @@ export const UNPIN_REQUEST = 'UNPIN_REQUEST'; export const UNPIN_SUCCESS = 'UNPIN_SUCCESS'; export const UNPIN_FAIL = 'UNPIN_FAIL'; +export const BOOKMARK_REQUEST = 'BOOKMARK_REQUEST'; +export const BOOKMARK_SUCCESS = 'BOOKMARKED_SUCCESS'; +export const BOOKMARK_FAIL = 'BOOKMARKED_FAIL'; + +export const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST'; +export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS'; +export const UNBOOKMARK_FAIL = 'UNBOOKMARKED_FAIL'; + export function reblog(status) { return function (dispatch, getState) { dispatch(reblogRequest(status)); @@ -187,6 +195,76 @@ export function unfavouriteFail(status, error) { }; }; +export function bookmark(status) { + return function (dispatch, getState) { + dispatch(bookmarkRequest(status)); + + api(getState).post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function (response) { + dispatch(bookmarkSuccess(status, response.data)); + }).catch(function (error) { + dispatch(bookmarkFail(status, error)); + }); + }; +}; + +export function unbookmark(status) { + return (dispatch, getState) => { + dispatch(unbookmarkRequest(status)); + + api(getState).post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => { + dispatch(unbookmarkSuccess(status, response.data)); + }).catch(error => { + dispatch(unbookmarkFail(status, error)); + }); + }; +}; + +export function bookmarkRequest(status) { + return { + type: BOOKMARK_REQUEST, + status: status, + }; +}; + +export function bookmarkSuccess(status, response) { + return { + type: BOOKMARK_SUCCESS, + status: status, + response: response, + }; +}; + +export function bookmarkFail(status, error) { + return { + type: BOOKMARK_FAIL, + status: status, + error: error, + }; +}; + +export function unbookmarkRequest(status) { + return { + type: UNBOOKMARK_REQUEST, + status: status, + }; +}; + +export function unbookmarkSuccess(status, response) { + return { + type: UNBOOKMARK_SUCCESS, + status: status, + response: response, + }; +}; + +export function unbookmarkFail(status, error) { + return { + type: UNBOOKMARK_FAIL, + status: status, + error: error, + }; +}; + export function fetchReblogs(id) { return (dispatch, getState) => { dispatch(fetchReblogsRequest(id)); diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 0995a1490..46af83066 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -23,6 +23,7 @@ const messages = defineMessages({ cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }, + bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' }, open: { id: 'status.open', defaultMessage: 'Expand this status' }, report: { id: 'status.report', defaultMessage: 'Report @{name}' }, muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, @@ -65,6 +66,7 @@ class StatusActionBar extends ImmutablePureComponent { onEmbed: PropTypes.func, onMuteConversation: PropTypes.func, onPin: PropTypes.func, + onBookmark: PropTypes.func, withDismiss: PropTypes.bool, intl: PropTypes.object.isRequired, }; @@ -93,6 +95,10 @@ class StatusActionBar extends ImmutablePureComponent { this.props.onFavourite(this.props.status); } + handleBookmarkClick = () => { + this.props.onBookmark(this.props.status); + } + handleReblogClick = (e) => { this.props.onReblog(this.props.status, e); } @@ -215,6 +221,7 @@ class StatusActionBar extends ImmutablePureComponent { {shareButton} +
diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js index b3555c76e..352d957e6 100644 --- a/app/javascript/mastodon/containers/status_container.js +++ b/app/javascript/mastodon/containers/status_container.js @@ -10,8 +10,10 @@ import { import { reblog, favourite, + bookmark, unreblog, unfavourite, + unbookmark, pin, unpin, } from '../actions/interactions'; @@ -91,6 +93,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ } }, + onBookmark (status) { + if (status.get('bookmarked')) { + dispatch(unbookmark(status)); + } else { + dispatch(bookmark(status)); + } + }, + onPin (status) { if (status.get('pinned')) { dispatch(unpin(status)); diff --git a/app/javascript/mastodon/features/bookmarked_statuses/index.js b/app/javascript/mastodon/features/bookmarked_statuses/index.js new file mode 100644 index 000000000..195eba2a9 --- /dev/null +++ b/app/javascript/mastodon/features/bookmarked_statuses/index.js @@ -0,0 +1,98 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { fetchBookmarkedStatuses, expandBookmarkedStatuses } from '../../actions/bookmarks'; +import Column from '../ui/components/column'; +import ColumnHeader from '../../components/column_header'; +import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; +import StatusList from '../../components/status_list'; +import { defineMessages, injectIntl } from 'react-intl'; +import ImmutablePureComponent from 'react-immutable-pure-component'; +import { debounce } from 'lodash'; + +const messages = defineMessages({ + heading: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' }, +}); + +const mapStateToProps = state => ({ + statusIds: state.getIn(['status_lists', 'bookmarks', 'items']), + isLoading: state.getIn(['status_lists', 'bookmarks', 'isLoading'], true), + hasMore: !!state.getIn(['status_lists', 'bookmarks', 'next']), +}); + +@connect(mapStateToProps) +@injectIntl +export default class Bookmarks extends ImmutablePureComponent { + + static propTypes = { + dispatch: PropTypes.func.isRequired, + statusIds: ImmutablePropTypes.list.isRequired, + intl: PropTypes.object.isRequired, + columnId: PropTypes.string, + multiColumn: PropTypes.bool, + hasMore: PropTypes.bool, + isLoading: PropTypes.bool, + }; + + componentWillMount () { + this.props.dispatch(fetchBookmarkedStatuses()); + } + + handlePin = () => { + const { columnId, dispatch } = this.props; + + if (columnId) { + dispatch(removeColumn(columnId)); + } else { + dispatch(addColumn('BOOKMARKS', {})); + } + } + + handleMove = (dir) => { + const { columnId, dispatch } = this.props; + dispatch(moveColumn(columnId, dir)); + } + + handleHeaderClick = () => { + this.column.scrollTop(); + } + + setRef = c => { + this.column = c; + } + + handleLoadMore = debounce(() => { + this.props.dispatch(expandBookmarkedStatuses()); + }, 300, { leading: true }) + + render () { + const { intl, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; + const pinned = !!columnId; + + return ( + + + + + + ); + } + +} diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index 709a3aa96..9163467fd 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -20,6 +20,7 @@ const messages = defineMessages({ settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' }, community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' }, direct: { id: 'navigation_bar.direct', defaultMessage: 'Direct messages' }, + bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, @@ -115,6 +116,7 @@ class GettingStarted extends ImmutablePureComponent { navItems.push( , + , , ); diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js index d3b725283..df3e9a054 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.js +++ b/app/javascript/mastodon/features/status/components/action_bar.js @@ -17,6 +17,7 @@ const messages = defineMessages({ cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }, + bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' }, mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' }, muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' }, @@ -42,6 +43,7 @@ class ActionBar extends React.PureComponent { onReply: PropTypes.func.isRequired, onReblog: PropTypes.func.isRequired, onFavourite: PropTypes.func.isRequired, + onBookmark: PropTypes.func.isRequired, onDelete: PropTypes.func.isRequired, onDirect: PropTypes.func.isRequired, onMention: PropTypes.func.isRequired, @@ -66,6 +68,10 @@ class ActionBar extends React.PureComponent { this.props.onFavourite(this.props.status); } + handleBookmarkClick = (e) => { + this.props.onBookmark(this.props.status, e); + } + handleDeleteClick = () => { this.props.onDelete(this.props.status, this.context.router.history); } @@ -177,6 +183,7 @@ class ActionBar extends React.PureComponent {
{shareButton} +
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index d48b682eb..a5699f192 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -12,6 +12,8 @@ import Column from '../ui/components/column'; import { favourite, unfavourite, + bookmark, + unbookmark, reblog, unreblog, pin, @@ -191,6 +193,14 @@ class Status extends ImmutablePureComponent { } } + handleBookmarkClick = (status) => { + if (status.get('bookmarked')) { + this.props.dispatch(unbookmark(status)); + } else { + this.props.dispatch(bookmark(status)); + } + } + handleDeleteClick = (status, history, withRedraft = false) => { const { dispatch, intl } = this.props; @@ -448,6 +458,7 @@ class Status extends ImmutablePureComponent { onReply={this.handleReplyClick} onFavourite={this.handleFavouriteClick} onReblog={this.handleReblogClick} + onBookmark={this.handleBookmarkClick} onDelete={this.handleDeleteClick} onDirect={this.handleDirectClick} onMention={this.handleMentionClick} diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js index b7e350cbc..fe2d5ea02 100644 --- a/app/javascript/mastodon/features/ui/components/columns_area.js +++ b/app/javascript/mastodon/features/ui/components/columns_area.js @@ -12,7 +12,7 @@ import BundleContainer from '../containers/bundle_container'; import ColumnLoading from './column_loading'; import DrawerLoading from './drawer_loading'; import BundleColumnError from './bundle_column_error'; -import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, ListTimeline } from '../../ui/util/async-components'; +import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, BookmarkedStatuses, ListTimeline } from '../../ui/util/async-components'; import detectPassiveEvents from 'detect-passive-events'; import { scrollRight } from '../../../scroll'; @@ -26,6 +26,7 @@ const componentMap = { 'HASHTAG': HashtagTimeline, 'DIRECT': DirectTimeline, 'FAVOURITES': FavouritedStatuses, + 'BOOKMARKS': BookmarkedStatuses, 'LIST': ListTimeline, }; diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index f01c2bf24..ebb0b1a96 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -39,6 +39,7 @@ import { FollowRequests, GenericNotFound, FavouritedStatuses, + BookmarkedStatuses, ListTimeline, Blocks, DomainBlocks, @@ -157,6 +158,7 @@ class SwitchingColumnsArea extends React.PureComponent { + diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index 235fd2a07..c9b922e6b 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -90,6 +90,10 @@ export function FavouritedStatuses () { return import(/* webpackChunkName: "features/favourited_statuses" */'../../favourited_statuses'); } +export function BookmarkedStatuses () { + return import(/* webpackChunkName: "features/bookmarked_statuses" */'../../bookmarked_statuses'); +} + export function Blocks () { return import(/* webpackChunkName: "features/blocks" */'../../blocks'); } diff --git a/app/javascript/mastodon/reducers/status_lists.js b/app/javascript/mastodon/reducers/status_lists.js index 6c5f33557..9f8f28dee 100644 --- a/app/javascript/mastodon/reducers/status_lists.js +++ b/app/javascript/mastodon/reducers/status_lists.js @@ -6,6 +6,14 @@ import { FAVOURITED_STATUSES_EXPAND_SUCCESS, FAVOURITED_STATUSES_EXPAND_FAIL, } from '../actions/favourites'; +import { + BOOKMARKED_STATUSES_FETCH_REQUEST, + BOOKMARKED_STATUSES_FETCH_SUCCESS, + BOOKMARKED_STATUSES_FETCH_FAIL, + BOOKMARKED_STATUSES_EXPAND_REQUEST, + BOOKMARKED_STATUSES_EXPAND_SUCCESS, + BOOKMARKED_STATUSES_EXPAND_FAIL, +} from '../actions/bookmarks'; import { PINNED_STATUSES_FETCH_SUCCESS, } from '../actions/pin_statuses'; @@ -13,6 +21,8 @@ import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { FAVOURITE_SUCCESS, UNFAVOURITE_SUCCESS, + BOOKMARK_SUCCESS, + UNBOOKMARK_SUCCESS, PIN_SUCCESS, UNPIN_SUCCESS, } from '../actions/interactions'; @@ -23,6 +33,11 @@ const initialState = ImmutableMap({ loaded: false, items: ImmutableList(), }), + bookmarks: ImmutableMap({ + next: null, + loaded: false, + items: ImmutableList(), + }), pins: ImmutableMap({ next: null, loaded: false, @@ -71,10 +86,24 @@ export default function statusLists(state = initialState, action) { return normalizeList(state, 'favourites', action.statuses, action.next); case FAVOURITED_STATUSES_EXPAND_SUCCESS: return appendToList(state, 'favourites', action.statuses, action.next); + case BOOKMARKED_STATUSES_FETCH_REQUEST: + case BOOKMARKED_STATUSES_EXPAND_REQUEST: + return state.setIn(['bookmarks', 'isLoading'], true); + case BOOKMARKED_STATUSES_FETCH_FAIL: + case BOOKMARKED_STATUSES_EXPAND_FAIL: + return state.setIn(['bookmarks', 'isLoading'], false); + case BOOKMARKED_STATUSES_FETCH_SUCCESS: + return normalizeList(state, 'bookmarks', action.statuses, action.next); + case BOOKMARKED_STATUSES_EXPAND_SUCCESS: + return appendToList(state, 'bookmarks', action.statuses, action.next); case FAVOURITE_SUCCESS: return prependOneToList(state, 'favourites', action.status); case UNFAVOURITE_SUCCESS: return removeOneFromList(state, 'favourites', action.status); + case BOOKMARK_SUCCESS: + return prependOneToList(state, 'bookmarks', action.status); + case UNBOOKMARK_SUCCESS: + return removeOneFromList(state, 'bookmarks', action.status); case PINNED_STATUSES_FETCH_SUCCESS: return normalizeList(state, 'pins', action.statuses, action.next); case PIN_SUCCESS: diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js index 885cc221c..735902e72 100644 --- a/app/javascript/mastodon/reducers/statuses.js +++ b/app/javascript/mastodon/reducers/statuses.js @@ -3,6 +3,8 @@ import { REBLOG_FAIL, FAVOURITE_REQUEST, FAVOURITE_FAIL, + BOOKMARK_REQUEST, + BOOKMARK_FAIL, } from '../actions/interactions'; import { STATUS_MUTE_SUCCESS, @@ -39,6 +41,10 @@ export default function statuses(state = initialState, action) { return state.setIn([action.status.get('id'), 'favourited'], true); case FAVOURITE_FAIL: return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'favourited'], false); + case BOOKMARK_REQUEST: + return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], true); + case BOOKMARK_FAIL: + return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], false); case REBLOG_REQUEST: return state.setIn([action.status.get('id'), 'reblogged'], true); case REBLOG_FAIL: From 33a4c201466416546cd2b71ac2a99b46a510896e Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Fri, 10 Aug 2018 15:22:04 +0200 Subject: [PATCH 004/200] Introduce OAuth scopes for bookmarks --- app/controllers/api/v1/bookmarks_controller.rb | 2 +- app/controllers/api/v1/statuses/bookmarks_controller.rb | 2 +- config/initializers/doorkeeper.rb | 2 ++ config/locales/doorkeeper.en.yml | 2 ++ spec/controllers/api/v1/bookmarks_controller_spec.rb | 2 +- spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb | 2 +- 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/v1/bookmarks_controller.rb b/app/controllers/api/v1/bookmarks_controller.rb index 49038807d..1cab3c372 100644 --- a/app/controllers/api/v1/bookmarks_controller.rb +++ b/app/controllers/api/v1/bookmarks_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::BookmarksController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:bookmarks' } before_action :require_user! after_action :insert_pagination_headers diff --git a/app/controllers/api/v1/statuses/bookmarks_controller.rb b/app/controllers/api/v1/statuses/bookmarks_controller.rb index d7def5f1f..bb9729cf5 100644 --- a/app/controllers/api/v1/statuses/bookmarks_controller.rb +++ b/app/controllers/api/v1/statuses/bookmarks_controller.rb @@ -3,7 +3,7 @@ class Api::V1::Statuses::BookmarksController < Api::BaseController include Authorization - before_action -> { doorkeeper_authorize! :write } + before_action -> { doorkeeper_authorize! :write, :'write:bookmarks' } before_action :require_user! respond_to :json diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 367eead6a..2a963b32b 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -58,6 +58,7 @@ Doorkeeper.configure do optional_scopes :write, :'write:accounts', :'write:blocks', + :'write:bookmarks', :'write:conversations', :'write:favourites', :'write:filters', @@ -71,6 +72,7 @@ Doorkeeper.configure do :read, :'read:accounts', :'read:blocks', + :'read:bookmarks', :'read:favourites', :'read:filters', :'read:follows', diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml index f1fe03716..211b210d7 100644 --- a/config/locales/doorkeeper.en.yml +++ b/config/locales/doorkeeper.en.yml @@ -119,6 +119,7 @@ en: read: read all your account's data read:accounts: see accounts information read:blocks: see your blocks + read:bookmarks: see your bookmarks read:favourites: see your favourites read:filters: see your filters read:follows: see your follows @@ -131,6 +132,7 @@ en: write: modify all your account's data write:accounts: modify your profile write:blocks: block accounts and domains + write:bookmarks: bookmark statuses write:favourites: favourite statuses write:filters: create filters write:follows: follow people diff --git a/spec/controllers/api/v1/bookmarks_controller_spec.rb b/spec/controllers/api/v1/bookmarks_controller_spec.rb index 26130e71b..79601b6e6 100644 --- a/spec/controllers/api/v1/bookmarks_controller_spec.rb +++ b/spec/controllers/api/v1/bookmarks_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Api::V1::BookmarksController, type: :controller do render_views let(:user) { Fabricate(:user) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:bookmarks') } describe 'GET #index' do context 'without token' do diff --git a/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb b/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb index d881e22ed..b79853718 100644 --- a/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb @@ -7,7 +7,7 @@ describe Api::V1::Statuses::BookmarksController do let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:bookmarks', application: app) } context 'with an oauth token' do before do From c4a69903b6990c873a6d127c720ed371cf30485d Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Wed, 29 Aug 2018 13:06:37 +0200 Subject: [PATCH 005/200] Add bookmarks to archive takeout --- app/services/backup_service.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/services/backup_service.rb b/app/services/backup_service.rb index 4cfa22ab8..5fcc98057 100644 --- a/app/services/backup_service.rb +++ b/app/services/backup_service.rb @@ -45,6 +45,7 @@ class BackupService < BaseService dump_media_attachments!(tar) dump_outbox!(tar) dump_likes!(tar) + dump_bookmarks!(tar) dump_actor!(tar) end end @@ -85,6 +86,7 @@ class BackupService < BaseService actor[:image][:url] = 'header' + File.extname(actor[:image][:url]) if actor[:image] actor[:outbox] = 'outbox.json' actor[:likes] = 'likes.json' + actor[:bookmarks] = 'bookmarks.json' download_to_tar(tar, account.avatar, 'avatar' + File.extname(account.avatar.path)) if account.avatar.exists? download_to_tar(tar, account.header, 'header' + File.extname(account.header.path)) if account.header.exists? @@ -115,6 +117,25 @@ class BackupService < BaseService end end + def dump_bookmarks!(tar) + collection = serialize(ActivityPub::CollectionPresenter.new(id: 'bookmarks.json', type: :ordered, size: 0, items: []), ActivityPub::CollectionSerializer) + + Status.reorder(nil).joins(:bookmarks).includes(:account).merge(account.bookmarks).find_in_batches do |statuses| + statuses.each do |status| + collection[:totalItems] += 1 + collection[:orderedItems] << ActivityPub::TagManager.instance.uri_for(status) + end + + GC.start + end + + json = Oj.dump(collection) + + tar.add_file_simple('bookmarks.json', 0o444, json.bytesize) do |io| + io.write(json) + end + end + def collection_presenter ActivityPub::CollectionPresenter.new( id: 'outbox.json', From 667b598e5ce789fdf93f883b7c77dff274db1de3 Mon Sep 17 00:00:00 2001 From: YoheiZuho Date: Mon, 12 Aug 2019 02:36:51 +0000 Subject: [PATCH 006/200] =?UTF-8?q?=E3=83=96=E3=83=83=E3=82=AF=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=AF=E3=81=AE=E5=86=8D=E5=AE=9F=E8=A3=85?= =?UTF-8?q?(=E3=82=B7=E3=83=B3=E3=82=B0=E3=83=AB=E3=82=AB=E3=83=A9?= =?UTF-8?q?=E3=83=A0=E3=83=BB=E7=BF=BB=E8=A8=B3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/javascript/mastodon/features/getting_started/index.js | 2 +- .../mastodon/features/ui/components/navigation_panel.js | 1 + app/javascript/mastodon/locales/ja.json | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index a1e3f86ad..9a2e0fa9c 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -134,7 +134,7 @@ class GettingStarted extends ImmutablePureComponent { ); - height += 48*3; + height += 48*4; if (myAccount.get('locked')) { navItems.push(); diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js index 64a40a9da..907dbc665 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.js +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js @@ -16,6 +16,7 @@ const NavigationPanel = () => ( + diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 7312ce5ac..362cbf3ab 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -230,6 +230,7 @@ "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?", "navigation_bar.apps": "アプリ", "navigation_bar.blocks": "ブロックしたユーザー", + "navigation_bar.bookmarks": "ブックマーク", "navigation_bar.community_timeline": "ローカルタイムライン", "navigation_bar.compose": "トゥートの新規作成", "navigation_bar.direct": "ダイレクトメッセージ", From 87875c093e3f6deb3ad27d71bac6ed792b4883f5 Mon Sep 17 00:00:00 2001 From: YoheiZuho Date: Mon, 12 Aug 2019 04:42:03 +0000 Subject: [PATCH 007/200] =?UTF-8?q?=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=AE?= =?UTF-8?q?=E5=BE=A9=E6=B4=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/javascript/mastodon/actions/UtilBtns.js | 71 +++++++++++++++++++ .../compose/components/compose_form.js | 32 +++++++-- .../compose/components/user_counter.js | 10 +++ .../containers/compose_form_container.js | 17 +++++ app/javascript/mastodon/locales/ja.json | 19 +++-- .../styles/mastodon/components.scss | 67 ++++++++--------- 6 files changed, 173 insertions(+), 43 deletions(-) create mode 100644 app/javascript/mastodon/actions/UtilBtns.js create mode 100644 app/javascript/mastodon/features/compose/components/user_counter.js diff --git a/app/javascript/mastodon/actions/UtilBtns.js b/app/javascript/mastodon/actions/UtilBtns.js new file mode 100644 index 000000000..52ccc6877 --- /dev/null +++ b/app/javascript/mastodon/actions/UtilBtns.js @@ -0,0 +1,71 @@ +import { changeCompose } from '../actions/compose'; + + + +export const UTILBTNS_GOJI = 'UTILBTNS_GOJI'; +export const UTILBTNS_HARUKIN = 'UTILBTNS_HARUKIN'; + + + +export function submitGoji (textarea) { + return function (dispatch, getState) { + if (!textarea.value) { + let text = [ + "#ゴジモリィィィィイイ", + ":goji:" + ].join("\r\n"); + + dispatch(submitGojiRequest()); + dispatch(changeCompose(text)); + + textarea.focus(); + } + } +} + +export function submitGojiRequest () { + return { + type: UTILBTNS_GOJI + } +} + +export function submitHarukin (textarea) { + return function (dispatch, getState) { + const HARUKINS = [":harukin: ", ":harukin_old: ", ":harukin_ika: ", ":harukin_tako: "]; + const MAX = 6; + + if (!textarea.value) { + let text = ""; + + let quantity = Math.round(Math.random() * MAX + 1); + let type = Math.round(Math.random() * (HARUKINS.length - 1)); + + let harukin = HARUKINS[type]; + + switch (quantity) { + default: + text = [ + harukin.repeat(quantity), + "🔥 ".repeat(quantity) + ].join("\r\n"); + + break; + + case MAX + 1: + text = `${harukin}💕\r\n`.repeat(6); + break; + } + + dispatch(submitHarukinRequest()); + dispatch(changeCompose(text)); + + textarea.focus(); + } + } +} + +export function submitHarukinRequest () { + return { + type: UTILBTNS_HARUKIN + } +} diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index 47e189251..14d8ee795 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -20,6 +20,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { length } from 'stringz'; import { countableText } from '../util/counter'; import Icon from 'mastodon/components/icon'; +import { UserCounter } from './user_counter'; const allowedAroundShortCode = '><\u0085\u0020\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\u0009\u000a\u000b\u000c\u000d'; @@ -28,6 +29,10 @@ const messages = defineMessages({ spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' }, publish: { id: 'compose_form.publish', defaultMessage: 'Toot' }, publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' }, + + + utilBtns_goji: { id: 'compose_form.utilBtns_goji', defaultMessage: 'Typo!!!' }, + utilBtns_harukin: { id: 'compose_form.utilBtns_harukin', defaultMessage: 'Burn Harukin' } }); export default @injectIntl @@ -60,7 +65,9 @@ class ComposeForm extends ImmutablePureComponent { onPickEmoji: PropTypes.func.isRequired, showSearch: PropTypes.bool, anyMedia: PropTypes.bool, - singleColumn: PropTypes.bool, + singleColumn: PropTypes.bool, + onGojiSubmit: PropTypes.func.isRequired, + onHarukinSubmit: PropTypes.func.isRequired }; static defaultProps = { @@ -88,7 +95,7 @@ class ComposeForm extends ImmutablePureComponent { const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props; const fulltext = [this.props.spoilerText, countableText(this.props.text)].join(''); - if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > 500 || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) { + if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > 2048 || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) { return; } @@ -177,11 +184,15 @@ class ComposeForm extends ImmutablePureComponent { this.props.onPickEmoji(position, data, needsSpace); } + + handleOnGojiSubmit = () => this.props.onGojiSubmit(this.autosuggestTextarea.textarea); + handleOnHarukinSubmit = () => this.props.onHarukinSubmit(this.autosuggestTextarea.textarea); + render () { const { intl, onPaste, showSearch, anyMedia } = this.props; const disabled = this.props.isSubmitting; const text = [this.props.spoilerText, countableText(this.props.text)].join(''); - const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > 500 || (text.length !== 0 && text.trim().length === 0 && !anyMedia); + const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > 2048 || (text.length !== 0 && text.trim().length === 0 && !anyMedia); let publishText = ''; if (this.props.privacy === 'private' || this.props.privacy === 'direct') { @@ -243,11 +254,22 @@ class ComposeForm extends ImmutablePureComponent {
-
+
-
+
+ + +
+
+ +
+ +
); diff --git a/app/javascript/mastodon/features/compose/components/user_counter.js b/app/javascript/mastodon/features/compose/components/user_counter.js new file mode 100644 index 000000000..e49d2f1a8 --- /dev/null +++ b/app/javascript/mastodon/features/compose/components/user_counter.js @@ -0,0 +1,10 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +export default class UserCounter extends React.PureComponent { + render () { + return ( + 10人 + ); + } +} diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js index 37a0e8845..c4b27ad79 100644 --- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js +++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js @@ -11,6 +11,11 @@ import { uploadCompose, } from '../../../actions/compose'; +import { + submitGoji, + submitHarukin +} from '../../../actions/UtilBtns'; + const mapStateToProps = state => ({ text: state.getIn(['compose', 'text']), suggestions: state.getIn(['compose', 'suggestions']), @@ -60,6 +65,18 @@ const mapDispatchToProps = (dispatch) => ({ onPickEmoji (position, data, needsSpace) { dispatch(insertEmojiCompose(position, data, needsSpace)); }, + + onRisaSubmit (textarea) { + dispatch(submitRisa(textarea)); + }, + + onGojiSubmit (textarea) { + dispatch(submitGoji(textarea)); + }, + + onHarukinSubmit (textarea) { + dispatch(submitHarukin(textarea)); + }, }); diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 362cbf3ab..95bd39465 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -54,7 +54,7 @@ "column.lists": "リスト", "column.mutes": "ミュートしたユーザー", "column.notifications": "通知", - "column.pins": "固定されたトゥート", + "column.pins": "固定された投稿", "column.public": "連合タイムライン", "column_back_button.label": "戻る", "column_header.hide_settings": "設定を隠す", @@ -70,7 +70,7 @@ "compose_form.hashtag_warning": "このトゥートは公開設定ではないのでハッシュタグの一覧に表示されません。公開トゥートだけがハッシュタグで検索できます。", "compose_form.lock_disclaimer": "あなたのアカウントは{locked}になっていません。誰でもあなたをフォローすることができ、フォロワー限定の投稿を見ることができます。", "compose_form.lock_disclaimer.lock": "承認制", - "compose_form.placeholder": "今なにしてる?", + "compose_form.placeholder": "ちょうどL.A.に到着しました。", "compose_form.poll.add_option": "追加", "compose_form.poll.duration": "アンケート期間", "compose_form.poll.option_placeholder": "項目 {number}", @@ -83,6 +83,8 @@ "compose_form.spoiler.marked": "閲覧注意が設定されています", "compose_form.spoiler.unmarked": "閲覧注意が設定されていません", "compose_form.spoiler_placeholder": "ここに警告を書いてください", + "compose_form.utilBtns_goji": "誤字盛!", + "compose_form.utilBtns_harukin": "はるきん焼却", "confirmation_modal.cancel": "キャンセル", "confirmations.block.block_and_report": "ブロックし通報", "confirmations.block.confirm": "ブロック", @@ -143,7 +145,7 @@ "getting_started.invite": "招待", "getting_started.open_source_notice": "Mastodonはオープンソースソフトウェアです。誰でもGitHub ( {github} ) から開発に参加したり、問題を報告したりできます。", "getting_started.security": "セキュリティ", - "getting_started.terms": "プライバシーポリシー", + "getting_started.terms": "利用規約とプライバシーポリシー", "hashtag.column_header.tag_mode.all": "と {additional}", "hashtag.column_header.tag_mode.any": "か {additional}", "hashtag.column_header.tag_mode.none": "({additional} を除く)", @@ -153,6 +155,7 @@ "hashtag.column_settings.tag_mode.any": "いずれかを含む", "hashtag.column_settings.tag_mode.none": "これらを除く", "hashtag.column_settings.tag_toggle": "このカラムに追加のタグを含める", + "home.column_settings.advanced": "高度な設定", "home.column_settings.basic": "基本設定", "home.column_settings.show_reblogs": "ブースト表示", "home.column_settings.show_replies": "返信表示", @@ -230,7 +233,6 @@ "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?", "navigation_bar.apps": "アプリ", "navigation_bar.blocks": "ブロックしたユーザー", - "navigation_bar.bookmarks": "ブックマーク", "navigation_bar.community_timeline": "ローカルタイムライン", "navigation_bar.compose": "トゥートの新規作成", "navigation_bar.direct": "ダイレクトメッセージ", @@ -241,7 +243,8 @@ "navigation_bar.filters": "フィルター設定", "navigation_bar.follow_requests": "フォローリクエスト", "navigation_bar.follows_and_followers": "フォロー・フォロワー", - "navigation_bar.info": "このサーバーについて", + "navigation_bar.generate_qrcode": "プロフィールのQRコードを生成", + "navigation_bar.info": "Yづドンについて", "navigation_bar.keyboard_shortcuts": "ホットキー", "navigation_bar.lists": "リスト", "navigation_bar.logout": "ログアウト", @@ -252,7 +255,10 @@ "navigation_bar.profile_directory": "ディレクトリ", "navigation_bar.public_timeline": "連合タイムライン", "navigation_bar.security": "セキュリティ", - "notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました", + "navigation_bar.announcements": "運営からのお知らせ", + "navigation_bar.trends": "トレンド", + "navigation_bar.bookmarks": "ブックマーク", + "notification.favourite": "{name}さんがあなたのトゥートに╰( ^o^)╮-=ニ=一=三★しました", "notification.follow": "{name}さんにフォローされました", "notification.mention": "{name}さんがあなたに返信しました", "notification.poll": "アンケートが終了しました", @@ -293,6 +299,7 @@ "privacy.public.short": "公開", "privacy.unlisted.long": "公開TLで表示しない", "privacy.unlisted.short": "未収載", + "qr_modal.description": "QRコードを読み取って簡単にプロフィールにアクセスしましょう。", "regeneration_indicator.label": "読み込み中…", "regeneration_indicator.sublabel": "ホームタイムラインは準備中です!", "relative_time.days": "{number}日前", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 8de72d72e..a7cbca4b5 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -657,10 +657,29 @@ justify-content: flex-end; min-width: 0; flex: 0 0 auto; - + padding-top: 10px; + .compose-form__publish-button-wrapper { overflow: hidden; - padding-top: 10px; + + button { + display: inline-block; + width: auto; + + margin-right: 0.5em; + } + + button:last-child { + margin-right: auto; + } + } + } + + .compose-form__utilBtns { + padding-top: 10px; + + * { + margin-bottom: 1em; } } } @@ -2212,6 +2231,7 @@ a.account__display-name { } .getting-started__wrapper, + .getting-started__trends, .search { margin-bottom: 10px; } @@ -2318,24 +2338,13 @@ a.account__display-name { margin-bottom: 10px; height: calc(100% - 20px); overflow-y: auto; - display: flex; - flex-direction: column; - - & > a { - flex: 0 0 auto; - } hr { - flex: 0 0 auto; border: 0; background: transparent; border-top: 1px solid lighten($ui-base-color, 4%); margin: 10px 0; } - - .flex-spacer { - background: transparent; - } } .drawer__pager { @@ -2727,10 +2736,8 @@ a.account__display-name { } &__trends { + background: $ui-base-color; flex: 0 1 auto; - opacity: 1; - animation: fade 150ms linear; - margin-top: 10px; @media screen and (max-height: 810px) { .trends__item:nth-child(3) { @@ -2747,15 +2754,11 @@ a.account__display-name { @media screen and (max-height: 670px) { display: none; } + } - .trends__item { - border-bottom: 0; - padding: 10px; - - &__current { - color: $darker-text-color; - } - } + &__scrollable { + max-height: 100%; + overflow-y: auto; } } @@ -5520,6 +5523,12 @@ noscript { } } +.embed-modal__qrcode { + display: block; + margin-left: auto; + margin-right: auto; +} + .account__moved-note { padding: 14px 10px; padding-bottom: 16px; @@ -5984,8 +5993,7 @@ noscript { font-size: 24px; line-height: 36px; font-weight: 500; - text-align: right; - padding-right: 15px; + text-align: center; color: $secondary-text-color; } @@ -5993,12 +6001,7 @@ noscript { flex: 0 0 auto; width: 50px; - path:first-child { - fill: rgba($highlight-text-color, 0.25) !important; - fill-opacity: 1 !important; - } - - path:last-child { + path { stroke: lighten($highlight-text-color, 6%) !important; } } From 4a2269092ac81ef8ed2684d0ea8e8443d4747704 Mon Sep 17 00:00:00 2001 From: YoheiZuho Date: Mon, 12 Aug 2019 11:38:13 +0000 Subject: [PATCH 008/200] =?UTF-8?q?Admin=E3=81=8B=E3=82=89=E3=81=AE?= =?UTF-8?q?=E3=81=8A=E7=9F=A5=E3=82=89=E3=81=9B=E6=AC=84=E3=81=AE=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mastodon/features/getting_started/index.js | 17 ++++++++++------- .../features/ui/components/navigation_panel.js | 1 + app/javascript/mastodon/locales/ja.json | 1 + 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index 9a2e0fa9c..3c6dc7194 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -18,6 +18,7 @@ import TrendsContainer from './containers/trends_container'; const messages = defineMessages({ home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' }, notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' }, + admin_notifications: { id: 'tabs_bar.admin_notifications', defaultMessage: 'Admin Notifications' }, public_timeline: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' }, settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' }, community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' }, @@ -100,7 +101,7 @@ class GettingStarted extends ImmutablePureComponent { if (multiColumn) { navItems.push( , - , + , , ); @@ -108,23 +109,25 @@ class GettingStarted extends ImmutablePureComponent { if (profile_directory) { navItems.push( - - ); + , + , + ); - height += 48; + height += 48*2; } navItems.push( - + , ); height += 34; } else if (profile_directory) { navItems.push( - + , + , ); - height += 48; + height += 48*2; } navItems.push( diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js index 907dbc665..05e823c92 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.js +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js @@ -16,6 +16,7 @@ const NavigationPanel = () => ( + diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 95bd39465..c8f88c39d 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -367,6 +367,7 @@ "status.unpin": "プロフィールへの固定を解除", "suggestions.dismiss": "隠す", "suggestions.header": "興味あるかもしれません…", + "tabs_bar.admin_notifications": "Adminからのお知らせ", "tabs_bar.federated_timeline": "連合", "tabs_bar.home": "ホーム", "tabs_bar.local_timeline": "ローカル", From 09b4c05ce19d5ec824b4b382b9b8eb58baba2da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=A7=E5=B3=B6=E3=81=B2=E3=81=AA=E3=81=9F?= Date: Mon, 20 Aug 2018 23:41:39 +0900 Subject: [PATCH 009/200] SecurityUpdate --- Gemfile | 2 + Gemfile.lock | 2 + app/lib/formatter.rb | 17 +- app/lib/formatter_markdown.rb | 340 ++++++++++++++++++++++++++++++++++ 4 files changed, 360 insertions(+), 1 deletion(-) create mode 100644 app/lib/formatter_markdown.rb diff --git a/Gemfile b/Gemfile index 263be0ac3..cbf00459c 100644 --- a/Gemfile +++ b/Gemfile @@ -96,6 +96,8 @@ gem 'json-ld', git: 'https://github.com/ruby-rdf/json-ld.git', ref: '345b7a57333 gem 'json-ld-preloaded', '~> 3.0' gem 'rdf-normalize', '~> 0.3' +gem 'redcarpet', "~> 3.4.0" + group :development, :test do gem 'fabrication', '~> 2.20' gem 'fuubar', '~> 2.4' diff --git a/Gemfile.lock b/Gemfile.lock index f185f3fa5..eb5e5445a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -496,6 +496,7 @@ GEM link_header (~> 0.0, >= 0.0.8) rdf-normalize (0.3.3) rdf (>= 2.2, < 4.0) + redcarpet (3.4.0) redis (4.1.2) redis-actionpack (5.0.2) actionpack (>= 4.0, < 6) @@ -755,6 +756,7 @@ DEPENDENCIES rails-i18n (~> 5.1) rails-settings-cached (~> 0.6) rdf-normalize (~> 0.3) + redcarpet (~> 3.4.0) redis (~> 4.1) redis-namespace (~> 1.5) redis-rails (~> 5.0) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index b5f42305f..c1ad9c701 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'singleton' +require_relative './formatter_markdown' require_relative './sanitize_config' class Formatter @@ -35,12 +36,21 @@ class Formatter linkable_accounts << status.account html = raw_content + + mdFormatter = Formatter_Markdown.new(html) + html = mdFormatter.formatted + html = "RT @#{prepend_reblog} #{html}" if prepend_reblog html = encode_and_link_urls(html, linkable_accounts) html = encode_custom_emojis(html, status.emojis, options[:autoplay]) if options[:custom_emojify] html = simple_format(html, {}, sanitize: false) html = html.delete("\n") + mdLinkDecoder = MDLinkDecoder.new(html) + html = mdLinkDecoder.decode + + html.gsub!(/(&)/){"&"} + html.html_safe # rubocop:disable Rails/OutputSafety end @@ -111,13 +121,18 @@ class Formatter def encode_and_link_urls(html, accounts = nil, options = {}) entities = utf8_friendly_extractor(html, extract_url_without_protocol: false) + mdExtractor = MDExtractor.new(html) + entities.concat(mdExtractor.extractEntities) + if accounts.is_a?(Hash) options = accounts accounts = nil end rewrite(html.dup, entities) do |entity| - if entity[:url] + if entity[:markdown] + html[entity[:indices][0]...entity[:indices][1]] + elsif entity[:url] link_to_url(entity, options) elsif entity[:hashtag] link_to_hashtag(entity) diff --git a/app/lib/formatter_markdown.rb b/app/lib/formatter_markdown.rb new file mode 100644 index 000000000..30a08d558 --- /dev/null +++ b/app/lib/formatter_markdown.rb @@ -0,0 +1,340 @@ +require 'uri' +require 'redcarpet' +require 'redcarpet/render_strip' + +class Formatter_Markdown + def initialize(html) + @html = html.dup + end + + def formatted + mdRenderer = CustomMDRenderer.new( + strikethrough: true, + hard_wrap: true, + autolink: false, + superscript:false, + fenced_link: true, + fenced_image: true, + no_intra_emphasis: true, + no_links: true, + no_styles: true, + no_images: true, + filter_html: true, + escape_html: true, + safe_links_only: true, + with_toc_data: true, + xhtml: false, + prettify: true, + link_attributes: true + ) + + md = Redcarpet::Markdown.new( + mdRenderer, + strikethrough: true, + hard_wrap: true, + superscript:false, + autolink: false, + space_after_headers: true, + no_intra_emphasis: true, + no_links: true, + no_styles: true, + no_images: true, + filter_html: true, + escape_html: true, + safe_links_only: true, + with_toc_data: true, + xhtml: false, + prettify: true, + link_attributes: true + ) + s = @html + s.gsub!(/\n[\n]+/) {"\n \n"}# 改行周りの問題を修正 + s.gsub!(/`[ ]+`/) {"` `"}# code内が半角スペースのみだとHTMLが壊れるのでそれの回避 + + renderedMD = md.render(s) + + result = renderedMD + result.gsub!(/(<\w+)([^>]*>)/) { "#{$1} data-md='true' #{$2}" }# ToDo data-md="true" を認識して他鯖の人にmarkdownの使用を伝える機能の実装 + result.gsub!(/(https?:\/\/[^<>"\[\]  ]+)/){"#{$1} "}#URLの後ろにスペースをねじ込む奴 mastodonのURL認識がゆるいのをmarkdownで対処 + + result + + end + + class CustomMDRenderer < Redcarpet::Render::HTML + + #基本的な実装の流れ + #URLの削除(mastodonの機能上URLとして認識されると十中八九HTMLが壊れるので) + #markdownコンテンツ内でのmarkdownコンテンツの禁止(意図しないHTMLタグの生成によってHTMLの不正出力を防ぐ目的) + #最後にHTMLに出力される際にHTML的にヤバイ子たちのエスケープ + + def paragraph(text) + %(#{text.strip}) + end + + def linebreak() + %(
) + end + + def block_quote(quote) + urlRemoved = "#{remove_url(quote)}" + escapedContents = "#{blockquote_markdown_escape(urlRemoved)}" + %(
#{escapedContents.strip}
) + end + + def header(text, header_level) + urlRemoved = "#{remove_url(text)}" + mdContentsRemoved = "#{markdown_escape(urlRemoved)}" + %(#{encode(mdContentsRemoved)}\n) + end + + def codespan(code) + urlRemoved = "#{remove_url(code)}" + escapedCode = "#{escape_bbcode(urlRemoved)}" + %(#{encode(escapedCode)}) + end + + def list(contents, list_type) + if list_type == :unordered + %(
    #{contents.strip}
) + elsif list_type == :ordered + %(
    #{contents.strip}
) + else + %(<#{list_type}>#{contents.strip}) + end + end + + def list_item(text, list_type) + urlRemoved = "#{remove_url(text)}" + mdContentsRemoved = "#{markdown_escape(urlRemoved)}" + %(
  • #{encode(mdContentsRemoved)}
  • ) + end + + def emphasis(text) + urlRemoved = "#{remove_url(text)}" + mdContentsRemoved = "#{markdown_escape(urlRemoved)}" + %(#{encode(mdContentsRemoved)}) + end + + def double_emphasis(text) + urlRemoved = "#{remove_url(text)}" + mdContentsRemoved = "#{markdown_escape(urlRemoved)}" + %(#{encode(mdContentsRemoved)}) + end + + def triple_emphasis(text) + urlRemoved = "#{remove_url(text)}" + mdContentsRemoved = "#{markdown_escape(urlRemoved)}" + %(#{encode(mdContentsRemoved)}) + end + + def strikethrough(text) + urlRemoved = "#{remove_url(text)}" + mdContentsRemoved = "#{markdown_escape(urlRemoved)}" + %(#{encode(mdContentsRemoved)}) + end + + def superscript(text) + urlRemoved = "#{remove_url(text)}" + mdContentsRemoved = "#{markdown_escape(urlRemoved)}" + %(#{encode(mdContentsRemoved)}) + end + + def underline(text) + urlRemoved = "#{remove_url(text)}" + mdContentsRemoved = "#{markdown_escape(urlRemoved)}" + %(#{encode(mdContentsRemoved)}) + end + + def highlight(text) + urlRemoved = "#{remove_url(text)}" + mdContentsRemoved = "#{markdown_escape(urlRemoved)}" + %(#{encode(mdContentsRemoved)}) + end + + #オートリンクはmastodonとの相性が悪いので基本的には使わない + + def autolink(link, link_type) + %(リンク) + end + + #https以外の物がURLとして記入された時にTextをHTML的に考えて安全に表示するように変更 + + def image(link, title, alt_text) + + if alt_text =~ /[<>"\[\]  ]+/ + alt_text = "設定なし" + end + + imgcheck = "#{link}" + if imgcheck !~ /\Ahttps:\/\/[^<>"\[\]  ]+\z/ + %(#{encode(alt_text)}) + else + %() + end + end + + def link(link, title, content) + + if content =~ /([<>"\[\]  ]+|https?:\/\/|#|@)/ + content = "リンク" + elsif content !~ /.+/ + content = "リンク" + end + + linkcheck = "#{link}" + if linkcheck !~ /\Ahttps:\/\/[^<>"\[\]  ]+\z/ + %(#{encode(content)}) + else + %(#{encode(content)}) + end + end + + #ここから下はいろいろエスケープするための奴 + + #HTML的に考えてよろしくない子たちをエスケープする奴 + def encode(html) + HTMLEntities.new.encode(html) + end + + #markdownコンテンツないでURLが生成されるのを防ぐためのエスケープする奴 + def remove_url(string) + url = string.gsub(/https?:\/\//){ "URL:" } + reply = url.gsub(/@/){ "@" } + hashTag = reply.gsub(/#/){ "#" } + end + + #前々から要望があったcode内でBBCodeを無効化するための奴 + def escape_bbcode(string) + string.gsub(/\[/){ "[" } + end + + #markdownの中でmarkdownを展開させないためのエスケープする奴 + + #blockquote以外は下のが使える + def markdown_escape(string) + string.gsub(/<[^>]+>/) { "" } + end + + #blockquoteコンテンツ内でblockquoteタグだけを許可するためのエスケープ + def blockquote_markdown_escape(string) + string.gsub(/<([\/]?a[^>]*|[\/]?img[^>]*|[\/]?code[^>]*|[\/]?h[1-6][^>]*|[\/]?sup[^>]*|[\/]?sub[^>]*|[\/]?small[^>]*|[\/]?ul[^>]*|[\/]?ol[^>]*|[\/]?li[^>]*|[\/]?hr[^>]*|[\/]?s[^>]*|[\/]?u[^>]*|[\/]?mark[^>]*)>/) { "" } + end + + #テストで書きなぐった奴 + def html_escape(string) + string.gsub(/['&\"<>\/]/, { + '&' => '&', + '<' => '<', + '>' => '>', + '"' => '"', + "'" => ''', + "/" => '/', + }) + end + + end + +end + +#URLとかいう人類には早すぎたやばい子たちを大人しくするために必要な機構 + +class MDLinkDecoder + def initialize(html) + @html = html.dup + end + + def decode + imageDecoded = @html.gsub(/]*)>/) { "" } + + imageDecoded.gsub(/]*)>/) { "" } + end +end + +#エスケープを回避するHTMLタグの設定とかその他 + +class MDExtractor + def initialize(html) + @html = html.dup + end + + def extractEntities + [ + extractByHTMLTagName("h1"), + extractByHTMLTagName("h2"), + extractByHTMLTagName("h3"), + extractByHTMLTagName("h4"), + extractByHTMLTagName("h5"), + extractByHTMLTagName("h6"), + extractByHTMLTagName("em"), + extractByHTMLTagName("sup"), + extractByHTMLTagName("sub"), + extractByHTMLTagName("small"), + extractByHTMLTagName("u"), + extractByHTMLTagName("strong"), + extractByHTMLTagName("ul", false, false, "li"), + extractByHTMLTagName("ol", false, false, "li"), + extractByHTMLTagName("code"), + extractByHTMLTagName("blockquote", false), + extractByHTMLTagName("hr", false, true), + extractByHTMLTagName("br", false, true), + extractByHTMLTagName("a"), + extractByHTMLTagName("img", false, true), + extractByHTMLTagName("s") + ].flatten.compact + end + + def extractByHTMLTagName(tagName, isNoNest = true, isSingle = false, itemTagName = nil) + entities = [] + + @html.to_s.scan(htmlTagPatternByCond(tagName, isNoNest, isSingle, itemTagName)) do + match = $~ + + beginPos = match.char_begin(0) + endPos = match.char_end(0) + #puts "MDExtractor extracted with:\n" + @html + "\nbeginPos: " + beginPos.to_s + ", endPos: " + endPos.to_s + ", length: " + @html.length.to_s + + entity = { + :markdown => true, + :indices => [beginPos, endPos] + } + + entities.push(entity) + end + + entities + end + + def htmlTagPatternByCond(tagName, isNoNest, isSingle, itemTagName) + if isSingle + htmlTagPatternSingle(tagName) + elsif isNoNest + htmlTagPatternNoNest(tagName) + elsif itemTagName && itemTagName.length > 0 + htmlTagPatternOuterMostWithItem(tagName, itemTagName) + else + htmlTagPatternOuterMost(tagName) + end + end + + def htmlTagPattern(tagName) + Regexp.compile("<#{tagName} data-md=[^>]*>(?:[^<]|<#{tagName} data-md=[^>]*>|<\\/#{tagName}>)*(?:<\\/#{tagName}>)*") + end + + def htmlTagPatternNoNest(tagName) + Regexp.compile("<#{tagName} data-md=[^>]*>(?:.|\n)*?<\\/#{tagName}>") + end + + def htmlTagPatternSingle(tagName) + Regexp.compile("<#{tagName} data-md=[^>]*>") + end + + # https://stackoverflow.com/questions/546433/regular-expression-to-match-outer-brackets + def htmlTagPatternOuterMost(tagName) + Regexp.compile("<#{tagName} data-md=[^>]*>(?:[^<>]|(\\g<0>))*<\/#{tagName}>") + end + + def htmlTagPatternOuterMostWithItem(tagName, itemTagName) + Regexp.compile("<#{tagName} data-md=[^>]*>(?:[^<>]|<#{itemTagName} data-md=[^>]*>|<\\/#{itemTagName}>|(\\g<0>))*<\/#{tagName}>") + end +end \ No newline at end of file From 0542d92c40d5e651b47f5552ab93ec8eb04292a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=A7=E5=B3=B6=E3=81=B2=E3=81=AA=E3=81=9F?= Date: Mon, 20 Aug 2018 23:42:23 +0900 Subject: [PATCH 010/200] add Markdown front-end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Markdownのフロントエンドの追加です --- app/javascript/styles/application.scss | 2 + app/javascript/styles/contrast.scss | 2 + app/javascript/styles/markdown.scss | 196 ++++++++++++++++++++++ app/javascript/styles/mastodon-light.scss | 2 + 4 files changed, 202 insertions(+) create mode 100644 app/javascript/styles/markdown.scss diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss index 8ebc45b62..cf32a70b0 100644 --- a/app/javascript/styles/application.scss +++ b/app/javascript/styles/application.scss @@ -26,3 +26,5 @@ @import 'mastodon/dashboard'; @import 'mastodon/rtl'; @import 'mastodon/accessibility'; + +@import 'markdown'; diff --git a/app/javascript/styles/contrast.scss b/app/javascript/styles/contrast.scss index 5b43aecbe..31805363c 100644 --- a/app/javascript/styles/contrast.scss +++ b/app/javascript/styles/contrast.scss @@ -1,3 +1,5 @@ @import 'contrast/variables'; @import 'application'; @import 'contrast/diff'; + +@import 'markdown'; diff --git a/app/javascript/styles/markdown.scss b/app/javascript/styles/markdown.scss new file mode 100644 index 000000000..d1c1adb9c --- /dev/null +++ b/app/javascript/styles/markdown.scss @@ -0,0 +1,196 @@ +.status__content { + + font-family: inherit; + max-height: 210px; + overflow-x: hidden; + overflow-y: auto; + + h1{ + font-size: 195%; + border-bottom: 2px solid #ff3333; + } + + h2{ + font-size: 180%; + border-bottom: 2px solid #ff3333; + } + + h3{ + font-size: 165%; + border-bottom: 2px solid #ff3333; + } + + h4{ + font-size: 150%; + border-bottom: 2px solid #ff3333; + } + + h5{ + font-size: 135%; + border-bottom: 2px solid #ff3333; + } + + h6{ + font-size: 120%; + border-bottom: 2px solid #ff3333; + } + + em{ + font-style: italic; + } + + strong{ + font-weight: bold; + } + + code{ + display: block; + border-left: 2px solid; + border-color: #079903; + color: $white; + padding-left: 10px; + margin-top: 5px; + margin-bottom: 5px; + margin-left: 5px; + background-color: #000000; + } + + pre{ + display: inline-block; + font-family: 'Noto Sans Japanese', sans-serif; + font-weight: 400; + } + + p ~ blockquote { + margin-top: -8px; + } + + blockquote{ + padding-left: 8px; + margin-top: 0.5em; + margin-bottom: 0.5em; + color: $white; + background-color: $ui-base-color; + display: block; + border-left: 4px solid $classic-highlight-color; + } + + ul{ + list-style: inside; + br{ + display: none; + } + } + + ul>ul{ + br{ + display: none; + } + } + + ul>li>ul{ + padding-left: 1em; + list-style: inside circle; + } + + ul>li{ + padding-left: 1em; + list-style: inside circle; + } + + ul>br>li{ + padding-left: 1em; + list-style: inside circle; + } + + ul>ul>li{ + padding-left: 2em; + list-style: inside circle; + } + + ul>br>ul>br>li{ + padding-left: 2em; + list-style: inside circle; + } + + ol{ + list-style: inside decimal; + } + + ol>li>ol{ + padding-left: 1em; + } + + p>a>img{ + width: 100%; + height: 100%; + object-fit: contain; + } + + a>img{ + width: 100%; + height: 100%; + object-fit: contain; + } + + p>a{ + color: #1FBFF9; + } + + a{ + color: #1FBFF9; + } + + sup{ + font-size: 75.5%; + vertical-align: top; + position: relative; + top: -0.5em; + } + + sub{ + font-size: 75.5%; + vertical-align: bottom; + position: relative; + top: 0.5em; + } + + small{ + font-size: 50.0%; + vertical-align: bottom; + position: relative; + } + + table { + margin-top: 0.5em; + margin-bottom: 0.5em; + color: $classic-highlight-color; + display: block; + width: 100%; + overflow: auto; + border-spacing: 0; + border-collapse: collapse; + } + + table tr{ + background-color: #000000; + } + + table th, table td{ + padding: 6px 13px; + border: 1px solid $classic-highlight-color; + } + + table th{ + font-weight: 600; + } + + table thead tr{ + background-color: $black; + } + + td, th{ + padding: 0; + } + + } \ No newline at end of file diff --git a/app/javascript/styles/mastodon-light.scss b/app/javascript/styles/mastodon-light.scss index 756a12d86..c99938bfa 100644 --- a/app/javascript/styles/mastodon-light.scss +++ b/app/javascript/styles/mastodon-light.scss @@ -1,3 +1,5 @@ @import 'mastodon-light/variables'; @import 'application'; @import 'mastodon-light/diff'; + +@import 'markdown'; From 4d4f8b5f5217dc47b144767905f5b55c1865df30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=A7=E5=B3=B6=E3=81=B2=E3=81=AA=E3=81=9F?= Date: Wed, 28 Nov 2018 20:02:48 +0900 Subject: [PATCH 011/200] UPDATE Markdown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit アスタルテで動いてる最新のMarkdownに追従する更新です。 一応テストしてから実装してください。 今回のアップデートで + 見出しのレイアウト変更 + リストのレイアウトの変更 + 罫線のレイアウトの変更 + より詳細なclass分け + codeのハイライト + 外部サーバー向け画像添付メッセージの表示 + 1件のセキュリティー的な問題の修正 などが変更になっています --- app/javascript/styles/markdown.scss | 462 ++++++++++++++++------------ app/lib/formatter_markdown.rb | 43 ++- 2 files changed, 301 insertions(+), 204 deletions(-) diff --git a/app/javascript/styles/markdown.scss b/app/javascript/styles/markdown.scss index d1c1adb9c..be08de0cd 100644 --- a/app/javascript/styles/markdown.scss +++ b/app/javascript/styles/markdown.scss @@ -1,196 +1,266 @@ -.status__content { - - font-family: inherit; - max-height: 210px; - overflow-x: hidden; - overflow-y: auto; - - h1{ - font-size: 195%; - border-bottom: 2px solid #ff3333; - } - - h2{ - font-size: 180%; - border-bottom: 2px solid #ff3333; - } - - h3{ - font-size: 165%; - border-bottom: 2px solid #ff3333; - } - - h4{ - font-size: 150%; - border-bottom: 2px solid #ff3333; - } - - h5{ - font-size: 135%; - border-bottom: 2px solid #ff3333; - } - - h6{ - font-size: 120%; - border-bottom: 2px solid #ff3333; - } - - em{ - font-style: italic; - } - - strong{ - font-weight: bold; - } - - code{ - display: block; - border-left: 2px solid; - border-color: #079903; - color: $white; - padding-left: 10px; - margin-top: 5px; - margin-bottom: 5px; - margin-left: 5px; - background-color: #000000; - } - - pre{ - display: inline-block; - font-family: 'Noto Sans Japanese', sans-serif; - font-weight: 400; - } - - p ~ blockquote { - margin-top: -8px; - } - - blockquote{ - padding-left: 8px; - margin-top: 0.5em; - margin-bottom: 0.5em; - color: $white; - background-color: $ui-base-color; - display: block; - border-left: 4px solid $classic-highlight-color; - } - - ul{ - list-style: inside; - br{ - display: none; - } - } - - ul>ul{ - br{ - display: none; - } - } - - ul>li>ul{ - padding-left: 1em; - list-style: inside circle; - } - - ul>li{ - padding-left: 1em; - list-style: inside circle; - } - - ul>br>li{ - padding-left: 1em; - list-style: inside circle; - } - - ul>ul>li{ - padding-left: 2em; - list-style: inside circle; - } - - ul>br>ul>br>li{ - padding-left: 2em; - list-style: inside circle; - } - - ol{ - list-style: inside decimal; - } - - ol>li>ol{ - padding-left: 1em; - } - - p>a>img{ - width: 100%; - height: 100%; - object-fit: contain; - } - - a>img{ - width: 100%; - height: 100%; - object-fit: contain; - } - - p>a{ - color: #1FBFF9; - } - - a{ - color: #1FBFF9; - } - - sup{ - font-size: 75.5%; - vertical-align: top; - position: relative; - top: -0.5em; - } - - sub{ - font-size: 75.5%; - vertical-align: bottom; - position: relative; - top: 0.5em; - } - - small{ - font-size: 50.0%; - vertical-align: bottom; - position: relative; - } - - table { - margin-top: 0.5em; - margin-bottom: 0.5em; - color: $classic-highlight-color; - display: block; - width: 100%; - overflow: auto; - border-spacing: 0; - border-collapse: collapse; - } - - table tr{ - background-color: #000000; - } - - table th, table td{ - padding: 6px 13px; - border: 1px solid $classic-highlight-color; - } - - table th{ - font-weight: 600; - } - - table thead tr{ - background-color: $black; - } - - td, th{ - padding: 0; - } - - } \ No newline at end of file +.status__content { + + font-family: inherit; + + h1{ + color: #ec840d; + font-weight: bold; + font-size: 1.6em; + padding: 0.5em; + display: inline-block; + line-height: 1.3; + background: #dbebf8; + vertical-align: middle; + border-radius: 25px 25px 25px 25px; + text-align: center; + border-bottom: solid 3px #ff0000; + } + + h2{ + color: #ec840d; + font-weight: bold; + font-size: 1.5em; + padding: 0.5em; + display: inline-block; + line-height: 1.3; + background: #dbebf8; + vertical-align: middle; + border-radius: 25px 25px 25px 25px; + text-align: center; + border-bottom: solid 3px #fffb00; + } + + h3{ + color: #ec840d; + font-weight: bold; + font-size: 1.4em; + padding: 0.5em; + display: inline-block; + line-height: 1.3; + background: #dbebf8; + vertical-align: middle; + border-radius: 25px 25px 25px 25px; + text-align: center; + border-bottom: solid 3px #2bff00; + } + + h4{ + color: #ec840d; + font-weight: bold; + font-size: 1.3em; + padding: 0.5em; + display: inline-block; + line-height: 1.3; + background: #dbebf8; + vertical-align: middle; + border-radius: 25px 25px 25px 25px; + text-align: center; + border-bottom: solid 3px #00ffea; + } + + h5{ + color: #ec840d; + font-weight: bold; + font-size: 1.2em; + padding: 0.5em; + display: inline-block; + line-height: 1.3; + background: #dbebf8; + vertical-align: middle; + border-radius: 25px 25px 25px 25px; + text-align: center; + border-bottom: solid 3px #0004ff; + } + + h6{ + color: #ec840d; + font-weight: bold; + font-size: 1.1em; + padding: 0.5em; + display: inline-block; + line-height: 1.3; + background: #dbebf8; + vertical-align: middle; + border-radius: 25px 25px 25px 25px; + text-align: center; + border-bottom: solid 3px #7700ff; + } + + em{ + font-style: italic; + } + + strong{ + font-weight: bold; + } + + code{ + display: block; + border-left: 2px solid; + border-color: #079903; + color: $white; + padding-left: 10px; + margin-top: 5px; + margin-bottom: 5px; + margin-left: 5px; + background-color: #000000; + + .positive{ + color: #5bda57; + } + + .negative{ + color: #ff4949; + } + + .rust-fanc{ + color: #ba7eff; + } + + .ruby-func{ + color: #24a8e6; + } + + .rust-macro{ + color: #d2ff6a; + } + + .contents{ + color: #ff9925; + } + } + + pre{ + display: inline-block; + font-family: 'Noto Sans Japanese', sans-serif; + font-weight: 400; + } + + p ~ blockquote { + margin-top: -8px; + } + + blockquote{ + padding-left: 8px; + margin-top: 0.5em; + margin-bottom: 0.5em; + color: $primary-text-color; + background-color: $ui-base-color; + display: block; + border-left: 4px solid $classic-highlight-color; + } + + ul.md-contents { + border: double 4px #21b384; + padding: 0.5em 1em 0.5em 2.3em; + position: relative; + } + ul li.md-contents { + line-height: 1.5; + padding: 0.2em 0; + list-style-type: none!important; + } + ul li.md-contents:before { + font-family: FontAwesome; + content: "\f0a4"; + position: absolute; + left : 1em; + color: #21b384; + } + + ol.md-contents { + border: double 4px #ff954f; + padding: 0.5em 1em 0.5em 1em; + position: relative; + list-style: inside decimal; + } + + ol li.md-contents { + line-height: 1.5; + padding: 0.2em 0; + } + + hr { + border-width: 2px 0px 0px 0px; + border-style: dashed; + border-color: #ff7676; + height: 1px; + } + + p>a>img{ + width: 100%; + height: 100%; + object-fit: contain; + } + + a>img{ + width: 100%; + height: 100%; + object-fit: contain; + } + + p>a{ + color: #1FBFF9; + } + + a{ + color: #1FBFF9; + } + + sup{ + font-size: 75.5%; + vertical-align: top; + position: relative; + top: -0.5em; + } + + sub{ + font-size: 75.5%; + vertical-align: bottom; + position: relative; + top: 0.5em; + } + + small{ + font-size: 50.0%; + vertical-align: bottom; + position: relative; + } + + table { + margin-top: 0.5em; + margin-bottom: 0.5em; + color: $classic-highlight-color; + display: block; + width: 100%; + overflow: auto; + border-spacing: 0; + border-collapse: collapse; + } + + table tr{ + background-color: #000000; + } + + table th, table td{ + padding: 6px 13px; + border: 1px solid $classic-highlight-color; + } + + table th{ + font-weight: 600; + } + + table thead tr{ + background-color: $black; + } + + td, th{ + padding: 0; + } + + span.img_FTL { + display: none; + } + +} \ No newline at end of file diff --git a/app/lib/formatter_markdown.rb b/app/lib/formatter_markdown.rb index 30a08d558..0ee01b972 100644 --- a/app/lib/formatter_markdown.rb +++ b/app/lib/formatter_markdown.rb @@ -88,26 +88,31 @@ class Formatter_Markdown %(#{encode(mdContentsRemoved)}\n) end + def block_code(code, language) + %(
    #{code.strip}) + end + def codespan(code) urlRemoved = "#{remove_url(code)}" escapedCode = "#{escape_bbcode(urlRemoved)}" - %(#{encode(escapedCode)}) + encoded = "#{encode(escapedCode)}" + %(#{code_contents(encoded)}) end def list(contents, list_type) if list_type == :unordered - %(
      #{contents.strip}
    ) + %(
      #{contents.strip}
    ) elsif list_type == :ordered - %(
      #{contents.strip}
    ) + %(
      #{contents.strip}
    ) else - %(<#{list_type}>#{contents.strip}) + %(<#{list_type} class='md-contents'>#{contents.strip}) end end def list_item(text, list_type) urlRemoved = "#{remove_url(text)}" mdContentsRemoved = "#{markdown_escape(urlRemoved)}" - %(
  • #{encode(mdContentsRemoved)}
  • ) + %(
  • #{encode(mdContentsRemoved)}
  • ) end def emphasis(text) @@ -170,7 +175,7 @@ class Formatter_Markdown if imgcheck !~ /\Ahttps:\/\/[^<>"\[\]  ]+\z/ %(#{encode(alt_text)}) else - %() + %(画像が添付されています。) end end @@ -206,7 +211,7 @@ class Formatter_Markdown #前々から要望があったcode内でBBCodeを無効化するための奴 def escape_bbcode(string) - string.gsub(/\[/){ "[" } + string.gsub(/\[/){ "[" } end #markdownの中でmarkdownを展開させないためのエスケープする奴 @@ -221,6 +226,27 @@ class Formatter_Markdown string.gsub(/<([\/]?a[^>]*|[\/]?img[^>]*|[\/]?code[^>]*|[\/]?h[1-6][^>]*|[\/]?sup[^>]*|[\/]?sub[^>]*|[\/]?small[^>]*|[\/]?ul[^>]*|[\/]?ol[^>]*|[\/]?li[^>]*|[\/]?hr[^>]*|[\/]?s[^>]*|[\/]?u[^>]*|[\/]?mark[^>]*)>/) { "" } end + #code内の一部を色分けするための変更 + def code_contents(string) + simple = string.gsub(/(true|error|false|failed|def|puts|end|fn|let|mut|use|String|println!)/ , + "true" => "#{:true}", + "error" => "#{:error}", + "false" => "#{:false}", + "failed" => "#{:failed}", + "def" => "#{:def}", + "puts" => "#{:puts}", + "end" => "#{:end}", + "fn" => "#{:fn}", + "let" => "#{:let}", + "mut" => "#{:mut}", + "use" => "#{:use}", + "String" => "#{:String}", + "println!" => "#{:println!}", + ) + simple.gsub(/("[a-zA-Z0-9_ ,]+")/){ "#{$1}" } +# "" => "#{:}", + end + #テストで書きなぐった奴 def html_escape(string) string.gsub(/['&\"<>\/]/, { @@ -280,7 +306,8 @@ class MDExtractor extractByHTMLTagName("br", false, true), extractByHTMLTagName("a"), extractByHTMLTagName("img", false, true), - extractByHTMLTagName("s") + extractByHTMLTagName("s"), + extractByHTMLTagName("span") ].flatten.compact end From 8c9d3e4c2d5b02359f18de76c10685044995d741 Mon Sep 17 00:00:00 2001 From: YoheiZuho Date: Mon, 12 Aug 2019 17:07:21 +0000 Subject: [PATCH 012/200] =?UTF-8?q?Markdown=E3=81=AE=E5=86=8D=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/announcement_icon_button.js | 90 +++++++++++++ .../compose/components/announcements.js | 127 ++++++++++++++++++ .../containers/announcements_container.js | 11 ++ .../mastodon/features/compose/index.js | 2 + app/javascript/styles/application.scss | 1 + app/javascript/styles/astarte.scss | 59 ++++++++ app/lib/formatter_markdown.rb | 2 +- 7 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 app/javascript/mastodon/components/announcement_icon_button.js create mode 100644 app/javascript/mastodon/features/compose/components/announcements.js create mode 100644 app/javascript/mastodon/features/compose/containers/announcements_container.js create mode 100644 app/javascript/styles/astarte.scss diff --git a/app/javascript/mastodon/components/announcement_icon_button.js b/app/javascript/mastodon/components/announcement_icon_button.js new file mode 100644 index 000000000..0de58c6f7 --- /dev/null +++ b/app/javascript/mastodon/components/announcement_icon_button.js @@ -0,0 +1,90 @@ +import React from 'react'; +import Motion from 'react-motion/lib/Motion'; +import spring from 'react-motion/lib/spring'; +import PropTypes from 'prop-types'; + +class IconButton extends React.PureComponent { + + static propTypes = { + className: PropTypes.string, + title: PropTypes.string.isRequired, + icon: PropTypes.string.isRequired, + onClick: PropTypes.func, + size: PropTypes.number, + active: PropTypes.bool, + style: PropTypes.object, + activeStyle: PropTypes.object, + disabled: PropTypes.bool, + inverted: PropTypes.bool, + animate: PropTypes.bool, + overlay: PropTypes.bool, + }; + + static defaultProps = { + size: 18, + active: false, + disabled: false, + animate: false, + overlay: false, + }; + + handleClick = (e) => { + e.preventDefault(); + + if (!this.props.disabled) { + this.props.onClick(e); + } + } + + render () { + const style = { + fontSize: `${this.props.size}px`, + width: `${this.props.size * 1.28571429}px`, + height: `${this.props.size * 1.28571429}px`, + lineHeight: `${this.props.size}px`, + ...this.props.style, + ...(this.props.active ? this.props.activeStyle : {}), + }; + + const classes = ['icon-button']; + + if (this.props.active) { + classes.push('active'); + } + + if (this.props.disabled) { + classes.push('disabled'); + } + + if (this.props.inverted) { + classes.push('inverted'); + } + + if (this.props.overlay) { + classes.push('overlayed'); + } + + if (this.props.className) { + classes.push(this.props.className); + } + + return ( + + {({ rotate }) => +
    diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss index cf32a70b0..4a4975a21 100644 --- a/app/javascript/styles/application.scss +++ b/app/javascript/styles/application.scss @@ -28,3 +28,4 @@ @import 'mastodon/accessibility'; @import 'markdown'; +@import 'astarte'; diff --git a/app/javascript/styles/astarte.scss b/app/javascript/styles/astarte.scss new file mode 100644 index 000000000..66507b944 --- /dev/null +++ b/app/javascript/styles/astarte.scss @@ -0,0 +1,59 @@ + + .announcements { + padding: 0 10px; + + li { + display: flex; + padding: 10px; + color: #282c37; + background: darken($white, 10%); + border-radius: 4px; + + & + li { + margin-top: 10px; + } + } + } + + .announcements__admin { + width: 100%; + position: relative; + + p { + padding: 0 5px; + font-size: 14px; + } + } + + .announcements__icon { + display: inline-block; + position: absolute; + margin: -5px 5px; + right: 10px; + } + + .announcements__body { + width: 100%; + position: relative; + + p { + padding: 0 5px; + font-size: 14px; + } + + a { + display: inline-block; + float: right; + clear: both; + color: #282c37; + background: darken($white, 5%); + text-decoration: none; + padding: 1px 10px 0; + border: solid 1px #282c37; + font-size: 10px; + font-weight: 600; + border-radius: 4px; + margin-top: 5px; + } + } + diff --git a/app/lib/formatter_markdown.rb b/app/lib/formatter_markdown.rb index 0ee01b972..13399069a 100644 --- a/app/lib/formatter_markdown.rb +++ b/app/lib/formatter_markdown.rb @@ -364,4 +364,4 @@ class MDExtractor def htmlTagPatternOuterMostWithItem(tagName, itemTagName) Regexp.compile("<#{tagName} data-md=[^>]*>(?:[^<>]|<#{itemTagName} data-md=[^>]*>|<\\/#{itemTagName}>|(\\g<0>))*<\/#{tagName}>") end -end \ No newline at end of file +end From 46f017ead6b9854a711d224ff7c1de533f1b1883 Mon Sep 17 00:00:00 2001 From: Rintan Date: Tue, 13 Aug 2019 22:29:46 +0900 Subject: [PATCH 013/200] =?UTF-8?q?G+=E3=83=86=E3=83=BC=E3=83=9E=E3=81=AE?= =?UTF-8?q?=E5=B0=8E=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dark-gplus-theme-for-mastodon-dev.scss | 24 ++ .../_functions.scss | 15 + .../_mixins.scss | 13 + .../_variables.scss | 98 +++++++ .../about.scss | 138 +++++++++ .../accounts.scss | 191 +++++++++++++ .../basics.scss | 47 ++++ .../columns.scss | 263 ++++++++++++++++++ .../components-button.scss | 39 +++ .../components-card.scss | 38 +++ .../components-dropdown.scss | 69 +++++ .../components-status-card.scss | 12 + .../components.scss | 6 + .../emoji-picker.scss | 68 +++++ .../explore.scss | 47 ++++ .../icons.scss | 179 ++++++++++++ .../keyboard_shortcuts.scss | 21 ++ .../lists.scss | 55 ++++ .../notifications.scss | 27 ++ .../profile.scss | 232 +++++++++++++++ .../searches.scss | 41 +++ .../settings-account.scss | 54 ++++ .../settings-dashboard.scss | 30 ++ .../settings-directory_tag.scss | 21 ++ .../settings-log.scss | 30 ++ .../settings-report.scss | 75 +++++ .../settings.scss | 244 ++++++++++++++++ .../statuses.scss | 121 ++++++++ .../tables.scss | 29 ++ .../styles/gplus-theme-for-mastodon-dev.scss | 24 ++ .../_functions.scss | 15 + .../gplus-theme-for-mastodon-dev/_mixins.scss | 13 + .../_variables.scss | 98 +++++++ .../gplus-theme-for-mastodon-dev/about.scss | 138 +++++++++ .../accounts.scss | 191 +++++++++++++ .../gplus-theme-for-mastodon-dev/basics.scss | 47 ++++ .../gplus-theme-for-mastodon-dev/columns.scss | 263 ++++++++++++++++++ .../components-button.scss | 39 +++ .../components-card.scss | 38 +++ .../components-dropdown.scss | 69 +++++ .../components-status-card.scss | 12 + .../components.scss | 6 + .../emoji-picker.scss | 68 +++++ .../gplus-theme-for-mastodon-dev/explore.scss | 47 ++++ .../gplus-theme-for-mastodon-dev/icons.scss | 179 ++++++++++++ .../keyboard_shortcuts.scss | 21 ++ .../gplus-theme-for-mastodon-dev/lists.scss | 55 ++++ .../notifications.scss | 27 ++ .../gplus-theme-for-mastodon-dev/profile.scss | 232 +++++++++++++++ .../searches.scss | 41 +++ .../settings-account.scss | 54 ++++ .../settings-dashboard.scss | 30 ++ .../settings-directory_tag.scss | 21 ++ .../settings-log.scss | 30 ++ .../settings-report.scss | 75 +++++ .../settings.scss | 244 ++++++++++++++++ .../statuses.scss | 121 ++++++++ .../gplus-theme-for-mastodon-dev/tables.scss | 29 ++ .../styles/gplus-theme-for-mastodon.scss | 22 ++ .../gplus-theme-for-mastodon/_mixins.scss | 11 + .../gplus-theme-for-mastodon/_variables.scss | 81 ++++++ .../gplus-theme-for-mastodon/about.scss | 138 +++++++++ .../gplus-theme-for-mastodon/accounts.scss | 109 ++++++++ .../gplus-theme-for-mastodon/basics.scss | 47 ++++ .../gplus-theme-for-mastodon/columns.scss | 197 +++++++++++++ .../components-button.scss | 11 + .../components-card.scss | 37 +++ .../components-dropdown.scss | 42 +++ .../gplus-theme-for-mastodon/components.scss | 5 + .../gplus-theme-for-mastodon/explore.scss | 38 +++ .../gplus-theme-for-mastodon/icons.scss | 97 +++++++ .../gplus-theme-for-mastodon/lists.scss | 34 +++ .../notifications.scss | 27 ++ .../gplus-theme-for-mastodon/profile.scss | 231 +++++++++++++++ .../gplus-theme-for-mastodon/searches.scss | 41 +++ .../settings-account.scss | 44 +++ .../settings-dashboard.scss | 28 ++ .../settings-report.scss | 63 +++++ .../gplus-theme-for-mastodon/settings.scss | 208 ++++++++++++++ .../gplus-theme-for-mastodon/statuses.scss | 107 +++++++ .../gplus-theme-for-mastodon/tables.scss | 29 ++ .../initializers/content_security_policy.rb | 4 +- config/locales/en.yml | 4 + config/locales/ja.yml | 3 + config/themes.yml | 3 + 85 files changed, 6114 insertions(+), 1 deletion(-) create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_functions.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_mixins.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/about.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/basics.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-card.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-status-card.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/emoji-picker.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/explore.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/lists.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/notifications.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/profile.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/searches.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-account.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-dashboard.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-directory_tag.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-log.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-report.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss create mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/tables.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/_functions.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/_mixins.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/about.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/basics.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components-card.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components-status-card.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/emoji-picker.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/explore.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/lists.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/notifications.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/profile.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/searches.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-account.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-dashboard.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-directory_tag.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-log.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-report.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/tables.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/_mixins.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/_variables.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/about.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/accounts.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/basics.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/columns.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/components-button.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/components-card.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/components-dropdown.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/components.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/explore.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/icons.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/lists.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/notifications.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/profile.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/searches.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/settings-account.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/settings-dashboard.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/settings-report.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/settings.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/statuses.scss create mode 100644 app/javascript/styles/gplus-theme-for-mastodon/tables.scss diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev.scss new file mode 100644 index 000000000..8c2471deb --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev.scss @@ -0,0 +1,24 @@ +/** + * Google+ Theme for Mastodon v1.1 + * Copyright (C) 2018-2019 Genbu Project + */ + +@charset "UTF-8"; + +// @import 'application'; +@import 'application'; +@import 'dark-gplus-theme-for-mastodon-dev/basics'; +@import 'dark-gplus-theme-for-mastodon-dev/components'; +@import 'dark-gplus-theme-for-mastodon-dev/emoji-picker'; +@import 'dark-gplus-theme-for-mastodon-dev/tables'; +@import 'dark-gplus-theme-for-mastodon-dev/columns'; +@import 'dark-gplus-theme-for-mastodon-dev/lists'; +@import 'dark-gplus-theme-for-mastodon-dev/accounts'; +@import 'dark-gplus-theme-for-mastodon-dev/statuses'; +@import 'dark-gplus-theme-for-mastodon-dev/notifications'; +@import 'dark-gplus-theme-for-mastodon-dev/searches'; +@import 'dark-gplus-theme-for-mastodon-dev/settings'; +@import 'dark-gplus-theme-for-mastodon-dev/icons'; +@import 'dark-gplus-theme-for-mastodon-dev/profile'; +@import 'dark-gplus-theme-for-mastodon-dev/about'; +@import 'dark-gplus-theme-for-mastodon-dev/explore'; \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_functions.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_functions.scss new file mode 100644 index 000000000..e5aea0e4e --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_functions.scss @@ -0,0 +1,15 @@ +@charset "UTF-8"; + + + +@function adjust-lightness ($color, $lightness) { + @if (lightness($color) - $lightness <= 0 and lightness($color) + $lightness < 100) { + @return lighten($color, $lightness); + } + + @if (0 < lightness($color) - $lightness and 100 <= lightness($color) + $lightness) { + @return darken($color, $lightness); + } + + @return change-color($color, $lightness: $lightness); +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_mixins.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_mixins.scss new file mode 100644 index 000000000..400a1ac90 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_mixins.scss @@ -0,0 +1,13 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +@mixin column-shadow { box-shadow: 0 1px 8px 0 $column-header-shadow-color } +@mixin status-shadow { box-shadow: 0 1px 4px 0 $status-shadow-color } +@mixin status-focus-shadow { box-shadow: 0 0 20px 0 $status-focused-shadow-color } +@mixin button-shadow { box-shadow: 0 2px 5px 0 $button-shadow-color } +@mixin material-border { border-radius: 4px } +@mixin material-card-radius { border-radius: 2px } +@mixin material-icon-large { font-size: 20px } \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss new file mode 100644 index 000000000..9f5098b22 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss @@ -0,0 +1,98 @@ +@charset "UTF-8"; + + + +// Base colors +$active-color: #db4437; +$accent-color: #fbbc04; +$valid-color: #4285f4; +$error-color: #d50000; +$checked-color: #4285f4; +$verified-color: #4caf50; + + +// Text colors +$primary-text-color: #ffffff; +$primary-lighter1-text-color: change-color($color: $primary-text-color, $lightness: 62%, $alpha: 1.0); // ex: 時間表示 +$primary-lighter2-text-color: change-color($color: $primary-text-color, $lightness: 38%, $alpha: 1.0); // ex: 通知メッセージ表示 +$secondary-text-color: #2196F3; // ex: リンク +$secondary-lighter1-text-color: #00bfff; // ex: アカウントTLのユーザーID +$light-text-color: #000000; +$light-darker1-text-color: darken($light-text-color, 15%); +$active-text-color: $active-color; +$error-text-color: $error-color; + + +// Icon colors +$icon-color: #BDBDBD; +$icon-active-color: $active-color; + + +// Background colors +$base-color: #212121; +$base-lighter1-color: #2d2d2d; +$base-darker1-color: #000000; + +$column-header-color: $base-lighter1-color; +$column-header-hover-color: change-color($color: $column-header-color, $lightness: 10%); + +$status-color: $base-lighter1-color; +$status-direct-color: darken($status-color, 5%); +$status-actionbar-color: darken($status-color, 2%); + +$account-color: $base-lighter1-color; +$account-foreground-color: $base-darker1-color; + +$card-color: $base-lighter1-color; +$card-hover-color: $column-header-hover-color; +$card-image-color: $base-color; + +$form-color: rgba(0, 0, 0, 0.1); +$form-focused-color: lighten($form-color, 20%); +$trend-color: $base-lighter1-color; + +$setting-base-color: $base-color; +$setting-lists-selected-color: darken($base-color, 2%); +$setting-lists-hover-color: darken($base-color, 5%); +$setting-content-base-color: $base-lighter1-color; + +$setting-toggle-color: #b9b9b9; +$setting-toggle-checked-color: change-color($color: $checked-color, $alpha: 0.5); +$setting-toggle-thumb-color: #fafafa; +$setting-toggle-thumb-checked-color: $checked-color; + +$setting-emphasis-color: $verified-color; + +$dashboard-counters-base-color: $base-color; +$dashboard-counters-hover-color: lighten($base-color, 2%); + +$log-entry-color: $base-lighter1-color; +$log-entry-extra-color: $base-color; +$log-entry-extra--neutral-color: $valid-color; +$log-entry-extra--old-color: $active-color; +$log-entry-extra--new-color: $verified-color; + +$explore-header-color: lighten($accent-color, 16%); +$explore-directory-color: $base-lighter1-color; + +$active-button-color: $valid-color; //文字入りボタン +$non-active-button-color: lighten($base-color, 20%); + +$floating-acton-button-hover-color: lighten($active-color, 10%); + + +// Shadow colors +$column-header-shadow-color: rgba(0, 0, 0, 0.3); +$status-shadow-color: rgba(0, 0, 0, 0.14); +$status-focused-shadow-color: change-color($color: $status-shadow-color, $alpha: 0.3); +$icon-hovered-shadow-color: rgba(0, 0, 0, 0.26); +$account-header-image-shadow-color: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.46)); +$button-shadow-color: rgba(0, 0, 0, 0.4); + + +// Separation colors +$base-separation-color: rgba(0, 0, 0, 0.14); + + +//Border colors +$non-elevated-card-boader : #e0e0e0; \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/about.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/about.scss new file mode 100644 index 000000000..de48883a8 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/about.scss @@ -0,0 +1,138 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +// from mastodon/about.scss +$column-breakpoint: 700px; + + + +.landing-page { + h3, h4, h5, h6 { color: $primary-lighter2-text-color } + p { color: $primary-lighter1-text-color } + em { color: $primary-text-color } + + .column-0 { background: $base-darker1-color } + .column-2 { + .landing-page { + &__information { padding: 0 } + + &__short-description { + & > .row:first-child { + background: $base-darker1-color; + padding: 10px 20px; + } + + & > * { + padding-left: 40px; padding-right: 40px; + &:last-child { padding-bottom: 45px } + + @media screen and (max-width: $column-breakpoint) { + padding-left: 20px; padding-right: 20px; + &:last-child { padding-bottom: 25px } + } + } + } + } + } + + &__forms, + &__information, + &__call-to-action { + @include status-shadow; + background: $column-header-color; + } + + &__forms { + padding: 0; + + & > *:first-child { margin: inherit } + & > * { margin-left: 20px; margin-right: 20px; } + + .brand { background: $base-darker1-color } + + form { + & > .input input { + background: $form-color; + + &:focus { background: $form-focused-color } + } + } + + .separator-or { + margin-left: 20px; margin-right: 20px; + + span { + color: $primary-lighter1-text-color; + background: $column-header-color; + } + } + + @media screen and (max-width: $column-breakpoint) { + background: inherit; + box-shadow: none; + + .separator-or span { background: $base-color } + } + } + + &__information { + color: $primary-lighter1-text-color; + + &.contact-widget { + @include status-shadow; + background: $column-header-color; + + .contact-widget { + &__mail { + a { color: $primary-text-color } + } + } + } + + strong { color: inherit } + + .row:first-child { + h1 small { + color: $light-darker1-text-color; + + span { color: $light-text-color } + } + } + } + + &__call-to-action { + .row__information-board { + .information-board__section { + color: $primary-lighter2-text-color; + + & > span:last-child { color: $primary-lighter1-text-color } + } + } + } + + &__features { + .features-list { + .features-list__row { + .text { color: $primary-lighter1-text-color } + .visual .fa { color: $icon-color } + } + } + } + + &__footer { color: $primary-lighter1-text-color } + + #mastodon-timeline { + color: $primary-text-color; + background: transparent; + + p { + color: $primary-text-color; + + a { color: $secondary-text-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss new file mode 100644 index 000000000..984a8c9ae --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss @@ -0,0 +1,191 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.account { + background: $account-color; + border-color: $base-separation-color; + + .account { + &__display-name { + color: $secondary-text-color; + strong { color: $primary-text-color } + } + } + + &-role { + color: $primary-lighter2-text-color; + background-color: rgba($base-separation-color, 0.1); + border-color: rgba($base-separation-color, 0.5); + } +} + +.column { + > .column-back-button { + @include column-shadow; + background: $column-header-color; + } +} + +.account-timeline__header { + .account__header { + background-color: $account-foreground-color; + + > div { background-color: inherit } // -> v2.7.4 + + .account__header { + &__username { color: $secondary-lighter1-text-color } + &__fields { @extend .account__header__fields; } + + &__image { // v2.8.0 -> + &::after { + content: ""; + + position: absolute; + top: auto; + left: 0; + bottom: 0; + + width: 100%; + height: 30%; + background: $account-header-image-shadow-color; + box-shadow: none; + } + + > img:not([src]), + > img[src$="/headers/original/missing.png"] { + content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); + } + } + + &__bar { // v2.8.0 -> + background-color: $base-lighter1-color; + + .account__header { + &__tabs { + .avatar { + .account__avatar { + border-color: $base-lighter1-color; + border-radius: 50%; + } + } + + &__buttons { + .icon-button { border: 0 } + } + + &__name { + h1 { color: $primary-text-color } + small { color: $secondary-text-color } + } + } + + &__bio { + .account__header { + &__content { color: $primary-text-color } + &__fields { border-color: $base-separation-color } + } + } + + &__extra { + &__links { + &, a { color: $primary-lighter1-text-color } + strong { color: $primary-lighter2-text-color } + } + } + } + } + } + + .account--action-button { + .icon-button:not(.active) { + color: darken($light-text-color, 7%); + + &:active, + &:focus, + &:hover { + color: $light-text-color; + } + } + } + } + + .account { + &__disclaimer, + &__action-bar, + &__section-headline { + background: $base-lighter1-color; + border-color: $base-separation-color; + } + + &__action-bar { + &__tab { + border-color: $base-separation-color; + &.active { border-bottom-color: $active-color } + + > span { color: $primary-lighter1-text-color } + } + } + + &__section-headline { + a { + color: $primary-text-color; + + &.active { + color: $active-color; + + &::before { border-color: transparent transparent $base-separation-color } + &::after { border-color: transparent transparent $status-color } + } + } + } + } +} + +.account-authorize__wrapper { + @include status-shadow; + background: $base-lighter1-color; + + &:focus { @include status-focus-shadow; } + + .account { + &__header__content { + color: $primary-lighter2-text-color; + } + + &--panel { + background: $account-color; + border-color: $base-separation-color; + } + } +} + +.account__header__fields { + dl { + border-color: $base-separation-color; + + dt, + dd { + color: $primary-text-color; + background: $base-lighter1-color; + } + + dd { + &.verified { + border-color: transparentize($valid-color, 0.5); + background: transparentize($valid-color, 0.75); + + a { color: lighten($verified-color, 20%) } + } + } + } + + a { color: $secondary-text-color } +} + +.account__action-bar__tab { + strong { color: $primary-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/basics.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/basics.scss new file mode 100644 index 000000000..a141ecd13 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/basics.scss @@ -0,0 +1,47 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +body { + &, + .ui { + color: $primary-text-color; + background: $base-color; + } +} + +.focusable { + &:focus { + background: inherit; + + .status { + @include status-focus-shadow; + + &.status-direct { background: $status-direct-color } + } + + .detailed-status { + & { background: $status-color } + &__action-bar { background: $status-actionbar-color } + } + } +} + +::-webkit-scrollbar-thumb { + background: darken($base-lighter1-color, 12%); + + &:hover { background: darken($base-lighter1-color, 16%) } + &:active { background: darken($base-lighter1-color, 12%) } +} + +::-webkit-scrollbar-track { + background: $base-color; + + &:hover, + &:active { + background: darken($base-lighter1-color, 8%); + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss new file mode 100644 index 000000000..9e5cd2621 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss @@ -0,0 +1,263 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.tabs-bar { + @include column-shadow; + margin: 0; + background: $column-header-color; + + .tabs-bar { + &__link { + color: $icon-color; + border-bottom: 4px solid $column-header-color; + padding: 15px 10px 11px 10px; + + &.active { + border-bottom: 4px solid $active-color; + } + + .fa { + @include material-icon-large; + vertical-align: top; + } + } + } +} + +.drawer { + .drawer { + &__header { + @include column-shadow; + background: $column-header-color; + + .drawer__tab { + @include material-icon-large; + color: $icon-color; + } + + a { + &:hover { background: $column-header-hover-color } + } + } + + &__pager { + @include status-shadow; + @include material-card-radius; + + .drawer__inner { + background: $column-header-color; + + &__mastodon { display: none } + } + } + } +} + +.navigation-bar { + color: $secondary-text-color; + background: $column-header-color; + + .navigation-bar { + &__profile { + strong { color: $primary-text-color } + &-edit { color: $secondary-text-color } + } + } +} + + +.compose-form { + .compose-form { + &__buttons-wrapper { + background: $column-header-color; + + &.character-counter__wrapper { + .character-counter { color: $primary-lighter1-text-color } + } + } + + &__publish { border-top: 1px solid $base-separation-color } + &__publish-button-wrapper { @include button-shadow } + &__modifiers { background-color: $base-lighter1-color } + } + + .autosuggest-textarea__textarea { + background-color: $base-lighter1-color; + color: $primary-text-color; + } + + .character-counter { + color: $icon-color + } +} + +.column { + .column-header { + @include column-shadow; + background: $column-header-color; + + &.active { + .column-header__icon { + color: $icon-active-color; + text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); + } + } + + * { background: inherit } + + &__icon { + @include material-icon-large; + color: $icon-color; + vertical-align: bottom; + margin-right: 10px; + } + + &__buttons { + height: 50px; + + .column-header { + &__back-button { + .column-back-button__icon { vertical-align: unset } + } + + &__button { + &.active { + color: $icon-active-color; + background: inherit; + } + + .fa { vertical-align: unset } + } + } + } + + &__button { + color: $icon-color; + padding: 0 16px; + } + + &__collapsible { + color: $secondary-text-color; + border-bottom: 1px solid $base-separation-color; + + &-inner { background: $column-header-color } + } + } + + .column-back-button { + &__icon { + @include material-icon-large; + vertical-align: bottom; + margin-right: 8px; + } + } + + .column { + &-subheading, + &-link__badge { background: $base-color } + + &-link { + color: $primary-text-color; + background: $base-color; + + &__icon { + @include material-icon-large; + color: $icon-color; + vertical-align: bottom; + margin-right: 8px; + } + } + } + + .scrollable { + background: transparent; + + *[role="feed"] { + article { + margin: 1em 0; + &:first-of-type { margin: 0 } + + &:focus { outline: none } + } + } + + div[tabindex="-1"] { margin-bottom: 1em } + } + + .notification__filter-bar { + background: $column-header-color; + border-bottom-color: $base-separation-color; + + button { + color: $icon-color; + background: $column-header-color; + + &.active { + color: $icon-active-color; + + &::before { border-color: transparent transparent $base-separation-color } + &::after { border-color: transparent transparent $column-header-color } + } + } + } + + .empty-column-indicator { + flex-direction: column; + background: $base-color; + + &::before { + content: ""; + display: block; + + width: 100px; + height: 100px; + margin-bottom: 1em; + + background: none center / contain no-repeat; + background-image: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/notification-jingle_2x.gif"); + } + } +} + +.getting-started { + &__wrapper, + & { + background: $base-color; + } + + & { + border-top: 1px solid $base-separation-color; + + a { color: $primary-text-color } + } +} + +.load { + &-more, + &-gap { + background: transparent; + + &:hover { background: darken($column-header-color, 10%) } + } + + &-gap { border: 0 } +} + +.confirmation-modal { + @include material-card-radius; + color: $primary-text-color; + background-color: $base-lighter1-color; + + &__action-bar { + background-color: $base-lighter1-color; + } + + &__cancel-button { + color: $primary-lighter1-text-color; + box-shadow: 0 2px 5px 0 transparent; + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss new file mode 100644 index 000000000..42d4f8db8 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss @@ -0,0 +1,39 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.floating-action-button { + font-size: 24px; + background-color: $active-color; + width: 3.6rem; + height: 3.6rem; + + &:active { + background-color: $active-color; + } + + &:hover { + background-color: $floating-acton-button-hover-color; + } +} + +.button { + @include button-shadow; + @include material-card-radius; + background-color: $active-button-color; + + .text-icon-button { color: $primary-lighter1-text-color } +} + +.modal-root { + &__modal { + .media-modal { + &__close.icon-button { + font-size: 40px !important; + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-card.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-card.scss new file mode 100644 index 000000000..dc72775a1 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-card.scss @@ -0,0 +1,38 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.card { + //border: 1px solid $base-separation-color; + //不要(?) + + > a { + @include status-shadow; + + &:hover, + &:focus, + &:active { + .card__bar { + background: initial; + + .display-name strong { color: $secondary-text-color } + } + } + + .card__img { background: $card-image-color } + .card__bar { + background: $card-color; + + .avatar { + img { background: transparent } + } + + .display-name { + strong { color: $primary-text-color } + span { color: $primary-lighter2-text-color } + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss new file mode 100644 index 000000000..a9c6dc5ef --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss @@ -0,0 +1,69 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + +.dropdown-menu { + background-color: $column-header-color; +} + +.dropdown-menu, +.actions-modal { + @include material-card-radius; + + & > ul { + background: $base-lighter1-color; + + .dropdown-menu { + &__arrow { + &.top { border-top-color: $column-header-color } + &.bottom { border-bottom-color: $column-header-color } + } + + &__item { + a { + color: $primary-lighter2-text-color; + + padding: 16px 16px; + background: $column-header-color; + + &:active, + &:focus, + &:hover { + color: $primary-text-color; + background: $column-header-hover-color; + } + } + } + + &__separator { border-bottom-color: $base-separation-color } + } + + & > li:not(:empty) { + @extend .dropdown-menu__item; + + a { + padding: 12px 16px; + color: $primary-text-color; + + &:hover { + color: $primary-text-color; + background-color: $column-header-hover-color; + } + } + } + } + + .status { + background-color: $base-lighter1-color; + padding-top: 16px; + padding-bottom: 16px; + padding-right: 16px; + padding-left: 74px; + + &__avatar { + top: 16px; + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-status-card.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-status-card.scss new file mode 100644 index 000000000..9b64572f9 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-status-card.scss @@ -0,0 +1,12 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.status-card { + color: $primary-lighter1-text-color; + &__title, &__description { color: $primary-lighter2-text-color } + + &__image { background: transparent } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components.scss new file mode 100644 index 000000000..e735b108d --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components.scss @@ -0,0 +1,6 @@ +@charset "UTF-8"; + +@import 'components-button'; +@import 'components-card'; +@import 'components-dropdown'; +@import 'components-status-card'; \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/emoji-picker.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/emoji-picker.scss new file mode 100644 index 000000000..0937158bf --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/emoji-picker.scss @@ -0,0 +1,68 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.emoji-mart { + &-bar { + border: 0 solid $base-separation-color; + + &:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + background-color: $base-color; + } + } + + &-anchors { + color: $icon-color; + } + &-anchor { + &-selected { + color: $icon-active-color; + + &:hover { + color: $icon-active-color; + } + } + + &-bar { + background-color: $icon-active-color; + } + } + + &-search { + background-color: $base-lighter1-color; + } + &-search input { + color: $primary-text-color; + background-color: $form-color; + border: 0px solid #ffffff00; + } + + &-category-label span { + color: $primary-text-color; + background-color: $base-lighter1-color; + } + + &-scroll { + background-color: $base-lighter1-color; + } +} + +.emoji-picker-dropdown { + &__modifiers { + &__menu { + @include status-shadow; + @include material-card-radius; + background-color: $base-lighter1-color; + } + } + + &__menu { + @include column-shadow; + background-color: $base-lighter1-color; + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/explore.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/explore.scss new file mode 100644 index 000000000..ae80b3884 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/explore.scss @@ -0,0 +1,47 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.public-layout { + .page-header { + background: $explore-header-color; + + h1 { color: $primary-text-color } + p { color: $primary-lighter2-text-color } + } + + .directory, + .notice-widget { @include column-shadow; } + + .directory { + background: $explore-directory-color; + + .accounts-table { + &__count { + color: $primary-lighter2-text-color; + small { color: $primary-lighter1-text-color } + } + } + + &__tag { + & > a { + @include status-shadow; + background: $explore-directory-color; + } + + h4 { color: $primary-lighter2-text-color } + .fa, small { color: $primary-lighter1-text-color } + .trends__item__current { color: $primary-text-color } + } + } + + .notice-widget { + color: $primary-lighter1-text-color; + background: $explore-directory-color; + + a { color: $secondary-text-color } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss new file mode 100644 index 000000000..825d18dac --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss @@ -0,0 +1,179 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +@function hex-color($color) { + @if type-of($color) == 'color' { + $color: str-slice(ie-hex-str($color), 4); + } + + @return '%23' + unquote($color) +}; + + + +@font-face { + font-family: "Material Icons Extended"; + src: + local("Material Icons Extended"), + url("https://fonts.gstatic.com/s/materialiconsextended/v50/kJEjBvgX7BgnkSrUwT8UnLVc38YydejYY-oE_LvJ.woff2"), + url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/font-Material_Icons_Extended-v50.woff2"); +} + +.icon-button { + color: $icon-color; + + &:active, + &:focus, + &:hover { + color: lighten($icon-color, 7%); + } + + &.star-icon { + &.active { + color: $light-text-color; + background: $icon-active-color; + border-radius: 50%; + } + + .fa.fa-star { vertical-align: top } + } + + &.inverted { + color: $icon-color; + } + + &.disabled { + color: lighten($icon-color, 13%); + + .fa.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + } + } + + .fa { + @include material-icon-large; + vertical-align: middle; + + &.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + + &:active, + &:hover, + &:focus { + background-image: url("data:image/svg+xml;utf8,"); + } + } + } +} + +.fa { + &.fa-users, + &.fa-globe, + &.fa-cog, + &.fa-cogs, + &.fa-gears, + &.fa-sign-out, + &.fa-star, + &.fa-reply, + &.fa-reply-all, + &.fa-mail-reply, + &.fa-mail-reply-all, + &.fa-envelope, + &.fa-bookmark, + &.fa-home, + &.fa-bell, + &.fa-eraser, + &.fa-ellipsis-h, + &.fa-ellipsis-v, + &.fa-address-book, + &.fa-thumb-tack, + &.fa-lock, + &.fa-pencil, + &.fa-chevron-left, + &.fa-chevron-right, + &.fa-camera, + &.fa-tasks, + &.fa-sliders, + &.fa-fire, + &.fa-list-ul, + &.fa-search, + &.fa-close, + &.fa-remove, + &.fa-times, + &.fa-user, + &.fa-mobile-phone, + &.fa-mobile, + &.fa-filter, + &.fa-user-plus, + &.fa-cloud-upload, + &.fa-cloud-download, + &.fa-eye, + &.fa-eye-slash, + &.fa-share-alt, + &.fa-chevron-down, + &.fa-bars, + &.fa-navicon, + &.fa-reorder { + font-family: "Material Icons Extended"; + } + + &.fa-users::before { content: "people" } // 人々マーク(.drawer__header > .drawer__tab:2) + &.fa-globe::before { content: "public" } // 地球マーク(.drawer__header > .drawer__tab:3) + &.fa-cog::before { content: "settings" } // 歯車マーク(.drawer__header > .drawer__tab:4) + &.fa-cogs::before { content: "settings" } //歯車マーク(モバイル) + &.fa-gears::before { content: "settings" } //歯車マーク(モバイル) + &.fa-sign-out::before { content: "exit_to_app" } //サインアウト + &.fa-star::before { content: "plus_one" } // +1(.status .status__action-bar > .star-icon) + &.fa-reply::before { content: "reply" } //返信ボタン + &.fa-reply-all::before { content: "reply_all" } //全員に返信ボタン + &.fa-mail-reply::before { content: "reply" } //返信ボタン + &.fa-mail-reply-all::before { content: "reply_all" } //全員に返信ボタン + &.fa-envelope::before { content: "mail" } //ダイレクトメッセージボタン + &.fa-bookmark::before { content: "bookmark" } //ブックマークボタン + &.fa-home::before { content: "home" } // 家マーク(ホームタイムライン) + &.fa-bell::before { content: "notifications" } // ベルマーク(通知) + &.fa-eraser::before { content: "clear_all" } // 通知を消去のマーク + &.fa-ellipsis-h::before { content: "more_horiz" } // 三点リーダー(横) + &.fa-ellipsis-v::before { content: "more_vert" } // 三点リーダー(縦) + &.fa-address-book::before { content: "explore" } // discoverマーク(explore遷移タブ) + &.fa-thumb-tack::before { content: "" } // ピンマーク(ピン留め投稿) + &.fa-lock::before { content: "" } // サークルマーク(フォロワー限定投稿) + &.fa-pencil::before { content: "create" } // 鉛筆マーク(モバイル用フローティングボタン) + &.fa-chevron-left::before { content: "arrow_back" } //戻るボタン + &.fa-chevron-right::before { content: "arrow_forward" } //進むボタン + &.fa-camera::before { content: "camera_alt" } //メディアを追加ボタン + &.fa-tasks::before { content: "poll" } //投票を追加ボタン + &.fa-sliders::before { content: "tune" } //設定を表示ボタン + &.fa-fire::before { content: "whatshot" } //トレンドマーク + &.fa-list-ul::before { content: "list" } //リストマーク + &.fa-search::before { content: "search" } //検索アイコン(モバイル、トップバー内) + &.fa-close::before { content: "close" } //閉じるボタン + &.fa-remove::before { content: "close" } //閉じるボタン + &.fa-times::before { content: "close" } //閉じるボタン(メディア) + &.fa-user::before { content: "account_circle" } //ユーザーアイコン + &.fa-mobile-phone::before { content: "smartphone" } //モバイルアイコン + &.fa-mobile::before { content: "smartphone" } //モバイルアイコン + &.fa-filter::before { content: "filter_list" } //フィルターアイコン + &.fa-user-plus::before { content: "person_add" } //ユーザーの追加アイコン + &.fa-cloud-upload::before { content: "cloud_upload" } //インポートアイコン + &.fa-cloud-download::before { content: "cloud_download" } //エクスポートアイコン + &.fa-eye::before { content: "visibility" } //目のアイコン + &.fa-eye-slash::before { content : "visibility_off" } //閉じた目のアイコン + &.fa-share-alt::before { content: "share" } //モバイル共有ボタン + &.fa-chevron-down::before { content: "keyboard_arrow_down" } //メニューボタン + &.fa-bars::before { content: "menu" } //ハンバーガーボタン + &.fa-navicon::before { content: "menu" } //ハンバーガーボタン + &.fa-reorder::before { content: "menu" } //ハンバーガーボタン +} + +.fa { + &.fa-chevron-left, + &.fa-chevron-right, + &.fa.fa-times { + @include material-icon-large; + vertical-align: bottom; + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss new file mode 100644 index 000000000..6c664b32f --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss @@ -0,0 +1,21 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.keyboard-shortcuts { + kbd { + @include status-shadow; + + color: $primary-text-color; + background-color: $base-lighter1-color; + border-color: $base-darker1-color; + + margin: 0 0.25em; + + &:first-child { margin-left: 0 } + &:last-child { margin-right: 0 } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/lists.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/lists.scss new file mode 100644 index 000000000..05c29a6df --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/lists.scss @@ -0,0 +1,55 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.column { + .column-back-button { background: inherit } + + .column-inline-form { + background: $column-header-color; + + label input { + color: $secondary-text-color; + &:focus { color: $primary-text-color } + } + } + + .column-inline-form ~ .scrollable { + article { margin: 0 } + } +} + +.modal-root { + .column-inline-form { + background: $column-header-color; + + .setting-text { + color: $primary-text-color; + &:active, &:focus { color: $primary-lighter2-text-color } + } + } + + .list-editor { + background: $base-color; + h4 { background: $column-header-color } + + .drawer__pager { + .drawer__inner { background: $column-header-color } + } + } + + .list-adder { + background: $base-color; + + .column-inline-form { border-bottom: 1px solid $base-separation-color } + + &__account, + &__lists { background: $column-header-color } + + &__lists { + .list { border-color: $base-separation-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/notifications.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/notifications.scss new file mode 100644 index 000000000..bab098372 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/notifications.scss @@ -0,0 +1,27 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.notification { + &.notification-favourite { + .status { + &.status-direct { background: transparent } + } + } + + > .notification__message { + color: $primary-lighter2-text-color; + font-size: 13px; + padding: 8px 0; + + .notification__display-name { + &:hover { color: inherit } + } + + .notification__favourite-icon-wrapper { + .star-icon { color: $icon-active-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/profile.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/profile.scss new file mode 100644 index 000000000..246d24b7d --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/profile.scss @@ -0,0 +1,232 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.public-layout { + a.button { + @include button-shadow; + + color: $primary-text-color; + background: $base-lighter1-color; + + &:hover, + &:focus, + &:active { + background: darken($base-lighter1-color, 8%); + } + } + + .logo-button { + svg path { + /* Only for Itabashi-don */ + &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } + &#Mastodon { fill: $base-lighter1-color !important } + } + } + + .public-account-header { + @include status-shadow; + + &__image { + background: $base-lighter1-color; + + @media screen and (min-width: 600px) { height: 500px } + + &::after { + content: ""; + + position: absolute; + top: auto; + left: 0; + bottom: 0; + + width: 100%; + height: 30%; + background: $account-header-image-shadow-color; + box-shadow: none; + } + + > img:not([src]), + > img[src="/headers/original/missing.png"] { + content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); + } + } + + &__bar { + @media screen and (max-width: 600px) { + flex-direction: column; + background: $base-color; + } + + @media screen and (min-width: 600px) { margin-top: -140px } + + &::before { background: $base-lighter1-color } + + .avatar { + @media screen and (max-width: 600px) { + position: relative; + bottom: 30px; + + display: initial; + width: 60px; + height: 60px; + margin: 0 auto; + padding: 0; + } + + img { + border: 2px solid $base-lighter1-color; + border-radius: 50%; + background: transparent; + } + } + } + + &__tabs { + @media screen and (max-width: 600px) { + flex-wrap: wrap; + margin-left: 0; + + &__name { + width: 100%; + text-align: center; + + h1 { + color: $primary-text-color; + + small { color: $primary-lighter1-text-color } + } + } + + &__tabs { + justify-content: center; + flex: auto; + + .spacer { display: none } + + a.button.logo-button { + color: $light-text-color; + background: $secondary-text-color; + + svg path { + /* Only for Itabashi-don */ + &:not(#Mastodon):not(#Itabashi) { fill: $base-lighter1-color !important } + &#Mastodon { fill: $secondary-text-color !important } + } + } + } + } + + .details-counters { + .counter { + color: $light-text-color; + border-right: 0; + + &::after { border-bottom-color: $base-color } + + &.active { + &::after { border-bottom-color: $active-color } + } + } + } + } + + &__extra { + .public-account-bio { + .account__header__content { text-align: center } + } + + &__links { + color: $primary-text-color; + + a { + &, strong { color: $primary-text-color } + } + } + } + } + + .public-account-bio, + .endorsements-widget, + .hero-widget { @include status-shadow; } + + .public-account-bio { + background: $base-lighter1-color; + + .account__header__content { color: $primary-text-color } + &__extra { color: $primary-lighter1-text-color } + } + + .endorsements-widget { + padding-bottom: 0; + border-radius: 4px; + + h4 { + color: $primary-lighter1-text-color; + background: $base-lighter1-color; + } + } + + .hero-widget { + &__img { background: $base-color } + &__text { + background: $base-lighter1-color; + + &, em { color: $primary-lighter2-text-color } + a { color: $secondary-text-color } + } + } + + .account__section-headline { + background: $base-lighter1-color; + border-bottom-color: $base-separation-color; + + a { + color: $primary-lighter1-text-color; + + &.active { + color: $primary-lighter2-text-color; + + &::before { border-color: transparent transparent $base-separation-color } + &::after { border-color: transparent transparent $status-color } + } + } + } + + .activity-stream { + box-shadow: none; + + .entry { + margin: 1em 0; + background: transparent; + + &:first-of-type { margin: 0 } + } + } + + .nothing-here { + @include status-shadow; + + color: $primary-lighter1-text-color; + background: $base-lighter1-color; + } + + .footer { + h4 { color: $primary-lighter1-text-color } + + ul { + a { color: $primary-lighter2-text-color } + } + + .brand { + svg path { + /* Only for Itabashi-don */ + &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } + &#Mastodon { fill: $base-lighter1-color !important } + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/searches.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/searches.scss new file mode 100644 index 000000000..b4478b91b --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/searches.scss @@ -0,0 +1,41 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.search { + .search { + &__input { + @include material-border; + + color: $primary-text-color; + background: $form-color; + + &:focus { background: $form-focused-color } + } + + &__icon { + .fa { color: $icon-color } + } + } + + &-results { + > .search-results { + &__header { background: $base-color } + &__section { + > h5 { background: darken($base-color, 10%) } + } + } + } +} + +.trends__item { + background: $trend-color; + + .trends__item { + &__name a { color: $secondary-text-color } + &__current { color: lighten($secondary-text-color, 10%) } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-account.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-account.scss new file mode 100644 index 000000000..02fb9eac4 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-account.scss @@ -0,0 +1,54 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.edit_account { + @media screen and (min-width: 415px) { + .card { + > a { + position: relative; + + .card__img { + border-bottom: 1px solid $base-separation-color; + + > img:not([src]), + > img[src="/headers/original/missing.png"] { + content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); + } + } + + .card__bar { + position: static; + padding-top: 30%; + + .avatar { + position: absolute; + left: 0; + bottom: 0; + + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + + img { + width: 128px; + height: 128px; + + border-radius: 50%; + } + } + + .display-name { + flex: auto; + margin-left: 0; + text-align: center; + } + } + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-dashboard.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-dashboard.scss new file mode 100644 index 000000000..b4303249b --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-dashboard.scss @@ -0,0 +1,30 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.dashboard { + &__counters { + & > div { + & > div, & > a { background: $dashboard-counters-base-color } + + & > a { + &:hover, + &:focus, + &:active { + background: $dashboard-counters-hover-color; + } + } + } + + &__text, + &__num { color: $primary-text-color } + + &__label { color: $primary-lighter1-text-color } + } + + &__widgets { + a:not(.name-tag) { color: $primary-lighter2-text-color } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-directory_tag.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-directory_tag.scss new file mode 100644 index 000000000..9f75646ac --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-directory_tag.scss @@ -0,0 +1,21 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.admin-wrapper { + .content { + .directory__tag { + & > a, + & > div { background: $setting-base-color } + + h4 { + & { color: $primary-lighter2-text-color } + .fa, small { color: $primary-lighter1-text-color } + } + + .trends__item__current { color: $primary-text-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-log.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-log.scss new file mode 100644 index 000000000..672a77c06 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-log.scss @@ -0,0 +1,30 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.log-entry { + .log-entry { + &__header { + color: $primary-lighter2-text-color; + background: $log-entry-color; + + .username, + .target, + a { color: $secondary-text-color } + } + + &__timestamp { color: $primary-lighter1-text-color } + &__icon { color: $icon-color } + + &__extras { + color: $primary-text-color; + background: $log-entry-extra-color; + + .diff-neutral { color: $log-entry-extra--neutral-color } + .diff-old { color: $log-entry-extra--old-color } + .diff-new { color: $log-entry-extra--new-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-report.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-report.scss new file mode 100644 index 000000000..2e198f338 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-report.scss @@ -0,0 +1,75 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.report-card { + background: $setting-content-base-color; + + &__profile__stats { + color: $primary-lighter2-text-color; + + a { + &:focus, + &:hover, + &:active { + color: lighten($primary-lighter2-text-color, 8%); + } + } + } + + &__summary { + &__item { + border-top-color: $base-separation-color; + + &:hover { background: $column-header-hover-color } + + &__reported-by, + &__assigned { + color: $primary-lighter2-text-color; + } + + &__content { + &__icon { color: $icon-color } + a { color: $primary-lighter2-text-color } + } + } + } +} + +.batch-table { + &__toolbar { + background: $base-lighter1-color; + border-color: $base-separation-color; + } + + &__row { + &, &:nth-child(2n) { background: $base-lighter1-color } + &:hover, &:nth-child(2n):hover { background: $column-header-hover-color } + + border-color: $base-separation-color; + + &__content { + .status__content { color: $primary-text-color } + .detailed-status__meta { color: $primary-lighter1-text-color } + + + .accounts-table { // v2.8.0 -> + .accounts-table { + &__count { + & {color: $primary-text-color } + small { color: $primary-lighter1-text-color } + } + } + + td .account { background: inherit } + } + } + } +} + +.speech-bubble { + &__bubble { color: $primary-text-color } + a { color: $secondary-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss new file mode 100644 index 000000000..308c7e6a0 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss @@ -0,0 +1,244 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; +@import 'settings-account'; +@import 'settings-report'; +@import 'settings-log'; +@import 'settings-dashboard'; +@import 'settings-directory_tag'; + + + +body.admin { + color: $primary-text-color; + background: $setting-base-color; + + .sidebar { + &-wrapper { background: inherit } + + ul { + border-radius: 0; + + a { + color: $primary-lighter2-text-color; + border-radius: 0; + + &:hover { + color: $primary-text-color; + background: $setting-lists-hover-color; + } + + &.selected { + color: $primary-text-color; + background: $setting-lists-selected-color; + } + + i.fa { + @include material-icon-large; + margin-right: 8px; + vertical-align: bottom; + } + } + + ul { background: darken($setting-base-color, 4%) } + + .simple-navigation-active-leaf a { + color: $icon-active-color; + background: initial; + + &:hover { background: $setting-lists-hover-color } + } + } + } + + .content { + @include column-shadow; + background: $setting-content-base-color; + + h2, h3, h4, h6 { color: $primary-text-color } + + p { + color: $primary-text-color; + strong { color: $primary-text-color } + } + + h2, h4, hr { border-bottom-color: $base-separation-color } + .muted-hint { color: $primary-lighter1-text-color } + } +} + +.simple_form { + .input { + &.boolean, + &.with_label, + &.with_floating_label { + .label_input > label { color: $primary-text-color } + } + + &.with_block_label { + & > label { color: $primary-text-color } + } + + &.radio_buttons{ + .radio label { color: $primary-text-color } + } + + &-copy { + background: $base-color; + border-color: $base-separation-color; + } + } + + .check_boxes { + .checkbox { + label { color: $primary-text-color } + } + } + + input[type=text], + input[type=number], + input[type=email], + input[type=password], + textarea { + color: $primary-text-color; + background: $setting-content-base-color; + border-color: $base-separation-color; + + &:hover { + border-color: $base-separation-color; + } + + &:active, + &:focus { + background: darken($setting-content-base-color, 8%); + } + } + + select { + color: $primary-text-color; + background-color: $setting-content-base-color; + border-color: $base-separation-color; + } + + .input.field_with_errors { + label, + .error { + color: $error-text-color; + } + } + + .hint, p.hint { + color: $primary-lighter1-text-color !important; + + code { + color: $light-text-color; + background: $setting-emphasis-color; + } + } + + .recommended { + color: $verified-color; + background-color: transparentize($verified-color, 0.75); + border-color: $verified-color; + } + + .label_input { + &__append { color: $primary-lighter1-text-color } + } + + button { + @include button-shadow; + } +} + +.simple_form, +.table-form { + .warning { background: change-color($color: $error-color, $alpha: 0.8) } +} + +.quick-nav { + a { + color: $secondary-text-color; + + &:hover, + &:focus, + &:active { + color: lighten($secondary-text-color, 8%); + } + } +} + +.pagination { + .page, + a { + color: $primary-text-color; + } + + .page { + &.current { + background: $icon-active-color; + color: $light-text-color; + } + } +} + +.filters { + .filter-subset { + strong { color: $primary-text-color } + + a { + color: $primary-lighter2-text-color; + + &:hover { color: $primary-text-color } + + &.selected { + color: $active-text-color; + border-bottom-color: $active-text-color; + } + } + } +} + +.new_form_two_factor_confirmation { + .qr-wrapper { + .qr-code { box-shadow: none } + .qr-alternative { color: $secondary-lighter1-text-color } + } +} + +label, +select#user_setting_default_privacy { + &[for=user_setting_default_privacy_public], + &[for=user_setting_default_privacy_unlisted], + option[value="public"], + option[value="unlisted"] { color: $active-text-color !important } +} + +.column-header__collapsible__extra { + .column-settings__section { color: $primary-text-color } + + .setting-toggle { + .react-toggle { + &.react-toggle--checked { + > .react-toggle-track { background: $setting-toggle-checked-color } + + > .react-toggle-thumb { + border-color: $setting-toggle-checked-color; + background-color: $setting-toggle-thumb-checked-color; + } + } + + > .react-toggle-track { background: $setting-toggle-color } + + > .react-toggle-thumb { + border-color: $setting-toggle-color; + background-color: $setting-toggle-thumb-color; + } + } + + .setting-toggle__label { color: $primary-text-color } + } + + .setting-meta__label { color: $primary-lighter1-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss new file mode 100644 index 000000000..6746032b4 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss @@ -0,0 +1,121 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.status { + @include status-shadow; + @include material-card-radius; + border-bottom: 0; + + transition: box-shadow 0.1s 0s ease-out; + + &.light { + .status { + &__relative-time { color: $primary-lighter1-text-color } + &__display-name { + color: $primary-text-color; + + .display-name__account { color: $primary-lighter1-text-color } + } + + &__content { color: $primary-text-color } + } + } + + &.status-direct { + background: $status-direct-color; + + &:not(.read) { + background: inherit; + border-bottom-color: initial; + } + } + + &.muted { + .status__content { + p { color: lighten($primary-text-color, 20%) } + } + } + + .status { + &__info { + .status__display-name { + color: $primary-lighter1-text-color; + + strong { color: $primary-text-color } + } + + .status__relative-time { color: $primary-lighter1-text-color } + } + } + + &__action-bar__counter__label { color: $primary-lighter1-text-color } +} + +.detailed-status { + &__display-name { + color: $secondary-text-color; + + strong { color: $primary-text-color } + } + + &__meta { + .detailed-status__datetime { color: $primary-lighter1-text-color } + + .detailed-status__link { + .fa.fa-star { vertical-align: middle } + } + } + + &__wrapper { + @include status-shadow; + + .detailed-status { @extend .detailed-status; } + .detailed-status__action-bar { + background: $status-actionbar-color; + border-color: $base-separation-color; + } + } +} + +.status, +.detailed-status { + background: $status-color; + + .status__content { + color: $primary-text-color; + + a { color: $secondary-text-color } + + .status__content__spoiler-link { + color: $primary-text-color; + background: $base-color; + } + } +} + +a.status-card, +a.status-card.compact { + &:hover { background: initial } +} + +.status-card, +.status-card.compact { + border-color: $non-elevated-card-boader; + + &__title { + color : $primary-text-color; + } + + &__host { + color: $primary-lighter1-text-color; + } +} + +.name-tag, +a.name-tag { + color: $secondary-text-color; +} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/tables.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/tables.scss new file mode 100644 index 000000000..e71ce7a38 --- /dev/null +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/tables.scss @@ -0,0 +1,29 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.table { + thead th { border-bottom-color: $base-separation-color } + + th, + td { + color: $primary-text-color; + background-color: $base-color; + border-top: 0; + } + + & > tbody > tr:nth-child(odd) { + & > td, & > th { background: darken($base-color, 4%) } + } + + a { color: $secondary-text-color } +} + +a.table-action-link, +button.table-action-link { + color: $secondary-text-color; + + &:hover { color: darken($secondary-text-color, 8%) } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev.scss new file mode 100644 index 000000000..1c8df2bab --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev.scss @@ -0,0 +1,24 @@ +/** + * Google+ Theme for Mastodon v1.1 + * Copyright (C) 2018-2019 Genbu Project + */ + + @charset "UTF-8"; + + // @import 'application'; + @import 'application'; + @import 'gplus-theme-for-mastodon-dev/basics'; + @import 'gplus-theme-for-mastodon-dev/components'; + @import 'gplus-theme-for-mastodon-dev/emoji-picker'; + @import 'gplus-theme-for-mastodon-dev/tables'; + @import 'gplus-theme-for-mastodon-dev/columns'; + @import 'gplus-theme-for-mastodon-dev/lists'; + @import 'gplus-theme-for-mastodon-dev/accounts'; + @import 'gplus-theme-for-mastodon-dev/statuses'; + @import 'gplus-theme-for-mastodon-dev/notifications'; + @import 'gplus-theme-for-mastodon-dev/searches'; + @import 'gplus-theme-for-mastodon-dev/settings'; + @import 'gplus-theme-for-mastodon-dev/icons'; + @import 'gplus-theme-for-mastodon-dev/profile'; + @import 'gplus-theme-for-mastodon-dev/about'; + @import 'gplus-theme-for-mastodon-dev/explore'; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/_functions.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/_functions.scss new file mode 100644 index 000000000..e5aea0e4e --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/_functions.scss @@ -0,0 +1,15 @@ +@charset "UTF-8"; + + + +@function adjust-lightness ($color, $lightness) { + @if (lightness($color) - $lightness <= 0 and lightness($color) + $lightness < 100) { + @return lighten($color, $lightness); + } + + @if (0 < lightness($color) - $lightness and 100 <= lightness($color) + $lightness) { + @return darken($color, $lightness); + } + + @return change-color($color, $lightness: $lightness); +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/_mixins.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/_mixins.scss new file mode 100644 index 000000000..400a1ac90 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/_mixins.scss @@ -0,0 +1,13 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +@mixin column-shadow { box-shadow: 0 1px 8px 0 $column-header-shadow-color } +@mixin status-shadow { box-shadow: 0 1px 4px 0 $status-shadow-color } +@mixin status-focus-shadow { box-shadow: 0 0 20px 0 $status-focused-shadow-color } +@mixin button-shadow { box-shadow: 0 2px 5px 0 $button-shadow-color } +@mixin material-border { border-radius: 4px } +@mixin material-card-radius { border-radius: 2px } +@mixin material-icon-large { font-size: 20px } \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss new file mode 100644 index 000000000..77a68f3b8 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss @@ -0,0 +1,98 @@ +@charset "UTF-8"; + + + +// Base colors +$active-color: #db4437; +$accent-color: #fbbc04; +$valid-color: #4285f4; +$error-color: #d50000; +$checked-color: #4285f4; +$verified-color: #4caf50; + + +// Text colors +$primary-text-color: rgba(0, 0, 0, 0.87); +$primary-lighter1-text-color: change-color($color: $primary-text-color, $lightness: 62%, $alpha: 1.0); // ex: 時間表示 +$primary-lighter2-text-color: change-color($color: $primary-text-color, $lightness: 38%, $alpha: 1.0); // ex: 通知メッセージ表示 +$secondary-text-color: #2962ff; // ex: リンク +$secondary-lighter1-text-color: #00bfff; // ex: アカウントTLのユーザーID +$light-text-color: #ffffff; +$light-darker1-text-color: darken($light-text-color, 15%); +$active-text-color: $active-color; +$error-text-color: $error-color; + + +// Icon colors +$icon-color: #757575; +$icon-active-color: $active-color; + + +// Background colors +$base-color: #f1f1f1; +$base-lighter1-color: #ffffff; +$base-darker1-color: rgba(0, 0, 0, 0.4); + +$column-header-color: $base-lighter1-color; +$column-header-hover-color: darken($column-header-color, 10%); + +$status-color: $base-lighter1-color; +$status-direct-color: darken($status-color, 5%); +$status-actionbar-color: darken($status-color, 2%); + +$account-color: $base-lighter1-color; +$account-foreground-color: $base-darker1-color; + +$card-color: $base-lighter1-color; +$card-hover-color: $column-header-hover-color; +$card-image-color: $base-color; + +$form-color: rgba(0, 0, 0, 0.1); +$form-focused-color: lighten($form-color, 20%); +$trend-color: $base-lighter1-color; + +$setting-base-color: $base-color; +$setting-lists-selected-color: darken($base-color, 2%); +$setting-lists-hover-color: darken($base-color, 5%); +$setting-content-base-color: $base-lighter1-color; + +$setting-toggle-color: #b9b9b9; +$setting-toggle-checked-color: change-color($color: $checked-color, $alpha: 0.5); +$setting-toggle-thumb-color: #fafafa; +$setting-toggle-thumb-checked-color: $checked-color; + +$setting-emphasis-color: $verified-color; + +$dashboard-counters-base-color: $base-color; +$dashboard-counters-hover-color: lighten($base-color, 2%); + +$log-entry-color: $base-lighter1-color; +$log-entry-extra-color: $base-color; +$log-entry-extra--neutral-color: $valid-color; +$log-entry-extra--old-color: $active-color; +$log-entry-extra--new-color: $verified-color; + +$explore-header-color: lighten($accent-color, 16%); +$explore-directory-color: $base-lighter1-color; + +$active-button-color: $valid-color; //文字入りボタン +$non-active-button-color: lighten($base-color, 20%); + +$floating-acton-button-hover-color: lighten($active-color, 10%); + + +// Shadow colors +$column-header-shadow-color: rgba(0, 0, 0, 0.3); +$status-shadow-color: rgba(0, 0, 0, 0.14); +$status-focused-shadow-color: change-color($color: $status-shadow-color, $alpha: 0.3); +$icon-hovered-shadow-color: rgba(0, 0, 0, 0.26); +$account-header-image-shadow-color: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.46)); +$button-shadow-color: rgba(0, 0, 0, 0.4); + + +// Separation colors +$base-separation-color: rgba(0, 0, 0, 0.14); + + +//Border colors +$non-elevated-card-boader : #e0e0e0; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/about.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/about.scss new file mode 100644 index 000000000..de48883a8 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/about.scss @@ -0,0 +1,138 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +// from mastodon/about.scss +$column-breakpoint: 700px; + + + +.landing-page { + h3, h4, h5, h6 { color: $primary-lighter2-text-color } + p { color: $primary-lighter1-text-color } + em { color: $primary-text-color } + + .column-0 { background: $base-darker1-color } + .column-2 { + .landing-page { + &__information { padding: 0 } + + &__short-description { + & > .row:first-child { + background: $base-darker1-color; + padding: 10px 20px; + } + + & > * { + padding-left: 40px; padding-right: 40px; + &:last-child { padding-bottom: 45px } + + @media screen and (max-width: $column-breakpoint) { + padding-left: 20px; padding-right: 20px; + &:last-child { padding-bottom: 25px } + } + } + } + } + } + + &__forms, + &__information, + &__call-to-action { + @include status-shadow; + background: $column-header-color; + } + + &__forms { + padding: 0; + + & > *:first-child { margin: inherit } + & > * { margin-left: 20px; margin-right: 20px; } + + .brand { background: $base-darker1-color } + + form { + & > .input input { + background: $form-color; + + &:focus { background: $form-focused-color } + } + } + + .separator-or { + margin-left: 20px; margin-right: 20px; + + span { + color: $primary-lighter1-text-color; + background: $column-header-color; + } + } + + @media screen and (max-width: $column-breakpoint) { + background: inherit; + box-shadow: none; + + .separator-or span { background: $base-color } + } + } + + &__information { + color: $primary-lighter1-text-color; + + &.contact-widget { + @include status-shadow; + background: $column-header-color; + + .contact-widget { + &__mail { + a { color: $primary-text-color } + } + } + } + + strong { color: inherit } + + .row:first-child { + h1 small { + color: $light-darker1-text-color; + + span { color: $light-text-color } + } + } + } + + &__call-to-action { + .row__information-board { + .information-board__section { + color: $primary-lighter2-text-color; + + & > span:last-child { color: $primary-lighter1-text-color } + } + } + } + + &__features { + .features-list { + .features-list__row { + .text { color: $primary-lighter1-text-color } + .visual .fa { color: $icon-color } + } + } + } + + &__footer { color: $primary-lighter1-text-color } + + #mastodon-timeline { + color: $primary-text-color; + background: transparent; + + p { + color: $primary-text-color; + + a { color: $secondary-text-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss new file mode 100644 index 000000000..984a8c9ae --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss @@ -0,0 +1,191 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.account { + background: $account-color; + border-color: $base-separation-color; + + .account { + &__display-name { + color: $secondary-text-color; + strong { color: $primary-text-color } + } + } + + &-role { + color: $primary-lighter2-text-color; + background-color: rgba($base-separation-color, 0.1); + border-color: rgba($base-separation-color, 0.5); + } +} + +.column { + > .column-back-button { + @include column-shadow; + background: $column-header-color; + } +} + +.account-timeline__header { + .account__header { + background-color: $account-foreground-color; + + > div { background-color: inherit } // -> v2.7.4 + + .account__header { + &__username { color: $secondary-lighter1-text-color } + &__fields { @extend .account__header__fields; } + + &__image { // v2.8.0 -> + &::after { + content: ""; + + position: absolute; + top: auto; + left: 0; + bottom: 0; + + width: 100%; + height: 30%; + background: $account-header-image-shadow-color; + box-shadow: none; + } + + > img:not([src]), + > img[src$="/headers/original/missing.png"] { + content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); + } + } + + &__bar { // v2.8.0 -> + background-color: $base-lighter1-color; + + .account__header { + &__tabs { + .avatar { + .account__avatar { + border-color: $base-lighter1-color; + border-radius: 50%; + } + } + + &__buttons { + .icon-button { border: 0 } + } + + &__name { + h1 { color: $primary-text-color } + small { color: $secondary-text-color } + } + } + + &__bio { + .account__header { + &__content { color: $primary-text-color } + &__fields { border-color: $base-separation-color } + } + } + + &__extra { + &__links { + &, a { color: $primary-lighter1-text-color } + strong { color: $primary-lighter2-text-color } + } + } + } + } + } + + .account--action-button { + .icon-button:not(.active) { + color: darken($light-text-color, 7%); + + &:active, + &:focus, + &:hover { + color: $light-text-color; + } + } + } + } + + .account { + &__disclaimer, + &__action-bar, + &__section-headline { + background: $base-lighter1-color; + border-color: $base-separation-color; + } + + &__action-bar { + &__tab { + border-color: $base-separation-color; + &.active { border-bottom-color: $active-color } + + > span { color: $primary-lighter1-text-color } + } + } + + &__section-headline { + a { + color: $primary-text-color; + + &.active { + color: $active-color; + + &::before { border-color: transparent transparent $base-separation-color } + &::after { border-color: transparent transparent $status-color } + } + } + } + } +} + +.account-authorize__wrapper { + @include status-shadow; + background: $base-lighter1-color; + + &:focus { @include status-focus-shadow; } + + .account { + &__header__content { + color: $primary-lighter2-text-color; + } + + &--panel { + background: $account-color; + border-color: $base-separation-color; + } + } +} + +.account__header__fields { + dl { + border-color: $base-separation-color; + + dt, + dd { + color: $primary-text-color; + background: $base-lighter1-color; + } + + dd { + &.verified { + border-color: transparentize($valid-color, 0.5); + background: transparentize($valid-color, 0.75); + + a { color: lighten($verified-color, 20%) } + } + } + } + + a { color: $secondary-text-color } +} + +.account__action-bar__tab { + strong { color: $primary-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/basics.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/basics.scss new file mode 100644 index 000000000..a141ecd13 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/basics.scss @@ -0,0 +1,47 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +body { + &, + .ui { + color: $primary-text-color; + background: $base-color; + } +} + +.focusable { + &:focus { + background: inherit; + + .status { + @include status-focus-shadow; + + &.status-direct { background: $status-direct-color } + } + + .detailed-status { + & { background: $status-color } + &__action-bar { background: $status-actionbar-color } + } + } +} + +::-webkit-scrollbar-thumb { + background: darken($base-lighter1-color, 12%); + + &:hover { background: darken($base-lighter1-color, 16%) } + &:active { background: darken($base-lighter1-color, 12%) } +} + +::-webkit-scrollbar-track { + background: $base-color; + + &:hover, + &:active { + background: darken($base-lighter1-color, 8%); + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss new file mode 100644 index 000000000..6a0239562 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss @@ -0,0 +1,263 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.tabs-bar { + @include column-shadow; + margin: 0; + background: $column-header-color; + + .tabs-bar { + &__link { + color: $icon-color; + border-bottom: 4px solid $column-header-color; + padding: 15px 10px 11px 10px; + + &.active { + border-bottom: 4px solid $active-color; + } + + .fa { + @include material-icon-large; + vertical-align: top; + } + } + } +} + +.drawer { + .drawer { + &__header { + @include column-shadow; + background: $column-header-color; + + .drawer__tab { + @include material-icon-large; + color: $icon-color; + } + + a { + &:hover { background: $column-header-hover-color } + } + } + + &__pager { + @include status-shadow; + @include material-card-radius; + + .drawer__inner { + background: $column-header-color; + + &__mastodon { display: none } + } + } + } +} + +.navigation-bar { + color: $secondary-text-color; + background: $column-header-color; + + .navigation-bar { + &__profile { + strong { color: $primary-text-color } + &-edit { color: $secondary-text-color } + } + } +} + + +.compose-form { + .compose-form { + &__buttons-wrapper { + background: $column-header-color; + + &.character-counter__wrapper { + .character-counter { color: $primary-lighter1-text-color } + } + } + + &__publish { border-top: 1px solid $base-separation-color } + &__publish-button-wrapper { @include button-shadow } + &__modifiers { background-color: $base-lighter1-color } + } + + .autosuggest-textarea__textarea { + background-color: $base-lighter1-color; + color: $primary-text-color; + } + + .character-counter { + color: $icon-color + } +} + +.column { + .column-header { + @include column-shadow; + background: $column-header-color; + + &.active { + .column-header__icon { + color: $icon-active-color; + text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); + } + } + + * { background: inherit } + + &__icon { + @include material-icon-large; + color: $icon-color; + vertical-align: bottom; + margin-right: 10px; + } + + &__buttons { + height: 50px; + + .column-header { + &__back-button { + .column-back-button__icon { vertical-align: unset } + } + + &__button { + &.active { + color: $icon-active-color; + background: inherit; + } + + .fa { vertical-align: unset } + } + } + } + + &__button { + color: $icon-color; + padding: 0 16px; + } + + &__collapsible { + color: $secondary-text-color; + border-bottom: 1px solid $base-separation-color; + + &-inner { background: $column-header-color } + } + } + + .column-back-button { + &__icon { + @include material-icon-large; + vertical-align: bottom; + margin-right: 8px; + } + } + + .column { + &-subheading, + &-link__badge { background: darken($base-color, 10%) } + + &-link { + color: $primary-text-color; + background: $base-color; + + &__icon { + @include material-icon-large; + color: $icon-color; + vertical-align: bottom; + margin-right: 8px; + } + } + } + + .scrollable { + background: transparent; + + *[role="feed"] { + article { + margin: 1em 0; + &:first-of-type { margin: 0 } + + &:focus { outline: none } + } + } + + div[tabindex="-1"] { margin-bottom: 1em } + } + + .notification__filter-bar { + background: $column-header-color; + border-bottom-color: $base-separation-color; + + button { + color: $icon-color; + background: $column-header-color; + + &.active { + color: $icon-active-color; + + &::before { border-color: transparent transparent $base-separation-color } + &::after { border-color: transparent transparent $column-header-color } + } + } + } + + .empty-column-indicator { + flex-direction: column; + background: $base-color; + + &::before { + content: ""; + display: block; + + width: 100px; + height: 100px; + margin-bottom: 1em; + + background: none center / contain no-repeat; + background-image: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/notification-jingle_2x.gif"); + } + } +} + +.getting-started { + &__wrapper, + & { + background: $base-color; + } + + & { + border-top: 1px solid $base-separation-color; + + a { color: $primary-text-color } + } +} + +.load { + &-more, + &-gap { + background: transparent; + + &:hover { background: darken($column-header-color, 10%) } + } + + &-gap { border: 0 } +} + +.confirmation-modal { + @include material-card-radius; + color: $primary-text-color; + background-color: $base-lighter1-color; + + &__action-bar { + background-color: $base-lighter1-color; + } + + &__cancel-button { + color: $primary-lighter1-text-color; + box-shadow: 0 2px 5px 0 transparent; + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss new file mode 100644 index 000000000..42d4f8db8 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss @@ -0,0 +1,39 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.floating-action-button { + font-size: 24px; + background-color: $active-color; + width: 3.6rem; + height: 3.6rem; + + &:active { + background-color: $active-color; + } + + &:hover { + background-color: $floating-acton-button-hover-color; + } +} + +.button { + @include button-shadow; + @include material-card-radius; + background-color: $active-button-color; + + .text-icon-button { color: $primary-lighter1-text-color } +} + +.modal-root { + &__modal { + .media-modal { + &__close.icon-button { + font-size: 40px !important; + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-card.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-card.scss new file mode 100644 index 000000000..dc72775a1 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-card.scss @@ -0,0 +1,38 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.card { + //border: 1px solid $base-separation-color; + //不要(?) + + > a { + @include status-shadow; + + &:hover, + &:focus, + &:active { + .card__bar { + background: initial; + + .display-name strong { color: $secondary-text-color } + } + } + + .card__img { background: $card-image-color } + .card__bar { + background: $card-color; + + .avatar { + img { background: transparent } + } + + .display-name { + strong { color: $primary-text-color } + span { color: $primary-lighter2-text-color } + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss new file mode 100644 index 000000000..a9c6dc5ef --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss @@ -0,0 +1,69 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + +.dropdown-menu { + background-color: $column-header-color; +} + +.dropdown-menu, +.actions-modal { + @include material-card-radius; + + & > ul { + background: $base-lighter1-color; + + .dropdown-menu { + &__arrow { + &.top { border-top-color: $column-header-color } + &.bottom { border-bottom-color: $column-header-color } + } + + &__item { + a { + color: $primary-lighter2-text-color; + + padding: 16px 16px; + background: $column-header-color; + + &:active, + &:focus, + &:hover { + color: $primary-text-color; + background: $column-header-hover-color; + } + } + } + + &__separator { border-bottom-color: $base-separation-color } + } + + & > li:not(:empty) { + @extend .dropdown-menu__item; + + a { + padding: 12px 16px; + color: $primary-text-color; + + &:hover { + color: $primary-text-color; + background-color: $column-header-hover-color; + } + } + } + } + + .status { + background-color: $base-lighter1-color; + padding-top: 16px; + padding-bottom: 16px; + padding-right: 16px; + padding-left: 74px; + + &__avatar { + top: 16px; + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-status-card.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-status-card.scss new file mode 100644 index 000000000..9b64572f9 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-status-card.scss @@ -0,0 +1,12 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.status-card { + color: $primary-lighter1-text-color; + &__title, &__description { color: $primary-lighter2-text-color } + + &__image { background: transparent } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components.scss new file mode 100644 index 000000000..e735b108d --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components.scss @@ -0,0 +1,6 @@ +@charset "UTF-8"; + +@import 'components-button'; +@import 'components-card'; +@import 'components-dropdown'; +@import 'components-status-card'; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/emoji-picker.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/emoji-picker.scss new file mode 100644 index 000000000..0937158bf --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/emoji-picker.scss @@ -0,0 +1,68 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.emoji-mart { + &-bar { + border: 0 solid $base-separation-color; + + &:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + background-color: $base-color; + } + } + + &-anchors { + color: $icon-color; + } + &-anchor { + &-selected { + color: $icon-active-color; + + &:hover { + color: $icon-active-color; + } + } + + &-bar { + background-color: $icon-active-color; + } + } + + &-search { + background-color: $base-lighter1-color; + } + &-search input { + color: $primary-text-color; + background-color: $form-color; + border: 0px solid #ffffff00; + } + + &-category-label span { + color: $primary-text-color; + background-color: $base-lighter1-color; + } + + &-scroll { + background-color: $base-lighter1-color; + } +} + +.emoji-picker-dropdown { + &__modifiers { + &__menu { + @include status-shadow; + @include material-card-radius; + background-color: $base-lighter1-color; + } + } + + &__menu { + @include column-shadow; + background-color: $base-lighter1-color; + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/explore.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/explore.scss new file mode 100644 index 000000000..ae80b3884 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/explore.scss @@ -0,0 +1,47 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.public-layout { + .page-header { + background: $explore-header-color; + + h1 { color: $primary-text-color } + p { color: $primary-lighter2-text-color } + } + + .directory, + .notice-widget { @include column-shadow; } + + .directory { + background: $explore-directory-color; + + .accounts-table { + &__count { + color: $primary-lighter2-text-color; + small { color: $primary-lighter1-text-color } + } + } + + &__tag { + & > a { + @include status-shadow; + background: $explore-directory-color; + } + + h4 { color: $primary-lighter2-text-color } + .fa, small { color: $primary-lighter1-text-color } + .trends__item__current { color: $primary-text-color } + } + } + + .notice-widget { + color: $primary-lighter1-text-color; + background: $explore-directory-color; + + a { color: $secondary-text-color } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss new file mode 100644 index 000000000..825d18dac --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss @@ -0,0 +1,179 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +@function hex-color($color) { + @if type-of($color) == 'color' { + $color: str-slice(ie-hex-str($color), 4); + } + + @return '%23' + unquote($color) +}; + + + +@font-face { + font-family: "Material Icons Extended"; + src: + local("Material Icons Extended"), + url("https://fonts.gstatic.com/s/materialiconsextended/v50/kJEjBvgX7BgnkSrUwT8UnLVc38YydejYY-oE_LvJ.woff2"), + url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/font-Material_Icons_Extended-v50.woff2"); +} + +.icon-button { + color: $icon-color; + + &:active, + &:focus, + &:hover { + color: lighten($icon-color, 7%); + } + + &.star-icon { + &.active { + color: $light-text-color; + background: $icon-active-color; + border-radius: 50%; + } + + .fa.fa-star { vertical-align: top } + } + + &.inverted { + color: $icon-color; + } + + &.disabled { + color: lighten($icon-color, 13%); + + .fa.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + } + } + + .fa { + @include material-icon-large; + vertical-align: middle; + + &.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + + &:active, + &:hover, + &:focus { + background-image: url("data:image/svg+xml;utf8,"); + } + } + } +} + +.fa { + &.fa-users, + &.fa-globe, + &.fa-cog, + &.fa-cogs, + &.fa-gears, + &.fa-sign-out, + &.fa-star, + &.fa-reply, + &.fa-reply-all, + &.fa-mail-reply, + &.fa-mail-reply-all, + &.fa-envelope, + &.fa-bookmark, + &.fa-home, + &.fa-bell, + &.fa-eraser, + &.fa-ellipsis-h, + &.fa-ellipsis-v, + &.fa-address-book, + &.fa-thumb-tack, + &.fa-lock, + &.fa-pencil, + &.fa-chevron-left, + &.fa-chevron-right, + &.fa-camera, + &.fa-tasks, + &.fa-sliders, + &.fa-fire, + &.fa-list-ul, + &.fa-search, + &.fa-close, + &.fa-remove, + &.fa-times, + &.fa-user, + &.fa-mobile-phone, + &.fa-mobile, + &.fa-filter, + &.fa-user-plus, + &.fa-cloud-upload, + &.fa-cloud-download, + &.fa-eye, + &.fa-eye-slash, + &.fa-share-alt, + &.fa-chevron-down, + &.fa-bars, + &.fa-navicon, + &.fa-reorder { + font-family: "Material Icons Extended"; + } + + &.fa-users::before { content: "people" } // 人々マーク(.drawer__header > .drawer__tab:2) + &.fa-globe::before { content: "public" } // 地球マーク(.drawer__header > .drawer__tab:3) + &.fa-cog::before { content: "settings" } // 歯車マーク(.drawer__header > .drawer__tab:4) + &.fa-cogs::before { content: "settings" } //歯車マーク(モバイル) + &.fa-gears::before { content: "settings" } //歯車マーク(モバイル) + &.fa-sign-out::before { content: "exit_to_app" } //サインアウト + &.fa-star::before { content: "plus_one" } // +1(.status .status__action-bar > .star-icon) + &.fa-reply::before { content: "reply" } //返信ボタン + &.fa-reply-all::before { content: "reply_all" } //全員に返信ボタン + &.fa-mail-reply::before { content: "reply" } //返信ボタン + &.fa-mail-reply-all::before { content: "reply_all" } //全員に返信ボタン + &.fa-envelope::before { content: "mail" } //ダイレクトメッセージボタン + &.fa-bookmark::before { content: "bookmark" } //ブックマークボタン + &.fa-home::before { content: "home" } // 家マーク(ホームタイムライン) + &.fa-bell::before { content: "notifications" } // ベルマーク(通知) + &.fa-eraser::before { content: "clear_all" } // 通知を消去のマーク + &.fa-ellipsis-h::before { content: "more_horiz" } // 三点リーダー(横) + &.fa-ellipsis-v::before { content: "more_vert" } // 三点リーダー(縦) + &.fa-address-book::before { content: "explore" } // discoverマーク(explore遷移タブ) + &.fa-thumb-tack::before { content: "" } // ピンマーク(ピン留め投稿) + &.fa-lock::before { content: "" } // サークルマーク(フォロワー限定投稿) + &.fa-pencil::before { content: "create" } // 鉛筆マーク(モバイル用フローティングボタン) + &.fa-chevron-left::before { content: "arrow_back" } //戻るボタン + &.fa-chevron-right::before { content: "arrow_forward" } //進むボタン + &.fa-camera::before { content: "camera_alt" } //メディアを追加ボタン + &.fa-tasks::before { content: "poll" } //投票を追加ボタン + &.fa-sliders::before { content: "tune" } //設定を表示ボタン + &.fa-fire::before { content: "whatshot" } //トレンドマーク + &.fa-list-ul::before { content: "list" } //リストマーク + &.fa-search::before { content: "search" } //検索アイコン(モバイル、トップバー内) + &.fa-close::before { content: "close" } //閉じるボタン + &.fa-remove::before { content: "close" } //閉じるボタン + &.fa-times::before { content: "close" } //閉じるボタン(メディア) + &.fa-user::before { content: "account_circle" } //ユーザーアイコン + &.fa-mobile-phone::before { content: "smartphone" } //モバイルアイコン + &.fa-mobile::before { content: "smartphone" } //モバイルアイコン + &.fa-filter::before { content: "filter_list" } //フィルターアイコン + &.fa-user-plus::before { content: "person_add" } //ユーザーの追加アイコン + &.fa-cloud-upload::before { content: "cloud_upload" } //インポートアイコン + &.fa-cloud-download::before { content: "cloud_download" } //エクスポートアイコン + &.fa-eye::before { content: "visibility" } //目のアイコン + &.fa-eye-slash::before { content : "visibility_off" } //閉じた目のアイコン + &.fa-share-alt::before { content: "share" } //モバイル共有ボタン + &.fa-chevron-down::before { content: "keyboard_arrow_down" } //メニューボタン + &.fa-bars::before { content: "menu" } //ハンバーガーボタン + &.fa-navicon::before { content: "menu" } //ハンバーガーボタン + &.fa-reorder::before { content: "menu" } //ハンバーガーボタン +} + +.fa { + &.fa-chevron-left, + &.fa-chevron-right, + &.fa.fa-times { + @include material-icon-large; + vertical-align: bottom; + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss new file mode 100644 index 000000000..6c664b32f --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss @@ -0,0 +1,21 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.keyboard-shortcuts { + kbd { + @include status-shadow; + + color: $primary-text-color; + background-color: $base-lighter1-color; + border-color: $base-darker1-color; + + margin: 0 0.25em; + + &:first-child { margin-left: 0 } + &:last-child { margin-right: 0 } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/lists.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/lists.scss new file mode 100644 index 000000000..05c29a6df --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/lists.scss @@ -0,0 +1,55 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.column { + .column-back-button { background: inherit } + + .column-inline-form { + background: $column-header-color; + + label input { + color: $secondary-text-color; + &:focus { color: $primary-text-color } + } + } + + .column-inline-form ~ .scrollable { + article { margin: 0 } + } +} + +.modal-root { + .column-inline-form { + background: $column-header-color; + + .setting-text { + color: $primary-text-color; + &:active, &:focus { color: $primary-lighter2-text-color } + } + } + + .list-editor { + background: $base-color; + h4 { background: $column-header-color } + + .drawer__pager { + .drawer__inner { background: $column-header-color } + } + } + + .list-adder { + background: $base-color; + + .column-inline-form { border-bottom: 1px solid $base-separation-color } + + &__account, + &__lists { background: $column-header-color } + + &__lists { + .list { border-color: $base-separation-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/notifications.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/notifications.scss new file mode 100644 index 000000000..bab098372 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/notifications.scss @@ -0,0 +1,27 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.notification { + &.notification-favourite { + .status { + &.status-direct { background: transparent } + } + } + + > .notification__message { + color: $primary-lighter2-text-color; + font-size: 13px; + padding: 8px 0; + + .notification__display-name { + &:hover { color: inherit } + } + + .notification__favourite-icon-wrapper { + .star-icon { color: $icon-active-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/profile.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/profile.scss new file mode 100644 index 000000000..246d24b7d --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/profile.scss @@ -0,0 +1,232 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.public-layout { + a.button { + @include button-shadow; + + color: $primary-text-color; + background: $base-lighter1-color; + + &:hover, + &:focus, + &:active { + background: darken($base-lighter1-color, 8%); + } + } + + .logo-button { + svg path { + /* Only for Itabashi-don */ + &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } + &#Mastodon { fill: $base-lighter1-color !important } + } + } + + .public-account-header { + @include status-shadow; + + &__image { + background: $base-lighter1-color; + + @media screen and (min-width: 600px) { height: 500px } + + &::after { + content: ""; + + position: absolute; + top: auto; + left: 0; + bottom: 0; + + width: 100%; + height: 30%; + background: $account-header-image-shadow-color; + box-shadow: none; + } + + > img:not([src]), + > img[src="/headers/original/missing.png"] { + content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); + } + } + + &__bar { + @media screen and (max-width: 600px) { + flex-direction: column; + background: $base-color; + } + + @media screen and (min-width: 600px) { margin-top: -140px } + + &::before { background: $base-lighter1-color } + + .avatar { + @media screen and (max-width: 600px) { + position: relative; + bottom: 30px; + + display: initial; + width: 60px; + height: 60px; + margin: 0 auto; + padding: 0; + } + + img { + border: 2px solid $base-lighter1-color; + border-radius: 50%; + background: transparent; + } + } + } + + &__tabs { + @media screen and (max-width: 600px) { + flex-wrap: wrap; + margin-left: 0; + + &__name { + width: 100%; + text-align: center; + + h1 { + color: $primary-text-color; + + small { color: $primary-lighter1-text-color } + } + } + + &__tabs { + justify-content: center; + flex: auto; + + .spacer { display: none } + + a.button.logo-button { + color: $light-text-color; + background: $secondary-text-color; + + svg path { + /* Only for Itabashi-don */ + &:not(#Mastodon):not(#Itabashi) { fill: $base-lighter1-color !important } + &#Mastodon { fill: $secondary-text-color !important } + } + } + } + } + + .details-counters { + .counter { + color: $light-text-color; + border-right: 0; + + &::after { border-bottom-color: $base-color } + + &.active { + &::after { border-bottom-color: $active-color } + } + } + } + } + + &__extra { + .public-account-bio { + .account__header__content { text-align: center } + } + + &__links { + color: $primary-text-color; + + a { + &, strong { color: $primary-text-color } + } + } + } + } + + .public-account-bio, + .endorsements-widget, + .hero-widget { @include status-shadow; } + + .public-account-bio { + background: $base-lighter1-color; + + .account__header__content { color: $primary-text-color } + &__extra { color: $primary-lighter1-text-color } + } + + .endorsements-widget { + padding-bottom: 0; + border-radius: 4px; + + h4 { + color: $primary-lighter1-text-color; + background: $base-lighter1-color; + } + } + + .hero-widget { + &__img { background: $base-color } + &__text { + background: $base-lighter1-color; + + &, em { color: $primary-lighter2-text-color } + a { color: $secondary-text-color } + } + } + + .account__section-headline { + background: $base-lighter1-color; + border-bottom-color: $base-separation-color; + + a { + color: $primary-lighter1-text-color; + + &.active { + color: $primary-lighter2-text-color; + + &::before { border-color: transparent transparent $base-separation-color } + &::after { border-color: transparent transparent $status-color } + } + } + } + + .activity-stream { + box-shadow: none; + + .entry { + margin: 1em 0; + background: transparent; + + &:first-of-type { margin: 0 } + } + } + + .nothing-here { + @include status-shadow; + + color: $primary-lighter1-text-color; + background: $base-lighter1-color; + } + + .footer { + h4 { color: $primary-lighter1-text-color } + + ul { + a { color: $primary-lighter2-text-color } + } + + .brand { + svg path { + /* Only for Itabashi-don */ + &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } + &#Mastodon { fill: $base-lighter1-color !important } + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/searches.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/searches.scss new file mode 100644 index 000000000..b4478b91b --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/searches.scss @@ -0,0 +1,41 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.search { + .search { + &__input { + @include material-border; + + color: $primary-text-color; + background: $form-color; + + &:focus { background: $form-focused-color } + } + + &__icon { + .fa { color: $icon-color } + } + } + + &-results { + > .search-results { + &__header { background: $base-color } + &__section { + > h5 { background: darken($base-color, 10%) } + } + } + } +} + +.trends__item { + background: $trend-color; + + .trends__item { + &__name a { color: $secondary-text-color } + &__current { color: lighten($secondary-text-color, 10%) } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-account.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-account.scss new file mode 100644 index 000000000..02fb9eac4 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-account.scss @@ -0,0 +1,54 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.edit_account { + @media screen and (min-width: 415px) { + .card { + > a { + position: relative; + + .card__img { + border-bottom: 1px solid $base-separation-color; + + > img:not([src]), + > img[src="/headers/original/missing.png"] { + content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); + } + } + + .card__bar { + position: static; + padding-top: 30%; + + .avatar { + position: absolute; + left: 0; + bottom: 0; + + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + + img { + width: 128px; + height: 128px; + + border-radius: 50%; + } + } + + .display-name { + flex: auto; + margin-left: 0; + text-align: center; + } + } + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-dashboard.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-dashboard.scss new file mode 100644 index 000000000..b4303249b --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-dashboard.scss @@ -0,0 +1,30 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.dashboard { + &__counters { + & > div { + & > div, & > a { background: $dashboard-counters-base-color } + + & > a { + &:hover, + &:focus, + &:active { + background: $dashboard-counters-hover-color; + } + } + } + + &__text, + &__num { color: $primary-text-color } + + &__label { color: $primary-lighter1-text-color } + } + + &__widgets { + a:not(.name-tag) { color: $primary-lighter2-text-color } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-directory_tag.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-directory_tag.scss new file mode 100644 index 000000000..9f75646ac --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-directory_tag.scss @@ -0,0 +1,21 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.admin-wrapper { + .content { + .directory__tag { + & > a, + & > div { background: $setting-base-color } + + h4 { + & { color: $primary-lighter2-text-color } + .fa, small { color: $primary-lighter1-text-color } + } + + .trends__item__current { color: $primary-text-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-log.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-log.scss new file mode 100644 index 000000000..672a77c06 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-log.scss @@ -0,0 +1,30 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.log-entry { + .log-entry { + &__header { + color: $primary-lighter2-text-color; + background: $log-entry-color; + + .username, + .target, + a { color: $secondary-text-color } + } + + &__timestamp { color: $primary-lighter1-text-color } + &__icon { color: $icon-color } + + &__extras { + color: $primary-text-color; + background: $log-entry-extra-color; + + .diff-neutral { color: $log-entry-extra--neutral-color } + .diff-old { color: $log-entry-extra--old-color } + .diff-new { color: $log-entry-extra--new-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-report.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-report.scss new file mode 100644 index 000000000..2e198f338 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-report.scss @@ -0,0 +1,75 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.report-card { + background: $setting-content-base-color; + + &__profile__stats { + color: $primary-lighter2-text-color; + + a { + &:focus, + &:hover, + &:active { + color: lighten($primary-lighter2-text-color, 8%); + } + } + } + + &__summary { + &__item { + border-top-color: $base-separation-color; + + &:hover { background: $column-header-hover-color } + + &__reported-by, + &__assigned { + color: $primary-lighter2-text-color; + } + + &__content { + &__icon { color: $icon-color } + a { color: $primary-lighter2-text-color } + } + } + } +} + +.batch-table { + &__toolbar { + background: $base-lighter1-color; + border-color: $base-separation-color; + } + + &__row { + &, &:nth-child(2n) { background: $base-lighter1-color } + &:hover, &:nth-child(2n):hover { background: $column-header-hover-color } + + border-color: $base-separation-color; + + &__content { + .status__content { color: $primary-text-color } + .detailed-status__meta { color: $primary-lighter1-text-color } + + + .accounts-table { // v2.8.0 -> + .accounts-table { + &__count { + & {color: $primary-text-color } + small { color: $primary-lighter1-text-color } + } + } + + td .account { background: inherit } + } + } + } +} + +.speech-bubble { + &__bubble { color: $primary-text-color } + a { color: $secondary-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss new file mode 100644 index 000000000..308c7e6a0 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss @@ -0,0 +1,244 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; +@import 'settings-account'; +@import 'settings-report'; +@import 'settings-log'; +@import 'settings-dashboard'; +@import 'settings-directory_tag'; + + + +body.admin { + color: $primary-text-color; + background: $setting-base-color; + + .sidebar { + &-wrapper { background: inherit } + + ul { + border-radius: 0; + + a { + color: $primary-lighter2-text-color; + border-radius: 0; + + &:hover { + color: $primary-text-color; + background: $setting-lists-hover-color; + } + + &.selected { + color: $primary-text-color; + background: $setting-lists-selected-color; + } + + i.fa { + @include material-icon-large; + margin-right: 8px; + vertical-align: bottom; + } + } + + ul { background: darken($setting-base-color, 4%) } + + .simple-navigation-active-leaf a { + color: $icon-active-color; + background: initial; + + &:hover { background: $setting-lists-hover-color } + } + } + } + + .content { + @include column-shadow; + background: $setting-content-base-color; + + h2, h3, h4, h6 { color: $primary-text-color } + + p { + color: $primary-text-color; + strong { color: $primary-text-color } + } + + h2, h4, hr { border-bottom-color: $base-separation-color } + .muted-hint { color: $primary-lighter1-text-color } + } +} + +.simple_form { + .input { + &.boolean, + &.with_label, + &.with_floating_label { + .label_input > label { color: $primary-text-color } + } + + &.with_block_label { + & > label { color: $primary-text-color } + } + + &.radio_buttons{ + .radio label { color: $primary-text-color } + } + + &-copy { + background: $base-color; + border-color: $base-separation-color; + } + } + + .check_boxes { + .checkbox { + label { color: $primary-text-color } + } + } + + input[type=text], + input[type=number], + input[type=email], + input[type=password], + textarea { + color: $primary-text-color; + background: $setting-content-base-color; + border-color: $base-separation-color; + + &:hover { + border-color: $base-separation-color; + } + + &:active, + &:focus { + background: darken($setting-content-base-color, 8%); + } + } + + select { + color: $primary-text-color; + background-color: $setting-content-base-color; + border-color: $base-separation-color; + } + + .input.field_with_errors { + label, + .error { + color: $error-text-color; + } + } + + .hint, p.hint { + color: $primary-lighter1-text-color !important; + + code { + color: $light-text-color; + background: $setting-emphasis-color; + } + } + + .recommended { + color: $verified-color; + background-color: transparentize($verified-color, 0.75); + border-color: $verified-color; + } + + .label_input { + &__append { color: $primary-lighter1-text-color } + } + + button { + @include button-shadow; + } +} + +.simple_form, +.table-form { + .warning { background: change-color($color: $error-color, $alpha: 0.8) } +} + +.quick-nav { + a { + color: $secondary-text-color; + + &:hover, + &:focus, + &:active { + color: lighten($secondary-text-color, 8%); + } + } +} + +.pagination { + .page, + a { + color: $primary-text-color; + } + + .page { + &.current { + background: $icon-active-color; + color: $light-text-color; + } + } +} + +.filters { + .filter-subset { + strong { color: $primary-text-color } + + a { + color: $primary-lighter2-text-color; + + &:hover { color: $primary-text-color } + + &.selected { + color: $active-text-color; + border-bottom-color: $active-text-color; + } + } + } +} + +.new_form_two_factor_confirmation { + .qr-wrapper { + .qr-code { box-shadow: none } + .qr-alternative { color: $secondary-lighter1-text-color } + } +} + +label, +select#user_setting_default_privacy { + &[for=user_setting_default_privacy_public], + &[for=user_setting_default_privacy_unlisted], + option[value="public"], + option[value="unlisted"] { color: $active-text-color !important } +} + +.column-header__collapsible__extra { + .column-settings__section { color: $primary-text-color } + + .setting-toggle { + .react-toggle { + &.react-toggle--checked { + > .react-toggle-track { background: $setting-toggle-checked-color } + + > .react-toggle-thumb { + border-color: $setting-toggle-checked-color; + background-color: $setting-toggle-thumb-checked-color; + } + } + + > .react-toggle-track { background: $setting-toggle-color } + + > .react-toggle-thumb { + border-color: $setting-toggle-color; + background-color: $setting-toggle-thumb-color; + } + } + + .setting-toggle__label { color: $primary-text-color } + } + + .setting-meta__label { color: $primary-lighter1-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss new file mode 100644 index 000000000..6746032b4 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss @@ -0,0 +1,121 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.status { + @include status-shadow; + @include material-card-radius; + border-bottom: 0; + + transition: box-shadow 0.1s 0s ease-out; + + &.light { + .status { + &__relative-time { color: $primary-lighter1-text-color } + &__display-name { + color: $primary-text-color; + + .display-name__account { color: $primary-lighter1-text-color } + } + + &__content { color: $primary-text-color } + } + } + + &.status-direct { + background: $status-direct-color; + + &:not(.read) { + background: inherit; + border-bottom-color: initial; + } + } + + &.muted { + .status__content { + p { color: lighten($primary-text-color, 20%) } + } + } + + .status { + &__info { + .status__display-name { + color: $primary-lighter1-text-color; + + strong { color: $primary-text-color } + } + + .status__relative-time { color: $primary-lighter1-text-color } + } + } + + &__action-bar__counter__label { color: $primary-lighter1-text-color } +} + +.detailed-status { + &__display-name { + color: $secondary-text-color; + + strong { color: $primary-text-color } + } + + &__meta { + .detailed-status__datetime { color: $primary-lighter1-text-color } + + .detailed-status__link { + .fa.fa-star { vertical-align: middle } + } + } + + &__wrapper { + @include status-shadow; + + .detailed-status { @extend .detailed-status; } + .detailed-status__action-bar { + background: $status-actionbar-color; + border-color: $base-separation-color; + } + } +} + +.status, +.detailed-status { + background: $status-color; + + .status__content { + color: $primary-text-color; + + a { color: $secondary-text-color } + + .status__content__spoiler-link { + color: $primary-text-color; + background: $base-color; + } + } +} + +a.status-card, +a.status-card.compact { + &:hover { background: initial } +} + +.status-card, +.status-card.compact { + border-color: $non-elevated-card-boader; + + &__title { + color : $primary-text-color; + } + + &__host { + color: $primary-lighter1-text-color; + } +} + +.name-tag, +a.name-tag { + color: $secondary-text-color; +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/tables.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/tables.scss new file mode 100644 index 000000000..e71ce7a38 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/tables.scss @@ -0,0 +1,29 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.table { + thead th { border-bottom-color: $base-separation-color } + + th, + td { + color: $primary-text-color; + background-color: $base-color; + border-top: 0; + } + + & > tbody > tr:nth-child(odd) { + & > td, & > th { background: darken($base-color, 4%) } + } + + a { color: $secondary-text-color } +} + +a.table-action-link, +button.table-action-link { + color: $secondary-text-color; + + &:hover { color: darken($secondary-text-color, 8%) } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon.scss b/app/javascript/styles/gplus-theme-for-mastodon.scss new file mode 100644 index 000000000..e233cfbea --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon.scss @@ -0,0 +1,22 @@ +/** + * Google+ Theme for Mastodon v1.1 + * Copyright (C) 2018-2019 Genbu Project + */ + +@charset "UTF-8"; + +@import 'application'; +@import 'gplus-theme-for-mastodon/basics'; +@import 'gplus-theme-for-mastodon/components'; +@import 'gplus-theme-for-mastodon/tables'; +@import 'gplus-theme-for-mastodon/columns'; +@import 'gplus-theme-for-mastodon/lists'; +@import 'gplus-theme-for-mastodon/accounts'; +@import 'gplus-theme-for-mastodon/statuses'; +@import 'gplus-theme-for-mastodon/notifications'; +@import 'gplus-theme-for-mastodon/searches'; +@import 'gplus-theme-for-mastodon/settings'; +@import 'gplus-theme-for-mastodon/icons'; +@import 'gplus-theme-for-mastodon/profile'; +@import 'gplus-theme-for-mastodon/about'; +@import 'gplus-theme-for-mastodon/explore'; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/_mixins.scss b/app/javascript/styles/gplus-theme-for-mastodon/_mixins.scss new file mode 100644 index 000000000..196473f89 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/_mixins.scss @@ -0,0 +1,11 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +@mixin column-shadow { box-shadow: 0 1px 8px 0 $column-header-shadow-color } +@mixin status-shadow { box-shadow: 0 1px 4px 0 $status-shadow-color } +@mixin status-focus-shadow { box-shadow: 0 0 20px 0 $status-focused-shadow-color } +@mixin button-shadow { box-shadow: 0 2px 5px 0 $button-shadow-color } +@mixin material-border { border-radius: 4px } \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/_variables.scss b/app/javascript/styles/gplus-theme-for-mastodon/_variables.scss new file mode 100644 index 000000000..2160a8fc9 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/_variables.scss @@ -0,0 +1,81 @@ +@charset "UTF-8"; + + + +// Base colors +$active-color: #db4437; +$accent-color: #fbbc04; +$valid-color: #4285f4; +$error-color: #d50000; +$checked-color: #4285f4; +$verified-color: #4caf50; + + +// Text colors +$primary-text-color: rgba(0, 0, 0, 0.87); +$primary-lighter1-text-color: change-color($color: $primary-text-color, $lightness: 62%, $alpha: 1.0); // ex: 時間表示 +$primary-lighter2-text-color: change-color($color: $primary-text-color, $lightness: 38%, $alpha: 1.0); // ex: 通知メッセージ表示 +$secondary-text-color: #2962ff; +$secondary-lighter1-text-color: #00bfff; // ex: アカウントTLのユーザーID +$light-text-color: #ffffff; +$light-darker1-text-color: darken($light-text-color, 15%); +$active-text-color: $active-color; +$error-text-color: $error-color; + + +// Icon colors +$icon-color: #757575; +$icon-active-color: $active-color; + + +// Background colors +$base-color: #f1f1f1; +$base-lighter1-color: #ffffff; +$base-darker1-color: rgba(0, 0, 0, 0.4); + +$column-header-color: $base-lighter1-color; +$column-header-hover-color: change-color($color: $column-header-color, $lightness: 90%); + +$status-color: $base-lighter1-color; +$status-direct-color: darken($status-color, 5%); +$status-actionbar-color: change-color($color: $status-color, $lightness: 98%); + +$account-color: $base-lighter1-color; +$account-foreground-color: $base-darker1-color; + +$card-color: $base-lighter1-color; +$card-hover-color: $column-header-hover-color; +$card-image-color: $base-color; + +$form-color: rgba(0, 0, 0, 0.1); +$form-focused-color: lighten($form-color, 20%); +$trend-color: $base-lighter1-color; + +$setting-base-color: $base-color; +$setting-lists-selected-color: darken($base-color, 2%); +$setting-lists-hover-color: darken($base-color, 5%); +$setting-content-base-color: $base-lighter1-color; + +$setting-toggle-color: #b9b9b9; +$setting-toggle-checked-color: change-color($color: $checked-color, $alpha: 0.5); +$setting-toggle-thumb-color: #fafafa; +$setting-toggle-thumb-checked-color: $checked-color; + +$dashboard-counters-base-color: $base-color; +$dashboard-counters-hover-color: lighten($base-color, 2%); + +$explore-header-color: lighten($accent-color, 16%); +$explore-directory-color: $base-lighter1-color; + + +// Shadow colors +$column-header-shadow-color: rgba(0, 0, 0, 0.3); +$status-shadow-color: rgba(0, 0, 0, 0.14); +$status-focused-shadow-color: change-color($color: $status-shadow-color, $alpha: 0.3); +$icon-hovered-shadow-color: rgba(0, 0, 0, 0.26); +$account-header-image-shadow-color: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.46)); +$button-shadow-color: rgba(0, 0, 0, 0.4); + + +// Separation colors +$base-separation-color: rgba(0, 0, 0, 0.14); \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/about.scss b/app/javascript/styles/gplus-theme-for-mastodon/about.scss new file mode 100644 index 000000000..de48883a8 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/about.scss @@ -0,0 +1,138 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +// from mastodon/about.scss +$column-breakpoint: 700px; + + + +.landing-page { + h3, h4, h5, h6 { color: $primary-lighter2-text-color } + p { color: $primary-lighter1-text-color } + em { color: $primary-text-color } + + .column-0 { background: $base-darker1-color } + .column-2 { + .landing-page { + &__information { padding: 0 } + + &__short-description { + & > .row:first-child { + background: $base-darker1-color; + padding: 10px 20px; + } + + & > * { + padding-left: 40px; padding-right: 40px; + &:last-child { padding-bottom: 45px } + + @media screen and (max-width: $column-breakpoint) { + padding-left: 20px; padding-right: 20px; + &:last-child { padding-bottom: 25px } + } + } + } + } + } + + &__forms, + &__information, + &__call-to-action { + @include status-shadow; + background: $column-header-color; + } + + &__forms { + padding: 0; + + & > *:first-child { margin: inherit } + & > * { margin-left: 20px; margin-right: 20px; } + + .brand { background: $base-darker1-color } + + form { + & > .input input { + background: $form-color; + + &:focus { background: $form-focused-color } + } + } + + .separator-or { + margin-left: 20px; margin-right: 20px; + + span { + color: $primary-lighter1-text-color; + background: $column-header-color; + } + } + + @media screen and (max-width: $column-breakpoint) { + background: inherit; + box-shadow: none; + + .separator-or span { background: $base-color } + } + } + + &__information { + color: $primary-lighter1-text-color; + + &.contact-widget { + @include status-shadow; + background: $column-header-color; + + .contact-widget { + &__mail { + a { color: $primary-text-color } + } + } + } + + strong { color: inherit } + + .row:first-child { + h1 small { + color: $light-darker1-text-color; + + span { color: $light-text-color } + } + } + } + + &__call-to-action { + .row__information-board { + .information-board__section { + color: $primary-lighter2-text-color; + + & > span:last-child { color: $primary-lighter1-text-color } + } + } + } + + &__features { + .features-list { + .features-list__row { + .text { color: $primary-lighter1-text-color } + .visual .fa { color: $icon-color } + } + } + } + + &__footer { color: $primary-lighter1-text-color } + + #mastodon-timeline { + color: $primary-text-color; + background: transparent; + + p { + color: $primary-text-color; + + a { color: $secondary-text-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/accounts.scss b/app/javascript/styles/gplus-theme-for-mastodon/accounts.scss new file mode 100644 index 000000000..16bff9ee6 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/accounts.scss @@ -0,0 +1,109 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.account { + background: $account-color; + border-color: $base-separation-color; + + .account { + &__display-name { + color: $secondary-text-color; + + strong { color: $primary-text-color } + } + } +} + +.column { + > .column-back-button { + @include column-shadow; + background: $column-header-color; + } +} + +.account-timeline__header { + .account__header { + background-color: $account-foreground-color; + + > div { background-color: inherit } + + .account__header { + &__username { color: $secondary-lighter1-text-color } + &__fields { @extend .account__header__fields; } + } + + .account--action-button { + .icon-button:not(.active) { + color: darken($light-text-color, 7%); + + &:active, + &:focus, + &:hover { + color: $light-text-color; + } + } + } + } + + .account { + &__disclaimer, + &__action-bar, + &__section-headline { + background: $column-header-color; + border-color: $base-separation-color; + } + + &__action-bar { + &__tab { + border-color: $base-separation-color; + &.active { border-bottom-color: $active-color } + + > span { color: $primary-lighter1-text-color } + } + } + + &__section-headline { + a { + color: $primary-text-color; + + &.active { + color: $primary-lighter1-text-color; + + &::before { border-color: transparent transparent $base-separation-color } + &::after { border-color: transparent transparent $status-color } + } + } + } + } +} + +.account__header__fields { + dl { + border-color: $base-separation-color; + + dt, + dd { + color: $primary-text-color; + background: $column-header-color; + } + + dd { + &.verified { + border-color: transparentize($valid-color, 0.5); + background: transparentize($valid-color, 0.75); + + a { color: lighten($verified-color, 20%) } + } + } + } + + a { color: $secondary-text-color } +} + +.account__action-bar__tab { + strong { color: $primary-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/basics.scss b/app/javascript/styles/gplus-theme-for-mastodon/basics.scss new file mode 100644 index 000000000..a141ecd13 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/basics.scss @@ -0,0 +1,47 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +body { + &, + .ui { + color: $primary-text-color; + background: $base-color; + } +} + +.focusable { + &:focus { + background: inherit; + + .status { + @include status-focus-shadow; + + &.status-direct { background: $status-direct-color } + } + + .detailed-status { + & { background: $status-color } + &__action-bar { background: $status-actionbar-color } + } + } +} + +::-webkit-scrollbar-thumb { + background: darken($base-lighter1-color, 12%); + + &:hover { background: darken($base-lighter1-color, 16%) } + &:active { background: darken($base-lighter1-color, 12%) } +} + +::-webkit-scrollbar-track { + background: $base-color; + + &:hover, + &:active { + background: darken($base-lighter1-color, 8%); + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/columns.scss b/app/javascript/styles/gplus-theme-for-mastodon/columns.scss new file mode 100644 index 000000000..9086e30bc --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/columns.scss @@ -0,0 +1,197 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.tabs-bar { + margin: 0; + background: $column-header-color; + + .tabs-bar { + &__link { + color: $icon-color; + + .fa { vertical-align: top } + } + } +} + +.drawer { + .drawer { + &__header { + @include column-shadow; + background: $column-header-color; + + .drawer__tab { color: $icon-color } + + a { + &:hover { background: $column-header-hover-color } + } + } + + &__pager { + @include status-shadow; + + .drawer__inner { + background: $column-header-color; + + &__mastodon { display: none } + } + } + } +} + +.navigation-bar { + color: $secondary-text-color; + background: $column-header-color; + + .navigation-bar { + &__profile { + strong { color: $primary-text-color } + &-edit { color: $secondary-text-color } + } + } +} + +.compose-form { + .compose-form { + &__buttons-wrapper { background: $column-header-color } + &__publish { border-top: 1px solid $base-separation-color } + } +} + +.column { + .column-header { + @include column-shadow; + background: $column-header-color; + + &.active { + .column-header__icon { + color: $icon-active-color; + text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); + } + } + + * { background: inherit } + + &__icon { + color: $icon-color; + vertical-align: top; + } + + &__buttons { + .column-header { + &__back-button { + .column-back-button__icon { vertical-align: unset } + } + + &__button { + &.active { + color: $icon-active-color; + background: inherit; + } + + .fa { vertical-align: unset } + } + } + } + + &__collapsible { + color: $secondary-text-color; + border-bottom: 1px solid $base-separation-color; + + &-inner { background: $column-header-color } + } + } + + .column-back-button { + &__icon { vertical-align: unset } + } + + .column { + &-subheading { background: darken($base-color, 10%) } + + &-link { + color: $primary-text-color; + background: $base-color; + + &__icon { + color: $icon-color; + vertical-align: top; + } + } + } + + .scrollable { + background: transparent; + + *[role="feed"] { + article { + margin: 1em 0; + &:first-of-type { margin: 0 } + } + } + + div[tabindex="-1"] { margin-bottom: 1em } + } + + .notification__filter-bar { + background: $column-header-color; + border-bottom-color: $base-separation-color; + + button { + color: $icon-color; + background: $column-header-color; + + &.active { + color: $icon-active-color; + + &::before { border-color: transparent transparent $base-separation-color } + &::after { border-color: transparent transparent $column-header-color } + } + } + } + + .empty-column-indicator { + flex-direction: column; + background: $base-color; + + &::before { + content: ""; + display: block; + + width: 100px; + height: 100px; + margin-bottom: 1em; + + background: none center / contain no-repeat; + background-image: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/notification-jingle_2x.gif"); + } + } +} + +.getting-started { + &__wrapper, + & { + background: $base-color; + } + + & { + border-top: 1px solid $base-separation-color; + + a { color: $primary-text-color } + } +} + +.load { + &-more, + &-gap { + background: transparent; + + &:hover { background: darken($column-header-color, 10%) } + } + + &-gap { border: 0 } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/components-button.scss b/app/javascript/styles/gplus-theme-for-mastodon/components-button.scss new file mode 100644 index 000000000..ef50ce863 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/components-button.scss @@ -0,0 +1,11 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.floating-action-button { + font-size: 24px; + background: $active-color; +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/components-card.scss b/app/javascript/styles/gplus-theme-for-mastodon/components-card.scss new file mode 100644 index 000000000..cc6bf2808 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/components-card.scss @@ -0,0 +1,37 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.card { + border: 1px solid $base-separation-color; + + > a { + @include status-shadow; + + &:hover, + &:focus, + &:active { + .card__bar { + background: initial; + + .display-name strong { color: $secondary-text-color } + } + } + + .card__img { background: $card-image-color } + .card__bar { + background: $card-color; + + .avatar { + img { background: transparent } + } + + .display-name { + strong { color: $primary-text-color } + span { color: $primary-lighter2-text-color } + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/components-dropdown.scss b/app/javascript/styles/gplus-theme-for-mastodon/components-dropdown.scss new file mode 100644 index 000000000..afc55f95f --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/components-dropdown.scss @@ -0,0 +1,42 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.dropdown-menu, +.actions-modal > ul { + @include material-border; + background: $base-lighter1-color; + + .dropdown-menu { + &__arrow { + &.top { border-top-color: $column-header-color } + &.bottom { border-bottom-color: $column-header-color } + } + + &__item { + a { + color: $primary-lighter2-text-color; + + padding: 8px 16px; + background: $column-header-color; + + &:active, + &:focus, + &:hover { + background: $column-header-hover-color; + } + } + } + + &__separator { border-bottom-color: $base-separation-color } + } + + & > li:not(:empty) { + @extend .dropdown-menu__item; + + a { padding: 12px 16px } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/components.scss b/app/javascript/styles/gplus-theme-for-mastodon/components.scss new file mode 100644 index 000000000..2b0e8a816 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/components.scss @@ -0,0 +1,5 @@ +@charset "UTF-8"; + +@import 'components-button'; +@import 'components-card'; +@import 'components-dropdown'; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/explore.scss b/app/javascript/styles/gplus-theme-for-mastodon/explore.scss new file mode 100644 index 000000000..7d4726790 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/explore.scss @@ -0,0 +1,38 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.public-layout { + .page-header { + background: $explore-header-color; + + h1 { color: $primary-text-color } + p { color: $primary-lighter2-text-color } + } + + .directory { + background: $explore-directory-color; + + .accounts-table { + &__count { + color: $primary-lighter2-text-color; + small { color: $primary-lighter1-text-color } + } + } + + &__tag { + a { background: $explore-directory-color } + h4 { color: $primary-text-color } + .fa, small { color: $primary-lighter1-text-color } + } + } + + .notice-widget { + color: $primary-lighter1-text-color; + background: $explore-directory-color; + + a { color: $secondary-text-color } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/icons.scss b/app/javascript/styles/gplus-theme-for-mastodon/icons.scss new file mode 100644 index 000000000..0125172ad --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/icons.scss @@ -0,0 +1,97 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +@function hex-color($color) { + @if type-of($color) == 'color' { + $color: str-slice(ie-hex-str($color), 4); + } + + @return '%23' + unquote($color) +}; + + + +@font-face { + font-family: "Material Icons Extended"; + src: + local("Material Icons Extended"), + url("https://fonts.gstatic.com/s/materialiconsextended/v50/kJEjBvgX7BgnkSrUwT8UnLVc38YydejYY-oE_LvJ.woff2"), + url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/font-Material_Icons_Extended-v50.woff2"); +} + +.icon-button { + color: $icon-color; + + &:active, + &:focus, + &:hover { + color: lighten($icon-color, 7%); + } + + &.star-icon { + &.active { + color: $light-text-color; + background: $icon-active-color; + border-radius: 50%; + } + + .fa.fa-star { vertical-align: top } + } + + &.disabled { + color: lighten($icon-color, 13%); + + .fa.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + } + } + + .fa { + vertical-align: middle; + + &.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); + + &:active, + &:hover, + &:focus { + background-image: url("data:image/svg+xml;utf8,"); + } + } + } +} + +.fa { + &.fa-users, + &.fa-globe, + &.fa-cog, + &.fa-star, + &.fa-home, + &.fa-bell, + &.fa-eraser, + &.fa-ellipsis-h, + &.fa-ellipsis-v, + &.fa-address-book, + &.fa-thumb-tack, + &.fa-lock, + &.fa-pencil { + font-family: "Material Icons Extended"; + } + + &.fa-users::before { content: "people" } // 人々マーク(.drawer__header > .drawer__tab:2) + &.fa-globe::before { content: "" } // 地球マーク(.drawer__header > .drawer__tab:3) + &.fa-cog::before { content: "settings" } // 歯車マーク(.drawer__header > .drawer__tab:4) + &.fa-star::before { content: "plus_one" } // +1(.status .status__action-bar > .star-icon) + &.fa-home::before { content: "home" } // 家マーク(ホームタイムライン) + &.fa-bell::before { content: "" } // ベルマーク(通知) + &.fa-eraser::before { content: "" } // 通知を消去のマーク + &.fa-ellipsis-h::before { content: "" } // 三点リーダー(横) + &.fa-ellipsis-v::before { content: "" } // 三点リーダー(縦) + &.fa-address-book::before { content: "" } // discoverマーク(explore遷移タブ) + &.fa-thumb-tack::before { content: "" } // ピンマーク(ピン留め投稿) + &.fa-lock::before { content: "" } // サークルマーク(フォロワー限定投稿) + &.fa-pencil::before { content: "" } // 鉛筆マーク(モバイル用フローティングボタン) +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/lists.scss b/app/javascript/styles/gplus-theme-for-mastodon/lists.scss new file mode 100644 index 000000000..eb770001e --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/lists.scss @@ -0,0 +1,34 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.column { + .column-back-button { background: inherit } + + .column-inline-form { + background: $column-header-color; + + label input { + color: $secondary-text-color; + &:focus { color: $primary-text-color } + } + } + + .column-inline-form ~ .scrollable { + article { margin: 0 } + } +} + +.modal-root { + .list-editor { + background: $base-color; + + h4 { background: $column-header-color } + + .drawer__pager { + .drawer__inner { background: $column-header-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/notifications.scss b/app/javascript/styles/gplus-theme-for-mastodon/notifications.scss new file mode 100644 index 000000000..bab098372 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/notifications.scss @@ -0,0 +1,27 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.notification { + &.notification-favourite { + .status { + &.status-direct { background: transparent } + } + } + + > .notification__message { + color: $primary-lighter2-text-color; + font-size: 13px; + padding: 8px 0; + + .notification__display-name { + &:hover { color: inherit } + } + + .notification__favourite-icon-wrapper { + .star-icon { color: $icon-active-color } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/profile.scss b/app/javascript/styles/gplus-theme-for-mastodon/profile.scss new file mode 100644 index 000000000..2bfa60c45 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/profile.scss @@ -0,0 +1,231 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.public-layout { + a.button { + @include button-shadow; + + color: $primary-text-color; + background: $base-lighter1-color; + + &:hover, + &:focus, + &:active { + background: darken($base-lighter1-color, 8%); + } + } + + .logo-button { + svg path { + /* Only for Itabashi-don */ + &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } + &:last-child { fill: $base-lighter1-color !important } + } + } + + .public-account-header { + @include status-shadow; + + &__image { + background: $base-lighter1-color; + + @media screen and (min-width: 600px) { height: 500px } + + &::after { + position: absolute; + top: auto; + left: 0; + bottom: 0; + + width: 100%; + height: 30%; + background: $account-header-image-shadow-color; + box-shadow: none; + } + + > img:not([src]), + > img[src="/headers/original/missing.png"] { + content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); + } + } + + &__bar { + @media screen and (max-width: 600px) { + flex-direction: column; + background: $base-color; + } + + @media screen and (min-width: 600px) { margin-top: -140px } + + &::before { background: $base-lighter1-color } + + .avatar { + @media screen and (max-width: 600px) { + position: relative; + bottom: 30px; + + display: initial; + width: 60px; + height: 60px; + margin: 0 auto; + padding: 0; + } + + img { + border: 2px solid $base-lighter1-color; + border-radius: 50%; + background: transparent; + } + } + } + + &__tabs { + @media screen and (max-width: 600px) { + flex-wrap: wrap; + margin-left: 0; + + &__name { + width: 100%; + text-align: center; + + h1 { + color: $primary-text-color; + + small { color: $primary-lighter1-text-color } + } + } + + &__tabs { + justify-content: center; + flex: auto; + + .spacer { display: none } + + a.button.logo-button { + color: $light-text-color; + background: $secondary-text-color; + + svg path { + /* Only for Itabashi-don */ + &:not(#Mastodon):not(#Itabashi) { fill: $base-lighter1-color !important } + &:last-child { fill: $secondary-text-color !important } + } + } + } + } + + .details-counters { + .counter { + color: $light-text-color; + border-right: 0; + + &::after { border-bottom-color: $base-color } + + &.active { + &::after { border-bottom-color: $active-color } + } + } + } + } + + &__extra { + .public-account-bio { + .account__header__content { text-align: center } + } + + &__links { + color: $primary-text-color; + + a { + &, strong { color: $primary-text-color } + } + } + } + } + + .public-account-bio { + @include column-shadow; + background: $base-lighter1-color; + + .account__header__content { color: $primary-text-color } + &__extra { color: $primary-lighter1-text-color } + } + + .endorsements-widget { + @include column-shadow; + + padding-bottom: 0; + border-radius: 4px; + + h4 { + color: $primary-lighter1-text-color; + background: $base-lighter1-color; + } + } + + .hero-widget { + @include column-shadow; + + &__img { background: $base-color } + &__text { + background: $base-lighter1-color; + + &, em { color: $primary-lighter2-text-color } + a { color: $secondary-text-color } + } + } + + .account__section-headline { + background: $base-lighter1-color; + border-bottom-color: $base-separation-color; + + a { + color: $primary-lighter1-text-color; + + &.active { + color: $primary-lighter2-text-color; + + &::before { border-color: transparent transparent $base-separation-color } + &::after { border-color: transparent transparent $status-color } + } + } + } + + .activity-stream { + box-shadow: none; + + .entry { + margin: 1em 0; + background: transparent; + + &:first-of-type { margin: 0 } + } + } + + .nothing-here { + @include status-shadow; + + color: $primary-lighter1-text-color; + background: $base-lighter1-color; + } + + .footer { + h4 { color: $primary-lighter1-text-color } + + ul { + a { color: $primary-lighter2-text-color } + } + + .brand { + svg path { + /* Only for Itabashi-don */ + &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } + &:last-child { fill: $base-lighter1-color !important } + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/searches.scss b/app/javascript/styles/gplus-theme-for-mastodon/searches.scss new file mode 100644 index 000000000..b4478b91b --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/searches.scss @@ -0,0 +1,41 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.search { + .search { + &__input { + @include material-border; + + color: $primary-text-color; + background: $form-color; + + &:focus { background: $form-focused-color } + } + + &__icon { + .fa { color: $icon-color } + } + } + + &-results { + > .search-results { + &__header { background: $base-color } + &__section { + > h5 { background: darken($base-color, 10%) } + } + } + } +} + +.trends__item { + background: $trend-color; + + .trends__item { + &__name a { color: $secondary-text-color } + &__current { color: lighten($secondary-text-color, 10%) } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/settings-account.scss b/app/javascript/styles/gplus-theme-for-mastodon/settings-account.scss new file mode 100644 index 000000000..d069af381 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/settings-account.scss @@ -0,0 +1,44 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.edit_account { + @media screen and (min-width: 415px) { + .card { + > a { + position: relative; + + .card__img { border-bottom: 1px solid $base-separation-color } + .card__bar { + position: static; + padding-top: 30%; + + .avatar { + position: absolute; + left: 0; + bottom: 0; + + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + + img { + width: 128px; + height: 128px; + } + } + + .display-name { + flex: auto; + margin-left: 0; + text-align: center; + } + } + } + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/settings-dashboard.scss b/app/javascript/styles/gplus-theme-for-mastodon/settings-dashboard.scss new file mode 100644 index 000000000..0e9c55136 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/settings-dashboard.scss @@ -0,0 +1,28 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.dashboard { + &__counters { + & > div { + & > div, & > a { background: $dashboard-counters-base-color } + + & > a { + &:hover, + &:focus, + &:active { + background: $dashboard-counters-hover-color; + } + } + } + + &__num { color: $primary-text-color } + &__label { color: $primary-lighter1-text-color } + } + + &__widgets { + a:not(.name-tag) { color: $primary-lighter2-text-color } + } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/settings-report.scss b/app/javascript/styles/gplus-theme-for-mastodon/settings-report.scss new file mode 100644 index 000000000..7912d1ddc --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/settings-report.scss @@ -0,0 +1,63 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.report-card { + background: $setting-content-base-color; + + &__profile__stats { + color: $primary-lighter2-text-color; + + a { + &:focus, + &:hover, + &:active { + color: lighten($primary-lighter2-text-color, 8%); + } + } + } + + &__summary { + &__item { + border-top-color: $base-separation-color; + + &:hover { background: $column-header-hover-color } + + &__reported-by, + &__assigned { + color: $primary-lighter2-text-color; + } + + &__content { + &__icon { color: $icon-color } + a { color: $primary-lighter2-text-color } + } + } + } +} + +.batch-table { + &__toolbar { + background: $base-lighter1-color; + border-color: $base-separation-color; + } + + &__row { + background: $base-lighter1-color; + border-color: $base-separation-color; + + &:hover { background: $column-header-hover-color } + + &__content { + .status__content { color: $primary-text-color } + .detailed-status__meta { color: $primary-lighter1-text-color } + } + } +} + +.speech-bubble { + &__bubble { color: $primary-text-color } + a { color: $secondary-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/settings.scss b/app/javascript/styles/gplus-theme-for-mastodon/settings.scss new file mode 100644 index 000000000..752d2c662 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/settings.scss @@ -0,0 +1,208 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; +@import 'settings-account'; +@import 'settings-report'; +@import 'settings-dashboard'; + + + +body.admin { + color: $primary-text-color; + background: $setting-base-color; + + .sidebar { + &-wrapper { background: inherit } + + ul { + border-radius: 0; + + a { + color: $primary-lighter2-text-color; + border-radius: 0; + + &:hover { + color: $primary-text-color; + background: $setting-lists-hover-color; + } + + &.selected { + color: $primary-text-color; + background: $setting-lists-selected-color; + } + } + + ul { background: darken($setting-base-color, 4%) } + + .simple-navigation-active-leaf a { + color: $icon-active-color; + background: initial; + + &:hover { background: $setting-lists-hover-color } + } + } + } + + .content { + @include column-shadow; + background: $setting-content-base-color; + + h2, h3, h4, h6 { color: $primary-text-color } + + p { + color: $primary-text-color; + strong { color: $primary-text-color } + } + + h2, h4, hr { border-bottom-color: $base-separation-color } + .muted-hint { color: $primary-lighter1-text-color } + } +} + +.simple_form { + .input { + &.boolean, + &.with_label, + &.with_floating_label { + .label_input > label { color: $primary-text-color } + } + + &.with_block_label { + & > label { color: $primary-text-color } + } + + &.radio_buttons{ + .radio label { color: $primary-text-color } + } + + &-copy { background: $base-color } + } + + .check_boxes { + .checkbox { + label { color: $primary-text-color } + } + } + + input[type=text], + input[type=number], + input[type=email], + input[type=password], + textarea { + color: $primary-text-color; + background: $setting-content-base-color; + border-color: $base-separation-color; + + &:hover { + border-color: $base-separation-color; + } + + &:active, + &:focus { + background: darken($setting-content-base-color, 8%); + } + } + + select { + color: $primary-text-color; + background-color: $setting-content-base-color; + border-color: $base-separation-color; + } + + .input.field_with_errors { + label, + .error { + color: $error-text-color; + } + } + + .hint, p.hint { color: $primary-lighter1-text-color !important } + + .label_input { + &__append { color: $primary-lighter1-text-color } + } +} + +.simple_form, +.table-form { + .warning { background: change-color($color: $error-color, $alpha: 0.8) } +} + +.quick-nav { + a { + color: $secondary-text-color; + + &:hover, + &:focus, + &:active { + color: lighten($secondary-text-color, 8%); + } + } +} + +.pagination { + .page, + a { + color: $primary-text-color; + } + + .page { + &.current { + background: $icon-active-color; + color: $light-text-color; + } + } +} + +.filters { + .filter-subset { + strong { color: $primary-text-color } + + a { + color: $primary-lighter2-text-color; + + &:hover { color: $primary-text-color } + + &.selected { + color: $active-text-color; + border-bottom-color: $active-text-color; + } + } + } +} + +label { + &[for=user_setting_default_privacy_public], + &[for=user_setting_default_privacy_unlisted] { + color: $active-text-color !important; + } +} + +.column-header__collapsible__extra { + .column-settings__section { color: $primary-text-color } + + .setting-toggle { + .react-toggle { + &.react-toggle--checked { + > .react-toggle-track { background: $setting-toggle-checked-color } + + > .react-toggle-thumb { + border-color: $setting-toggle-checked-color; + background-color: $setting-toggle-thumb-checked-color; + } + } + + > .react-toggle-track { background: $setting-toggle-color } + + > .react-toggle-thumb { + border-color: $setting-toggle-color; + background-color: $setting-toggle-thumb-color; + } + } + + .setting-toggle__label { color: $primary-text-color } + } + + .setting-meta__label { color: $primary-lighter1-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/statuses.scss b/app/javascript/styles/gplus-theme-for-mastodon/statuses.scss new file mode 100644 index 000000000..0532a0b90 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/statuses.scss @@ -0,0 +1,107 @@ +@charset "UTF-8"; + +@import 'variables'; +@import 'mixins'; + + + +.status { + @include status-shadow; + border-bottom: 0; + + transition: box-shadow 0.1s 0s ease-out; + + &.light { + .status { + &__relative-time { color: $primary-lighter1-text-color } + &__display-name { + color: $primary-text-color; + + .display-name__account { color: $primary-lighter1-text-color } + } + + &__content { color: $primary-text-color } + } + } + + &.status-direct { + background: $status-direct-color; + + &:not(.read) { + background: inherit; + border-bottom-color: initial; + } + } + + &.muted { + .status__content { + p { color: lighten($primary-text-color, 20%) } + } + } + + .status { + &__info { + .status__display-name { + color: $primary-lighter1-text-color; + + strong { color: $primary-text-color } + } + + .status__relative-time { color: $primary-lighter1-text-color } + } + } +} + +.detailed-status { + .detailed-status { + &__display-name { + color: $secondary-text-color; + + strong { color: $primary-text-color } + } + + &__meta { + .detailed-status__datetime { color: $primary-lighter1-text-color } + + .detailed-status__link { + .fa.fa-star { vertical-align: middle } + } + } + } + + &__wrapper { + @include status-shadow; + + .detailed-status { @extend .detailed-status; } + .detailed-status__action-bar { + background: $status-actionbar-color; + border-color: $base-separation-color; + } + } +} + +.status, +.detailed-status { + background: $status-color; + + .status__content { + color: $primary-text-color; + + a { color: $secondary-text-color } + + .status__content__spoiler-link { + color: $primary-text-color; + background: $base-color; + } + } +} + +a.status-card, +a.status-card.compact { + &:hover { background: initial } +} + +.name-tag, +a.name-tag { + color: $secondary-text-color; +} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/tables.scss b/app/javascript/styles/gplus-theme-for-mastodon/tables.scss new file mode 100644 index 000000000..e71ce7a38 --- /dev/null +++ b/app/javascript/styles/gplus-theme-for-mastodon/tables.scss @@ -0,0 +1,29 @@ +@charset "UTF-8"; + +@import 'variables'; + + + +.table { + thead th { border-bottom-color: $base-separation-color } + + th, + td { + color: $primary-text-color; + background-color: $base-color; + border-top: 0; + } + + & > tbody > tr:nth-child(odd) { + & > td, & > th { background: darken($base-color, 4%) } + } + + a { color: $secondary-text-color } +} + +a.table-action-link, +button.table-action-link { + color: $secondary-text-color; + + &:hover { color: darken($secondary-text-color, 8%) } +} \ No newline at end of file diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index 59cfbba17..20a609a77 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -5,12 +5,14 @@ base_host = Rails.configuration.x.web_domain assets_host = Rails.configuration.action_controller.asset_host assets_host ||= "http#{Rails.configuration.x.use_https ? 's' : ''}://#{base_host}" +google_font_host = "https://fonts.gstatic.com" +gplus_theme_host = "https://raw.githubusercontent.com" Rails.application.config.content_security_policy do |p| p.base_uri :none p.default_src :none p.frame_ancestors :none - p.font_src :self, assets_host + p.font_src :self, assets_host, google_font_host p.img_src :self, :https, :data, :blob, assets_host p.style_src :self, :unsafe_inline, assets_host p.media_src :self, :https, :data, assets_host diff --git a/config/locales/en.yml b/config/locales/en.yml index 786906e2d..7b704f667 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1056,6 +1056,10 @@ en: contrast: Mastodon (High contrast) default: Mastodon (Dark) mastodon-light: Mastodon (Light) + google-plus: Google+ + google-plus-dev: Google+ Dev + dark-google-plus-dev: Dark Google+ Dev + time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 1ff5a2b63..65f66fa92 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -987,6 +987,9 @@ ja: contrast: Mastodon (ハイコントラスト) default: Mastodon (ダーク) mastodon-light: Mastodon (ライト) + google-plus: Google+ + google-plus-dev: Google+ Dev + dark-google-plus-dev: Dark Google+ Dev time: formats: default: "%Y年%m月%d日 %H:%M" diff --git a/config/themes.yml b/config/themes.yml index 9c21c9459..ff2639be1 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,3 +1,6 @@ default: styles/application.scss contrast: styles/contrast.scss mastodon-light: styles/mastodon-light.scss +google-plus: styles/gplus-theme-for-mastodon.scss +google-plus-dev: styles/gplus-theme-for-mastodon-dev.scss +dark-google-plus-dev: styles/dark-gplus-theme-for-mastodon-dev.scss From 45cb583c54fb2c48d8d24f1c6fa3451512c4df4a Mon Sep 17 00:00:00 2001 From: Rintan Date: Wed, 14 Aug 2019 22:23:40 +0900 Subject: [PATCH 014/200] =?UTF-8?q?=E3=83=80=E3=83=BC=E3=82=AF=E3=83=86?= =?UTF-8?q?=E3=83=BC=E3=83=9E=E3=81=AE=E4=BF=AE=E6=AD=A3=E3=80=81v2.9.x?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E5=AF=BE=E5=BF=9C=E3=81=AA=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_variables.scss | 2 +- .../columns.scss | 69 +++++++++++++++++-- .../components-button.scss | 5 +- .../icons.scss | 16 ++++- .../gplus-theme-for-mastodon-dev/columns.scss | 69 +++++++++++++++++-- .../components-button.scss | 5 +- .../gplus-theme-for-mastodon-dev/icons.scss | 16 ++++- 7 files changed, 167 insertions(+), 15 deletions(-) diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss index 9f5098b22..6907a668f 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss @@ -29,7 +29,7 @@ $icon-active-color: $active-color; // Background colors -$base-color: #212121; +$base-color: #121212; $base-lighter1-color: #2d2d2d; $base-darker1-color: #000000; diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss index 9e5cd2621..8fbd6be10 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss @@ -6,9 +6,10 @@ .tabs-bar { - @include column-shadow; margin: 0; background: $column-header-color; + position: relative; + z-index: 2; .tabs-bar { &__link { @@ -99,6 +100,7 @@ .column-header { @include column-shadow; background: $column-header-color; + z-index: 1; &.active { .column-header__icon { @@ -121,9 +123,9 @@ .column-header { &__back-button { - .column-back-button__icon { vertical-align: unset } + .column-back-button__icon { vertical-align: bottom } } - + &__button { &.active { color: $icon-active-color; @@ -143,7 +145,7 @@ &__collapsible { color: $secondary-text-color; border-bottom: 1px solid $base-separation-color; - + &-inner { background: $column-header-color } } } @@ -158,7 +160,10 @@ .column { &-subheading, - &-link__badge { background: $base-color } + &-link__badge { + background: $base-color; + color: $secondary-text-color; + } &-link { color: $primary-text-color; @@ -223,6 +228,60 @@ } } +// v2.9.0以降 +.column-header { + @include column-shadow; + background: $column-header-color; + z-index: 1; + + &.active { + .column-header__icon { + color: $icon-active-color; + text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); + } + } + + * { background: inherit } + + &__icon { + @include material-icon-large; + color: $icon-color; + vertical-align: bottom; + margin-right: 10px; + } + + &__buttons { + height: 50px; + + .column-header { + &__back-button { + .column-back-button__icon { vertical-align: bottom } + } + + &__button { + &.active { + color: $icon-active-color; + background: inherit; + } + + .fa { vertical-align: unset } + } + } + } + + &__button { + color: $icon-color; + padding: 0 16px; + } + + &__collapsible { + color: $secondary-text-color; + border-bottom: 1px solid $base-separation-color; + + &-inner { background: $column-header-color } + } +} + .getting-started { &__wrapper, & { diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss index 42d4f8db8..2b6644215 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss @@ -25,7 +25,10 @@ @include material-card-radius; background-color: $active-button-color; - .text-icon-button { color: $primary-lighter1-text-color } + .text-icon-button { + color: $primary-lighter1-text-color; + border-radius: 50%; + } } .modal-root { diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss index 825d18dac..d28fa367d 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss @@ -24,11 +24,13 @@ .icon-button { color: $icon-color; + border-radius: 50%; &:active, &:focus, &:hover { color: lighten($icon-color, 7%); + background-color: $column-header-hover-color; } &.star-icon { @@ -116,7 +118,13 @@ &.fa-chevron-down, &.fa-bars, &.fa-navicon, - &.fa-reorder { + &.fa-reorder, + &.fa-desktop, + &.fa-code, + &.fa-list, + &.fa-paperclip, + &.fa-plus, + &.fa-bullhorn { font-family: "Material Icons Extended"; } @@ -167,6 +175,12 @@ &.fa-bars::before { content: "menu" } //ハンバーガーボタン &.fa-navicon::before { content: "menu" } //ハンバーガーボタン &.fa-reorder::before { content: "menu" } //ハンバーガーボタン + &.fa-desktop::before { content: "desktop-windows" } //外観設定のアイコン + &.fa-code::before { content: "code" } //開発アイコン + &.fa-list::before { content: "list" } //リストアイコン + &.fa-paperclip::before { content: "attach_file" } //メディアを追加のアイコン + &.fa-plus::before { content: "add" } // 追加ボタン + &.fa-bullhorn::before { content: "announcement"} //Adminからのお知らせ(一部サーバーのみ) } .fa { diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss index 6a0239562..8fbd6be10 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss @@ -6,9 +6,10 @@ .tabs-bar { - @include column-shadow; margin: 0; background: $column-header-color; + position: relative; + z-index: 2; .tabs-bar { &__link { @@ -99,6 +100,7 @@ .column-header { @include column-shadow; background: $column-header-color; + z-index: 1; &.active { .column-header__icon { @@ -121,9 +123,9 @@ .column-header { &__back-button { - .column-back-button__icon { vertical-align: unset } + .column-back-button__icon { vertical-align: bottom } } - + &__button { &.active { color: $icon-active-color; @@ -143,7 +145,7 @@ &__collapsible { color: $secondary-text-color; border-bottom: 1px solid $base-separation-color; - + &-inner { background: $column-header-color } } } @@ -158,7 +160,10 @@ .column { &-subheading, - &-link__badge { background: darken($base-color, 10%) } + &-link__badge { + background: $base-color; + color: $secondary-text-color; + } &-link { color: $primary-text-color; @@ -223,6 +228,60 @@ } } +// v2.9.0以降 +.column-header { + @include column-shadow; + background: $column-header-color; + z-index: 1; + + &.active { + .column-header__icon { + color: $icon-active-color; + text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); + } + } + + * { background: inherit } + + &__icon { + @include material-icon-large; + color: $icon-color; + vertical-align: bottom; + margin-right: 10px; + } + + &__buttons { + height: 50px; + + .column-header { + &__back-button { + .column-back-button__icon { vertical-align: bottom } + } + + &__button { + &.active { + color: $icon-active-color; + background: inherit; + } + + .fa { vertical-align: unset } + } + } + } + + &__button { + color: $icon-color; + padding: 0 16px; + } + + &__collapsible { + color: $secondary-text-color; + border-bottom: 1px solid $base-separation-color; + + &-inner { background: $column-header-color } + } +} + .getting-started { &__wrapper, & { diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss index 42d4f8db8..2b6644215 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss @@ -25,7 +25,10 @@ @include material-card-radius; background-color: $active-button-color; - .text-icon-button { color: $primary-lighter1-text-color } + .text-icon-button { + color: $primary-lighter1-text-color; + border-radius: 50%; + } } .modal-root { diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss index 825d18dac..d28fa367d 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss @@ -24,11 +24,13 @@ .icon-button { color: $icon-color; + border-radius: 50%; &:active, &:focus, &:hover { color: lighten($icon-color, 7%); + background-color: $column-header-hover-color; } &.star-icon { @@ -116,7 +118,13 @@ &.fa-chevron-down, &.fa-bars, &.fa-navicon, - &.fa-reorder { + &.fa-reorder, + &.fa-desktop, + &.fa-code, + &.fa-list, + &.fa-paperclip, + &.fa-plus, + &.fa-bullhorn { font-family: "Material Icons Extended"; } @@ -167,6 +175,12 @@ &.fa-bars::before { content: "menu" } //ハンバーガーボタン &.fa-navicon::before { content: "menu" } //ハンバーガーボタン &.fa-reorder::before { content: "menu" } //ハンバーガーボタン + &.fa-desktop::before { content: "desktop-windows" } //外観設定のアイコン + &.fa-code::before { content: "code" } //開発アイコン + &.fa-list::before { content: "list" } //リストアイコン + &.fa-paperclip::before { content: "attach_file" } //メディアを追加のアイコン + &.fa-plus::before { content: "add" } // 追加ボタン + &.fa-bullhorn::before { content: "announcement"} //Adminからのお知らせ(一部サーバーのみ) } .fa { From 94dd22e12f0e7aaf5b398e808b7441835093d04b Mon Sep 17 00:00:00 2001 From: YoheiZuho Date: Thu, 15 Aug 2019 00:34:59 +0000 Subject: [PATCH 015/200] =?UTF-8?q?=E5=88=9D=E6=9C=9F=E3=82=A2=E3=83=90?= =?UTF-8?q?=E3=82=BF=E3=83=BC=E3=82=92=E6=97=A7=E6=9D=A5=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/avatars/original/missing.png | Bin 3292 -> 23108 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/avatars/original/missing.png b/public/avatars/original/missing.png index 34c8e45e61ce1e1ddeb6a9f69dc1979816a7286e..fb27b84df87468af256ff6ed33af0f06576fdfdf 100644 GIT binary patch literal 23108 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 T1m@pU{u3x2G_pqP0p|YzWF96{ From e3809d241727e13d4d017df71f98104894fcdb5e Mon Sep 17 00:00:00 2001 From: Rintan Date: Fri, 16 Aug 2019 19:16:50 +0900 Subject: [PATCH 016/200] =?UTF-8?q?=E3=82=B7=E3=83=B3=E3=82=B0=E3=83=AB?= =?UTF-8?q?=E3=82=AB=E3=83=A9=E3=83=A0=E3=81=A7=E3=81=AE=E4=B8=AD=E5=A4=AE?= =?UTF-8?q?=E5=AF=84=E3=81=9B=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/javascript/styles/mastodon/components.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index a7cbca4b5..f4ad094c8 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1875,7 +1875,7 @@ a.account__display-name { } &__inner { - position: fixed; + position: static; width: 285px; pointer-events: auto; height: 100%; From 2d25a56a7aea624017d2bc847636408f41c5e224 Mon Sep 17 00:00:00 2001 From: Rintan Date: Sat, 17 Aug 2019 17:17:38 +0900 Subject: [PATCH 017/200] =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88=E3=81=A7?= =?UTF-8?q?=E3=81=AE=E3=83=90=E3=82=B0=E4=BF=AE=E6=AD=A3=20=E5=BD=B1?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3=20UI=E5=AF=86=E5=BA=A6=E3=81=AE?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=20=E3=81=9D=E3=81=AE=E4=BB=96=E3=81=9F?= =?UTF-8?q?=E3=81=8F=E3=81=95=E3=82=93=E3=81=AE=E4=BF=AE=E6=AD=A3=E3=81=AA?= =?UTF-8?q?=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_variables.scss | 1 + .../accounts.scss | 5 +++- .../columns.scss | 23 ++++++++++++++---- .../components-button.scss | 22 +++++++++++++++-- .../components-dropdown.scss | 12 ++++++---- .../icons.scss | 24 ++++++++++++++----- .../settings.scss | 1 + .../statuses.scss | 2 ++ .../_variables.scss | 1 + .../accounts.scss | 5 +++- .../gplus-theme-for-mastodon-dev/columns.scss | 23 ++++++++++++++---- .../components-button.scss | 22 +++++++++++++++-- .../components-dropdown.scss | 12 ++++++---- .../gplus-theme-for-mastodon-dev/icons.scss | 24 ++++++++++++++----- .../settings.scss | 1 + .../statuses.scss | 2 ++ 16 files changed, 142 insertions(+), 38 deletions(-) diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss index 6907a668f..250491a45 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss @@ -46,6 +46,7 @@ $account-foreground-color: $base-darker1-color; $card-color: $base-lighter1-color; $card-hover-color: $column-header-hover-color; $card-image-color: $base-color; +$warning-card-color: #26a69a; $form-color: rgba(0, 0, 0, 0.1); $form-focused-color: lighten($form-color, 20%); diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss index 984a8c9ae..7c4bcb5bf 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss @@ -74,7 +74,10 @@ } &__buttons { - .icon-button { border: 0 } + .icon-button { + border: 0; + border-radius: 50%; + } } &__name { diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss index 8fbd6be10..ce5f082b1 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss @@ -9,7 +9,6 @@ margin: 0; background: $column-header-color; position: relative; - z-index: 2; .tabs-bar { &__link { @@ -81,8 +80,11 @@ } } + &__warning { + background-color: $warning-card-color; + } + &__publish { border-top: 1px solid $base-separation-color } - &__publish-button-wrapper { @include button-shadow } &__modifiers { background-color: $base-lighter1-color } } @@ -100,7 +102,6 @@ .column-header { @include column-shadow; background: $column-header-color; - z-index: 1; &.active { .column-header__icon { @@ -151,6 +152,9 @@ } .column-back-button { + background-color: $column-header-color; + color: $secondary-text-color; + &__icon { @include material-icon-large; vertical-align: bottom; @@ -228,11 +232,10 @@ } } -// v2.9.0以降 +// v2.9.0以降に対応 .column-header { @include column-shadow; background: $column-header-color; - z-index: 1; &.active { .column-header__icon { @@ -281,6 +284,16 @@ &-inner { background: $column-header-color } } } +.column-back-button { + background-color: $column-header-color; + color: $secondary-text-color; + + &__icon { + @include material-icon-large; + vertical-align: bottom; + margin-right: 8px; + } +} .getting-started { &__wrapper, diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss index 2b6644215..8abd2ad5e 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss @@ -29,14 +29,32 @@ color: $primary-lighter1-text-color; border-radius: 50%; } + + .button--block { @include button-shadow } + + .button-secondary { + background-color: $primary-lighter1-text-color; + border: 0px; + } } .modal-root { &__modal { .media-modal { &__close.icon-button { - font-size: 40px !important; + font-size: 40px; + width: 40px; + height: 40px; + + &:hover { + background-color: darken($base-lighter1-color, 40%); + } } } } -} \ No newline at end of file +} + +// DOM操作によりpaddingが調整できないもの +.privacy-dropdown__value-icon.icon-button.inverted, +.compose-form__poll-button-icon.icon-button.inverted, +.compose-form__upload-button-icon.icon-button.inverted { padding: 4px } \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss index a9c6dc5ef..b84fae3be 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss @@ -6,6 +6,13 @@ .dropdown-menu { background-color: $column-header-color; + + &__arrow { + &.top { border-top-color: $column-header-color } + &.bottom { border-bottom-color: $column-header-color } + } + + &__separator { margin: 4px 0 } } .dropdown-menu, @@ -16,11 +23,6 @@ background: $base-lighter1-color; .dropdown-menu { - &__arrow { - &.top { border-top-color: $column-header-color } - &.bottom { border-bottom-color: $column-header-color } - } - &__item { a { color: $primary-lighter2-text-color; diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss index d28fa367d..ee45f5712 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss @@ -25,9 +25,12 @@ .icon-button { color: $icon-color; border-radius: 50%; + width: 28px !important; // UIの密度が下がる代わりに、ホバー時に正常に表示 + height: 28px !important; // !importantを付けないと動作しない…? &:active, - &:focus, + &:focus { background-color: transparent } + &:hover { color: lighten($icon-color, 7%); background-color: $column-header-hover-color; @@ -43,9 +46,9 @@ .fa.fa-star { vertical-align: top } } - &.inverted { - color: $icon-color; - } + &.inverted { color: $icon-color } + + &.overlayed { border-radius: 50% } &.disabled { color: lighten($icon-color, 13%); @@ -175,7 +178,7 @@ &.fa-bars::before { content: "menu" } //ハンバーガーボタン &.fa-navicon::before { content: "menu" } //ハンバーガーボタン &.fa-reorder::before { content: "menu" } //ハンバーガーボタン - &.fa-desktop::before { content: "desktop-windows" } //外観設定のアイコン + &.fa-desktop::before { content: "desktop_windows" } //外観設定のアイコン &.fa-code::before { content: "code" } //開発アイコン &.fa-list::before { content: "list" } //リストアイコン &.fa-paperclip::before { content: "attach_file" } //メディアを追加のアイコン @@ -186,8 +189,17 @@ .fa { &.fa-chevron-left, &.fa-chevron-right, - &.fa.fa-times { + &.fa-plus { @include material-icon-large; vertical-align: bottom; } + + &.fa-times { + @include material-icon-large; + vertical-align: top; + &.fa-fw { + font-size: 24px; + vertical-align: 8px; + } + } } \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss index 308c7e6a0..bfabd1e6e 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss @@ -149,6 +149,7 @@ body.admin { button { @include button-shadow; + background-color: $active-button-color; } } diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss index 6746032b4..b3f5ffae3 100644 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss +++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss @@ -23,6 +23,8 @@ &__content { color: $primary-text-color } } + + .display-name strong { color: $primary-text-color } } &.status-direct { diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss index 77a68f3b8..8ae2a027a 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss @@ -46,6 +46,7 @@ $account-foreground-color: $base-darker1-color; $card-color: $base-lighter1-color; $card-hover-color: $column-header-hover-color; $card-image-color: $base-color; +$warning-card-color: #26a69a; $form-color: rgba(0, 0, 0, 0.1); $form-focused-color: lighten($form-color, 20%); diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss index 984a8c9ae..7c4bcb5bf 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss @@ -74,7 +74,10 @@ } &__buttons { - .icon-button { border: 0 } + .icon-button { + border: 0; + border-radius: 50%; + } } &__name { diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss index 8fbd6be10..ce5f082b1 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss @@ -9,7 +9,6 @@ margin: 0; background: $column-header-color; position: relative; - z-index: 2; .tabs-bar { &__link { @@ -81,8 +80,11 @@ } } + &__warning { + background-color: $warning-card-color; + } + &__publish { border-top: 1px solid $base-separation-color } - &__publish-button-wrapper { @include button-shadow } &__modifiers { background-color: $base-lighter1-color } } @@ -100,7 +102,6 @@ .column-header { @include column-shadow; background: $column-header-color; - z-index: 1; &.active { .column-header__icon { @@ -151,6 +152,9 @@ } .column-back-button { + background-color: $column-header-color; + color: $secondary-text-color; + &__icon { @include material-icon-large; vertical-align: bottom; @@ -228,11 +232,10 @@ } } -// v2.9.0以降 +// v2.9.0以降に対応 .column-header { @include column-shadow; background: $column-header-color; - z-index: 1; &.active { .column-header__icon { @@ -281,6 +284,16 @@ &-inner { background: $column-header-color } } } +.column-back-button { + background-color: $column-header-color; + color: $secondary-text-color; + + &__icon { + @include material-icon-large; + vertical-align: bottom; + margin-right: 8px; + } +} .getting-started { &__wrapper, diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss index 2b6644215..8abd2ad5e 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss @@ -29,14 +29,32 @@ color: $primary-lighter1-text-color; border-radius: 50%; } + + .button--block { @include button-shadow } + + .button-secondary { + background-color: $primary-lighter1-text-color; + border: 0px; + } } .modal-root { &__modal { .media-modal { &__close.icon-button { - font-size: 40px !important; + font-size: 40px; + width: 40px; + height: 40px; + + &:hover { + background-color: darken($base-lighter1-color, 40%); + } } } } -} \ No newline at end of file +} + +// DOM操作によりpaddingが調整できないもの +.privacy-dropdown__value-icon.icon-button.inverted, +.compose-form__poll-button-icon.icon-button.inverted, +.compose-form__upload-button-icon.icon-button.inverted { padding: 4px } \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss index a9c6dc5ef..b84fae3be 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss @@ -6,6 +6,13 @@ .dropdown-menu { background-color: $column-header-color; + + &__arrow { + &.top { border-top-color: $column-header-color } + &.bottom { border-bottom-color: $column-header-color } + } + + &__separator { margin: 4px 0 } } .dropdown-menu, @@ -16,11 +23,6 @@ background: $base-lighter1-color; .dropdown-menu { - &__arrow { - &.top { border-top-color: $column-header-color } - &.bottom { border-bottom-color: $column-header-color } - } - &__item { a { color: $primary-lighter2-text-color; diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss index d28fa367d..ee45f5712 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss @@ -25,9 +25,12 @@ .icon-button { color: $icon-color; border-radius: 50%; + width: 28px !important; // UIの密度が下がる代わりに、ホバー時に正常に表示 + height: 28px !important; // !importantを付けないと動作しない…? &:active, - &:focus, + &:focus { background-color: transparent } + &:hover { color: lighten($icon-color, 7%); background-color: $column-header-hover-color; @@ -43,9 +46,9 @@ .fa.fa-star { vertical-align: top } } - &.inverted { - color: $icon-color; - } + &.inverted { color: $icon-color } + + &.overlayed { border-radius: 50% } &.disabled { color: lighten($icon-color, 13%); @@ -175,7 +178,7 @@ &.fa-bars::before { content: "menu" } //ハンバーガーボタン &.fa-navicon::before { content: "menu" } //ハンバーガーボタン &.fa-reorder::before { content: "menu" } //ハンバーガーボタン - &.fa-desktop::before { content: "desktop-windows" } //外観設定のアイコン + &.fa-desktop::before { content: "desktop_windows" } //外観設定のアイコン &.fa-code::before { content: "code" } //開発アイコン &.fa-list::before { content: "list" } //リストアイコン &.fa-paperclip::before { content: "attach_file" } //メディアを追加のアイコン @@ -186,8 +189,17 @@ .fa { &.fa-chevron-left, &.fa-chevron-right, - &.fa.fa-times { + &.fa-plus { @include material-icon-large; vertical-align: bottom; } + + &.fa-times { + @include material-icon-large; + vertical-align: top; + &.fa-fw { + font-size: 24px; + vertical-align: 8px; + } + } } \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss index 308c7e6a0..bfabd1e6e 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss @@ -149,6 +149,7 @@ body.admin { button { @include button-shadow; + background-color: $active-button-color; } } diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss index 6746032b4..b3f5ffae3 100644 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss +++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss @@ -23,6 +23,8 @@ &__content { color: $primary-text-color } } + + .display-name strong { color: $primary-text-color } } &.status-direct { From 30ce8dd0dc4ccaca6d1624437f67ac0fc286234d Mon Sep 17 00:00:00 2001 From: YoheiZuho Date: Mon, 2 Sep 2019 12:49:19 +0900 Subject: [PATCH 018/200] =?UTF-8?q?=E6=8A=95=E7=A8=BF=E6=96=87=E5=AD=97?= =?UTF-8?q?=E6=95=B0=E4=B8=8A=E9=99=90=E3=82=922048=E6=96=87=E5=AD=97?= =?UTF-8?q?=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/validators/status_length_validator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/validators/status_length_validator.rb b/app/validators/status_length_validator.rb index 93bae2fa8..3cae672ae 100644 --- a/app/validators/status_length_validator.rb +++ b/app/validators/status_length_validator.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class StatusLengthValidator < ActiveModel::Validator - MAX_CHARS = 500 + MAX_CHARS = 2048 def validate(status) return unless status.local? && !status.reblog? From 83e9ccd514d3a83fbaa769364510d16d5996bba6 Mon Sep 17 00:00:00 2001 From: Rintan Date: Sat, 1 Feb 2020 16:54:22 +0900 Subject: [PATCH 019/200] delete google-plus theme --- .../dark-gplus-theme-for-mastodon-dev.scss | 24 -- .../_functions.scss | 15 - .../_mixins.scss | 13 - .../_variables.scss | 99 ------ .../about.scss | 138 -------- .../accounts.scss | 194 ---------- .../basics.scss | 47 --- .../columns.scss | 335 ------------------ .../components-button.scss | 60 ---- .../components-card.scss | 38 -- .../components-dropdown.scss | 71 ---- .../components-status-card.scss | 12 - .../components.scss | 6 - .../emoji-picker.scss | 68 ---- .../explore.scss | 47 --- .../icons.scss | 205 ----------- .../keyboard_shortcuts.scss | 21 -- .../lists.scss | 55 --- .../notifications.scss | 27 -- .../profile.scss | 232 ------------ .../searches.scss | 41 --- .../settings-account.scss | 54 --- .../settings-dashboard.scss | 30 -- .../settings-directory_tag.scss | 21 -- .../settings-log.scss | 30 -- .../settings-report.scss | 75 ---- .../settings.scss | 245 ------------- .../statuses.scss | 123 ------- .../tables.scss | 29 -- .../styles/gplus-theme-for-mastodon-dev.scss | 24 -- .../_functions.scss | 15 - .../gplus-theme-for-mastodon-dev/_mixins.scss | 13 - .../_variables.scss | 99 ------ .../gplus-theme-for-mastodon-dev/about.scss | 138 -------- .../accounts.scss | 194 ---------- .../gplus-theme-for-mastodon-dev/basics.scss | 47 --- .../gplus-theme-for-mastodon-dev/columns.scss | 335 ------------------ .../components-button.scss | 60 ---- .../components-card.scss | 38 -- .../components-dropdown.scss | 71 ---- .../components-status-card.scss | 12 - .../components.scss | 6 - .../emoji-picker.scss | 68 ---- .../gplus-theme-for-mastodon-dev/explore.scss | 47 --- .../gplus-theme-for-mastodon-dev/icons.scss | 205 ----------- .../keyboard_shortcuts.scss | 21 -- .../gplus-theme-for-mastodon-dev/lists.scss | 55 --- .../notifications.scss | 27 -- .../gplus-theme-for-mastodon-dev/profile.scss | 232 ------------ .../searches.scss | 41 --- .../settings-account.scss | 54 --- .../settings-dashboard.scss | 30 -- .../settings-directory_tag.scss | 21 -- .../settings-log.scss | 30 -- .../settings-report.scss | 75 ---- .../settings.scss | 245 ------------- .../statuses.scss | 123 ------- .../gplus-theme-for-mastodon-dev/tables.scss | 29 -- .../styles/gplus-theme-for-mastodon.scss | 22 -- .../gplus-theme-for-mastodon/_mixins.scss | 11 - .../gplus-theme-for-mastodon/_variables.scss | 81 ----- .../gplus-theme-for-mastodon/about.scss | 138 -------- .../gplus-theme-for-mastodon/accounts.scss | 109 ------ .../gplus-theme-for-mastodon/basics.scss | 47 --- .../gplus-theme-for-mastodon/columns.scss | 197 ---------- .../components-button.scss | 11 - .../components-card.scss | 37 -- .../components-dropdown.scss | 42 --- .../gplus-theme-for-mastodon/components.scss | 5 - .../gplus-theme-for-mastodon/explore.scss | 38 -- .../gplus-theme-for-mastodon/icons.scss | 97 ----- .../gplus-theme-for-mastodon/lists.scss | 34 -- .../notifications.scss | 27 -- .../gplus-theme-for-mastodon/profile.scss | 231 ------------ .../gplus-theme-for-mastodon/searches.scss | 41 --- .../settings-account.scss | 44 --- .../settings-dashboard.scss | 28 -- .../settings-report.scss | 63 ---- .../gplus-theme-for-mastodon/settings.scss | 208 ----------- .../gplus-theme-for-mastodon/statuses.scss | 107 ------ .../gplus-theme-for-mastodon/tables.scss | 29 -- config/locales/en.yml | 3 - config/locales/ja.yml | 3 - config/themes.yml | 3 - 84 files changed, 6366 deletions(-) delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_functions.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_mixins.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/about.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/basics.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-card.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-status-card.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/emoji-picker.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/explore.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/lists.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/notifications.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/profile.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/searches.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-account.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-dashboard.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-directory_tag.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-log.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-report.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss delete mode 100644 app/javascript/styles/dark-gplus-theme-for-mastodon-dev/tables.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/_functions.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/_mixins.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/about.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/basics.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components-card.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components-status-card.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/components.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/emoji-picker.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/explore.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/lists.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/notifications.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/profile.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/searches.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-account.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-dashboard.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-directory_tag.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-log.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings-report.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon-dev/tables.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/_mixins.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/_variables.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/about.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/accounts.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/basics.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/columns.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/components-button.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/components-card.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/components-dropdown.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/components.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/explore.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/icons.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/lists.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/notifications.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/profile.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/searches.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/settings-account.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/settings-dashboard.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/settings-report.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/settings.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/statuses.scss delete mode 100644 app/javascript/styles/gplus-theme-for-mastodon/tables.scss diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev.scss deleted file mode 100644 index 8c2471deb..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev.scss +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Google+ Theme for Mastodon v1.1 - * Copyright (C) 2018-2019 Genbu Project - */ - -@charset "UTF-8"; - -// @import 'application'; -@import 'application'; -@import 'dark-gplus-theme-for-mastodon-dev/basics'; -@import 'dark-gplus-theme-for-mastodon-dev/components'; -@import 'dark-gplus-theme-for-mastodon-dev/emoji-picker'; -@import 'dark-gplus-theme-for-mastodon-dev/tables'; -@import 'dark-gplus-theme-for-mastodon-dev/columns'; -@import 'dark-gplus-theme-for-mastodon-dev/lists'; -@import 'dark-gplus-theme-for-mastodon-dev/accounts'; -@import 'dark-gplus-theme-for-mastodon-dev/statuses'; -@import 'dark-gplus-theme-for-mastodon-dev/notifications'; -@import 'dark-gplus-theme-for-mastodon-dev/searches'; -@import 'dark-gplus-theme-for-mastodon-dev/settings'; -@import 'dark-gplus-theme-for-mastodon-dev/icons'; -@import 'dark-gplus-theme-for-mastodon-dev/profile'; -@import 'dark-gplus-theme-for-mastodon-dev/about'; -@import 'dark-gplus-theme-for-mastodon-dev/explore'; \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_functions.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_functions.scss deleted file mode 100644 index e5aea0e4e..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_functions.scss +++ /dev/null @@ -1,15 +0,0 @@ -@charset "UTF-8"; - - - -@function adjust-lightness ($color, $lightness) { - @if (lightness($color) - $lightness <= 0 and lightness($color) + $lightness < 100) { - @return lighten($color, $lightness); - } - - @if (0 < lightness($color) - $lightness and 100 <= lightness($color) + $lightness) { - @return darken($color, $lightness); - } - - @return change-color($color, $lightness: $lightness); -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_mixins.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_mixins.scss deleted file mode 100644 index 400a1ac90..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_mixins.scss +++ /dev/null @@ -1,13 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -@mixin column-shadow { box-shadow: 0 1px 8px 0 $column-header-shadow-color } -@mixin status-shadow { box-shadow: 0 1px 4px 0 $status-shadow-color } -@mixin status-focus-shadow { box-shadow: 0 0 20px 0 $status-focused-shadow-color } -@mixin button-shadow { box-shadow: 0 2px 5px 0 $button-shadow-color } -@mixin material-border { border-radius: 4px } -@mixin material-card-radius { border-radius: 2px } -@mixin material-icon-large { font-size: 20px } \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss deleted file mode 100644 index 250491a45..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss +++ /dev/null @@ -1,99 +0,0 @@ -@charset "UTF-8"; - - - -// Base colors -$active-color: #db4437; -$accent-color: #fbbc04; -$valid-color: #4285f4; -$error-color: #d50000; -$checked-color: #4285f4; -$verified-color: #4caf50; - - -// Text colors -$primary-text-color: #ffffff; -$primary-lighter1-text-color: change-color($color: $primary-text-color, $lightness: 62%, $alpha: 1.0); // ex: 時間表示 -$primary-lighter2-text-color: change-color($color: $primary-text-color, $lightness: 38%, $alpha: 1.0); // ex: 通知メッセージ表示 -$secondary-text-color: #2196F3; // ex: リンク -$secondary-lighter1-text-color: #00bfff; // ex: アカウントTLのユーザーID -$light-text-color: #000000; -$light-darker1-text-color: darken($light-text-color, 15%); -$active-text-color: $active-color; -$error-text-color: $error-color; - - -// Icon colors -$icon-color: #BDBDBD; -$icon-active-color: $active-color; - - -// Background colors -$base-color: #121212; -$base-lighter1-color: #2d2d2d; -$base-darker1-color: #000000; - -$column-header-color: $base-lighter1-color; -$column-header-hover-color: change-color($color: $column-header-color, $lightness: 10%); - -$status-color: $base-lighter1-color; -$status-direct-color: darken($status-color, 5%); -$status-actionbar-color: darken($status-color, 2%); - -$account-color: $base-lighter1-color; -$account-foreground-color: $base-darker1-color; - -$card-color: $base-lighter1-color; -$card-hover-color: $column-header-hover-color; -$card-image-color: $base-color; -$warning-card-color: #26a69a; - -$form-color: rgba(0, 0, 0, 0.1); -$form-focused-color: lighten($form-color, 20%); -$trend-color: $base-lighter1-color; - -$setting-base-color: $base-color; -$setting-lists-selected-color: darken($base-color, 2%); -$setting-lists-hover-color: darken($base-color, 5%); -$setting-content-base-color: $base-lighter1-color; - -$setting-toggle-color: #b9b9b9; -$setting-toggle-checked-color: change-color($color: $checked-color, $alpha: 0.5); -$setting-toggle-thumb-color: #fafafa; -$setting-toggle-thumb-checked-color: $checked-color; - -$setting-emphasis-color: $verified-color; - -$dashboard-counters-base-color: $base-color; -$dashboard-counters-hover-color: lighten($base-color, 2%); - -$log-entry-color: $base-lighter1-color; -$log-entry-extra-color: $base-color; -$log-entry-extra--neutral-color: $valid-color; -$log-entry-extra--old-color: $active-color; -$log-entry-extra--new-color: $verified-color; - -$explore-header-color: lighten($accent-color, 16%); -$explore-directory-color: $base-lighter1-color; - -$active-button-color: $valid-color; //文字入りボタン -$non-active-button-color: lighten($base-color, 20%); - -$floating-acton-button-hover-color: lighten($active-color, 10%); - - -// Shadow colors -$column-header-shadow-color: rgba(0, 0, 0, 0.3); -$status-shadow-color: rgba(0, 0, 0, 0.14); -$status-focused-shadow-color: change-color($color: $status-shadow-color, $alpha: 0.3); -$icon-hovered-shadow-color: rgba(0, 0, 0, 0.26); -$account-header-image-shadow-color: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.46)); -$button-shadow-color: rgba(0, 0, 0, 0.4); - - -// Separation colors -$base-separation-color: rgba(0, 0, 0, 0.14); - - -//Border colors -$non-elevated-card-boader : #e0e0e0; \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/about.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/about.scss deleted file mode 100644 index de48883a8..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/about.scss +++ /dev/null @@ -1,138 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -// from mastodon/about.scss -$column-breakpoint: 700px; - - - -.landing-page { - h3, h4, h5, h6 { color: $primary-lighter2-text-color } - p { color: $primary-lighter1-text-color } - em { color: $primary-text-color } - - .column-0 { background: $base-darker1-color } - .column-2 { - .landing-page { - &__information { padding: 0 } - - &__short-description { - & > .row:first-child { - background: $base-darker1-color; - padding: 10px 20px; - } - - & > * { - padding-left: 40px; padding-right: 40px; - &:last-child { padding-bottom: 45px } - - @media screen and (max-width: $column-breakpoint) { - padding-left: 20px; padding-right: 20px; - &:last-child { padding-bottom: 25px } - } - } - } - } - } - - &__forms, - &__information, - &__call-to-action { - @include status-shadow; - background: $column-header-color; - } - - &__forms { - padding: 0; - - & > *:first-child { margin: inherit } - & > * { margin-left: 20px; margin-right: 20px; } - - .brand { background: $base-darker1-color } - - form { - & > .input input { - background: $form-color; - - &:focus { background: $form-focused-color } - } - } - - .separator-or { - margin-left: 20px; margin-right: 20px; - - span { - color: $primary-lighter1-text-color; - background: $column-header-color; - } - } - - @media screen and (max-width: $column-breakpoint) { - background: inherit; - box-shadow: none; - - .separator-or span { background: $base-color } - } - } - - &__information { - color: $primary-lighter1-text-color; - - &.contact-widget { - @include status-shadow; - background: $column-header-color; - - .contact-widget { - &__mail { - a { color: $primary-text-color } - } - } - } - - strong { color: inherit } - - .row:first-child { - h1 small { - color: $light-darker1-text-color; - - span { color: $light-text-color } - } - } - } - - &__call-to-action { - .row__information-board { - .information-board__section { - color: $primary-lighter2-text-color; - - & > span:last-child { color: $primary-lighter1-text-color } - } - } - } - - &__features { - .features-list { - .features-list__row { - .text { color: $primary-lighter1-text-color } - .visual .fa { color: $icon-color } - } - } - } - - &__footer { color: $primary-lighter1-text-color } - - #mastodon-timeline { - color: $primary-text-color; - background: transparent; - - p { - color: $primary-text-color; - - a { color: $secondary-text-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss deleted file mode 100644 index 7c4bcb5bf..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss +++ /dev/null @@ -1,194 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.account { - background: $account-color; - border-color: $base-separation-color; - - .account { - &__display-name { - color: $secondary-text-color; - strong { color: $primary-text-color } - } - } - - &-role { - color: $primary-lighter2-text-color; - background-color: rgba($base-separation-color, 0.1); - border-color: rgba($base-separation-color, 0.5); - } -} - -.column { - > .column-back-button { - @include column-shadow; - background: $column-header-color; - } -} - -.account-timeline__header { - .account__header { - background-color: $account-foreground-color; - - > div { background-color: inherit } // -> v2.7.4 - - .account__header { - &__username { color: $secondary-lighter1-text-color } - &__fields { @extend .account__header__fields; } - - &__image { // v2.8.0 -> - &::after { - content: ""; - - position: absolute; - top: auto; - left: 0; - bottom: 0; - - width: 100%; - height: 30%; - background: $account-header-image-shadow-color; - box-shadow: none; - } - - > img:not([src]), - > img[src$="/headers/original/missing.png"] { - content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); - } - } - - &__bar { // v2.8.0 -> - background-color: $base-lighter1-color; - - .account__header { - &__tabs { - .avatar { - .account__avatar { - border-color: $base-lighter1-color; - border-radius: 50%; - } - } - - &__buttons { - .icon-button { - border: 0; - border-radius: 50%; - } - } - - &__name { - h1 { color: $primary-text-color } - small { color: $secondary-text-color } - } - } - - &__bio { - .account__header { - &__content { color: $primary-text-color } - &__fields { border-color: $base-separation-color } - } - } - - &__extra { - &__links { - &, a { color: $primary-lighter1-text-color } - strong { color: $primary-lighter2-text-color } - } - } - } - } - } - - .account--action-button { - .icon-button:not(.active) { - color: darken($light-text-color, 7%); - - &:active, - &:focus, - &:hover { - color: $light-text-color; - } - } - } - } - - .account { - &__disclaimer, - &__action-bar, - &__section-headline { - background: $base-lighter1-color; - border-color: $base-separation-color; - } - - &__action-bar { - &__tab { - border-color: $base-separation-color; - &.active { border-bottom-color: $active-color } - - > span { color: $primary-lighter1-text-color } - } - } - - &__section-headline { - a { - color: $primary-text-color; - - &.active { - color: $active-color; - - &::before { border-color: transparent transparent $base-separation-color } - &::after { border-color: transparent transparent $status-color } - } - } - } - } -} - -.account-authorize__wrapper { - @include status-shadow; - background: $base-lighter1-color; - - &:focus { @include status-focus-shadow; } - - .account { - &__header__content { - color: $primary-lighter2-text-color; - } - - &--panel { - background: $account-color; - border-color: $base-separation-color; - } - } -} - -.account__header__fields { - dl { - border-color: $base-separation-color; - - dt, - dd { - color: $primary-text-color; - background: $base-lighter1-color; - } - - dd { - &.verified { - border-color: transparentize($valid-color, 0.5); - background: transparentize($valid-color, 0.75); - - a { color: lighten($verified-color, 20%) } - } - } - } - - a { color: $secondary-text-color } -} - -.account__action-bar__tab { - strong { color: $primary-text-color } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/basics.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/basics.scss deleted file mode 100644 index a141ecd13..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/basics.scss +++ /dev/null @@ -1,47 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -body { - &, - .ui { - color: $primary-text-color; - background: $base-color; - } -} - -.focusable { - &:focus { - background: inherit; - - .status { - @include status-focus-shadow; - - &.status-direct { background: $status-direct-color } - } - - .detailed-status { - & { background: $status-color } - &__action-bar { background: $status-actionbar-color } - } - } -} - -::-webkit-scrollbar-thumb { - background: darken($base-lighter1-color, 12%); - - &:hover { background: darken($base-lighter1-color, 16%) } - &:active { background: darken($base-lighter1-color, 12%) } -} - -::-webkit-scrollbar-track { - background: $base-color; - - &:hover, - &:active { - background: darken($base-lighter1-color, 8%); - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss deleted file mode 100644 index ce5f082b1..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss +++ /dev/null @@ -1,335 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.tabs-bar { - margin: 0; - background: $column-header-color; - position: relative; - - .tabs-bar { - &__link { - color: $icon-color; - border-bottom: 4px solid $column-header-color; - padding: 15px 10px 11px 10px; - - &.active { - border-bottom: 4px solid $active-color; - } - - .fa { - @include material-icon-large; - vertical-align: top; - } - } - } -} - -.drawer { - .drawer { - &__header { - @include column-shadow; - background: $column-header-color; - - .drawer__tab { - @include material-icon-large; - color: $icon-color; - } - - a { - &:hover { background: $column-header-hover-color } - } - } - - &__pager { - @include status-shadow; - @include material-card-radius; - - .drawer__inner { - background: $column-header-color; - - &__mastodon { display: none } - } - } - } -} - -.navigation-bar { - color: $secondary-text-color; - background: $column-header-color; - - .navigation-bar { - &__profile { - strong { color: $primary-text-color } - &-edit { color: $secondary-text-color } - } - } -} - - -.compose-form { - .compose-form { - &__buttons-wrapper { - background: $column-header-color; - - &.character-counter__wrapper { - .character-counter { color: $primary-lighter1-text-color } - } - } - - &__warning { - background-color: $warning-card-color; - } - - &__publish { border-top: 1px solid $base-separation-color } - &__modifiers { background-color: $base-lighter1-color } - } - - .autosuggest-textarea__textarea { - background-color: $base-lighter1-color; - color: $primary-text-color; - } - - .character-counter { - color: $icon-color - } -} - -.column { - .column-header { - @include column-shadow; - background: $column-header-color; - - &.active { - .column-header__icon { - color: $icon-active-color; - text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); - } - } - - * { background: inherit } - - &__icon { - @include material-icon-large; - color: $icon-color; - vertical-align: bottom; - margin-right: 10px; - } - - &__buttons { - height: 50px; - - .column-header { - &__back-button { - .column-back-button__icon { vertical-align: bottom } - } - - &__button { - &.active { - color: $icon-active-color; - background: inherit; - } - - .fa { vertical-align: unset } - } - } - } - - &__button { - color: $icon-color; - padding: 0 16px; - } - - &__collapsible { - color: $secondary-text-color; - border-bottom: 1px solid $base-separation-color; - - &-inner { background: $column-header-color } - } - } - - .column-back-button { - background-color: $column-header-color; - color: $secondary-text-color; - - &__icon { - @include material-icon-large; - vertical-align: bottom; - margin-right: 8px; - } - } - - .column { - &-subheading, - &-link__badge { - background: $base-color; - color: $secondary-text-color; - } - - &-link { - color: $primary-text-color; - background: $base-color; - - &__icon { - @include material-icon-large; - color: $icon-color; - vertical-align: bottom; - margin-right: 8px; - } - } - } - - .scrollable { - background: transparent; - - *[role="feed"] { - article { - margin: 1em 0; - &:first-of-type { margin: 0 } - - &:focus { outline: none } - } - } - - div[tabindex="-1"] { margin-bottom: 1em } - } - - .notification__filter-bar { - background: $column-header-color; - border-bottom-color: $base-separation-color; - - button { - color: $icon-color; - background: $column-header-color; - - &.active { - color: $icon-active-color; - - &::before { border-color: transparent transparent $base-separation-color } - &::after { border-color: transparent transparent $column-header-color } - } - } - } - - .empty-column-indicator { - flex-direction: column; - background: $base-color; - - &::before { - content: ""; - display: block; - - width: 100px; - height: 100px; - margin-bottom: 1em; - - background: none center / contain no-repeat; - background-image: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/notification-jingle_2x.gif"); - } - } -} - -// v2.9.0以降に対応 -.column-header { - @include column-shadow; - background: $column-header-color; - - &.active { - .column-header__icon { - color: $icon-active-color; - text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); - } - } - - * { background: inherit } - - &__icon { - @include material-icon-large; - color: $icon-color; - vertical-align: bottom; - margin-right: 10px; - } - - &__buttons { - height: 50px; - - .column-header { - &__back-button { - .column-back-button__icon { vertical-align: bottom } - } - - &__button { - &.active { - color: $icon-active-color; - background: inherit; - } - - .fa { vertical-align: unset } - } - } - } - - &__button { - color: $icon-color; - padding: 0 16px; - } - - &__collapsible { - color: $secondary-text-color; - border-bottom: 1px solid $base-separation-color; - - &-inner { background: $column-header-color } - } -} -.column-back-button { - background-color: $column-header-color; - color: $secondary-text-color; - - &__icon { - @include material-icon-large; - vertical-align: bottom; - margin-right: 8px; - } -} - -.getting-started { - &__wrapper, - & { - background: $base-color; - } - - & { - border-top: 1px solid $base-separation-color; - - a { color: $primary-text-color } - } -} - -.load { - &-more, - &-gap { - background: transparent; - - &:hover { background: darken($column-header-color, 10%) } - } - - &-gap { border: 0 } -} - -.confirmation-modal { - @include material-card-radius; - color: $primary-text-color; - background-color: $base-lighter1-color; - - &__action-bar { - background-color: $base-lighter1-color; - } - - &__cancel-button { - color: $primary-lighter1-text-color; - box-shadow: 0 2px 5px 0 transparent; - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss deleted file mode 100644 index 8abd2ad5e..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss +++ /dev/null @@ -1,60 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.floating-action-button { - font-size: 24px; - background-color: $active-color; - width: 3.6rem; - height: 3.6rem; - - &:active { - background-color: $active-color; - } - - &:hover { - background-color: $floating-acton-button-hover-color; - } -} - -.button { - @include button-shadow; - @include material-card-radius; - background-color: $active-button-color; - - .text-icon-button { - color: $primary-lighter1-text-color; - border-radius: 50%; - } - - .button--block { @include button-shadow } - - .button-secondary { - background-color: $primary-lighter1-text-color; - border: 0px; - } -} - -.modal-root { - &__modal { - .media-modal { - &__close.icon-button { - font-size: 40px; - width: 40px; - height: 40px; - - &:hover { - background-color: darken($base-lighter1-color, 40%); - } - } - } - } -} - -// DOM操作によりpaddingが調整できないもの -.privacy-dropdown__value-icon.icon-button.inverted, -.compose-form__poll-button-icon.icon-button.inverted, -.compose-form__upload-button-icon.icon-button.inverted { padding: 4px } \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-card.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-card.scss deleted file mode 100644 index dc72775a1..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-card.scss +++ /dev/null @@ -1,38 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.card { - //border: 1px solid $base-separation-color; - //不要(?) - - > a { - @include status-shadow; - - &:hover, - &:focus, - &:active { - .card__bar { - background: initial; - - .display-name strong { color: $secondary-text-color } - } - } - - .card__img { background: $card-image-color } - .card__bar { - background: $card-color; - - .avatar { - img { background: transparent } - } - - .display-name { - strong { color: $primary-text-color } - span { color: $primary-lighter2-text-color } - } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss deleted file mode 100644 index b84fae3be..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss +++ /dev/null @@ -1,71 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - -.dropdown-menu { - background-color: $column-header-color; - - &__arrow { - &.top { border-top-color: $column-header-color } - &.bottom { border-bottom-color: $column-header-color } - } - - &__separator { margin: 4px 0 } -} - -.dropdown-menu, -.actions-modal { - @include material-card-radius; - - & > ul { - background: $base-lighter1-color; - - .dropdown-menu { - &__item { - a { - color: $primary-lighter2-text-color; - - padding: 16px 16px; - background: $column-header-color; - - &:active, - &:focus, - &:hover { - color: $primary-text-color; - background: $column-header-hover-color; - } - } - } - - &__separator { border-bottom-color: $base-separation-color } - } - - & > li:not(:empty) { - @extend .dropdown-menu__item; - - a { - padding: 12px 16px; - color: $primary-text-color; - - &:hover { - color: $primary-text-color; - background-color: $column-header-hover-color; - } - } - } - } - - .status { - background-color: $base-lighter1-color; - padding-top: 16px; - padding-bottom: 16px; - padding-right: 16px; - padding-left: 74px; - - &__avatar { - top: 16px; - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-status-card.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-status-card.scss deleted file mode 100644 index 9b64572f9..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-status-card.scss +++ /dev/null @@ -1,12 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.status-card { - color: $primary-lighter1-text-color; - &__title, &__description { color: $primary-lighter2-text-color } - - &__image { background: transparent } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components.scss deleted file mode 100644 index e735b108d..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components.scss +++ /dev/null @@ -1,6 +0,0 @@ -@charset "UTF-8"; - -@import 'components-button'; -@import 'components-card'; -@import 'components-dropdown'; -@import 'components-status-card'; \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/emoji-picker.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/emoji-picker.scss deleted file mode 100644 index 0937158bf..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/emoji-picker.scss +++ /dev/null @@ -1,68 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.emoji-mart { - &-bar { - border: 0 solid $base-separation-color; - - &:first-child { - border-top-left-radius: 2px; - border-top-right-radius: 2px; - background-color: $base-color; - } - } - - &-anchors { - color: $icon-color; - } - &-anchor { - &-selected { - color: $icon-active-color; - - &:hover { - color: $icon-active-color; - } - } - - &-bar { - background-color: $icon-active-color; - } - } - - &-search { - background-color: $base-lighter1-color; - } - &-search input { - color: $primary-text-color; - background-color: $form-color; - border: 0px solid #ffffff00; - } - - &-category-label span { - color: $primary-text-color; - background-color: $base-lighter1-color; - } - - &-scroll { - background-color: $base-lighter1-color; - } -} - -.emoji-picker-dropdown { - &__modifiers { - &__menu { - @include status-shadow; - @include material-card-radius; - background-color: $base-lighter1-color; - } - } - - &__menu { - @include column-shadow; - background-color: $base-lighter1-color; - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/explore.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/explore.scss deleted file mode 100644 index ae80b3884..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/explore.scss +++ /dev/null @@ -1,47 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.public-layout { - .page-header { - background: $explore-header-color; - - h1 { color: $primary-text-color } - p { color: $primary-lighter2-text-color } - } - - .directory, - .notice-widget { @include column-shadow; } - - .directory { - background: $explore-directory-color; - - .accounts-table { - &__count { - color: $primary-lighter2-text-color; - small { color: $primary-lighter1-text-color } - } - } - - &__tag { - & > a { - @include status-shadow; - background: $explore-directory-color; - } - - h4 { color: $primary-lighter2-text-color } - .fa, small { color: $primary-lighter1-text-color } - .trends__item__current { color: $primary-text-color } - } - } - - .notice-widget { - color: $primary-lighter1-text-color; - background: $explore-directory-color; - - a { color: $secondary-text-color } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss deleted file mode 100644 index ee45f5712..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss +++ /dev/null @@ -1,205 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -@function hex-color($color) { - @if type-of($color) == 'color' { - $color: str-slice(ie-hex-str($color), 4); - } - - @return '%23' + unquote($color) -}; - - - -@font-face { - font-family: "Material Icons Extended"; - src: - local("Material Icons Extended"), - url("https://fonts.gstatic.com/s/materialiconsextended/v50/kJEjBvgX7BgnkSrUwT8UnLVc38YydejYY-oE_LvJ.woff2"), - url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/font-Material_Icons_Extended-v50.woff2"); -} - -.icon-button { - color: $icon-color; - border-radius: 50%; - width: 28px !important; // UIの密度が下がる代わりに、ホバー時に正常に表示 - height: 28px !important; // !importantを付けないと動作しない…? - - &:active, - &:focus { background-color: transparent } - - &:hover { - color: lighten($icon-color, 7%); - background-color: $column-header-hover-color; - } - - &.star-icon { - &.active { - color: $light-text-color; - background: $icon-active-color; - border-radius: 50%; - } - - .fa.fa-star { vertical-align: top } - } - - &.inverted { color: $icon-color } - - &.overlayed { border-radius: 50% } - - &.disabled { - color: lighten($icon-color, 13%); - - .fa.fa-retweet { - background-image: url("data:image/svg+xml;utf8,"); - } - } - - .fa { - @include material-icon-large; - vertical-align: middle; - - &.fa-retweet { - background-image: url("data:image/svg+xml;utf8,"); - - &:active, - &:hover, - &:focus { - background-image: url("data:image/svg+xml;utf8,"); - } - } - } -} - -.fa { - &.fa-users, - &.fa-globe, - &.fa-cog, - &.fa-cogs, - &.fa-gears, - &.fa-sign-out, - &.fa-star, - &.fa-reply, - &.fa-reply-all, - &.fa-mail-reply, - &.fa-mail-reply-all, - &.fa-envelope, - &.fa-bookmark, - &.fa-home, - &.fa-bell, - &.fa-eraser, - &.fa-ellipsis-h, - &.fa-ellipsis-v, - &.fa-address-book, - &.fa-thumb-tack, - &.fa-lock, - &.fa-pencil, - &.fa-chevron-left, - &.fa-chevron-right, - &.fa-camera, - &.fa-tasks, - &.fa-sliders, - &.fa-fire, - &.fa-list-ul, - &.fa-search, - &.fa-close, - &.fa-remove, - &.fa-times, - &.fa-user, - &.fa-mobile-phone, - &.fa-mobile, - &.fa-filter, - &.fa-user-plus, - &.fa-cloud-upload, - &.fa-cloud-download, - &.fa-eye, - &.fa-eye-slash, - &.fa-share-alt, - &.fa-chevron-down, - &.fa-bars, - &.fa-navicon, - &.fa-reorder, - &.fa-desktop, - &.fa-code, - &.fa-list, - &.fa-paperclip, - &.fa-plus, - &.fa-bullhorn { - font-family: "Material Icons Extended"; - } - - &.fa-users::before { content: "people" } // 人々マーク(.drawer__header > .drawer__tab:2) - &.fa-globe::before { content: "public" } // 地球マーク(.drawer__header > .drawer__tab:3) - &.fa-cog::before { content: "settings" } // 歯車マーク(.drawer__header > .drawer__tab:4) - &.fa-cogs::before { content: "settings" } //歯車マーク(モバイル) - &.fa-gears::before { content: "settings" } //歯車マーク(モバイル) - &.fa-sign-out::before { content: "exit_to_app" } //サインアウト - &.fa-star::before { content: "plus_one" } // +1(.status .status__action-bar > .star-icon) - &.fa-reply::before { content: "reply" } //返信ボタン - &.fa-reply-all::before { content: "reply_all" } //全員に返信ボタン - &.fa-mail-reply::before { content: "reply" } //返信ボタン - &.fa-mail-reply-all::before { content: "reply_all" } //全員に返信ボタン - &.fa-envelope::before { content: "mail" } //ダイレクトメッセージボタン - &.fa-bookmark::before { content: "bookmark" } //ブックマークボタン - &.fa-home::before { content: "home" } // 家マーク(ホームタイムライン) - &.fa-bell::before { content: "notifications" } // ベルマーク(通知) - &.fa-eraser::before { content: "clear_all" } // 通知を消去のマーク - &.fa-ellipsis-h::before { content: "more_horiz" } // 三点リーダー(横) - &.fa-ellipsis-v::before { content: "more_vert" } // 三点リーダー(縦) - &.fa-address-book::before { content: "explore" } // discoverマーク(explore遷移タブ) - &.fa-thumb-tack::before { content: "" } // ピンマーク(ピン留め投稿) - &.fa-lock::before { content: "" } // サークルマーク(フォロワー限定投稿) - &.fa-pencil::before { content: "create" } // 鉛筆マーク(モバイル用フローティングボタン) - &.fa-chevron-left::before { content: "arrow_back" } //戻るボタン - &.fa-chevron-right::before { content: "arrow_forward" } //進むボタン - &.fa-camera::before { content: "camera_alt" } //メディアを追加ボタン - &.fa-tasks::before { content: "poll" } //投票を追加ボタン - &.fa-sliders::before { content: "tune" } //設定を表示ボタン - &.fa-fire::before { content: "whatshot" } //トレンドマーク - &.fa-list-ul::before { content: "list" } //リストマーク - &.fa-search::before { content: "search" } //検索アイコン(モバイル、トップバー内) - &.fa-close::before { content: "close" } //閉じるボタン - &.fa-remove::before { content: "close" } //閉じるボタン - &.fa-times::before { content: "close" } //閉じるボタン(メディア) - &.fa-user::before { content: "account_circle" } //ユーザーアイコン - &.fa-mobile-phone::before { content: "smartphone" } //モバイルアイコン - &.fa-mobile::before { content: "smartphone" } //モバイルアイコン - &.fa-filter::before { content: "filter_list" } //フィルターアイコン - &.fa-user-plus::before { content: "person_add" } //ユーザーの追加アイコン - &.fa-cloud-upload::before { content: "cloud_upload" } //インポートアイコン - &.fa-cloud-download::before { content: "cloud_download" } //エクスポートアイコン - &.fa-eye::before { content: "visibility" } //目のアイコン - &.fa-eye-slash::before { content : "visibility_off" } //閉じた目のアイコン - &.fa-share-alt::before { content: "share" } //モバイル共有ボタン - &.fa-chevron-down::before { content: "keyboard_arrow_down" } //メニューボタン - &.fa-bars::before { content: "menu" } //ハンバーガーボタン - &.fa-navicon::before { content: "menu" } //ハンバーガーボタン - &.fa-reorder::before { content: "menu" } //ハンバーガーボタン - &.fa-desktop::before { content: "desktop_windows" } //外観設定のアイコン - &.fa-code::before { content: "code" } //開発アイコン - &.fa-list::before { content: "list" } //リストアイコン - &.fa-paperclip::before { content: "attach_file" } //メディアを追加のアイコン - &.fa-plus::before { content: "add" } // 追加ボタン - &.fa-bullhorn::before { content: "announcement"} //Adminからのお知らせ(一部サーバーのみ) -} - -.fa { - &.fa-chevron-left, - &.fa-chevron-right, - &.fa-plus { - @include material-icon-large; - vertical-align: bottom; - } - - &.fa-times { - @include material-icon-large; - vertical-align: top; - &.fa-fw { - font-size: 24px; - vertical-align: 8px; - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss deleted file mode 100644 index 6c664b32f..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss +++ /dev/null @@ -1,21 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.keyboard-shortcuts { - kbd { - @include status-shadow; - - color: $primary-text-color; - background-color: $base-lighter1-color; - border-color: $base-darker1-color; - - margin: 0 0.25em; - - &:first-child { margin-left: 0 } - &:last-child { margin-right: 0 } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/lists.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/lists.scss deleted file mode 100644 index 05c29a6df..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/lists.scss +++ /dev/null @@ -1,55 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.column { - .column-back-button { background: inherit } - - .column-inline-form { - background: $column-header-color; - - label input { - color: $secondary-text-color; - &:focus { color: $primary-text-color } - } - } - - .column-inline-form ~ .scrollable { - article { margin: 0 } - } -} - -.modal-root { - .column-inline-form { - background: $column-header-color; - - .setting-text { - color: $primary-text-color; - &:active, &:focus { color: $primary-lighter2-text-color } - } - } - - .list-editor { - background: $base-color; - h4 { background: $column-header-color } - - .drawer__pager { - .drawer__inner { background: $column-header-color } - } - } - - .list-adder { - background: $base-color; - - .column-inline-form { border-bottom: 1px solid $base-separation-color } - - &__account, - &__lists { background: $column-header-color } - - &__lists { - .list { border-color: $base-separation-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/notifications.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/notifications.scss deleted file mode 100644 index bab098372..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/notifications.scss +++ /dev/null @@ -1,27 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.notification { - &.notification-favourite { - .status { - &.status-direct { background: transparent } - } - } - - > .notification__message { - color: $primary-lighter2-text-color; - font-size: 13px; - padding: 8px 0; - - .notification__display-name { - &:hover { color: inherit } - } - - .notification__favourite-icon-wrapper { - .star-icon { color: $icon-active-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/profile.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/profile.scss deleted file mode 100644 index 246d24b7d..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/profile.scss +++ /dev/null @@ -1,232 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.public-layout { - a.button { - @include button-shadow; - - color: $primary-text-color; - background: $base-lighter1-color; - - &:hover, - &:focus, - &:active { - background: darken($base-lighter1-color, 8%); - } - } - - .logo-button { - svg path { - /* Only for Itabashi-don */ - &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } - &#Mastodon { fill: $base-lighter1-color !important } - } - } - - .public-account-header { - @include status-shadow; - - &__image { - background: $base-lighter1-color; - - @media screen and (min-width: 600px) { height: 500px } - - &::after { - content: ""; - - position: absolute; - top: auto; - left: 0; - bottom: 0; - - width: 100%; - height: 30%; - background: $account-header-image-shadow-color; - box-shadow: none; - } - - > img:not([src]), - > img[src="/headers/original/missing.png"] { - content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); - } - } - - &__bar { - @media screen and (max-width: 600px) { - flex-direction: column; - background: $base-color; - } - - @media screen and (min-width: 600px) { margin-top: -140px } - - &::before { background: $base-lighter1-color } - - .avatar { - @media screen and (max-width: 600px) { - position: relative; - bottom: 30px; - - display: initial; - width: 60px; - height: 60px; - margin: 0 auto; - padding: 0; - } - - img { - border: 2px solid $base-lighter1-color; - border-radius: 50%; - background: transparent; - } - } - } - - &__tabs { - @media screen and (max-width: 600px) { - flex-wrap: wrap; - margin-left: 0; - - &__name { - width: 100%; - text-align: center; - - h1 { - color: $primary-text-color; - - small { color: $primary-lighter1-text-color } - } - } - - &__tabs { - justify-content: center; - flex: auto; - - .spacer { display: none } - - a.button.logo-button { - color: $light-text-color; - background: $secondary-text-color; - - svg path { - /* Only for Itabashi-don */ - &:not(#Mastodon):not(#Itabashi) { fill: $base-lighter1-color !important } - &#Mastodon { fill: $secondary-text-color !important } - } - } - } - } - - .details-counters { - .counter { - color: $light-text-color; - border-right: 0; - - &::after { border-bottom-color: $base-color } - - &.active { - &::after { border-bottom-color: $active-color } - } - } - } - } - - &__extra { - .public-account-bio { - .account__header__content { text-align: center } - } - - &__links { - color: $primary-text-color; - - a { - &, strong { color: $primary-text-color } - } - } - } - } - - .public-account-bio, - .endorsements-widget, - .hero-widget { @include status-shadow; } - - .public-account-bio { - background: $base-lighter1-color; - - .account__header__content { color: $primary-text-color } - &__extra { color: $primary-lighter1-text-color } - } - - .endorsements-widget { - padding-bottom: 0; - border-radius: 4px; - - h4 { - color: $primary-lighter1-text-color; - background: $base-lighter1-color; - } - } - - .hero-widget { - &__img { background: $base-color } - &__text { - background: $base-lighter1-color; - - &, em { color: $primary-lighter2-text-color } - a { color: $secondary-text-color } - } - } - - .account__section-headline { - background: $base-lighter1-color; - border-bottom-color: $base-separation-color; - - a { - color: $primary-lighter1-text-color; - - &.active { - color: $primary-lighter2-text-color; - - &::before { border-color: transparent transparent $base-separation-color } - &::after { border-color: transparent transparent $status-color } - } - } - } - - .activity-stream { - box-shadow: none; - - .entry { - margin: 1em 0; - background: transparent; - - &:first-of-type { margin: 0 } - } - } - - .nothing-here { - @include status-shadow; - - color: $primary-lighter1-text-color; - background: $base-lighter1-color; - } - - .footer { - h4 { color: $primary-lighter1-text-color } - - ul { - a { color: $primary-lighter2-text-color } - } - - .brand { - svg path { - /* Only for Itabashi-don */ - &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } - &#Mastodon { fill: $base-lighter1-color !important } - } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/searches.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/searches.scss deleted file mode 100644 index b4478b91b..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/searches.scss +++ /dev/null @@ -1,41 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.search { - .search { - &__input { - @include material-border; - - color: $primary-text-color; - background: $form-color; - - &:focus { background: $form-focused-color } - } - - &__icon { - .fa { color: $icon-color } - } - } - - &-results { - > .search-results { - &__header { background: $base-color } - &__section { - > h5 { background: darken($base-color, 10%) } - } - } - } -} - -.trends__item { - background: $trend-color; - - .trends__item { - &__name a { color: $secondary-text-color } - &__current { color: lighten($secondary-text-color, 10%) } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-account.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-account.scss deleted file mode 100644 index 02fb9eac4..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-account.scss +++ /dev/null @@ -1,54 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.edit_account { - @media screen and (min-width: 415px) { - .card { - > a { - position: relative; - - .card__img { - border-bottom: 1px solid $base-separation-color; - - > img:not([src]), - > img[src="/headers/original/missing.png"] { - content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); - } - } - - .card__bar { - position: static; - padding-top: 30%; - - .avatar { - position: absolute; - left: 0; - bottom: 0; - - display: flex; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; - - img { - width: 128px; - height: 128px; - - border-radius: 50%; - } - } - - .display-name { - flex: auto; - margin-left: 0; - text-align: center; - } - } - } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-dashboard.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-dashboard.scss deleted file mode 100644 index b4303249b..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-dashboard.scss +++ /dev/null @@ -1,30 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.dashboard { - &__counters { - & > div { - & > div, & > a { background: $dashboard-counters-base-color } - - & > a { - &:hover, - &:focus, - &:active { - background: $dashboard-counters-hover-color; - } - } - } - - &__text, - &__num { color: $primary-text-color } - - &__label { color: $primary-lighter1-text-color } - } - - &__widgets { - a:not(.name-tag) { color: $primary-lighter2-text-color } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-directory_tag.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-directory_tag.scss deleted file mode 100644 index 9f75646ac..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-directory_tag.scss +++ /dev/null @@ -1,21 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.admin-wrapper { - .content { - .directory__tag { - & > a, - & > div { background: $setting-base-color } - - h4 { - & { color: $primary-lighter2-text-color } - .fa, small { color: $primary-lighter1-text-color } - } - - .trends__item__current { color: $primary-text-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-log.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-log.scss deleted file mode 100644 index 672a77c06..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-log.scss +++ /dev/null @@ -1,30 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.log-entry { - .log-entry { - &__header { - color: $primary-lighter2-text-color; - background: $log-entry-color; - - .username, - .target, - a { color: $secondary-text-color } - } - - &__timestamp { color: $primary-lighter1-text-color } - &__icon { color: $icon-color } - - &__extras { - color: $primary-text-color; - background: $log-entry-extra-color; - - .diff-neutral { color: $log-entry-extra--neutral-color } - .diff-old { color: $log-entry-extra--old-color } - .diff-new { color: $log-entry-extra--new-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-report.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-report.scss deleted file mode 100644 index 2e198f338..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings-report.scss +++ /dev/null @@ -1,75 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.report-card { - background: $setting-content-base-color; - - &__profile__stats { - color: $primary-lighter2-text-color; - - a { - &:focus, - &:hover, - &:active { - color: lighten($primary-lighter2-text-color, 8%); - } - } - } - - &__summary { - &__item { - border-top-color: $base-separation-color; - - &:hover { background: $column-header-hover-color } - - &__reported-by, - &__assigned { - color: $primary-lighter2-text-color; - } - - &__content { - &__icon { color: $icon-color } - a { color: $primary-lighter2-text-color } - } - } - } -} - -.batch-table { - &__toolbar { - background: $base-lighter1-color; - border-color: $base-separation-color; - } - - &__row { - &, &:nth-child(2n) { background: $base-lighter1-color } - &:hover, &:nth-child(2n):hover { background: $column-header-hover-color } - - border-color: $base-separation-color; - - &__content { - .status__content { color: $primary-text-color } - .detailed-status__meta { color: $primary-lighter1-text-color } - - - .accounts-table { // v2.8.0 -> - .accounts-table { - &__count { - & {color: $primary-text-color } - small { color: $primary-lighter1-text-color } - } - } - - td .account { background: inherit } - } - } - } -} - -.speech-bubble { - &__bubble { color: $primary-text-color } - a { color: $secondary-text-color } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss deleted file mode 100644 index bfabd1e6e..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss +++ /dev/null @@ -1,245 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; -@import 'settings-account'; -@import 'settings-report'; -@import 'settings-log'; -@import 'settings-dashboard'; -@import 'settings-directory_tag'; - - - -body.admin { - color: $primary-text-color; - background: $setting-base-color; - - .sidebar { - &-wrapper { background: inherit } - - ul { - border-radius: 0; - - a { - color: $primary-lighter2-text-color; - border-radius: 0; - - &:hover { - color: $primary-text-color; - background: $setting-lists-hover-color; - } - - &.selected { - color: $primary-text-color; - background: $setting-lists-selected-color; - } - - i.fa { - @include material-icon-large; - margin-right: 8px; - vertical-align: bottom; - } - } - - ul { background: darken($setting-base-color, 4%) } - - .simple-navigation-active-leaf a { - color: $icon-active-color; - background: initial; - - &:hover { background: $setting-lists-hover-color } - } - } - } - - .content { - @include column-shadow; - background: $setting-content-base-color; - - h2, h3, h4, h6 { color: $primary-text-color } - - p { - color: $primary-text-color; - strong { color: $primary-text-color } - } - - h2, h4, hr { border-bottom-color: $base-separation-color } - .muted-hint { color: $primary-lighter1-text-color } - } -} - -.simple_form { - .input { - &.boolean, - &.with_label, - &.with_floating_label { - .label_input > label { color: $primary-text-color } - } - - &.with_block_label { - & > label { color: $primary-text-color } - } - - &.radio_buttons{ - .radio label { color: $primary-text-color } - } - - &-copy { - background: $base-color; - border-color: $base-separation-color; - } - } - - .check_boxes { - .checkbox { - label { color: $primary-text-color } - } - } - - input[type=text], - input[type=number], - input[type=email], - input[type=password], - textarea { - color: $primary-text-color; - background: $setting-content-base-color; - border-color: $base-separation-color; - - &:hover { - border-color: $base-separation-color; - } - - &:active, - &:focus { - background: darken($setting-content-base-color, 8%); - } - } - - select { - color: $primary-text-color; - background-color: $setting-content-base-color; - border-color: $base-separation-color; - } - - .input.field_with_errors { - label, - .error { - color: $error-text-color; - } - } - - .hint, p.hint { - color: $primary-lighter1-text-color !important; - - code { - color: $light-text-color; - background: $setting-emphasis-color; - } - } - - .recommended { - color: $verified-color; - background-color: transparentize($verified-color, 0.75); - border-color: $verified-color; - } - - .label_input { - &__append { color: $primary-lighter1-text-color } - } - - button { - @include button-shadow; - background-color: $active-button-color; - } -} - -.simple_form, -.table-form { - .warning { background: change-color($color: $error-color, $alpha: 0.8) } -} - -.quick-nav { - a { - color: $secondary-text-color; - - &:hover, - &:focus, - &:active { - color: lighten($secondary-text-color, 8%); - } - } -} - -.pagination { - .page, - a { - color: $primary-text-color; - } - - .page { - &.current { - background: $icon-active-color; - color: $light-text-color; - } - } -} - -.filters { - .filter-subset { - strong { color: $primary-text-color } - - a { - color: $primary-lighter2-text-color; - - &:hover { color: $primary-text-color } - - &.selected { - color: $active-text-color; - border-bottom-color: $active-text-color; - } - } - } -} - -.new_form_two_factor_confirmation { - .qr-wrapper { - .qr-code { box-shadow: none } - .qr-alternative { color: $secondary-lighter1-text-color } - } -} - -label, -select#user_setting_default_privacy { - &[for=user_setting_default_privacy_public], - &[for=user_setting_default_privacy_unlisted], - option[value="public"], - option[value="unlisted"] { color: $active-text-color !important } -} - -.column-header__collapsible__extra { - .column-settings__section { color: $primary-text-color } - - .setting-toggle { - .react-toggle { - &.react-toggle--checked { - > .react-toggle-track { background: $setting-toggle-checked-color } - - > .react-toggle-thumb { - border-color: $setting-toggle-checked-color; - background-color: $setting-toggle-thumb-checked-color; - } - } - - > .react-toggle-track { background: $setting-toggle-color } - - > .react-toggle-thumb { - border-color: $setting-toggle-color; - background-color: $setting-toggle-thumb-color; - } - } - - .setting-toggle__label { color: $primary-text-color } - } - - .setting-meta__label { color: $primary-lighter1-text-color } -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss deleted file mode 100644 index b3f5ffae3..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss +++ /dev/null @@ -1,123 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.status { - @include status-shadow; - @include material-card-radius; - border-bottom: 0; - - transition: box-shadow 0.1s 0s ease-out; - - &.light { - .status { - &__relative-time { color: $primary-lighter1-text-color } - &__display-name { - color: $primary-text-color; - - .display-name__account { color: $primary-lighter1-text-color } - } - - &__content { color: $primary-text-color } - } - - .display-name strong { color: $primary-text-color } - } - - &.status-direct { - background: $status-direct-color; - - &:not(.read) { - background: inherit; - border-bottom-color: initial; - } - } - - &.muted { - .status__content { - p { color: lighten($primary-text-color, 20%) } - } - } - - .status { - &__info { - .status__display-name { - color: $primary-lighter1-text-color; - - strong { color: $primary-text-color } - } - - .status__relative-time { color: $primary-lighter1-text-color } - } - } - - &__action-bar__counter__label { color: $primary-lighter1-text-color } -} - -.detailed-status { - &__display-name { - color: $secondary-text-color; - - strong { color: $primary-text-color } - } - - &__meta { - .detailed-status__datetime { color: $primary-lighter1-text-color } - - .detailed-status__link { - .fa.fa-star { vertical-align: middle } - } - } - - &__wrapper { - @include status-shadow; - - .detailed-status { @extend .detailed-status; } - .detailed-status__action-bar { - background: $status-actionbar-color; - border-color: $base-separation-color; - } - } -} - -.status, -.detailed-status { - background: $status-color; - - .status__content { - color: $primary-text-color; - - a { color: $secondary-text-color } - - .status__content__spoiler-link { - color: $primary-text-color; - background: $base-color; - } - } -} - -a.status-card, -a.status-card.compact { - &:hover { background: initial } -} - -.status-card, -.status-card.compact { - border-color: $non-elevated-card-boader; - - &__title { - color : $primary-text-color; - } - - &__host { - color: $primary-lighter1-text-color; - } -} - -.name-tag, -a.name-tag { - color: $secondary-text-color; -} \ No newline at end of file diff --git a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/tables.scss b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/tables.scss deleted file mode 100644 index e71ce7a38..000000000 --- a/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/tables.scss +++ /dev/null @@ -1,29 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.table { - thead th { border-bottom-color: $base-separation-color } - - th, - td { - color: $primary-text-color; - background-color: $base-color; - border-top: 0; - } - - & > tbody > tr:nth-child(odd) { - & > td, & > th { background: darken($base-color, 4%) } - } - - a { color: $secondary-text-color } -} - -a.table-action-link, -button.table-action-link { - color: $secondary-text-color; - - &:hover { color: darken($secondary-text-color, 8%) } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev.scss deleted file mode 100644 index 1c8df2bab..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev.scss +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Google+ Theme for Mastodon v1.1 - * Copyright (C) 2018-2019 Genbu Project - */ - - @charset "UTF-8"; - - // @import 'application'; - @import 'application'; - @import 'gplus-theme-for-mastodon-dev/basics'; - @import 'gplus-theme-for-mastodon-dev/components'; - @import 'gplus-theme-for-mastodon-dev/emoji-picker'; - @import 'gplus-theme-for-mastodon-dev/tables'; - @import 'gplus-theme-for-mastodon-dev/columns'; - @import 'gplus-theme-for-mastodon-dev/lists'; - @import 'gplus-theme-for-mastodon-dev/accounts'; - @import 'gplus-theme-for-mastodon-dev/statuses'; - @import 'gplus-theme-for-mastodon-dev/notifications'; - @import 'gplus-theme-for-mastodon-dev/searches'; - @import 'gplus-theme-for-mastodon-dev/settings'; - @import 'gplus-theme-for-mastodon-dev/icons'; - @import 'gplus-theme-for-mastodon-dev/profile'; - @import 'gplus-theme-for-mastodon-dev/about'; - @import 'gplus-theme-for-mastodon-dev/explore'; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/_functions.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/_functions.scss deleted file mode 100644 index e5aea0e4e..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/_functions.scss +++ /dev/null @@ -1,15 +0,0 @@ -@charset "UTF-8"; - - - -@function adjust-lightness ($color, $lightness) { - @if (lightness($color) - $lightness <= 0 and lightness($color) + $lightness < 100) { - @return lighten($color, $lightness); - } - - @if (0 < lightness($color) - $lightness and 100 <= lightness($color) + $lightness) { - @return darken($color, $lightness); - } - - @return change-color($color, $lightness: $lightness); -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/_mixins.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/_mixins.scss deleted file mode 100644 index 400a1ac90..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/_mixins.scss +++ /dev/null @@ -1,13 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -@mixin column-shadow { box-shadow: 0 1px 8px 0 $column-header-shadow-color } -@mixin status-shadow { box-shadow: 0 1px 4px 0 $status-shadow-color } -@mixin status-focus-shadow { box-shadow: 0 0 20px 0 $status-focused-shadow-color } -@mixin button-shadow { box-shadow: 0 2px 5px 0 $button-shadow-color } -@mixin material-border { border-radius: 4px } -@mixin material-card-radius { border-radius: 2px } -@mixin material-icon-large { font-size: 20px } \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss deleted file mode 100644 index 8ae2a027a..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss +++ /dev/null @@ -1,99 +0,0 @@ -@charset "UTF-8"; - - - -// Base colors -$active-color: #db4437; -$accent-color: #fbbc04; -$valid-color: #4285f4; -$error-color: #d50000; -$checked-color: #4285f4; -$verified-color: #4caf50; - - -// Text colors -$primary-text-color: rgba(0, 0, 0, 0.87); -$primary-lighter1-text-color: change-color($color: $primary-text-color, $lightness: 62%, $alpha: 1.0); // ex: 時間表示 -$primary-lighter2-text-color: change-color($color: $primary-text-color, $lightness: 38%, $alpha: 1.0); // ex: 通知メッセージ表示 -$secondary-text-color: #2962ff; // ex: リンク -$secondary-lighter1-text-color: #00bfff; // ex: アカウントTLのユーザーID -$light-text-color: #ffffff; -$light-darker1-text-color: darken($light-text-color, 15%); -$active-text-color: $active-color; -$error-text-color: $error-color; - - -// Icon colors -$icon-color: #757575; -$icon-active-color: $active-color; - - -// Background colors -$base-color: #f1f1f1; -$base-lighter1-color: #ffffff; -$base-darker1-color: rgba(0, 0, 0, 0.4); - -$column-header-color: $base-lighter1-color; -$column-header-hover-color: darken($column-header-color, 10%); - -$status-color: $base-lighter1-color; -$status-direct-color: darken($status-color, 5%); -$status-actionbar-color: darken($status-color, 2%); - -$account-color: $base-lighter1-color; -$account-foreground-color: $base-darker1-color; - -$card-color: $base-lighter1-color; -$card-hover-color: $column-header-hover-color; -$card-image-color: $base-color; -$warning-card-color: #26a69a; - -$form-color: rgba(0, 0, 0, 0.1); -$form-focused-color: lighten($form-color, 20%); -$trend-color: $base-lighter1-color; - -$setting-base-color: $base-color; -$setting-lists-selected-color: darken($base-color, 2%); -$setting-lists-hover-color: darken($base-color, 5%); -$setting-content-base-color: $base-lighter1-color; - -$setting-toggle-color: #b9b9b9; -$setting-toggle-checked-color: change-color($color: $checked-color, $alpha: 0.5); -$setting-toggle-thumb-color: #fafafa; -$setting-toggle-thumb-checked-color: $checked-color; - -$setting-emphasis-color: $verified-color; - -$dashboard-counters-base-color: $base-color; -$dashboard-counters-hover-color: lighten($base-color, 2%); - -$log-entry-color: $base-lighter1-color; -$log-entry-extra-color: $base-color; -$log-entry-extra--neutral-color: $valid-color; -$log-entry-extra--old-color: $active-color; -$log-entry-extra--new-color: $verified-color; - -$explore-header-color: lighten($accent-color, 16%); -$explore-directory-color: $base-lighter1-color; - -$active-button-color: $valid-color; //文字入りボタン -$non-active-button-color: lighten($base-color, 20%); - -$floating-acton-button-hover-color: lighten($active-color, 10%); - - -// Shadow colors -$column-header-shadow-color: rgba(0, 0, 0, 0.3); -$status-shadow-color: rgba(0, 0, 0, 0.14); -$status-focused-shadow-color: change-color($color: $status-shadow-color, $alpha: 0.3); -$icon-hovered-shadow-color: rgba(0, 0, 0, 0.26); -$account-header-image-shadow-color: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.46)); -$button-shadow-color: rgba(0, 0, 0, 0.4); - - -// Separation colors -$base-separation-color: rgba(0, 0, 0, 0.14); - - -//Border colors -$non-elevated-card-boader : #e0e0e0; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/about.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/about.scss deleted file mode 100644 index de48883a8..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/about.scss +++ /dev/null @@ -1,138 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -// from mastodon/about.scss -$column-breakpoint: 700px; - - - -.landing-page { - h3, h4, h5, h6 { color: $primary-lighter2-text-color } - p { color: $primary-lighter1-text-color } - em { color: $primary-text-color } - - .column-0 { background: $base-darker1-color } - .column-2 { - .landing-page { - &__information { padding: 0 } - - &__short-description { - & > .row:first-child { - background: $base-darker1-color; - padding: 10px 20px; - } - - & > * { - padding-left: 40px; padding-right: 40px; - &:last-child { padding-bottom: 45px } - - @media screen and (max-width: $column-breakpoint) { - padding-left: 20px; padding-right: 20px; - &:last-child { padding-bottom: 25px } - } - } - } - } - } - - &__forms, - &__information, - &__call-to-action { - @include status-shadow; - background: $column-header-color; - } - - &__forms { - padding: 0; - - & > *:first-child { margin: inherit } - & > * { margin-left: 20px; margin-right: 20px; } - - .brand { background: $base-darker1-color } - - form { - & > .input input { - background: $form-color; - - &:focus { background: $form-focused-color } - } - } - - .separator-or { - margin-left: 20px; margin-right: 20px; - - span { - color: $primary-lighter1-text-color; - background: $column-header-color; - } - } - - @media screen and (max-width: $column-breakpoint) { - background: inherit; - box-shadow: none; - - .separator-or span { background: $base-color } - } - } - - &__information { - color: $primary-lighter1-text-color; - - &.contact-widget { - @include status-shadow; - background: $column-header-color; - - .contact-widget { - &__mail { - a { color: $primary-text-color } - } - } - } - - strong { color: inherit } - - .row:first-child { - h1 small { - color: $light-darker1-text-color; - - span { color: $light-text-color } - } - } - } - - &__call-to-action { - .row__information-board { - .information-board__section { - color: $primary-lighter2-text-color; - - & > span:last-child { color: $primary-lighter1-text-color } - } - } - } - - &__features { - .features-list { - .features-list__row { - .text { color: $primary-lighter1-text-color } - .visual .fa { color: $icon-color } - } - } - } - - &__footer { color: $primary-lighter1-text-color } - - #mastodon-timeline { - color: $primary-text-color; - background: transparent; - - p { - color: $primary-text-color; - - a { color: $secondary-text-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss deleted file mode 100644 index 7c4bcb5bf..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss +++ /dev/null @@ -1,194 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.account { - background: $account-color; - border-color: $base-separation-color; - - .account { - &__display-name { - color: $secondary-text-color; - strong { color: $primary-text-color } - } - } - - &-role { - color: $primary-lighter2-text-color; - background-color: rgba($base-separation-color, 0.1); - border-color: rgba($base-separation-color, 0.5); - } -} - -.column { - > .column-back-button { - @include column-shadow; - background: $column-header-color; - } -} - -.account-timeline__header { - .account__header { - background-color: $account-foreground-color; - - > div { background-color: inherit } // -> v2.7.4 - - .account__header { - &__username { color: $secondary-lighter1-text-color } - &__fields { @extend .account__header__fields; } - - &__image { // v2.8.0 -> - &::after { - content: ""; - - position: absolute; - top: auto; - left: 0; - bottom: 0; - - width: 100%; - height: 30%; - background: $account-header-image-shadow-color; - box-shadow: none; - } - - > img:not([src]), - > img[src$="/headers/original/missing.png"] { - content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); - } - } - - &__bar { // v2.8.0 -> - background-color: $base-lighter1-color; - - .account__header { - &__tabs { - .avatar { - .account__avatar { - border-color: $base-lighter1-color; - border-radius: 50%; - } - } - - &__buttons { - .icon-button { - border: 0; - border-radius: 50%; - } - } - - &__name { - h1 { color: $primary-text-color } - small { color: $secondary-text-color } - } - } - - &__bio { - .account__header { - &__content { color: $primary-text-color } - &__fields { border-color: $base-separation-color } - } - } - - &__extra { - &__links { - &, a { color: $primary-lighter1-text-color } - strong { color: $primary-lighter2-text-color } - } - } - } - } - } - - .account--action-button { - .icon-button:not(.active) { - color: darken($light-text-color, 7%); - - &:active, - &:focus, - &:hover { - color: $light-text-color; - } - } - } - } - - .account { - &__disclaimer, - &__action-bar, - &__section-headline { - background: $base-lighter1-color; - border-color: $base-separation-color; - } - - &__action-bar { - &__tab { - border-color: $base-separation-color; - &.active { border-bottom-color: $active-color } - - > span { color: $primary-lighter1-text-color } - } - } - - &__section-headline { - a { - color: $primary-text-color; - - &.active { - color: $active-color; - - &::before { border-color: transparent transparent $base-separation-color } - &::after { border-color: transparent transparent $status-color } - } - } - } - } -} - -.account-authorize__wrapper { - @include status-shadow; - background: $base-lighter1-color; - - &:focus { @include status-focus-shadow; } - - .account { - &__header__content { - color: $primary-lighter2-text-color; - } - - &--panel { - background: $account-color; - border-color: $base-separation-color; - } - } -} - -.account__header__fields { - dl { - border-color: $base-separation-color; - - dt, - dd { - color: $primary-text-color; - background: $base-lighter1-color; - } - - dd { - &.verified { - border-color: transparentize($valid-color, 0.5); - background: transparentize($valid-color, 0.75); - - a { color: lighten($verified-color, 20%) } - } - } - } - - a { color: $secondary-text-color } -} - -.account__action-bar__tab { - strong { color: $primary-text-color } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/basics.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/basics.scss deleted file mode 100644 index a141ecd13..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/basics.scss +++ /dev/null @@ -1,47 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -body { - &, - .ui { - color: $primary-text-color; - background: $base-color; - } -} - -.focusable { - &:focus { - background: inherit; - - .status { - @include status-focus-shadow; - - &.status-direct { background: $status-direct-color } - } - - .detailed-status { - & { background: $status-color } - &__action-bar { background: $status-actionbar-color } - } - } -} - -::-webkit-scrollbar-thumb { - background: darken($base-lighter1-color, 12%); - - &:hover { background: darken($base-lighter1-color, 16%) } - &:active { background: darken($base-lighter1-color, 12%) } -} - -::-webkit-scrollbar-track { - background: $base-color; - - &:hover, - &:active { - background: darken($base-lighter1-color, 8%); - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss deleted file mode 100644 index ce5f082b1..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss +++ /dev/null @@ -1,335 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.tabs-bar { - margin: 0; - background: $column-header-color; - position: relative; - - .tabs-bar { - &__link { - color: $icon-color; - border-bottom: 4px solid $column-header-color; - padding: 15px 10px 11px 10px; - - &.active { - border-bottom: 4px solid $active-color; - } - - .fa { - @include material-icon-large; - vertical-align: top; - } - } - } -} - -.drawer { - .drawer { - &__header { - @include column-shadow; - background: $column-header-color; - - .drawer__tab { - @include material-icon-large; - color: $icon-color; - } - - a { - &:hover { background: $column-header-hover-color } - } - } - - &__pager { - @include status-shadow; - @include material-card-radius; - - .drawer__inner { - background: $column-header-color; - - &__mastodon { display: none } - } - } - } -} - -.navigation-bar { - color: $secondary-text-color; - background: $column-header-color; - - .navigation-bar { - &__profile { - strong { color: $primary-text-color } - &-edit { color: $secondary-text-color } - } - } -} - - -.compose-form { - .compose-form { - &__buttons-wrapper { - background: $column-header-color; - - &.character-counter__wrapper { - .character-counter { color: $primary-lighter1-text-color } - } - } - - &__warning { - background-color: $warning-card-color; - } - - &__publish { border-top: 1px solid $base-separation-color } - &__modifiers { background-color: $base-lighter1-color } - } - - .autosuggest-textarea__textarea { - background-color: $base-lighter1-color; - color: $primary-text-color; - } - - .character-counter { - color: $icon-color - } -} - -.column { - .column-header { - @include column-shadow; - background: $column-header-color; - - &.active { - .column-header__icon { - color: $icon-active-color; - text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); - } - } - - * { background: inherit } - - &__icon { - @include material-icon-large; - color: $icon-color; - vertical-align: bottom; - margin-right: 10px; - } - - &__buttons { - height: 50px; - - .column-header { - &__back-button { - .column-back-button__icon { vertical-align: bottom } - } - - &__button { - &.active { - color: $icon-active-color; - background: inherit; - } - - .fa { vertical-align: unset } - } - } - } - - &__button { - color: $icon-color; - padding: 0 16px; - } - - &__collapsible { - color: $secondary-text-color; - border-bottom: 1px solid $base-separation-color; - - &-inner { background: $column-header-color } - } - } - - .column-back-button { - background-color: $column-header-color; - color: $secondary-text-color; - - &__icon { - @include material-icon-large; - vertical-align: bottom; - margin-right: 8px; - } - } - - .column { - &-subheading, - &-link__badge { - background: $base-color; - color: $secondary-text-color; - } - - &-link { - color: $primary-text-color; - background: $base-color; - - &__icon { - @include material-icon-large; - color: $icon-color; - vertical-align: bottom; - margin-right: 8px; - } - } - } - - .scrollable { - background: transparent; - - *[role="feed"] { - article { - margin: 1em 0; - &:first-of-type { margin: 0 } - - &:focus { outline: none } - } - } - - div[tabindex="-1"] { margin-bottom: 1em } - } - - .notification__filter-bar { - background: $column-header-color; - border-bottom-color: $base-separation-color; - - button { - color: $icon-color; - background: $column-header-color; - - &.active { - color: $icon-active-color; - - &::before { border-color: transparent transparent $base-separation-color } - &::after { border-color: transparent transparent $column-header-color } - } - } - } - - .empty-column-indicator { - flex-direction: column; - background: $base-color; - - &::before { - content: ""; - display: block; - - width: 100px; - height: 100px; - margin-bottom: 1em; - - background: none center / contain no-repeat; - background-image: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/notification-jingle_2x.gif"); - } - } -} - -// v2.9.0以降に対応 -.column-header { - @include column-shadow; - background: $column-header-color; - - &.active { - .column-header__icon { - color: $icon-active-color; - text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); - } - } - - * { background: inherit } - - &__icon { - @include material-icon-large; - color: $icon-color; - vertical-align: bottom; - margin-right: 10px; - } - - &__buttons { - height: 50px; - - .column-header { - &__back-button { - .column-back-button__icon { vertical-align: bottom } - } - - &__button { - &.active { - color: $icon-active-color; - background: inherit; - } - - .fa { vertical-align: unset } - } - } - } - - &__button { - color: $icon-color; - padding: 0 16px; - } - - &__collapsible { - color: $secondary-text-color; - border-bottom: 1px solid $base-separation-color; - - &-inner { background: $column-header-color } - } -} -.column-back-button { - background-color: $column-header-color; - color: $secondary-text-color; - - &__icon { - @include material-icon-large; - vertical-align: bottom; - margin-right: 8px; - } -} - -.getting-started { - &__wrapper, - & { - background: $base-color; - } - - & { - border-top: 1px solid $base-separation-color; - - a { color: $primary-text-color } - } -} - -.load { - &-more, - &-gap { - background: transparent; - - &:hover { background: darken($column-header-color, 10%) } - } - - &-gap { border: 0 } -} - -.confirmation-modal { - @include material-card-radius; - color: $primary-text-color; - background-color: $base-lighter1-color; - - &__action-bar { - background-color: $base-lighter1-color; - } - - &__cancel-button { - color: $primary-lighter1-text-color; - box-shadow: 0 2px 5px 0 transparent; - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss deleted file mode 100644 index 8abd2ad5e..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss +++ /dev/null @@ -1,60 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.floating-action-button { - font-size: 24px; - background-color: $active-color; - width: 3.6rem; - height: 3.6rem; - - &:active { - background-color: $active-color; - } - - &:hover { - background-color: $floating-acton-button-hover-color; - } -} - -.button { - @include button-shadow; - @include material-card-radius; - background-color: $active-button-color; - - .text-icon-button { - color: $primary-lighter1-text-color; - border-radius: 50%; - } - - .button--block { @include button-shadow } - - .button-secondary { - background-color: $primary-lighter1-text-color; - border: 0px; - } -} - -.modal-root { - &__modal { - .media-modal { - &__close.icon-button { - font-size: 40px; - width: 40px; - height: 40px; - - &:hover { - background-color: darken($base-lighter1-color, 40%); - } - } - } - } -} - -// DOM操作によりpaddingが調整できないもの -.privacy-dropdown__value-icon.icon-button.inverted, -.compose-form__poll-button-icon.icon-button.inverted, -.compose-form__upload-button-icon.icon-button.inverted { padding: 4px } \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-card.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-card.scss deleted file mode 100644 index dc72775a1..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-card.scss +++ /dev/null @@ -1,38 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.card { - //border: 1px solid $base-separation-color; - //不要(?) - - > a { - @include status-shadow; - - &:hover, - &:focus, - &:active { - .card__bar { - background: initial; - - .display-name strong { color: $secondary-text-color } - } - } - - .card__img { background: $card-image-color } - .card__bar { - background: $card-color; - - .avatar { - img { background: transparent } - } - - .display-name { - strong { color: $primary-text-color } - span { color: $primary-lighter2-text-color } - } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss deleted file mode 100644 index b84fae3be..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss +++ /dev/null @@ -1,71 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - -.dropdown-menu { - background-color: $column-header-color; - - &__arrow { - &.top { border-top-color: $column-header-color } - &.bottom { border-bottom-color: $column-header-color } - } - - &__separator { margin: 4px 0 } -} - -.dropdown-menu, -.actions-modal { - @include material-card-radius; - - & > ul { - background: $base-lighter1-color; - - .dropdown-menu { - &__item { - a { - color: $primary-lighter2-text-color; - - padding: 16px 16px; - background: $column-header-color; - - &:active, - &:focus, - &:hover { - color: $primary-text-color; - background: $column-header-hover-color; - } - } - } - - &__separator { border-bottom-color: $base-separation-color } - } - - & > li:not(:empty) { - @extend .dropdown-menu__item; - - a { - padding: 12px 16px; - color: $primary-text-color; - - &:hover { - color: $primary-text-color; - background-color: $column-header-hover-color; - } - } - } - } - - .status { - background-color: $base-lighter1-color; - padding-top: 16px; - padding-bottom: 16px; - padding-right: 16px; - padding-left: 74px; - - &__avatar { - top: 16px; - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-status-card.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-status-card.scss deleted file mode 100644 index 9b64572f9..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/components-status-card.scss +++ /dev/null @@ -1,12 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.status-card { - color: $primary-lighter1-text-color; - &__title, &__description { color: $primary-lighter2-text-color } - - &__image { background: transparent } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/components.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/components.scss deleted file mode 100644 index e735b108d..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/components.scss +++ /dev/null @@ -1,6 +0,0 @@ -@charset "UTF-8"; - -@import 'components-button'; -@import 'components-card'; -@import 'components-dropdown'; -@import 'components-status-card'; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/emoji-picker.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/emoji-picker.scss deleted file mode 100644 index 0937158bf..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/emoji-picker.scss +++ /dev/null @@ -1,68 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.emoji-mart { - &-bar { - border: 0 solid $base-separation-color; - - &:first-child { - border-top-left-radius: 2px; - border-top-right-radius: 2px; - background-color: $base-color; - } - } - - &-anchors { - color: $icon-color; - } - &-anchor { - &-selected { - color: $icon-active-color; - - &:hover { - color: $icon-active-color; - } - } - - &-bar { - background-color: $icon-active-color; - } - } - - &-search { - background-color: $base-lighter1-color; - } - &-search input { - color: $primary-text-color; - background-color: $form-color; - border: 0px solid #ffffff00; - } - - &-category-label span { - color: $primary-text-color; - background-color: $base-lighter1-color; - } - - &-scroll { - background-color: $base-lighter1-color; - } -} - -.emoji-picker-dropdown { - &__modifiers { - &__menu { - @include status-shadow; - @include material-card-radius; - background-color: $base-lighter1-color; - } - } - - &__menu { - @include column-shadow; - background-color: $base-lighter1-color; - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/explore.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/explore.scss deleted file mode 100644 index ae80b3884..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/explore.scss +++ /dev/null @@ -1,47 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.public-layout { - .page-header { - background: $explore-header-color; - - h1 { color: $primary-text-color } - p { color: $primary-lighter2-text-color } - } - - .directory, - .notice-widget { @include column-shadow; } - - .directory { - background: $explore-directory-color; - - .accounts-table { - &__count { - color: $primary-lighter2-text-color; - small { color: $primary-lighter1-text-color } - } - } - - &__tag { - & > a { - @include status-shadow; - background: $explore-directory-color; - } - - h4 { color: $primary-lighter2-text-color } - .fa, small { color: $primary-lighter1-text-color } - .trends__item__current { color: $primary-text-color } - } - } - - .notice-widget { - color: $primary-lighter1-text-color; - background: $explore-directory-color; - - a { color: $secondary-text-color } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss deleted file mode 100644 index ee45f5712..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss +++ /dev/null @@ -1,205 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -@function hex-color($color) { - @if type-of($color) == 'color' { - $color: str-slice(ie-hex-str($color), 4); - } - - @return '%23' + unquote($color) -}; - - - -@font-face { - font-family: "Material Icons Extended"; - src: - local("Material Icons Extended"), - url("https://fonts.gstatic.com/s/materialiconsextended/v50/kJEjBvgX7BgnkSrUwT8UnLVc38YydejYY-oE_LvJ.woff2"), - url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/font-Material_Icons_Extended-v50.woff2"); -} - -.icon-button { - color: $icon-color; - border-radius: 50%; - width: 28px !important; // UIの密度が下がる代わりに、ホバー時に正常に表示 - height: 28px !important; // !importantを付けないと動作しない…? - - &:active, - &:focus { background-color: transparent } - - &:hover { - color: lighten($icon-color, 7%); - background-color: $column-header-hover-color; - } - - &.star-icon { - &.active { - color: $light-text-color; - background: $icon-active-color; - border-radius: 50%; - } - - .fa.fa-star { vertical-align: top } - } - - &.inverted { color: $icon-color } - - &.overlayed { border-radius: 50% } - - &.disabled { - color: lighten($icon-color, 13%); - - .fa.fa-retweet { - background-image: url("data:image/svg+xml;utf8,"); - } - } - - .fa { - @include material-icon-large; - vertical-align: middle; - - &.fa-retweet { - background-image: url("data:image/svg+xml;utf8,"); - - &:active, - &:hover, - &:focus { - background-image: url("data:image/svg+xml;utf8,"); - } - } - } -} - -.fa { - &.fa-users, - &.fa-globe, - &.fa-cog, - &.fa-cogs, - &.fa-gears, - &.fa-sign-out, - &.fa-star, - &.fa-reply, - &.fa-reply-all, - &.fa-mail-reply, - &.fa-mail-reply-all, - &.fa-envelope, - &.fa-bookmark, - &.fa-home, - &.fa-bell, - &.fa-eraser, - &.fa-ellipsis-h, - &.fa-ellipsis-v, - &.fa-address-book, - &.fa-thumb-tack, - &.fa-lock, - &.fa-pencil, - &.fa-chevron-left, - &.fa-chevron-right, - &.fa-camera, - &.fa-tasks, - &.fa-sliders, - &.fa-fire, - &.fa-list-ul, - &.fa-search, - &.fa-close, - &.fa-remove, - &.fa-times, - &.fa-user, - &.fa-mobile-phone, - &.fa-mobile, - &.fa-filter, - &.fa-user-plus, - &.fa-cloud-upload, - &.fa-cloud-download, - &.fa-eye, - &.fa-eye-slash, - &.fa-share-alt, - &.fa-chevron-down, - &.fa-bars, - &.fa-navicon, - &.fa-reorder, - &.fa-desktop, - &.fa-code, - &.fa-list, - &.fa-paperclip, - &.fa-plus, - &.fa-bullhorn { - font-family: "Material Icons Extended"; - } - - &.fa-users::before { content: "people" } // 人々マーク(.drawer__header > .drawer__tab:2) - &.fa-globe::before { content: "public" } // 地球マーク(.drawer__header > .drawer__tab:3) - &.fa-cog::before { content: "settings" } // 歯車マーク(.drawer__header > .drawer__tab:4) - &.fa-cogs::before { content: "settings" } //歯車マーク(モバイル) - &.fa-gears::before { content: "settings" } //歯車マーク(モバイル) - &.fa-sign-out::before { content: "exit_to_app" } //サインアウト - &.fa-star::before { content: "plus_one" } // +1(.status .status__action-bar > .star-icon) - &.fa-reply::before { content: "reply" } //返信ボタン - &.fa-reply-all::before { content: "reply_all" } //全員に返信ボタン - &.fa-mail-reply::before { content: "reply" } //返信ボタン - &.fa-mail-reply-all::before { content: "reply_all" } //全員に返信ボタン - &.fa-envelope::before { content: "mail" } //ダイレクトメッセージボタン - &.fa-bookmark::before { content: "bookmark" } //ブックマークボタン - &.fa-home::before { content: "home" } // 家マーク(ホームタイムライン) - &.fa-bell::before { content: "notifications" } // ベルマーク(通知) - &.fa-eraser::before { content: "clear_all" } // 通知を消去のマーク - &.fa-ellipsis-h::before { content: "more_horiz" } // 三点リーダー(横) - &.fa-ellipsis-v::before { content: "more_vert" } // 三点リーダー(縦) - &.fa-address-book::before { content: "explore" } // discoverマーク(explore遷移タブ) - &.fa-thumb-tack::before { content: "" } // ピンマーク(ピン留め投稿) - &.fa-lock::before { content: "" } // サークルマーク(フォロワー限定投稿) - &.fa-pencil::before { content: "create" } // 鉛筆マーク(モバイル用フローティングボタン) - &.fa-chevron-left::before { content: "arrow_back" } //戻るボタン - &.fa-chevron-right::before { content: "arrow_forward" } //進むボタン - &.fa-camera::before { content: "camera_alt" } //メディアを追加ボタン - &.fa-tasks::before { content: "poll" } //投票を追加ボタン - &.fa-sliders::before { content: "tune" } //設定を表示ボタン - &.fa-fire::before { content: "whatshot" } //トレンドマーク - &.fa-list-ul::before { content: "list" } //リストマーク - &.fa-search::before { content: "search" } //検索アイコン(モバイル、トップバー内) - &.fa-close::before { content: "close" } //閉じるボタン - &.fa-remove::before { content: "close" } //閉じるボタン - &.fa-times::before { content: "close" } //閉じるボタン(メディア) - &.fa-user::before { content: "account_circle" } //ユーザーアイコン - &.fa-mobile-phone::before { content: "smartphone" } //モバイルアイコン - &.fa-mobile::before { content: "smartphone" } //モバイルアイコン - &.fa-filter::before { content: "filter_list" } //フィルターアイコン - &.fa-user-plus::before { content: "person_add" } //ユーザーの追加アイコン - &.fa-cloud-upload::before { content: "cloud_upload" } //インポートアイコン - &.fa-cloud-download::before { content: "cloud_download" } //エクスポートアイコン - &.fa-eye::before { content: "visibility" } //目のアイコン - &.fa-eye-slash::before { content : "visibility_off" } //閉じた目のアイコン - &.fa-share-alt::before { content: "share" } //モバイル共有ボタン - &.fa-chevron-down::before { content: "keyboard_arrow_down" } //メニューボタン - &.fa-bars::before { content: "menu" } //ハンバーガーボタン - &.fa-navicon::before { content: "menu" } //ハンバーガーボタン - &.fa-reorder::before { content: "menu" } //ハンバーガーボタン - &.fa-desktop::before { content: "desktop_windows" } //外観設定のアイコン - &.fa-code::before { content: "code" } //開発アイコン - &.fa-list::before { content: "list" } //リストアイコン - &.fa-paperclip::before { content: "attach_file" } //メディアを追加のアイコン - &.fa-plus::before { content: "add" } // 追加ボタン - &.fa-bullhorn::before { content: "announcement"} //Adminからのお知らせ(一部サーバーのみ) -} - -.fa { - &.fa-chevron-left, - &.fa-chevron-right, - &.fa-plus { - @include material-icon-large; - vertical-align: bottom; - } - - &.fa-times { - @include material-icon-large; - vertical-align: top; - &.fa-fw { - font-size: 24px; - vertical-align: 8px; - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss deleted file mode 100644 index 6c664b32f..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/keyboard_shortcuts.scss +++ /dev/null @@ -1,21 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.keyboard-shortcuts { - kbd { - @include status-shadow; - - color: $primary-text-color; - background-color: $base-lighter1-color; - border-color: $base-darker1-color; - - margin: 0 0.25em; - - &:first-child { margin-left: 0 } - &:last-child { margin-right: 0 } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/lists.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/lists.scss deleted file mode 100644 index 05c29a6df..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/lists.scss +++ /dev/null @@ -1,55 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.column { - .column-back-button { background: inherit } - - .column-inline-form { - background: $column-header-color; - - label input { - color: $secondary-text-color; - &:focus { color: $primary-text-color } - } - } - - .column-inline-form ~ .scrollable { - article { margin: 0 } - } -} - -.modal-root { - .column-inline-form { - background: $column-header-color; - - .setting-text { - color: $primary-text-color; - &:active, &:focus { color: $primary-lighter2-text-color } - } - } - - .list-editor { - background: $base-color; - h4 { background: $column-header-color } - - .drawer__pager { - .drawer__inner { background: $column-header-color } - } - } - - .list-adder { - background: $base-color; - - .column-inline-form { border-bottom: 1px solid $base-separation-color } - - &__account, - &__lists { background: $column-header-color } - - &__lists { - .list { border-color: $base-separation-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/notifications.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/notifications.scss deleted file mode 100644 index bab098372..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/notifications.scss +++ /dev/null @@ -1,27 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.notification { - &.notification-favourite { - .status { - &.status-direct { background: transparent } - } - } - - > .notification__message { - color: $primary-lighter2-text-color; - font-size: 13px; - padding: 8px 0; - - .notification__display-name { - &:hover { color: inherit } - } - - .notification__favourite-icon-wrapper { - .star-icon { color: $icon-active-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/profile.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/profile.scss deleted file mode 100644 index 246d24b7d..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/profile.scss +++ /dev/null @@ -1,232 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.public-layout { - a.button { - @include button-shadow; - - color: $primary-text-color; - background: $base-lighter1-color; - - &:hover, - &:focus, - &:active { - background: darken($base-lighter1-color, 8%); - } - } - - .logo-button { - svg path { - /* Only for Itabashi-don */ - &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } - &#Mastodon { fill: $base-lighter1-color !important } - } - } - - .public-account-header { - @include status-shadow; - - &__image { - background: $base-lighter1-color; - - @media screen and (min-width: 600px) { height: 500px } - - &::after { - content: ""; - - position: absolute; - top: auto; - left: 0; - bottom: 0; - - width: 100%; - height: 30%; - background: $account-header-image-shadow-color; - box-shadow: none; - } - - > img:not([src]), - > img[src="/headers/original/missing.png"] { - content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); - } - } - - &__bar { - @media screen and (max-width: 600px) { - flex-direction: column; - background: $base-color; - } - - @media screen and (min-width: 600px) { margin-top: -140px } - - &::before { background: $base-lighter1-color } - - .avatar { - @media screen and (max-width: 600px) { - position: relative; - bottom: 30px; - - display: initial; - width: 60px; - height: 60px; - margin: 0 auto; - padding: 0; - } - - img { - border: 2px solid $base-lighter1-color; - border-radius: 50%; - background: transparent; - } - } - } - - &__tabs { - @media screen and (max-width: 600px) { - flex-wrap: wrap; - margin-left: 0; - - &__name { - width: 100%; - text-align: center; - - h1 { - color: $primary-text-color; - - small { color: $primary-lighter1-text-color } - } - } - - &__tabs { - justify-content: center; - flex: auto; - - .spacer { display: none } - - a.button.logo-button { - color: $light-text-color; - background: $secondary-text-color; - - svg path { - /* Only for Itabashi-don */ - &:not(#Mastodon):not(#Itabashi) { fill: $base-lighter1-color !important } - &#Mastodon { fill: $secondary-text-color !important } - } - } - } - } - - .details-counters { - .counter { - color: $light-text-color; - border-right: 0; - - &::after { border-bottom-color: $base-color } - - &.active { - &::after { border-bottom-color: $active-color } - } - } - } - } - - &__extra { - .public-account-bio { - .account__header__content { text-align: center } - } - - &__links { - color: $primary-text-color; - - a { - &, strong { color: $primary-text-color } - } - } - } - } - - .public-account-bio, - .endorsements-widget, - .hero-widget { @include status-shadow; } - - .public-account-bio { - background: $base-lighter1-color; - - .account__header__content { color: $primary-text-color } - &__extra { color: $primary-lighter1-text-color } - } - - .endorsements-widget { - padding-bottom: 0; - border-radius: 4px; - - h4 { - color: $primary-lighter1-text-color; - background: $base-lighter1-color; - } - } - - .hero-widget { - &__img { background: $base-color } - &__text { - background: $base-lighter1-color; - - &, em { color: $primary-lighter2-text-color } - a { color: $secondary-text-color } - } - } - - .account__section-headline { - background: $base-lighter1-color; - border-bottom-color: $base-separation-color; - - a { - color: $primary-lighter1-text-color; - - &.active { - color: $primary-lighter2-text-color; - - &::before { border-color: transparent transparent $base-separation-color } - &::after { border-color: transparent transparent $status-color } - } - } - } - - .activity-stream { - box-shadow: none; - - .entry { - margin: 1em 0; - background: transparent; - - &:first-of-type { margin: 0 } - } - } - - .nothing-here { - @include status-shadow; - - color: $primary-lighter1-text-color; - background: $base-lighter1-color; - } - - .footer { - h4 { color: $primary-lighter1-text-color } - - ul { - a { color: $primary-lighter2-text-color } - } - - .brand { - svg path { - /* Only for Itabashi-don */ - &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } - &#Mastodon { fill: $base-lighter1-color !important } - } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/searches.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/searches.scss deleted file mode 100644 index b4478b91b..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/searches.scss +++ /dev/null @@ -1,41 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.search { - .search { - &__input { - @include material-border; - - color: $primary-text-color; - background: $form-color; - - &:focus { background: $form-focused-color } - } - - &__icon { - .fa { color: $icon-color } - } - } - - &-results { - > .search-results { - &__header { background: $base-color } - &__section { - > h5 { background: darken($base-color, 10%) } - } - } - } -} - -.trends__item { - background: $trend-color; - - .trends__item { - &__name a { color: $secondary-text-color } - &__current { color: lighten($secondary-text-color, 10%) } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-account.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-account.scss deleted file mode 100644 index 02fb9eac4..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-account.scss +++ /dev/null @@ -1,54 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.edit_account { - @media screen and (min-width: 415px) { - .card { - > a { - position: relative; - - .card__img { - border-bottom: 1px solid $base-separation-color; - - > img:not([src]), - > img[src="/headers/original/missing.png"] { - content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); - } - } - - .card__bar { - position: static; - padding-top: 30%; - - .avatar { - position: absolute; - left: 0; - bottom: 0; - - display: flex; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; - - img { - width: 128px; - height: 128px; - - border-radius: 50%; - } - } - - .display-name { - flex: auto; - margin-left: 0; - text-align: center; - } - } - } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-dashboard.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-dashboard.scss deleted file mode 100644 index b4303249b..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-dashboard.scss +++ /dev/null @@ -1,30 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.dashboard { - &__counters { - & > div { - & > div, & > a { background: $dashboard-counters-base-color } - - & > a { - &:hover, - &:focus, - &:active { - background: $dashboard-counters-hover-color; - } - } - } - - &__text, - &__num { color: $primary-text-color } - - &__label { color: $primary-lighter1-text-color } - } - - &__widgets { - a:not(.name-tag) { color: $primary-lighter2-text-color } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-directory_tag.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-directory_tag.scss deleted file mode 100644 index 9f75646ac..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-directory_tag.scss +++ /dev/null @@ -1,21 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.admin-wrapper { - .content { - .directory__tag { - & > a, - & > div { background: $setting-base-color } - - h4 { - & { color: $primary-lighter2-text-color } - .fa, small { color: $primary-lighter1-text-color } - } - - .trends__item__current { color: $primary-text-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-log.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-log.scss deleted file mode 100644 index 672a77c06..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-log.scss +++ /dev/null @@ -1,30 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.log-entry { - .log-entry { - &__header { - color: $primary-lighter2-text-color; - background: $log-entry-color; - - .username, - .target, - a { color: $secondary-text-color } - } - - &__timestamp { color: $primary-lighter1-text-color } - &__icon { color: $icon-color } - - &__extras { - color: $primary-text-color; - background: $log-entry-extra-color; - - .diff-neutral { color: $log-entry-extra--neutral-color } - .diff-old { color: $log-entry-extra--old-color } - .diff-new { color: $log-entry-extra--new-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-report.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-report.scss deleted file mode 100644 index 2e198f338..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings-report.scss +++ /dev/null @@ -1,75 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.report-card { - background: $setting-content-base-color; - - &__profile__stats { - color: $primary-lighter2-text-color; - - a { - &:focus, - &:hover, - &:active { - color: lighten($primary-lighter2-text-color, 8%); - } - } - } - - &__summary { - &__item { - border-top-color: $base-separation-color; - - &:hover { background: $column-header-hover-color } - - &__reported-by, - &__assigned { - color: $primary-lighter2-text-color; - } - - &__content { - &__icon { color: $icon-color } - a { color: $primary-lighter2-text-color } - } - } - } -} - -.batch-table { - &__toolbar { - background: $base-lighter1-color; - border-color: $base-separation-color; - } - - &__row { - &, &:nth-child(2n) { background: $base-lighter1-color } - &:hover, &:nth-child(2n):hover { background: $column-header-hover-color } - - border-color: $base-separation-color; - - &__content { - .status__content { color: $primary-text-color } - .detailed-status__meta { color: $primary-lighter1-text-color } - - - .accounts-table { // v2.8.0 -> - .accounts-table { - &__count { - & {color: $primary-text-color } - small { color: $primary-lighter1-text-color } - } - } - - td .account { background: inherit } - } - } - } -} - -.speech-bubble { - &__bubble { color: $primary-text-color } - a { color: $secondary-text-color } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss deleted file mode 100644 index bfabd1e6e..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss +++ /dev/null @@ -1,245 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; -@import 'settings-account'; -@import 'settings-report'; -@import 'settings-log'; -@import 'settings-dashboard'; -@import 'settings-directory_tag'; - - - -body.admin { - color: $primary-text-color; - background: $setting-base-color; - - .sidebar { - &-wrapper { background: inherit } - - ul { - border-radius: 0; - - a { - color: $primary-lighter2-text-color; - border-radius: 0; - - &:hover { - color: $primary-text-color; - background: $setting-lists-hover-color; - } - - &.selected { - color: $primary-text-color; - background: $setting-lists-selected-color; - } - - i.fa { - @include material-icon-large; - margin-right: 8px; - vertical-align: bottom; - } - } - - ul { background: darken($setting-base-color, 4%) } - - .simple-navigation-active-leaf a { - color: $icon-active-color; - background: initial; - - &:hover { background: $setting-lists-hover-color } - } - } - } - - .content { - @include column-shadow; - background: $setting-content-base-color; - - h2, h3, h4, h6 { color: $primary-text-color } - - p { - color: $primary-text-color; - strong { color: $primary-text-color } - } - - h2, h4, hr { border-bottom-color: $base-separation-color } - .muted-hint { color: $primary-lighter1-text-color } - } -} - -.simple_form { - .input { - &.boolean, - &.with_label, - &.with_floating_label { - .label_input > label { color: $primary-text-color } - } - - &.with_block_label { - & > label { color: $primary-text-color } - } - - &.radio_buttons{ - .radio label { color: $primary-text-color } - } - - &-copy { - background: $base-color; - border-color: $base-separation-color; - } - } - - .check_boxes { - .checkbox { - label { color: $primary-text-color } - } - } - - input[type=text], - input[type=number], - input[type=email], - input[type=password], - textarea { - color: $primary-text-color; - background: $setting-content-base-color; - border-color: $base-separation-color; - - &:hover { - border-color: $base-separation-color; - } - - &:active, - &:focus { - background: darken($setting-content-base-color, 8%); - } - } - - select { - color: $primary-text-color; - background-color: $setting-content-base-color; - border-color: $base-separation-color; - } - - .input.field_with_errors { - label, - .error { - color: $error-text-color; - } - } - - .hint, p.hint { - color: $primary-lighter1-text-color !important; - - code { - color: $light-text-color; - background: $setting-emphasis-color; - } - } - - .recommended { - color: $verified-color; - background-color: transparentize($verified-color, 0.75); - border-color: $verified-color; - } - - .label_input { - &__append { color: $primary-lighter1-text-color } - } - - button { - @include button-shadow; - background-color: $active-button-color; - } -} - -.simple_form, -.table-form { - .warning { background: change-color($color: $error-color, $alpha: 0.8) } -} - -.quick-nav { - a { - color: $secondary-text-color; - - &:hover, - &:focus, - &:active { - color: lighten($secondary-text-color, 8%); - } - } -} - -.pagination { - .page, - a { - color: $primary-text-color; - } - - .page { - &.current { - background: $icon-active-color; - color: $light-text-color; - } - } -} - -.filters { - .filter-subset { - strong { color: $primary-text-color } - - a { - color: $primary-lighter2-text-color; - - &:hover { color: $primary-text-color } - - &.selected { - color: $active-text-color; - border-bottom-color: $active-text-color; - } - } - } -} - -.new_form_two_factor_confirmation { - .qr-wrapper { - .qr-code { box-shadow: none } - .qr-alternative { color: $secondary-lighter1-text-color } - } -} - -label, -select#user_setting_default_privacy { - &[for=user_setting_default_privacy_public], - &[for=user_setting_default_privacy_unlisted], - option[value="public"], - option[value="unlisted"] { color: $active-text-color !important } -} - -.column-header__collapsible__extra { - .column-settings__section { color: $primary-text-color } - - .setting-toggle { - .react-toggle { - &.react-toggle--checked { - > .react-toggle-track { background: $setting-toggle-checked-color } - - > .react-toggle-thumb { - border-color: $setting-toggle-checked-color; - background-color: $setting-toggle-thumb-checked-color; - } - } - - > .react-toggle-track { background: $setting-toggle-color } - - > .react-toggle-thumb { - border-color: $setting-toggle-color; - background-color: $setting-toggle-thumb-color; - } - } - - .setting-toggle__label { color: $primary-text-color } - } - - .setting-meta__label { color: $primary-lighter1-text-color } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss deleted file mode 100644 index b3f5ffae3..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss +++ /dev/null @@ -1,123 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.status { - @include status-shadow; - @include material-card-radius; - border-bottom: 0; - - transition: box-shadow 0.1s 0s ease-out; - - &.light { - .status { - &__relative-time { color: $primary-lighter1-text-color } - &__display-name { - color: $primary-text-color; - - .display-name__account { color: $primary-lighter1-text-color } - } - - &__content { color: $primary-text-color } - } - - .display-name strong { color: $primary-text-color } - } - - &.status-direct { - background: $status-direct-color; - - &:not(.read) { - background: inherit; - border-bottom-color: initial; - } - } - - &.muted { - .status__content { - p { color: lighten($primary-text-color, 20%) } - } - } - - .status { - &__info { - .status__display-name { - color: $primary-lighter1-text-color; - - strong { color: $primary-text-color } - } - - .status__relative-time { color: $primary-lighter1-text-color } - } - } - - &__action-bar__counter__label { color: $primary-lighter1-text-color } -} - -.detailed-status { - &__display-name { - color: $secondary-text-color; - - strong { color: $primary-text-color } - } - - &__meta { - .detailed-status__datetime { color: $primary-lighter1-text-color } - - .detailed-status__link { - .fa.fa-star { vertical-align: middle } - } - } - - &__wrapper { - @include status-shadow; - - .detailed-status { @extend .detailed-status; } - .detailed-status__action-bar { - background: $status-actionbar-color; - border-color: $base-separation-color; - } - } -} - -.status, -.detailed-status { - background: $status-color; - - .status__content { - color: $primary-text-color; - - a { color: $secondary-text-color } - - .status__content__spoiler-link { - color: $primary-text-color; - background: $base-color; - } - } -} - -a.status-card, -a.status-card.compact { - &:hover { background: initial } -} - -.status-card, -.status-card.compact { - border-color: $non-elevated-card-boader; - - &__title { - color : $primary-text-color; - } - - &__host { - color: $primary-lighter1-text-color; - } -} - -.name-tag, -a.name-tag { - color: $secondary-text-color; -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon-dev/tables.scss b/app/javascript/styles/gplus-theme-for-mastodon-dev/tables.scss deleted file mode 100644 index e71ce7a38..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon-dev/tables.scss +++ /dev/null @@ -1,29 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.table { - thead th { border-bottom-color: $base-separation-color } - - th, - td { - color: $primary-text-color; - background-color: $base-color; - border-top: 0; - } - - & > tbody > tr:nth-child(odd) { - & > td, & > th { background: darken($base-color, 4%) } - } - - a { color: $secondary-text-color } -} - -a.table-action-link, -button.table-action-link { - color: $secondary-text-color; - - &:hover { color: darken($secondary-text-color, 8%) } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon.scss b/app/javascript/styles/gplus-theme-for-mastodon.scss deleted file mode 100644 index e233cfbea..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon.scss +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Google+ Theme for Mastodon v1.1 - * Copyright (C) 2018-2019 Genbu Project - */ - -@charset "UTF-8"; - -@import 'application'; -@import 'gplus-theme-for-mastodon/basics'; -@import 'gplus-theme-for-mastodon/components'; -@import 'gplus-theme-for-mastodon/tables'; -@import 'gplus-theme-for-mastodon/columns'; -@import 'gplus-theme-for-mastodon/lists'; -@import 'gplus-theme-for-mastodon/accounts'; -@import 'gplus-theme-for-mastodon/statuses'; -@import 'gplus-theme-for-mastodon/notifications'; -@import 'gplus-theme-for-mastodon/searches'; -@import 'gplus-theme-for-mastodon/settings'; -@import 'gplus-theme-for-mastodon/icons'; -@import 'gplus-theme-for-mastodon/profile'; -@import 'gplus-theme-for-mastodon/about'; -@import 'gplus-theme-for-mastodon/explore'; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/_mixins.scss b/app/javascript/styles/gplus-theme-for-mastodon/_mixins.scss deleted file mode 100644 index 196473f89..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/_mixins.scss +++ /dev/null @@ -1,11 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -@mixin column-shadow { box-shadow: 0 1px 8px 0 $column-header-shadow-color } -@mixin status-shadow { box-shadow: 0 1px 4px 0 $status-shadow-color } -@mixin status-focus-shadow { box-shadow: 0 0 20px 0 $status-focused-shadow-color } -@mixin button-shadow { box-shadow: 0 2px 5px 0 $button-shadow-color } -@mixin material-border { border-radius: 4px } \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/_variables.scss b/app/javascript/styles/gplus-theme-for-mastodon/_variables.scss deleted file mode 100644 index 2160a8fc9..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/_variables.scss +++ /dev/null @@ -1,81 +0,0 @@ -@charset "UTF-8"; - - - -// Base colors -$active-color: #db4437; -$accent-color: #fbbc04; -$valid-color: #4285f4; -$error-color: #d50000; -$checked-color: #4285f4; -$verified-color: #4caf50; - - -// Text colors -$primary-text-color: rgba(0, 0, 0, 0.87); -$primary-lighter1-text-color: change-color($color: $primary-text-color, $lightness: 62%, $alpha: 1.0); // ex: 時間表示 -$primary-lighter2-text-color: change-color($color: $primary-text-color, $lightness: 38%, $alpha: 1.0); // ex: 通知メッセージ表示 -$secondary-text-color: #2962ff; -$secondary-lighter1-text-color: #00bfff; // ex: アカウントTLのユーザーID -$light-text-color: #ffffff; -$light-darker1-text-color: darken($light-text-color, 15%); -$active-text-color: $active-color; -$error-text-color: $error-color; - - -// Icon colors -$icon-color: #757575; -$icon-active-color: $active-color; - - -// Background colors -$base-color: #f1f1f1; -$base-lighter1-color: #ffffff; -$base-darker1-color: rgba(0, 0, 0, 0.4); - -$column-header-color: $base-lighter1-color; -$column-header-hover-color: change-color($color: $column-header-color, $lightness: 90%); - -$status-color: $base-lighter1-color; -$status-direct-color: darken($status-color, 5%); -$status-actionbar-color: change-color($color: $status-color, $lightness: 98%); - -$account-color: $base-lighter1-color; -$account-foreground-color: $base-darker1-color; - -$card-color: $base-lighter1-color; -$card-hover-color: $column-header-hover-color; -$card-image-color: $base-color; - -$form-color: rgba(0, 0, 0, 0.1); -$form-focused-color: lighten($form-color, 20%); -$trend-color: $base-lighter1-color; - -$setting-base-color: $base-color; -$setting-lists-selected-color: darken($base-color, 2%); -$setting-lists-hover-color: darken($base-color, 5%); -$setting-content-base-color: $base-lighter1-color; - -$setting-toggle-color: #b9b9b9; -$setting-toggle-checked-color: change-color($color: $checked-color, $alpha: 0.5); -$setting-toggle-thumb-color: #fafafa; -$setting-toggle-thumb-checked-color: $checked-color; - -$dashboard-counters-base-color: $base-color; -$dashboard-counters-hover-color: lighten($base-color, 2%); - -$explore-header-color: lighten($accent-color, 16%); -$explore-directory-color: $base-lighter1-color; - - -// Shadow colors -$column-header-shadow-color: rgba(0, 0, 0, 0.3); -$status-shadow-color: rgba(0, 0, 0, 0.14); -$status-focused-shadow-color: change-color($color: $status-shadow-color, $alpha: 0.3); -$icon-hovered-shadow-color: rgba(0, 0, 0, 0.26); -$account-header-image-shadow-color: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.46)); -$button-shadow-color: rgba(0, 0, 0, 0.4); - - -// Separation colors -$base-separation-color: rgba(0, 0, 0, 0.14); \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/about.scss b/app/javascript/styles/gplus-theme-for-mastodon/about.scss deleted file mode 100644 index de48883a8..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/about.scss +++ /dev/null @@ -1,138 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -// from mastodon/about.scss -$column-breakpoint: 700px; - - - -.landing-page { - h3, h4, h5, h6 { color: $primary-lighter2-text-color } - p { color: $primary-lighter1-text-color } - em { color: $primary-text-color } - - .column-0 { background: $base-darker1-color } - .column-2 { - .landing-page { - &__information { padding: 0 } - - &__short-description { - & > .row:first-child { - background: $base-darker1-color; - padding: 10px 20px; - } - - & > * { - padding-left: 40px; padding-right: 40px; - &:last-child { padding-bottom: 45px } - - @media screen and (max-width: $column-breakpoint) { - padding-left: 20px; padding-right: 20px; - &:last-child { padding-bottom: 25px } - } - } - } - } - } - - &__forms, - &__information, - &__call-to-action { - @include status-shadow; - background: $column-header-color; - } - - &__forms { - padding: 0; - - & > *:first-child { margin: inherit } - & > * { margin-left: 20px; margin-right: 20px; } - - .brand { background: $base-darker1-color } - - form { - & > .input input { - background: $form-color; - - &:focus { background: $form-focused-color } - } - } - - .separator-or { - margin-left: 20px; margin-right: 20px; - - span { - color: $primary-lighter1-text-color; - background: $column-header-color; - } - } - - @media screen and (max-width: $column-breakpoint) { - background: inherit; - box-shadow: none; - - .separator-or span { background: $base-color } - } - } - - &__information { - color: $primary-lighter1-text-color; - - &.contact-widget { - @include status-shadow; - background: $column-header-color; - - .contact-widget { - &__mail { - a { color: $primary-text-color } - } - } - } - - strong { color: inherit } - - .row:first-child { - h1 small { - color: $light-darker1-text-color; - - span { color: $light-text-color } - } - } - } - - &__call-to-action { - .row__information-board { - .information-board__section { - color: $primary-lighter2-text-color; - - & > span:last-child { color: $primary-lighter1-text-color } - } - } - } - - &__features { - .features-list { - .features-list__row { - .text { color: $primary-lighter1-text-color } - .visual .fa { color: $icon-color } - } - } - } - - &__footer { color: $primary-lighter1-text-color } - - #mastodon-timeline { - color: $primary-text-color; - background: transparent; - - p { - color: $primary-text-color; - - a { color: $secondary-text-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/accounts.scss b/app/javascript/styles/gplus-theme-for-mastodon/accounts.scss deleted file mode 100644 index 16bff9ee6..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/accounts.scss +++ /dev/null @@ -1,109 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.account { - background: $account-color; - border-color: $base-separation-color; - - .account { - &__display-name { - color: $secondary-text-color; - - strong { color: $primary-text-color } - } - } -} - -.column { - > .column-back-button { - @include column-shadow; - background: $column-header-color; - } -} - -.account-timeline__header { - .account__header { - background-color: $account-foreground-color; - - > div { background-color: inherit } - - .account__header { - &__username { color: $secondary-lighter1-text-color } - &__fields { @extend .account__header__fields; } - } - - .account--action-button { - .icon-button:not(.active) { - color: darken($light-text-color, 7%); - - &:active, - &:focus, - &:hover { - color: $light-text-color; - } - } - } - } - - .account { - &__disclaimer, - &__action-bar, - &__section-headline { - background: $column-header-color; - border-color: $base-separation-color; - } - - &__action-bar { - &__tab { - border-color: $base-separation-color; - &.active { border-bottom-color: $active-color } - - > span { color: $primary-lighter1-text-color } - } - } - - &__section-headline { - a { - color: $primary-text-color; - - &.active { - color: $primary-lighter1-text-color; - - &::before { border-color: transparent transparent $base-separation-color } - &::after { border-color: transparent transparent $status-color } - } - } - } - } -} - -.account__header__fields { - dl { - border-color: $base-separation-color; - - dt, - dd { - color: $primary-text-color; - background: $column-header-color; - } - - dd { - &.verified { - border-color: transparentize($valid-color, 0.5); - background: transparentize($valid-color, 0.75); - - a { color: lighten($verified-color, 20%) } - } - } - } - - a { color: $secondary-text-color } -} - -.account__action-bar__tab { - strong { color: $primary-text-color } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/basics.scss b/app/javascript/styles/gplus-theme-for-mastodon/basics.scss deleted file mode 100644 index a141ecd13..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/basics.scss +++ /dev/null @@ -1,47 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -body { - &, - .ui { - color: $primary-text-color; - background: $base-color; - } -} - -.focusable { - &:focus { - background: inherit; - - .status { - @include status-focus-shadow; - - &.status-direct { background: $status-direct-color } - } - - .detailed-status { - & { background: $status-color } - &__action-bar { background: $status-actionbar-color } - } - } -} - -::-webkit-scrollbar-thumb { - background: darken($base-lighter1-color, 12%); - - &:hover { background: darken($base-lighter1-color, 16%) } - &:active { background: darken($base-lighter1-color, 12%) } -} - -::-webkit-scrollbar-track { - background: $base-color; - - &:hover, - &:active { - background: darken($base-lighter1-color, 8%); - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/columns.scss b/app/javascript/styles/gplus-theme-for-mastodon/columns.scss deleted file mode 100644 index 9086e30bc..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/columns.scss +++ /dev/null @@ -1,197 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.tabs-bar { - margin: 0; - background: $column-header-color; - - .tabs-bar { - &__link { - color: $icon-color; - - .fa { vertical-align: top } - } - } -} - -.drawer { - .drawer { - &__header { - @include column-shadow; - background: $column-header-color; - - .drawer__tab { color: $icon-color } - - a { - &:hover { background: $column-header-hover-color } - } - } - - &__pager { - @include status-shadow; - - .drawer__inner { - background: $column-header-color; - - &__mastodon { display: none } - } - } - } -} - -.navigation-bar { - color: $secondary-text-color; - background: $column-header-color; - - .navigation-bar { - &__profile { - strong { color: $primary-text-color } - &-edit { color: $secondary-text-color } - } - } -} - -.compose-form { - .compose-form { - &__buttons-wrapper { background: $column-header-color } - &__publish { border-top: 1px solid $base-separation-color } - } -} - -.column { - .column-header { - @include column-shadow; - background: $column-header-color; - - &.active { - .column-header__icon { - color: $icon-active-color; - text-shadow: 0 0 10px change-color($color: $icon-active-color, $alpha: 0.4); - } - } - - * { background: inherit } - - &__icon { - color: $icon-color; - vertical-align: top; - } - - &__buttons { - .column-header { - &__back-button { - .column-back-button__icon { vertical-align: unset } - } - - &__button { - &.active { - color: $icon-active-color; - background: inherit; - } - - .fa { vertical-align: unset } - } - } - } - - &__collapsible { - color: $secondary-text-color; - border-bottom: 1px solid $base-separation-color; - - &-inner { background: $column-header-color } - } - } - - .column-back-button { - &__icon { vertical-align: unset } - } - - .column { - &-subheading { background: darken($base-color, 10%) } - - &-link { - color: $primary-text-color; - background: $base-color; - - &__icon { - color: $icon-color; - vertical-align: top; - } - } - } - - .scrollable { - background: transparent; - - *[role="feed"] { - article { - margin: 1em 0; - &:first-of-type { margin: 0 } - } - } - - div[tabindex="-1"] { margin-bottom: 1em } - } - - .notification__filter-bar { - background: $column-header-color; - border-bottom-color: $base-separation-color; - - button { - color: $icon-color; - background: $column-header-color; - - &.active { - color: $icon-active-color; - - &::before { border-color: transparent transparent $base-separation-color } - &::after { border-color: transparent transparent $column-header-color } - } - } - } - - .empty-column-indicator { - flex-direction: column; - background: $base-color; - - &::before { - content: ""; - display: block; - - width: 100px; - height: 100px; - margin-bottom: 1em; - - background: none center / contain no-repeat; - background-image: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/notification-jingle_2x.gif"); - } - } -} - -.getting-started { - &__wrapper, - & { - background: $base-color; - } - - & { - border-top: 1px solid $base-separation-color; - - a { color: $primary-text-color } - } -} - -.load { - &-more, - &-gap { - background: transparent; - - &:hover { background: darken($column-header-color, 10%) } - } - - &-gap { border: 0 } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/components-button.scss b/app/javascript/styles/gplus-theme-for-mastodon/components-button.scss deleted file mode 100644 index ef50ce863..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/components-button.scss +++ /dev/null @@ -1,11 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.floating-action-button { - font-size: 24px; - background: $active-color; -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/components-card.scss b/app/javascript/styles/gplus-theme-for-mastodon/components-card.scss deleted file mode 100644 index cc6bf2808..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/components-card.scss +++ /dev/null @@ -1,37 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.card { - border: 1px solid $base-separation-color; - - > a { - @include status-shadow; - - &:hover, - &:focus, - &:active { - .card__bar { - background: initial; - - .display-name strong { color: $secondary-text-color } - } - } - - .card__img { background: $card-image-color } - .card__bar { - background: $card-color; - - .avatar { - img { background: transparent } - } - - .display-name { - strong { color: $primary-text-color } - span { color: $primary-lighter2-text-color } - } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/components-dropdown.scss b/app/javascript/styles/gplus-theme-for-mastodon/components-dropdown.scss deleted file mode 100644 index afc55f95f..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/components-dropdown.scss +++ /dev/null @@ -1,42 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.dropdown-menu, -.actions-modal > ul { - @include material-border; - background: $base-lighter1-color; - - .dropdown-menu { - &__arrow { - &.top { border-top-color: $column-header-color } - &.bottom { border-bottom-color: $column-header-color } - } - - &__item { - a { - color: $primary-lighter2-text-color; - - padding: 8px 16px; - background: $column-header-color; - - &:active, - &:focus, - &:hover { - background: $column-header-hover-color; - } - } - } - - &__separator { border-bottom-color: $base-separation-color } - } - - & > li:not(:empty) { - @extend .dropdown-menu__item; - - a { padding: 12px 16px } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/components.scss b/app/javascript/styles/gplus-theme-for-mastodon/components.scss deleted file mode 100644 index 2b0e8a816..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/components.scss +++ /dev/null @@ -1,5 +0,0 @@ -@charset "UTF-8"; - -@import 'components-button'; -@import 'components-card'; -@import 'components-dropdown'; \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/explore.scss b/app/javascript/styles/gplus-theme-for-mastodon/explore.scss deleted file mode 100644 index 7d4726790..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/explore.scss +++ /dev/null @@ -1,38 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.public-layout { - .page-header { - background: $explore-header-color; - - h1 { color: $primary-text-color } - p { color: $primary-lighter2-text-color } - } - - .directory { - background: $explore-directory-color; - - .accounts-table { - &__count { - color: $primary-lighter2-text-color; - small { color: $primary-lighter1-text-color } - } - } - - &__tag { - a { background: $explore-directory-color } - h4 { color: $primary-text-color } - .fa, small { color: $primary-lighter1-text-color } - } - } - - .notice-widget { - color: $primary-lighter1-text-color; - background: $explore-directory-color; - - a { color: $secondary-text-color } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/icons.scss b/app/javascript/styles/gplus-theme-for-mastodon/icons.scss deleted file mode 100644 index 0125172ad..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/icons.scss +++ /dev/null @@ -1,97 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -@function hex-color($color) { - @if type-of($color) == 'color' { - $color: str-slice(ie-hex-str($color), 4); - } - - @return '%23' + unquote($color) -}; - - - -@font-face { - font-family: "Material Icons Extended"; - src: - local("Material Icons Extended"), - url("https://fonts.gstatic.com/s/materialiconsextended/v50/kJEjBvgX7BgnkSrUwT8UnLVc38YydejYY-oE_LvJ.woff2"), - url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/font-Material_Icons_Extended-v50.woff2"); -} - -.icon-button { - color: $icon-color; - - &:active, - &:focus, - &:hover { - color: lighten($icon-color, 7%); - } - - &.star-icon { - &.active { - color: $light-text-color; - background: $icon-active-color; - border-radius: 50%; - } - - .fa.fa-star { vertical-align: top } - } - - &.disabled { - color: lighten($icon-color, 13%); - - .fa.fa-retweet { - background-image: url("data:image/svg+xml;utf8,"); - } - } - - .fa { - vertical-align: middle; - - &.fa-retweet { - background-image: url("data:image/svg+xml;utf8,"); - - &:active, - &:hover, - &:focus { - background-image: url("data:image/svg+xml;utf8,"); - } - } - } -} - -.fa { - &.fa-users, - &.fa-globe, - &.fa-cog, - &.fa-star, - &.fa-home, - &.fa-bell, - &.fa-eraser, - &.fa-ellipsis-h, - &.fa-ellipsis-v, - &.fa-address-book, - &.fa-thumb-tack, - &.fa-lock, - &.fa-pencil { - font-family: "Material Icons Extended"; - } - - &.fa-users::before { content: "people" } // 人々マーク(.drawer__header > .drawer__tab:2) - &.fa-globe::before { content: "" } // 地球マーク(.drawer__header > .drawer__tab:3) - &.fa-cog::before { content: "settings" } // 歯車マーク(.drawer__header > .drawer__tab:4) - &.fa-star::before { content: "plus_one" } // +1(.status .status__action-bar > .star-icon) - &.fa-home::before { content: "home" } // 家マーク(ホームタイムライン) - &.fa-bell::before { content: "" } // ベルマーク(通知) - &.fa-eraser::before { content: "" } // 通知を消去のマーク - &.fa-ellipsis-h::before { content: "" } // 三点リーダー(横) - &.fa-ellipsis-v::before { content: "" } // 三点リーダー(縦) - &.fa-address-book::before { content: "" } // discoverマーク(explore遷移タブ) - &.fa-thumb-tack::before { content: "" } // ピンマーク(ピン留め投稿) - &.fa-lock::before { content: "" } // サークルマーク(フォロワー限定投稿) - &.fa-pencil::before { content: "" } // 鉛筆マーク(モバイル用フローティングボタン) -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/lists.scss b/app/javascript/styles/gplus-theme-for-mastodon/lists.scss deleted file mode 100644 index eb770001e..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/lists.scss +++ /dev/null @@ -1,34 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.column { - .column-back-button { background: inherit } - - .column-inline-form { - background: $column-header-color; - - label input { - color: $secondary-text-color; - &:focus { color: $primary-text-color } - } - } - - .column-inline-form ~ .scrollable { - article { margin: 0 } - } -} - -.modal-root { - .list-editor { - background: $base-color; - - h4 { background: $column-header-color } - - .drawer__pager { - .drawer__inner { background: $column-header-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/notifications.scss b/app/javascript/styles/gplus-theme-for-mastodon/notifications.scss deleted file mode 100644 index bab098372..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/notifications.scss +++ /dev/null @@ -1,27 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.notification { - &.notification-favourite { - .status { - &.status-direct { background: transparent } - } - } - - > .notification__message { - color: $primary-lighter2-text-color; - font-size: 13px; - padding: 8px 0; - - .notification__display-name { - &:hover { color: inherit } - } - - .notification__favourite-icon-wrapper { - .star-icon { color: $icon-active-color } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/profile.scss b/app/javascript/styles/gplus-theme-for-mastodon/profile.scss deleted file mode 100644 index 2bfa60c45..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/profile.scss +++ /dev/null @@ -1,231 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.public-layout { - a.button { - @include button-shadow; - - color: $primary-text-color; - background: $base-lighter1-color; - - &:hover, - &:focus, - &:active { - background: darken($base-lighter1-color, 8%); - } - } - - .logo-button { - svg path { - /* Only for Itabashi-don */ - &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } - &:last-child { fill: $base-lighter1-color !important } - } - } - - .public-account-header { - @include status-shadow; - - &__image { - background: $base-lighter1-color; - - @media screen and (min-width: 600px) { height: 500px } - - &::after { - position: absolute; - top: auto; - left: 0; - bottom: 0; - - width: 100%; - height: 30%; - background: $account-header-image-shadow-color; - box-shadow: none; - } - - > img:not([src]), - > img[src="/headers/original/missing.png"] { - content: url("https://raw.githubusercontent.com/GenbuProject/GPlusTheme-for-Mastodon/asset/account-default_header.jpg"); - } - } - - &__bar { - @media screen and (max-width: 600px) { - flex-direction: column; - background: $base-color; - } - - @media screen and (min-width: 600px) { margin-top: -140px } - - &::before { background: $base-lighter1-color } - - .avatar { - @media screen and (max-width: 600px) { - position: relative; - bottom: 30px; - - display: initial; - width: 60px; - height: 60px; - margin: 0 auto; - padding: 0; - } - - img { - border: 2px solid $base-lighter1-color; - border-radius: 50%; - background: transparent; - } - } - } - - &__tabs { - @media screen and (max-width: 600px) { - flex-wrap: wrap; - margin-left: 0; - - &__name { - width: 100%; - text-align: center; - - h1 { - color: $primary-text-color; - - small { color: $primary-lighter1-text-color } - } - } - - &__tabs { - justify-content: center; - flex: auto; - - .spacer { display: none } - - a.button.logo-button { - color: $light-text-color; - background: $secondary-text-color; - - svg path { - /* Only for Itabashi-don */ - &:not(#Mastodon):not(#Itabashi) { fill: $base-lighter1-color !important } - &:last-child { fill: $secondary-text-color !important } - } - } - } - } - - .details-counters { - .counter { - color: $light-text-color; - border-right: 0; - - &::after { border-bottom-color: $base-color } - - &.active { - &::after { border-bottom-color: $active-color } - } - } - } - } - - &__extra { - .public-account-bio { - .account__header__content { text-align: center } - } - - &__links { - color: $primary-text-color; - - a { - &, strong { color: $primary-text-color } - } - } - } - } - - .public-account-bio { - @include column-shadow; - background: $base-lighter1-color; - - .account__header__content { color: $primary-text-color } - &__extra { color: $primary-lighter1-text-color } - } - - .endorsements-widget { - @include column-shadow; - - padding-bottom: 0; - border-radius: 4px; - - h4 { - color: $primary-lighter1-text-color; - background: $base-lighter1-color; - } - } - - .hero-widget { - @include column-shadow; - - &__img { background: $base-color } - &__text { - background: $base-lighter1-color; - - &, em { color: $primary-lighter2-text-color } - a { color: $secondary-text-color } - } - } - - .account__section-headline { - background: $base-lighter1-color; - border-bottom-color: $base-separation-color; - - a { - color: $primary-lighter1-text-color; - - &.active { - color: $primary-lighter2-text-color; - - &::before { border-color: transparent transparent $base-separation-color } - &::after { border-color: transparent transparent $status-color } - } - } - } - - .activity-stream { - box-shadow: none; - - .entry { - margin: 1em 0; - background: transparent; - - &:first-of-type { margin: 0 } - } - } - - .nothing-here { - @include status-shadow; - - color: $primary-lighter1-text-color; - background: $base-lighter1-color; - } - - .footer { - h4 { color: $primary-lighter1-text-color } - - ul { - a { color: $primary-lighter2-text-color } - } - - .brand { - svg path { - /* Only for Itabashi-don */ - &:not(#Mastodon):not(#Itabashi) { fill: $secondary-text-color !important } - &:last-child { fill: $base-lighter1-color !important } - } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/searches.scss b/app/javascript/styles/gplus-theme-for-mastodon/searches.scss deleted file mode 100644 index b4478b91b..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/searches.scss +++ /dev/null @@ -1,41 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.search { - .search { - &__input { - @include material-border; - - color: $primary-text-color; - background: $form-color; - - &:focus { background: $form-focused-color } - } - - &__icon { - .fa { color: $icon-color } - } - } - - &-results { - > .search-results { - &__header { background: $base-color } - &__section { - > h5 { background: darken($base-color, 10%) } - } - } - } -} - -.trends__item { - background: $trend-color; - - .trends__item { - &__name a { color: $secondary-text-color } - &__current { color: lighten($secondary-text-color, 10%) } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/settings-account.scss b/app/javascript/styles/gplus-theme-for-mastodon/settings-account.scss deleted file mode 100644 index d069af381..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/settings-account.scss +++ /dev/null @@ -1,44 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.edit_account { - @media screen and (min-width: 415px) { - .card { - > a { - position: relative; - - .card__img { border-bottom: 1px solid $base-separation-color } - .card__bar { - position: static; - padding-top: 30%; - - .avatar { - position: absolute; - left: 0; - bottom: 0; - - display: flex; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; - - img { - width: 128px; - height: 128px; - } - } - - .display-name { - flex: auto; - margin-left: 0; - text-align: center; - } - } - } - } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/settings-dashboard.scss b/app/javascript/styles/gplus-theme-for-mastodon/settings-dashboard.scss deleted file mode 100644 index 0e9c55136..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/settings-dashboard.scss +++ /dev/null @@ -1,28 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.dashboard { - &__counters { - & > div { - & > div, & > a { background: $dashboard-counters-base-color } - - & > a { - &:hover, - &:focus, - &:active { - background: $dashboard-counters-hover-color; - } - } - } - - &__num { color: $primary-text-color } - &__label { color: $primary-lighter1-text-color } - } - - &__widgets { - a:not(.name-tag) { color: $primary-lighter2-text-color } - } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/settings-report.scss b/app/javascript/styles/gplus-theme-for-mastodon/settings-report.scss deleted file mode 100644 index 7912d1ddc..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/settings-report.scss +++ /dev/null @@ -1,63 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.report-card { - background: $setting-content-base-color; - - &__profile__stats { - color: $primary-lighter2-text-color; - - a { - &:focus, - &:hover, - &:active { - color: lighten($primary-lighter2-text-color, 8%); - } - } - } - - &__summary { - &__item { - border-top-color: $base-separation-color; - - &:hover { background: $column-header-hover-color } - - &__reported-by, - &__assigned { - color: $primary-lighter2-text-color; - } - - &__content { - &__icon { color: $icon-color } - a { color: $primary-lighter2-text-color } - } - } - } -} - -.batch-table { - &__toolbar { - background: $base-lighter1-color; - border-color: $base-separation-color; - } - - &__row { - background: $base-lighter1-color; - border-color: $base-separation-color; - - &:hover { background: $column-header-hover-color } - - &__content { - .status__content { color: $primary-text-color } - .detailed-status__meta { color: $primary-lighter1-text-color } - } - } -} - -.speech-bubble { - &__bubble { color: $primary-text-color } - a { color: $secondary-text-color } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/settings.scss b/app/javascript/styles/gplus-theme-for-mastodon/settings.scss deleted file mode 100644 index 752d2c662..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/settings.scss +++ /dev/null @@ -1,208 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; -@import 'settings-account'; -@import 'settings-report'; -@import 'settings-dashboard'; - - - -body.admin { - color: $primary-text-color; - background: $setting-base-color; - - .sidebar { - &-wrapper { background: inherit } - - ul { - border-radius: 0; - - a { - color: $primary-lighter2-text-color; - border-radius: 0; - - &:hover { - color: $primary-text-color; - background: $setting-lists-hover-color; - } - - &.selected { - color: $primary-text-color; - background: $setting-lists-selected-color; - } - } - - ul { background: darken($setting-base-color, 4%) } - - .simple-navigation-active-leaf a { - color: $icon-active-color; - background: initial; - - &:hover { background: $setting-lists-hover-color } - } - } - } - - .content { - @include column-shadow; - background: $setting-content-base-color; - - h2, h3, h4, h6 { color: $primary-text-color } - - p { - color: $primary-text-color; - strong { color: $primary-text-color } - } - - h2, h4, hr { border-bottom-color: $base-separation-color } - .muted-hint { color: $primary-lighter1-text-color } - } -} - -.simple_form { - .input { - &.boolean, - &.with_label, - &.with_floating_label { - .label_input > label { color: $primary-text-color } - } - - &.with_block_label { - & > label { color: $primary-text-color } - } - - &.radio_buttons{ - .radio label { color: $primary-text-color } - } - - &-copy { background: $base-color } - } - - .check_boxes { - .checkbox { - label { color: $primary-text-color } - } - } - - input[type=text], - input[type=number], - input[type=email], - input[type=password], - textarea { - color: $primary-text-color; - background: $setting-content-base-color; - border-color: $base-separation-color; - - &:hover { - border-color: $base-separation-color; - } - - &:active, - &:focus { - background: darken($setting-content-base-color, 8%); - } - } - - select { - color: $primary-text-color; - background-color: $setting-content-base-color; - border-color: $base-separation-color; - } - - .input.field_with_errors { - label, - .error { - color: $error-text-color; - } - } - - .hint, p.hint { color: $primary-lighter1-text-color !important } - - .label_input { - &__append { color: $primary-lighter1-text-color } - } -} - -.simple_form, -.table-form { - .warning { background: change-color($color: $error-color, $alpha: 0.8) } -} - -.quick-nav { - a { - color: $secondary-text-color; - - &:hover, - &:focus, - &:active { - color: lighten($secondary-text-color, 8%); - } - } -} - -.pagination { - .page, - a { - color: $primary-text-color; - } - - .page { - &.current { - background: $icon-active-color; - color: $light-text-color; - } - } -} - -.filters { - .filter-subset { - strong { color: $primary-text-color } - - a { - color: $primary-lighter2-text-color; - - &:hover { color: $primary-text-color } - - &.selected { - color: $active-text-color; - border-bottom-color: $active-text-color; - } - } - } -} - -label { - &[for=user_setting_default_privacy_public], - &[for=user_setting_default_privacy_unlisted] { - color: $active-text-color !important; - } -} - -.column-header__collapsible__extra { - .column-settings__section { color: $primary-text-color } - - .setting-toggle { - .react-toggle { - &.react-toggle--checked { - > .react-toggle-track { background: $setting-toggle-checked-color } - - > .react-toggle-thumb { - border-color: $setting-toggle-checked-color; - background-color: $setting-toggle-thumb-checked-color; - } - } - - > .react-toggle-track { background: $setting-toggle-color } - - > .react-toggle-thumb { - border-color: $setting-toggle-color; - background-color: $setting-toggle-thumb-color; - } - } - - .setting-toggle__label { color: $primary-text-color } - } - - .setting-meta__label { color: $primary-lighter1-text-color } -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/statuses.scss b/app/javascript/styles/gplus-theme-for-mastodon/statuses.scss deleted file mode 100644 index 0532a0b90..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/statuses.scss +++ /dev/null @@ -1,107 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; -@import 'mixins'; - - - -.status { - @include status-shadow; - border-bottom: 0; - - transition: box-shadow 0.1s 0s ease-out; - - &.light { - .status { - &__relative-time { color: $primary-lighter1-text-color } - &__display-name { - color: $primary-text-color; - - .display-name__account { color: $primary-lighter1-text-color } - } - - &__content { color: $primary-text-color } - } - } - - &.status-direct { - background: $status-direct-color; - - &:not(.read) { - background: inherit; - border-bottom-color: initial; - } - } - - &.muted { - .status__content { - p { color: lighten($primary-text-color, 20%) } - } - } - - .status { - &__info { - .status__display-name { - color: $primary-lighter1-text-color; - - strong { color: $primary-text-color } - } - - .status__relative-time { color: $primary-lighter1-text-color } - } - } -} - -.detailed-status { - .detailed-status { - &__display-name { - color: $secondary-text-color; - - strong { color: $primary-text-color } - } - - &__meta { - .detailed-status__datetime { color: $primary-lighter1-text-color } - - .detailed-status__link { - .fa.fa-star { vertical-align: middle } - } - } - } - - &__wrapper { - @include status-shadow; - - .detailed-status { @extend .detailed-status; } - .detailed-status__action-bar { - background: $status-actionbar-color; - border-color: $base-separation-color; - } - } -} - -.status, -.detailed-status { - background: $status-color; - - .status__content { - color: $primary-text-color; - - a { color: $secondary-text-color } - - .status__content__spoiler-link { - color: $primary-text-color; - background: $base-color; - } - } -} - -a.status-card, -a.status-card.compact { - &:hover { background: initial } -} - -.name-tag, -a.name-tag { - color: $secondary-text-color; -} \ No newline at end of file diff --git a/app/javascript/styles/gplus-theme-for-mastodon/tables.scss b/app/javascript/styles/gplus-theme-for-mastodon/tables.scss deleted file mode 100644 index e71ce7a38..000000000 --- a/app/javascript/styles/gplus-theme-for-mastodon/tables.scss +++ /dev/null @@ -1,29 +0,0 @@ -@charset "UTF-8"; - -@import 'variables'; - - - -.table { - thead th { border-bottom-color: $base-separation-color } - - th, - td { - color: $primary-text-color; - background-color: $base-color; - border-top: 0; - } - - & > tbody > tr:nth-child(odd) { - & > td, & > th { background: darken($base-color, 4%) } - } - - a { color: $secondary-text-color } -} - -a.table-action-link, -button.table-action-link { - color: $secondary-text-color; - - &:hover { color: darken($secondary-text-color, 8%) } -} \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 47a625f28..341effbb2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1190,9 +1190,6 @@ en: contrast: Mastodon (High contrast) default: Mastodon (Dark) mastodon-light: Mastodon (Light) - google-plus: Google+ - google-plus-dev: Google+ Dev - dark-google-plus-dev: Dark Google+ Dev time: formats: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 6c79b16cc..7ea6f1f38 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1169,9 +1169,6 @@ ja: contrast: Mastodon (ハイコントラスト) default: Mastodon (ダーク) mastodon-light: Mastodon (ライト) - google-plus: Google+ - google-plus-dev: Google+ Dev - dark-google-plus-dev: Dark Google+ Dev time: formats: default: "%Y年%m月%d日 %H:%M" diff --git a/config/themes.yml b/config/themes.yml index ff2639be1..9c21c9459 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,6 +1,3 @@ default: styles/application.scss contrast: styles/contrast.scss mastodon-light: styles/mastodon-light.scss -google-plus: styles/gplus-theme-for-mastodon.scss -google-plus-dev: styles/gplus-theme-for-mastodon-dev.scss -dark-google-plus-dev: styles/dark-gplus-theme-for-mastodon-dev.scss From 2ddeab4c2194642ad68f299b2736f41a88c7994c Mon Sep 17 00:00:00 2001 From: YoheiZuho Date: Sun, 9 Feb 2020 17:09:12 +0900 Subject: [PATCH 020/200] Update navigation_panel.js --- .../mastodon/features/ui/components/navigation_panel.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js index 2c0f63e66..569049bba 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.js +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js @@ -16,7 +16,6 @@ const NavigationPanel = () => ( - From 59c715a3c2cdcf930ce6589a1a76dcf1cffb74d4 Mon Sep 17 00:00:00 2001 From: YoheiZuho Date: Sun, 9 Feb 2020 17:09:59 +0900 Subject: [PATCH 021/200] Update navigation_panel.js --- .../mastodon/features/ui/components/navigation_panel.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js index 569049bba..0c12852f5 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.js +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js @@ -16,7 +16,6 @@ const NavigationPanel = () => ( - From 12ed74781185cfd74435bf53181a72bd0d6585f2 Mon Sep 17 00:00:00 2001 From: Rintan Date: Sun, 8 Mar 2020 21:03:15 +0900 Subject: [PATCH 022/200] Material theme (dev) initial release --- .../styles/fonts/MaterialIcons-Regular.woff2 | Bin 0 -> 44300 bytes .../styles/mastodon-material-dev.scss | 15 + .../styles/mastodon-material-dev/_mixins.scss | 23 ++ .../styles/mastodon-material-dev/account.scss | 127 +++++++ .../styles/mastodon-material-dev/basics.scss | 20 + .../styles/mastodon-material-dev/button.scss | 59 +++ .../styles/mastodon-material-dev/cards.scss | 1 + .../mastodon-material-dev/color/dark.scss | 30 ++ .../mastodon-material-dev/color/light.scss | 93 +++++ .../styles/mastodon-material-dev/columns.scss | 351 ++++++++++++++++++ .../mastodon-material-dev/components.scss | 329 ++++++++++++++++ .../styles/mastodon-material-dev/config.scss | 21 ++ .../styles/mastodon-material-dev/control.scss | 59 +++ .../mastodon-material-dev/emoji-picker.scss | 88 +++++ .../styles/mastodon-material-dev/icons.scss | 36 ++ .../mastodon-material-dev/material-icons.scss | 88 +++++ .../styles/mastodon-material-dev/media.scss | 17 + .../styles/mastodon-material-dev/mobile.scss | 0 .../profile/material-v1.scss | 52 +++ .../profile/material-v2.scss | 66 ++++ .../mastodon-material-dev/statuses.scss | 135 +++++++ .../initializers/content_security_policy.rb | 2 - config/locales/en.yml | 3 +- config/locales/ja.yml | 2 + config/themes.yml | 3 + 25 files changed, 1617 insertions(+), 3 deletions(-) create mode 100644 app/javascript/styles/fonts/MaterialIcons-Regular.woff2 create mode 100644 app/javascript/styles/mastodon-material-dev.scss create mode 100644 app/javascript/styles/mastodon-material-dev/_mixins.scss create mode 100644 app/javascript/styles/mastodon-material-dev/account.scss create mode 100644 app/javascript/styles/mastodon-material-dev/basics.scss create mode 100644 app/javascript/styles/mastodon-material-dev/button.scss create mode 100644 app/javascript/styles/mastodon-material-dev/cards.scss create mode 100644 app/javascript/styles/mastodon-material-dev/color/dark.scss create mode 100644 app/javascript/styles/mastodon-material-dev/color/light.scss create mode 100644 app/javascript/styles/mastodon-material-dev/columns.scss create mode 100644 app/javascript/styles/mastodon-material-dev/components.scss create mode 100644 app/javascript/styles/mastodon-material-dev/config.scss create mode 100644 app/javascript/styles/mastodon-material-dev/control.scss create mode 100644 app/javascript/styles/mastodon-material-dev/emoji-picker.scss create mode 100644 app/javascript/styles/mastodon-material-dev/icons.scss create mode 100644 app/javascript/styles/mastodon-material-dev/material-icons.scss create mode 100644 app/javascript/styles/mastodon-material-dev/media.scss create mode 100644 app/javascript/styles/mastodon-material-dev/mobile.scss create mode 100644 app/javascript/styles/mastodon-material-dev/profile/material-v1.scss create mode 100644 app/javascript/styles/mastodon-material-dev/profile/material-v2.scss create mode 100644 app/javascript/styles/mastodon-material-dev/statuses.scss diff --git a/app/javascript/styles/fonts/MaterialIcons-Regular.woff2 b/app/javascript/styles/fonts/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 zcmV(qLaH4god-Bm<8i3y&NC1Rw>1dIum|RgzJoZ2Lrs zpu7QWyVk0GD*tRm1RDn#*n?jf3b-+JGsXb`o^K4<|9?_)Fopu#Ks7Vl-V09HrK0t1 z8~Zi}2F+TgDCMZDV{d4SjNq*5tBjvq-#O>6QvbMhde0G@=1>WT6AD?FYHu0ikega; z>#mApX-iw$(w6QH48JEw30FN{_sf5mTE?Y}D*r#_=EX+*uo1&#?f0LDsnA_;;~H3% zLxCTdVy;vtIwBs?ZoLX9$L7>X+VkW~9@$mBGp(v>Ob<@a910>RNex5OognF)o!ohs!So!2}}rZG)$IL^H=v$DKWnv|V>w-8hao zagH}G<;94Yj2XA;q^>=(%^d5(wx|WmmDKWTsi$hebmD*KGM53NIwPkx<@V<0<%C7b zQ3^@BU!oKcp8vnvoo~GfclBBJR-x#20u3VxJj}9%>0o@O93))a-xfrYnDq0!ZvFug z2s1C_1qdS{Adq{*5`qetJRqzDWxe|t4%kYf;$S)Id$m@mtr~kQIgrpbIo%ngDG9Rlp690_YS-ueT}jfMY{APPG@P%2ZPKjR9shqiV}7sVy`{ z0|v~by%6)`bN^R5>(}h9YWLPb5@~{z33et(!V?KjfUCMN+JyUgbh%bvyWiYeEilYv zi~`^ZS;_XKB%r!`_DxmpW=zm#clXua=#r zyBzKU6?hrq`2FqYh3EGz-A>NUzmpIT-6)K?&8GByd21|V|7bvg!|BpeQ1st7wQTh- zQdcdVvYfJt&avMWwy4fU>HOx+`yM_%esITg3*GE!fRiZVmevY}oC5z04;aqMhA1a; zL?6fzWl+*xE=q@(%PXC`>ngkGT$C>PuGS2 zZMmoLz0@IMc!&`)-1+7gPM72-eaBTw3Bd$mgjNV4gjN`nH#1**`<)+suX~vNnf1TB z?-~)&A|fJ6lqlsWCF0$$<@bLWLYYoFm#RV#0YwCT(`sH#fB6Slu3Fk^)pc*Gb)>IA zA-nI+4%<7Hwb-gv1XP@;u(M8*lcE1V4=X{;sOny%uTMRy_2PC! z7{p5Dv!l%*wV%8i(2MD6gJlN%4&434HC}YXtI+FlpM2Q4twt9{w4nYk-Ut6sX_!U( zf5p8!Pb^S%XdmFTu)gR}ULZPet=Kq%!{2oe>a8+P9c|k+c5U&T=RM7PKPX{+gg8WD zcvK@9+BEZA%{-(WIlKIIx9ZJzTCd^eDb97y@S?eA8A}MIL0DyBc>*xs@VLlRMZ$!V z*_w0VR}+_wyl`f46CWl~wnU<)8ZMIrq4CpItF2O_PJL~xq{TWP>h#qhIf|qKq5@Py zOf*ialDL3Mh$@ggs9p88P69INp;4&7&|YJ=&rEHqHF*oSItB5^TW5bbp6o(tNs-m%p#=hv(v3e?@xGt4L@*mnkUuN1rcwH9`shV5aEL7P2Qm0@9^aoCsw zXw0bi+yZXLdsnfDJzNC^5eL>TQI=m`1$~pl50)}o0j`}UaMwC-DDA5ZM2gtJv9`#F zEmGetQw|sTW>ag!tJvy=00=9g58EndtD<+y_eEf}SX1xjIGVj`iMKXRPy5W1U~3G^ zK4OeNuAEuF$*U%xo(=c5&?9-QZ@ScsXjc)?3YNPJJ>fl4(sS;}cGz$d$Bg)JSvi^a ziIc6L~Q{p3eaB%`>}#A@9Z*mFo8CfPSY^|77lWWN%)u*A;1STVU;>cpnu zg#4PI>d?IC=Hws;eZX{JR2G-x?XYB2chll@H7~lfYzJJf*Uer7RVb8gJ++DjE&!Kz z_LhqMui9$*((F6D+scmcfr4^bAjH$Xp|AI)_15ChduX}M3NNbF1(>g+1_CA(;B3!V-e!$D0dUfTrzVUEotZ~*77 z>|yGpeoF{UPMy^44)+;PQrG@$-5j5*y6yzAt|d*6PQpNrAcPW&z-~Uru8;d>X{2aj zbXZ3}*WZZK?O&mt_A3m6Vu!btFb(R(Z-odMIM z(19nDmri#pXLuC#A%lZqHMQG+q}94|-N&;sq;a~GPUoXiay~M}=Oa>dK0Jk0)~RTh zc$oqS%BYH^!pN`H%L`NlH*0*K$mqmhSi;1$=K|{J`-}xT*!zuo)f@*$Ri!9^HE|v? zTP4vdk5Xy}1F4tJ(GL(YvO3O3t8J~d;bUQT1&3$9Kb=Xk(a{~U{5UG?unZZUc}{gQQsqJ61_3;8oGz zvwSBh-0e7KY~}sLDgSns*y?FkAyix=GRR92d0OozDk{~fK8&zUarRT!-)PzJuIAaP zM6Z(7R7;LjRYW8z-l0?xP+|C<6`L&&hL&ADqkcPyxwG_ginOiU3u2(cUDMCBWtQNtVMIvbWf`JE}N2#&>_ zJX#qhD>w~f#fT)CcSGx13LX$S+8B;38K9WoT2s(I)941yT%WikbWo99ImmQBV ztE(#dY?UpBMvv@HP)Np)4g@^W5Ea0~LLIJs+nSY7eEL0gY}I}zJAS|0&G_W zU8kF!I2(?}NgFWyTcpJBfauVXI_%_>c)4u?!-d>pO=s~(@5Rx1A)_7DULSYbmP72$Zvs)fbSr%m**3Yt(l?H!! zu$CN_mimVx3RHE7Z=i+J)6vMAvgjO!ilJInGtnM^Fq8e0t6`KzBe1>bPDU_W$~aCR zDe*)y8pJ55dq?{KGKpcs+n0&dLm43QSt@4j)(`zog*BoqnO+?dQ7?dfS6jm_S8-Z; zeiYw@B;R-7XN+cjO5M9bji6Y5;?dE*q_e(gA7MI|LK!5dY{%FmCCN-Ci${#(~c;tbMD&yxPU;C8R}K8q zJ&wdifFbqb;e!DaOw-Y$X(xxc=ABVv|2C|f=D_{Hm+iVJb+$~05@+%B;Mt`$TRO?y z(P+~_G#kvN>9tU4Cr54RJRb*;2^FfF-{5dDXWT<}gXXGCn-TQikijC_u^yq!+8u-u z!NF(Ir3wplRSpV)zB7V#;*u^Mf&0332w=lhbRa&0@$B83+sYbK?5FQ*ok=#k=||Qm z2gZsJC(v1#rgZc z19f{^wZtKbAT59cyQ?ArtYY{P@NW2`%LCvz@%ki1M4e8xgg%6?$IIh>$`chl2kM@C z9SUic=t4ZUk39qBJfJ#&5?6jD+g|#8dZ6Qt5YH8V&6U-1>f?y#8LIUeyTc8~-(*&V z_Xch(({a1Q{u8Ocm^?=%G5R|5XsIeeWUp;ONWjEWFlCV)>JC&Rd${j;#*q@LzcmM^ z&+-gR6)90fgb(xOdH|QU9!%~QtRKMOTz*O;rOsp~w(Ye*QEH0tldl4bK7EI%UpmL5 z>|oM?RoYutouF2q8;1=#f_Kp*I0EiAutdUP>N(Edar6z<_2^itR<^RFGeq)@fAAw{ zjy4j-_!$BuvC$EqP7pkxWZ6$_Jpye`Jr$s+qb^eYfdtV7dG zCqa0s`U+IJ_r*1OUR=_oa_wd#2nmv_T##B2*ybQndTDe}mMVOqfD>LO?%23Qr=+W* zARrGSEg*=GWGs4t^*mq>*%E0-uU*(yzDfRZoT==)pNQQ&%Qy!HOIBNtk(+0kV%6i8 zW3r#wt9f*9x?2_b&cX^qQ9hgx6haH=A5jQ%kxDozvxTLGz(_SU0(_L|R8c|Wc~vIt zCBnhsc*Oy2c3sG&z}B*;_m-7L{Imu7Y88qg!s$TsNN#x$oq}{&X_S_JU#Q3zWb255 zyx6?fjw57$^Kwr8o-5i%2zV81-8A;IwGq7UKmQ7Qy-PplG13YvBF}1CwaW$#H%;D9 z|M8O|TkMDSBlX)8sCJyO!4~IBX!VzI>8b^)haoSpsi9&@tD^2Lh zjp;dMoTN7CY|BoV)KhiW9EotZuXA~1V6Z{j8MTN;_ym&(X5bPJctim|Y8yw4H=hkQ zoa+@aATev1c(O$tg?l`XTbiV?4}m$vG?mf!l+6a~vTm2rYd02+@b)Q^yx{`;GgK)f zbetX=D5(*%n*vAk-VV}CQZZDX|0t&P`fWrI?Jbq}5>#J<7)@RMp5BhoqO>1EfQ^^_ zEB0RMCVI{^M!X(U-1|)=E<5S8Q9mm_)-pJZyP+n6GW3FteIiS1~Uy`1(4k>UP4MK_f6xnc}9F!LN?3W zszgNPMSPo|C~*2T!lNOsvFxV-(csidQ9hNA;rMlgq0`~on?7nC*|hyVFqU-N{!trN zb=SKh8opbyJPiF&U80?10+Z-j&r$~Ah7aB`0{wLiE>Xu#ZyObtMcVe?7t&MiU(NMM zEvs4%^jb+kJA#Z+3p5&3K=b-a5Un-T+;7Y|#5{}!Xs_OBnDkjNvl?>%{~cC1oVtja5cJ> zvfF$UXfN6T%8n|(Q)=!EFuf(Zm7+e2Un_N4SV?6*lB2Mo3@35kY`jQh=Cu;fbd}}M z>cI*6$h2_gep`7^G-Ua8{LX*M(K95hi9VAvCvAw~Ir3q6Jn;yAV#d|vtf zKTA|RQr0~Byh1P2wE1n!vcZ0rJ@p|7Ukh8rqMXw_1|=I7$NQmWQLC%Kod8r;=+Eg# zj4603+$d62>wbpcJ2OFIpRmi(|At1y6Ch=` zWixz6#Up*Ry4F<~z6UPC4_h!Nic6jQHa}35l>Ny^r|}A0EdjuN1OF+g;!X$?)#eMf zv2i;%`g#17iyxX)ML!GlGsk9UJ@+FT;)qn#a~l*AE2rVo$s#oG8SV(9g~c&a9C8cQ z*0D$iAsICl!qIDIdGT0LLIcH&NN&Qu(O@0lS)zpiPx8P^zP0os7i7AjfP?D`N^F&H1`6~fV&Ya-zEdJ?xR%)rTtI_eQ!Y=>n{<>VB0>C`(xi1kup)<*g!{n7ztmjYOjo&h&;)MoHjZT^8w>!pEaJ3VkAbB;h# zAM~aTCUHHl))b}WX#k*Jy5x1rc1q?1Uy5lMGPoBhX!8}`2X3#nlYk_xkCM8z2lS}i z;kAxeiv=n{2(hrNm*|t3k9$s)8twAz=ea6RtFqlx@_19-I8kMY6LrfTzXlZ55HLdjAaym*Aj=%}JQ(7N zdQgnOkg$a9VUA*I+(=oQl}egbZ?PU>n$YB@yZgc6(eZ8XcwifV=~N&`r1qY_Su`!&wF9kjcN0wax&z1<&Joo z&relZLOg!Mag!nD4m~#`4S_U1@x7d%s3T@=pwBkCmg#7sEQnD$_StN0G7+1OIxLIj zL1m0wX6xFHs0$Vd4~oKheXxPioGi*qRxL-W4!?!Z$?`nl5lEBPb;9wp8wz>}<7iOG zRaXAc-`DabkCRG;_Q{A(3r_2SE_FUs-gQz_&p4)GaC0R$v; zHW#pB1a&xQY4*-=596p><>FFSBB%9o$VeRYW;wY8&`=ey_p2?^xv8h>5# ziS$0$L(h>iH1g7(Rr9!phk2T^D5!Ysv=JVFMiQhTmWT7FdoE^bg{`WrA-0?bCguCc z)+&pA%)jT$mfOQ(7gFT*egSH4h0|ZQQY9Lr!z&JT*a_Y7EBckGLe6UQe+jaEwypeu zDuDQMmNJi-z^bXy=v7d;5SP=;~;mYReD|mCa-PFO`W**hXnrDuM*9z=44a_wHrYwmCv;h zitB=~4JwR(%a+>iWj3Rle3r@5^r~TLr*-OXbErAanzU%(P|^MH<1kI7O9g=>yu%nW zgCXqo1=ZU0y`eMz83Ni9W(=;PkJ!; zhb?T9Ta3A#^SIV0afQW}M?3{Ew#k#l$v~b&yMZ9bc#O>Bq{9xS`zCZMd1F(~@;(?3 zVKk>|Y=5;cIXE;Z0^Y5HN%Y>wBOD5&_z_M9qv=fhBB=u3lP4{Ct^ottBbzSgCzIfC zfW+r2s34YTemf(+`c+S*;?6l+FEz1W< zNDp!E$-T0U0*_V&gX4 z=-L!+9~!B)F?q!>A-FPbHrH^p!MV9G_5;P*e=lDo+agKa!fn~vC5?Y^zu`r$(JO-$ zmQoWG^qR*d%$*=Tv&BJs2WD?Ymo4oE7k*`@O)B|yVQm)S$N0i9(%#t9Z9P=k&+cGD z@BL5iHsVt=*(vcvI0$Vpv=5_gbhO7lPrC={OLZJz2ze}MOC=#C$OT_G0hqXS5n!b2 znbLpsNsyBLrMJa`4z^;u07}7Unp=Vme+gOMp*qP+B74E86-sGtola0xF`6amcPREL zCW*U4I7Jj9DtX&=M84-(+av=t+jZTS_9+tx86GZ~+WSGAfm!P#Mzon3;r9ug8DG+% zO|1WI*de|r=HL1sWmLB#l6}pP^{a0(!3M|Ow^$*NgiN*&LFsP4{rKm|(g=;L?ZWSp zS$;v%5y7d(GKe40io^!jPlbIE0-@bx*u~ROUJD$@Q;E7`>~_3?#XLSs`K1k1qm># zdoR$x-ne2(rk_STcg1yAQj9e70T#Tm0yet%VBCBB<4|9pCMLfo*_YyuG>rb^T96V) zA;B6EWyyk84kglED?HAQif4q$V@c|R4eX3JnB!o!ao4=@GV2XGjfI;*rblgiZq2zK zJM3<#gfl(LTqkxh)nous7HvNtmNV=z&kBeIcP>Y+dkWk}9m9x}O&^-vlLYGfwZIlT zBFDn4o8to0Hq$BF%0Jpc!(a_^zUJ0$*{Rc{`qVl#s@u+XkzdSDNo7kYu3w`|*{9)| zWJ|+OlOrB_j2!92qR68W{;7vU4x+=e$(rLQiH@vICkPpw7Nd5}hrCnu8YbZxCD-~IWP+V_2@NeOsD;HUl1jS1$S>nc8y-M5d zq^x3o%BJCYL(@lBoOqNooY=7rJmjzw{{7wg2mkiR{^H;M@vr~ncP}31E8XHgUVQmI zz0xH&yZnkLZu8@w_qzA|5>I{NT|VKBp84M2_`!?cb834V`aGH5+4z_Bk18sl=D6NkS?9kh(F^T!w|)D@@6}#s8^LgHaVR87VGv zoiI2E&MaArAB~#P8fUrQKPsllRKMTV)ng;cEi9He8YH_KViME6C`T_rc{1&+7wao; zAY+b#0IoHEM;QdBA!im$Hv5?<>yObp=zt}E&1-X+qEc7}X@?H>IzN#umx=3V+C4bz znzd%Kh}I>@ZKWCKk-lQsL9%SghbSMU_sg^YS>q+8iQnv5dX&s{plBtaOj9CFO@Xu|?- zI^ydEBRye*MekXZpRrI6Y%_x259?fL4eAm`RGiK-hnACsKBjI$fUMmHoI%ZhW;X#D zkNl1>+lYO{TUZRB6e789#9Cw|sfE~pj_nnDNhoDgX_oVrlpqs*EP2U>o73UpfB2p! zPeA!O@UmZ-dd+qCaDW*wk$7bro*W;_bJ_e5cFQX#6J?R8#Cjj0ar#$&)?D63RpB1B7SDc7-^~ud0rNG zJg#Q4**a;xhYSf*ybNPp$MD3P``44bCs(^uie#SEinLjU38;mLnjD3(2b?%<60~j; z4krsIT{td)z1EGEc^2A8Kso;}xqx08yKGKQtEX5?ZnpFp zN$WmtXw7tMr#+_@a?APUPkCQkC%JuL*INu0@Gs}GS zz~WHW=|qzw3*eNxPY_s&oH~2=&;?vNK)71VB}~&Cm^e zkvUey1JZQbQ09`KjB7Wvp(=5G>yr@znJ*NzPHngivxy~=ecYT5!LgeW0sd%D?mKCV z7hGS#fxnb%XM}m+(VY;P2D?}>A;7&FB)-hfM@;liNfkNVk)Lmj1={Eq4fz22)WMFy zVnh1y$8BB#T3W}UCvT9HlHrT^=a)6Z15}lGFv}1dT=XWZkVy0si{*%1QZQRl4_~aj zm+h2x+z^C6Jm-_PSTs2oglg*b=)tZP(vpt!j;{nRR32-KC1M0CcByya@=0*w|Cw0tXGc(ypyyfDb&??i;x=3A&8EPcL z5)wYiMWLe=v9LK_$`nG$OZ7cA4Z(#lS2iJJEK06w`&%_D3Y@YjsS0R`XJbRL7Ck2M zH zur6XsRqqatNcGga1;{^^P5vee7SfpNAq&h~X}W;Ri;5A6O~zrANM|BMS+Im2@BP+D z%ZMYojQZl)*7$p@=x31u7TD>kSHTcX1fm$zL?TB71ZR;TBx>x$dlLQ^kn~fl?-aF! z`E8hMt$~wXyEy6RDaS(FBLG@!ng#^O84)odnPHcZ^_)!BI-*BRYOjKCP{%8YUnXL#(bEhEVjVocy0+$4giL%QWNz z#)fD@_-w19Iq3pIB84<`f3V-6S+I-Emy1vkS zed}i5k}mAseHYHBVpc%{1(;!(z37Z7N<+djmc&Afvu0nv+AjdaIOza@o&-|KB%6GS zA@rkSsrT&41-|ivJ@&?iOy&J^`8fPlo2$N{o~$1&`iq;}S-qy;hSfRd9n$|K4c}af zOF`DfED@PVX5m%q9-m^r`2Xx*=YK(+sg6<0)Ra0(9jT5`hpWR>S5ynC4^ymCHF^c)C{AK=P{n>mmEh{mh`is8199a%S zfSvFGyay|w18rzQ6B!4uGX942gqnz7i52+=tN=U}CS{NcEmW3eck3;9Mk3GH9KuP1!-`d} zx$CY=?z?ZcJuDOWGM>L&@Or#MdI7~7ctME7pOB;GAqC?f44C*QGhx0J5o3acny|+l z2S_hLbmHZ(bGiu$o)-hGjQ2Wn>h!U(O+zeeeG ziDKx%ycH?=7%cY*IOIjD1Eb_MNa5v-;KiYZx5kjc^2Yg+5;bChK7={3$*TvhCZE6y z?*5R>n^9si6CoY|O6s6l))<3=IW<1O#kc}!`5AC(WX^3(Wf&i#vP0_<6WahPQRnNH zz9#n;l&SX{N2vc(#W(M&VLSLhhmue#o-O7!X>2JaUN|B^pdN+Wmh7;qrK)r1a!t!d z%OnsWWA_40VNj`>U= z*{9D-O=LDvP0prTJVvwO+n8uGFxu1*_`1QxCC|UVTWe($8OWV-`C;tqOmJ3ct~3%S zwaUcb1o5*=qFfC-NAYB0Qx*m%&8c=iX7dXK}>+m=5jZ!RE}EoCX9FBMT*GXyiG} zy+^c&-{8TUY2`2gP{N-m(UnKtIY#18WRXM`U+*LI$a&7$m$*^S$f{&#)HcL>VuJ`q zDKEPqUPNsHBV5RVRINrM-3*^0I4~qHW@XKi^{z>UmJAK(^Jef!FDzx0{;qYKd*{Ei z**UiBlrp#v9PZ7$8to!xjNm?y z#=##A>CYm`E^Wp{dPD}vfc2P9hqDTfJjva+m;t!eKRpwvGCot!u2oUb2{n^1{3NNn z5HqtNYqoX8ZQ1FDt;FH_l~Xc^Qkm164d~i!`G#If!_k=PQyv*$mK~C*xkOWK$V+}B zorCnUWoP53UHoK_s!FL1+)?1>&fSMoVgP8BYY`x<6q+Uv?vpyPFV~}D?EK`@1|2Ts z;&V?2oWENNn+zr@D;X@@@bX)Vq@%gHT;m-xf~8l9h9_>5&_|@Tk@}qU7uIAD)IzZ&o1q-=^)TEI%%J9$*>f|0sH189)7Y>Jz zD!*4~@fIf3jABrks&;$>2nE_XOyp%P7X~=%4y;6=jr&uc)$!Wq7*n1?XPj-{-5MDg z5oCD8)sqKP+3+MpRG~h82sg6g@sKN!BFSB>3B;gsjAR$TP}IcO-%Zqt!(OX4!k)?` z-@=Ba6?hb)fqQYSzYz~BkxN?!5q7joL52-Jt#8(cdq-;B3_F3fDs8XJRqGHjR>c9U z|7v-l)LF^5Fjm<55S1Mc1N;?H#+jsPwPws3b3{cJ!Hr!+AZfu#sG_Z6hC{rCG91N+ z0yUQNuSui4@1m*?<(UzlOZJ53mW+7xvn_ln8tI0WqTzM)h*SjC*JqVPg*yYr%KQLk zJzRT6mY&L0y?cL>gDOt$HGZ~VKcct-o=uB@a>{y?u0|U=ew0-TM?+GQl?<^3Zt#0_ z7q?rBnXquJ5tY_i=Nc+^l56iEbe5>`9U+ld32*XRk+J1dfx?Y%wpqeg2{z`lSg23ex^!%#s?!GAnIq(Lw5*4Z7H^EPg4A;38F1p3J`y?kX~zJ;h>^kctt(g zvrrNZ=CyuxXIv>)rC-fngI)PqFpdxz#XP~cH-d_z@>&W@jkb``gAV3kXG=Dw=_vz9 zZ7jic4})4A!B7mDbMQqNW_;#;d3K4X^*XoPpRWl|pagH<#q)eQ6f>3?a-(E{c`L^@ zeTZJoC_Ax-cE`R)J%WN;JPVG3j=qu6?%2V>?74YwRxuGlfwYJsFx6WOK1OuW=HxIZ z!gCv{qA%KUC4<&Dr{1k$Wm@aeb97!3QQk6@v>S|xrXR=VJUDPZU?E8&JeG-MLVY_e zKJ=ilBfVh~5tBvViC%z(%+&J))`*(`v{c19;yP__*t_vFqMhg2R>?^w;F}}Mm!gcu zBmqX|gcqQ7xB^O{)Tq#rZwlmgZvJJrbp|T?!v{lN=)|ltVn?M*^q53^!-u9;Y{Tj- zvyy?zG0(c<0FR|t<=~aeDA9)GIsT`!^14{9S=KxvHlBLQM&{DLXEp%S{XqOv+ z3&?kYq6e?!aWDMkm*l~L90;MR#(?`~ag8ZHp}Rt~Vo*a7_t8#khfML8F6cCKVi|m} zx0%vHr^L{vo6HWE<1kGzft_#Bah@0h+IS8ARG#k1rb#AMvD7WO_&SjU-cWqBqGMYC zH#FWYxz)Q^Vb-lpV`}beCQQ&3=JVU z(QY<<(cxiaE%4v>o$`a8$}c}TD;}M0+h|Jx1d%TkoYp@Xz%5oj^_`cvI9DFPlAKeP z;ZC}0eD_VF94VFQp681>|0m~(C0C5Agop7Q36!t@tK$o42Uh5WR$xo<)BQMSAP@v3 zE!o^^A_aVM8FdN*oJK30!%oww1E2X&aJyzVesU_pwLMEZ$JUYE7h&qARSjfeh@6HD z_I*ysIBH~PK;H?G1WzV;j5U#vn8S2MC5%lbI^IJ$Tz^sY7(?luiIh*~} zRm8;18%=XpSC#xcUM85I>&>zcVdeQ{t`JqZk|UY~0YSpH*<54$w@;?xZaWR(2t##5 z?ST;km9Rm8$_>B-#Ol&++g+n<@d=X1o(&iG(SNq6y8fe;_Aw3uu z5?O*i+$1!Mg$x;_+3AkD-f&%WuO%X}XJI8EQxx4xAvR<|>+)eEi~VA)L}$VL&c5i; zbI4}n&~~|K4XboR>8OJN8YIazy$Z1Q0#6AVEikTKi;TTu^qZK+b2fw2`u3B4cn)`S z21dx%>I4^%-`cj`zqQy_8u(Rt8Z)Xvg@K~)ec+n6iR*i+NCuXNsZ6*)InxdXCgrq&r&U@x zHHgbWwKOuX3kBhIc#&x*B(jA`F-t+YCAqhb>}&5t^rD`JwQmE|@vj2aKD$FJoD1dZ`dF(VW+itjz$JeQo7^(R@P_JpSvJ`o)D{wmEp1IlR zb)hj(+qKnvH=(kCp-hxorT*Y#oafM#R1)RwFk}HXO$m8y$sVKp*&KhSdGg=AEEKUE z1um(aw;A=&t(jTR*q=Usqj5G0-k*M%%?I zRg!8Y+sTN?>xG!J7$ckV`1_tc9lM_OM-4!G1N7OhXypv%%DLd_M)F7b2-1vM4#$WR z)nIMS37clL-e@O4>NO%;YAX|7BM7E01D2?FBX*w1v7M-`BWwKRG_8hR6M<+OmG>i& zh+bNFDYm%WT_#t9%Jk34(PEUk!e+dYgEgTJu8Y;W(?%1zdpF$xr}j1;BFn`(sGRz~ z4$7ZSwL2Mq1M|SC_};n!ONYpgFqL#S;0HICtpT1$+m9}Z=&Ob4amp{RZHtc6t04wn z7YJW(@$|F!%yZd}mSaur{t|n02tC$VAVu!AKif<3%z38}HSBZ|K)Aru z7Le1aT%`)>$V+2Ds+FMKw~vsJ&;Mk&c^LKP&Qa)5_+oZ(v=gRw{d4e9~7gqC;o>5>LC%)%II@g0hACrYboe z>X))#ci5Kdja7A@P$EuZZE5P{O7IxwJV@7CZ>l2P@v6+yygk`<>71%glj?W>bjgDj zia}hL8*I~0`V{A%kUL71tQ+vR=h6*hF=_;X-SzZ#J8t(G^lil=fKWY|CFad6YYTk|p#z~PUi>8ZJSEEcKMTzgAb z%=|D(c8I4d%2}gb@N<}QpwnDtkeZ~PN)S}Y?l4o*ZO5`DRS7fpu|>z~CF9Swj)|+y zMjx;6?r2uw{%%(;*siEJ)n=W-;pXmVCR$9|^w3dfO7TxuA$OCOCiBlz%5{}v2n!(u ziVOt)-s+~3#KVJ1Qzxex;K{_elQ!wJCrO&2KRso-iH+370hb0qE}z+O`--3Oa|x( z*j)#W=!KI-pjP1Pqww1K5V74tt%&SuM!Z%ERhVX~LMVaWHsoSzvPgqsqI0w6bSj;r zZz+XT4yeSnqP`dUuDBGxZH-Iw5E#kXNcc+TDlqCBL37N?SzIqThjNSixD7KO6Phhv z53oUf-yTQDdHR`covILW_*5D^dqzFazS(m*GW3+?9+}rfq2&u5HXeo5)L!f*Fk_Yka%AAL;&p*AQ~$jy@wH?zO54wbo%8x^i-BH< z*mJ+_8IN}_g4R_u2>hH>xiW^;G-$@#;x!onYEg8|@Ls0&p>vEzt2^~N*ggk@$GXG(BJn1& z=XP*@7zrFr(@S`;on;e4Za%C8qJRPx93V8^<{0RJcpzPOl+K!RuZ5}03q=4ne14Vy zuAIFIbJdOaxDSd>$UjIUV)6v=pUPRBzrq-%Ua| z&2AS~m9tL6F}Xyfijs0G8nPqK6C9{=#g!#*b$M1k7^wj2rJPfFn=>%($zfiDcs;J9 z&6K@Fe6D<;_9iP-OD-XtT`6zY3?$c{9}a6}9wr5m0u~7dNwA_hIGivLwvb$BaDoMB zaE59j-H9Z<60bbE zYcVn*H`d~3+jrSLeSuA79mg^;)kv}-vvHzZ-tnxp+KPGkz~^kY^38dQQ}mzVpAfGv zz?X1r5iqu&fUk{<^DrQnBy=*fOQvr{n9LN9 zAjOD4f}j58N#?+D`UZFr3zmgI6{?nvFPL@#{=>OoV4;m(qAknxa9V8%4{*kIAf`Y! z2lq%BNabvRZfGB`Wu^5uT_r5=44biTBBPln_V>eNJ235W-}Rl@gfZG9Weog+#@T%e zb&u5U#3eM*gn0PxV@vf~J^cr#$UI1GgoE@k0pa{o5i&2?_4L|`AyB)b9s=o#>3A%8 z3Z)Kaqz{_yRI)sDjVyPXcxDsu8u!6ZQ+A2ZW-et+9a5zXG@30TTVoE)D?M#+Mn6Bk-B~xkM zx@jFEZ0oRNv~i@ES_R@!-f{p$(Rwg1!;J~u`52k;IRe^dh+lgS30B%5`wTL`t-p2bbGSGX$ zB1+;X${@sw*$q{Iq;uv0AbdzU_9&m0f*_0rgXoovy9kEfw<({7@oU;E;7O!j)jF#7 z@)*bQp{KEsEz=GItvK-n)(8P*OnQLd>PpJ(I{q9mKFIu*jR)nDl#kSFV)=lO`c9s| zLF^h?0Ri|xXG!JlP36X3NV0HxG+Yq@`N#@PP(c^t1g0Al%fjG7H5@zD(Tpk9Kyi+~ z;0v+|!6!7)m&j?Sb}0ZrkWBe`6+IHf zN485}Zm4hAtrri>28&MoEC2lHzXh`~yj;2-q+y5XKMZ6T_;=XCOvg>)&z@Tb@^LR& z$U*=5a&!A;;mS;*E$L2xMB$szLPOy_ELHv~t>4h+ULMuCS08dZYp1hvhx;p4Xh}pM zSsKQH^wClcK3XrvH=-X5$x!yyN8@?h+)PAuW^th{9BFHr7y8%=&wpFCC{Fj5XtYI^06aj$ zzan1`;>^_y)=1*DB>dWaC|O6-Itf(SfJooDW|Eg#BN+Cs6S49v4FphO5&19_G6QfJ}Uo?Ae)un^!B&l4r3j zCI2R5GITlXY{{|{R%&5sPJi>V7Ej;xC&xp^x}oz28skSFi2LVuxOucbW9x7+(_~yT zt`3a_k{q>g7|$6E|I+^V&oQi5rA4!dy!qsW6YN_|gXL7fm6nmM9|D(bx09dr>4g12 zJTVq^?RjeG;Eb%EKr~ArVXO=vYWhF;JqiaIl4y?zp0)VZ)Okd0(BW&IAuiYe7K%(A zlkgOI?QfFQ#R{p5*^-YjNao(0YR~>7r#^W*-}$=w>k>pSy8S zB`+13in3N6J5CA&TA&*Wt(somOfuw(ybe6i8TQ*$ha9v16nt&oJiH7i7|4>jnYE_9 zcV!4_gy6YXh*dLjLo(D0g7rC+>*nD9Jvaen^F&JifTmWXtH!zhg)(GSh#s#hQ(p*Y z2dIyhR}W^r3>(xN<1UgH9!KW`Y^-s9P7hR;l#TS7*y|h_7$Vb_F(Ep+BVdbUCVJtu zS))e=Lh0{!HPqLMCsx%>FtVidm7)_HoGAKeWeI2}%1s9jBasgA(}w_Rr~3vLA6{q+ zp&8RE2@Aa>&pDb<5UBz+v6*Or5pCej6GQQ8c1yO15%`U^NEi@O&d~bieFzBZC=v|+ znk2$Pq^xyR4_khMheN8(mU8r){Hi+-UQ80`R41Ceo*0(|l@N6eDxwC?@4iU7F|tRA z>c}oor4=&57YNz9YdsH3Zsw12rGeOT(E7RRsVX+1;UpXChZI*}Xm<1@8y zpYgXx_?1gLlwC8`lU%>`(s=UVF(W#40Y9TUlcbH>HSL5KlZ}Vy;cBT4kbRP?KLC}X zUfS*ZY3*3R&r0&`D9xQ0cfod( z(iOs>BLNGGySU$w#l)!~u8C(MJjVv8ps^!Wu8rgg=gcTQOa#aP_fh`KaIjhgXpl$d zJz}c3Nz>^O0|Ev~NwCa53ecOxWpaEs(%Rej?k7=&bm_bV3bt*gt*wYOJe+)rIA!KY z5MJnT`cG=$Pw5Cfm&Eua;(#S&amkVeR5**`dgrai_u+9eE76Ikk=N2%A37@J26vJw74snDcfdts?q@V8A&H?Oqf8s)0LJx=jdRr#VcaTyNu9x668<{?~i~+Kj4Jw=2GrRs`U(k!L zleTfgC4t2+z0tSnE8;Qp;ICVcAA(lzFaMyyQ%_vs`uULHBsxe1)ou|hs5q6cMBStz zux5R2nk5b*7Q%#+mNnrwFKM4`KL(6(dAp?_F{hIq;jPibe;+z7e69C-Nf$yge%Gx!Q;4oR+i6z9IO56#jYmJg~w!tXYOtAhn>- zS~j85N})+EoZrsj~8n$!+DDDJVAePvNww!1=AaL_k2Pv ziCd~QAoOL^6VYZ&vLjAs!2Ad>GWpciq>L)a9q-K`f?{iv)A$lwgtA7Fg^t3gMHkp8 zo_rj0GHzWf&4)UH9(HTMdWsP6Kr<)B-fV5P`l+;xWTmbVHgQD)t~Xd%Jfk^7m9XG; zG~I$i8WzJu0zTgf@Iu+$OhbZ4XeQNsFA-%m4U$BWWwyyeEGBoqp_yH}%<8NQ-)gCS zqLQ>B+srDU?rcQl1PJY>FiglXg5H!SH}nz>2N`NdX|6mh?NXl?Ff0VyW_ zdsP)rXV#Lb^lkcd9wBG7$*du7^k?4>YJ6Uc=~|1C^{T6hc3q5lf~I3e-s$4-m!|6h zI71nqgkIgij-CHl=OR-pqXUs|uR)D1d7Eg(Cb&iYu_^AmcYJhmYK%Vh@F4q08=pft8G&9YAcV|wiaBHc6l?^rmVX@T)B<|6>cmKOLf zhcGBj4&yf4w{1u8K`_nrgnX3WBX*x{ui|s+@nqN+(pno=?76u($(Wl9CT7r4VL=2t zs{YzB$W3iP;E(W%Gmu?Ob0>_Y{XFlZ z0lKTm64t#Ff&hZ$r}WzlGCvD!_YtIEsK29(8UG^ihwx_jrs&)MUxQLc$)G!v76Mgr zO_40r!46|^rebORQr|qkIuDa1`*xM>IHuj(sgG{|_Ff+8jpFK-mx)wR4`rMU@{ z-TEZ_g1q+}o3-WWsP~W;3uc4(!cC+}B0khoPm!l!8HuP4W(<3z&%vt0-!50B;pd@; zY7ih4z%E>5VD!-W)9^zbm+*Ew4(!zI8(8ZiwMU8-jxKY%QvG)F6DWW8zPCu|K6MpM zqNnw@M=@K&{_^Gzwb)Z8GSp*%am3gxnPH7i;BDZMLQg)bk$uk%sM$zngm9)=s~d8C zCTh50uGtAIopRtn`#zG3J)|#GgABsTyne3NQVk3H#SSB`O?x9rIe?R^U`}?d|}2o z!`pipFNdbr4xDfaL1lw;W^Hmqj_JAs)4Y6BYpCMfJ>JbM64gpmgk+It~1 zv~c!&P>U#U8jgWw#i?+FyuxOPvh0(X^(VaFan}=qxv>gWB?HQeHzn8dL)5U_mgK8| zb}!WW7uIvQ?j)MEgPJyV+TJvc#W!(ruza1@3S^ZS$O}#b z>C2in`#NyTPg*RQ;*nxDuBxJ0tD-Dt%7Uf@FsHERTB`?nMxN8BLp5QD+x!NBxI#?3 z&3Y{ol#?eP6wvj|?$ZV&^pik#Hye9qkY^^RmIz~GxgO1hgQLAe$n9L0T_j(Ac~6&} zR$IPl(9LhTHh|m-LEu!tW+13R3n6p7ApuRZRliSazh1XiR{f{xq2i=qx@0AeRo(hZ z3e!N%pYN1;Ux{~9PM9De0?N=&wrXH`CY*y0MTvUQmOVSd?y>(RGJ>JyeL@btxn*Hg$DY&;|YGl;?IA+Vu6z{6{bmriLYpTh& zA2wJIeMEMRmzp1_<%>15uXkzZ=ee)`6$#yIz>cgkdGef{pXzx5nYxW% zV3RvGWeOYvHV_SCkS+0+@ZS3`?B-AN#M7?b$xL?_uN^H1zl7}O&t=~1K?D8TUV?bT zRf6>8V-g>2H*T98y&c8w%gI!lD{JJy8C1J4ohfyQVKM5|yXsJLO2(!3x0tRjCK@fW zA0F>_$=E&{Y3@YPkRPH+F>Wj;DSRi7O zwXEip1<7`=t1OOUQ6@t8#*r5yC`RMlX%Juq;!>dF3Hpt zGtN%>p$E!KcaxKv@x14M2d{i*dT4(}0_%scN+o=DmH7)D^XON}c<`;f(AADu+2Ij3 z8{V0glW%XaZCiqW0@$2^*q@rv`ECfm9463B2amlMrK5mM9%$Fhx9OpMAMoV|-Z#;- zVO3|nS0$lkYn%RZl&+G`HIm=vFTi0V>lFec8L@?JO5=`(GEKWm(mleOMSU&@?XMGG z&y>7(j7+17KDs!|O%5HEy@IjiIfX|3SCc?0r11<3W*H;PtaIh1&PyP_{-}mOzVJ;r zgq*@`{8zFL(q!t%pH9QH**M$W8F}xB0)Wl<>C{j}we!B55Hjj;nGlff>0--%)UlnA~G!b_e2Kfo7%a8u8|?? z^~Q(;nyv&wR$auw3zQR89i>c)p*n|ux&*25vsEThVuT2LB}(cZEoyGcO~yg!abO<9 z_u7vT#eF>G&b$n*u8@WsOUZc|Sv!3Btw%&SD!=I!5w3^)=2+=RNvKZ=5PiK|wQ$tb ztHZBE{XQb5T^FZr+8L94uvFm14h|I$NTE!+@q1f@i0!!-vyh>qos!)V!n(_MFz;NC z2UWGE>o=KHE6S)#N6*dwo;VD{5*eLU1GDR4VEpOpK-iMU#h_3NcqpejT+jHzZOac5 z@(c8XDl83>9+Dd`f4mvfeb4KP@i<~>M2{22o1j#^10yYBW{iF^8XX{Ck^v3OcnOtI zqk3~Y_m@(|vsuzHp9CtwKu1&Nb2q-Vzt3XCgPzgRMfbzGG*_rP>U1Vwk5b?Js`oYf zAjmd?3D&gJex~jZauZo-FE*Nr?qW()sV&h2=Y~kLxge9U2_nS~_NFF!jHo1Q9}UZP zRB?kf9t{I%aqzrYeM^C4st=eiu7;HpWwy)hu~=1sal%Fud)(!0!=i$jSYj}61XZa% zgVu!$mAxJs+HE{&5^^I^$z7zjRk8ipGE*qLA)1&0-9W5jiC-KQIAr6T6I&5yjcwY8 zrknqn3*PIhWS{2ed&l<-Aa~@45xVm+W*gi;>=btK#Pi>j?JH3n z90h9x;HLQ+S|4S01Yt5ydrteAETBBrwkI%)lZezeiT^M{whhxt`g)4MBkNmG-~x26 z$FC8hskrOX86gW&cN0A|-J#a#etBGV@`3R?t*p+|?;Zn9wPOqWO^(6kEIF4!+y(~q zTh7*nPpmG85*gR}xGOoilAI;++>py|<4#k;-E|=x!5!5Ecs`WDB(e`)6a^KK4Z?(x zi=>iEL0nDaPHHvkdDKo->2gf|Q|v3=@IqzD3F=juZUp&!cRp;zXj9N{&f;xjveyj} z)wf6JMdRg(FHga{3vUe@FIxjgPsiUF(*9q{-7KRI488qa4 zKsEIb$Lqx-l5oeULf6CQs>$e3s*zVFG*7qfA*%YT#I05XVH2<}Z}S|3?bATTM|q;j zjddfqz>F<$X2o+?24*f7*c51GqQ=Ol^Q3XOq=u#%T|&$RYH$gt36(@WC;-5ix>2O6 z3D!)EOD)A%Z5Vd(Z=MHxG)Zvu81YV8o>l$bqyD*8qyjc!s0DpOmC7;@f|2^7PS)iu zcxZJiDm|%b%3=ItXP`QenJ+O?n*-|5CCBuTv;c?yX}4K(mPNCIEwO6f-i4s=n!PTl z5UuTiEU3HGOP;INlD}W}NH$tz`g~Xq>4Cd_;!yTZFQrd;MKcZxmS?5Z_a zsFADQQqk|KsFzp7n0{qdze7Bx+p1bzdCv)14VVdDAz`yd6VnK=)w2N>+s8N>|x$=^aH`%R*7hN3mNyco5$ zbY5)tKWOl5{>;<%0Ld>T1Detp9(b?w?w1kug(Uz5I7s=Us zNZc$xRC0tIrU&T<29ZtXBDRL%8PP%|9y;~sJxE2-sPTEsE1#uE@w|LVrDz(5@j+5w zR1e#V#4;eLCq$P(_Q}JfOz;JQ1@N4!mB4*Hz(H11v4(x~x}MkYxA5L`{{D)>Wmk1C zl?doC>`f`Kgf($NH@q!;07)dvKOv5r;pfeHqYduV@|I0HQ3zzUK9yByawTWG?LHMY zm%XBtJD)ql`1LY8}uMSt1DTI21lAtuC{@H-^Q8I3!amqt+ej#YCt_$ zbbO}E|B^5CI=#GY$_6g<@f+N|7h(PcVgle zhIgozn@ax;?LY{@UpF_DZ7R19j2rLac9;4v#B{En_)aa1Gt4SToS9^@7Fxt=VTx_l zvLnMjouF}3VQzfJUg7^_hSdC=g>|0qj{@rgZL=&2fEjg&X6}gPg^12wQ6@|}Ry@~9 z5`0$yQ;u%5+7oYRFIfYC8df1-)SA1ndA?NoMt&cuIu$kLFtgt~zL=t2Z7X({tz+6~ zkRCgfX|J``_4K!AzHt`58Y|vY?XBrk!Q_XdeY2~5jXB@2_Yqg9{E5T5zwT?6#ZyTw2 ziHen(2^$xO-}UI>a2n?F<5Kav^}>~r<(YNqUjie#UlS8}u5qT;GQBc8oH5=-ePR&jD) zq|+@cwyms-s;7^YfxMZ;I0qV<^H7=(BNvdo<*yKYW}Rz&EUVw-CaR60*49%SaphlW zxU$t5lK8K9Y)i`a`Gnr+&mjHnAs-A*smu)fn04EaQuADpZwudkQg^a;7LQi2)JLvr!l!Jr!}x(KGR6 zk|(8_7A)9)espRwGh4_NXS4Ytg}Bo|I--HY;vfS_d;>zZL>a#UGI&jZA6BrD{Y39J zY_}#Fn*Cp$iDI0~)Jw=jdON*zrq!7!)F!hHK&NAFoV!u{9Lyj0m&Nyuyg94>vvs3G z)@*aXM5FE(m2b5RzVb8|Kp43a{?|hxhZhzEB+TDW$TfNCTl;(82}hg?(Ko(^i|+zk z4%!}edeyN?Zq22=_#4s=#^2Skfu$errQXgVMczJRJDq4L{*9PbwXVb_Ts!%ippADM z*-UMb+ZPIhQLe~qlbLijpXH;uNt|S72Qssn996FY&Px|o8B>M8(XZ-|GjqVz|0wIv zcye$8>xZ-FM)nY8DWhkn`R=E%IaA6IXY2r@q*odZ&TYd8tmCVQ;r~e}b>eZZ$6Hu> zUuD>hyvo)R z@;cW6XyByP2OrK6mNtK!GEkGvg~W<~n2SVSc?UZfC(mu;2A#B!p#V1e8mjTfk?xT@}O_t zc7nEcNEq_BxBLA;sN~NtldDSM#|qtDoewK_T^>0-;x(DxqTl&npPo zGsxd9AbnlctxHAUa#}_SQT$Z{6CqQas0RX^0@=L{3N( zd^i_Tn;z~c({HB-cAkXSPIk-b&c^c}sX80Zi#-4$D5W@H z4|cPd!)Vb2ZTXqsIp<73(P*YVVozo39jAPxpwM*B@=D5~mH%qqTHDmrI6?|Muv)Q( zT;&(B>=MgbFnWAe;=%6uw}-uZ#q#o|;DA}uDZA-kKHuR+g$0}?Rx3wciE7_)+c_Z1 z^;W(zBc(k(;%x1>?nq}_+lh`rp?9-?_UZhhbvJcPWYbntZp(kfTFJ8foEk8% zJjKRTmWkBeY-)YanFWobHRqP-)Vl)X95*Mok{e{{s~ti0!=lhOw+nkXuHbnIDEWJl zgg!~|;EF?F|~Ud1XcPhGmZ_E4#a^_-l+Su$ZkB**c`hEcj3XVo1C9VsnMF{-{$Oaz|R685$kF z;x@7CZPu>n$RH{xD4aibL5k29LjraMM7**mIwU4AC@9c$Shi}pgo4`Y=6?s?8yHGK zzcUX@Ws#%KdlVTBza8xgkVUS~k6s}Q3=B{Q1OahTfrEiTIQoOV z`=3>>yZ{sZ1A%`j(NB1D8DvZL%f6UiD;RC-pBK>qV-y-{QU;P8qik5jHrW^jrBh_! zGjtRcWf9akUa8h){z1QjSJTz(^Xxc%kD#>Z%}U4>nxmG4xl|f;$H2vY zBfeWk7SotrL{`+#Vk?Fk@2@*wcYznEDGGYWZ$E`*v4}n2$qX+d5#Z%ss~FtUd#W}J z(^2>6HfEQy_uWX|2zidYtbiy({(RVmnF%FZ;FBW(@oe+wg1a^V^QH&<(@tuP;yCV< zBp(v{HUeXK4s%e*_)8oe?S96HXe1)C*nJ5>RZfQc95XX$e_9u@~zh+CHz3wSde7zZ{N|EuABWP#q)bReLAQ2`=o& zwQrpf82+YL~3idhN9O^kKVlyRi*+@ZZ~@9&K<89 ze+U*pyXkBh<9Y9%-6MQRb(L4_1r|B4%VoEBVW$&!4G#l9J{CuDb^(E*Z{G{(Y)=o2 z*(V5aR0%*9+lYDW#5N3xvG>|J%(B9zlpMyG72TviMF>SrighUb->@l0Fy`wDaHNi_ zPBKwhociG3GiP`0_Ho^3!HGEx$5n715xetcZ`hRU8+*GrO#7hQe-H*_MIm$+Gi zHCh?0(Tp%Gd&5k_^c(=Gdie=tw>zJ$2?pfZXz%*;_3O*Pf7i;7eD z;OmUe_aQ>XVeDO0$#uBm+?W4}8ET+#JLBhwwj6$39Ya+jBCX%-`_~NanH_y4)H7Ay z8tDxD>A(M_CQ`jE;h&q^3l%**;;GXCxzrT3jJj8zH))zfsp*ERk%ie=>-$XMtGkNK zuU%dY!sWi?wJiq@w5DC)Ssqb`ij-D zU%fQ_(;!PHHK)}#rzO!-{&9hIy|=w{(S2$m$QV%&fZh$e^{1Z{KmQC=S1D+_6caxf_Oxx@@E3#aA*K0|T5V;|?qkZ2ZJTvjqh!E8=2H zONVTOtHRJeRPigiq@5-l4RM4frmYPigI4~6&RQ~m^l&L%@W~XAO|7(|v zA9NO_f|r~1z-!Wc7u5kl44%6n!Ywg6LB|t~NMSCx|IGkD@CQkcQsei=(u{Of?Wt8k zeL>5l_pdEAo;Mf%5P$(ey+LcvTg>OrgJ{vp5x-mP7yI4AmObkNsUvmSTcZ@)XNY4j z!H}e~QJGuH=L2Ih_clQO{c!5;_OG6PTAaEsczz&K! zDvS2ZVG8Vh-ZN*0hx?jOn%xd?b<6(!Eo%)eErwUd-+F7jWY@`)yS|JOGp91e7`X@( z1p$42EpQQWTw8u|*yMe5vD>a27Fw>$B0o0{dQ!R`##}TwXvQ2iqlX`l4og297XA3! zMGWRKpiP!qjCm(<*l#BccZ*ESv(H24tW z{kkKN#Y_0Q*arU5aH2DKHw|v2TYHAKJ4BUPp-|laie@rxlCAh}PHT-ygF|S>Zl`w0 z|6;=ato$2_`sQXsAm9+=VG#EuZ{957!>LJ%V~*V2wsze?ce>!^?tOK2eMCkmBIB>! zxS?cOQ4bQ&Z$IB>GKZJB*<{QeUp%){{Ks4j7!eq27qDPo#2kj3aMV4qchrGwb0ENp zq9}4s5w02#bwU4^?<1QhT|bsTJ|e1OvQ)_zUwx{+Dpc|%dFq!n=tzoQU$ETdO-US1 zNGY!B4_RK@yBL;OR2}s3p0h}m7X1|U^Vd-FR2PtUV>f4#EBL8N8NyXwHY!63{f#=^ z)t0L|PRk|q74{`?+I}91C?MyW;DQ79+`*mqX37PY+PS%PwRa4wTbN}kx_pq-5TJ+< z;=?!CgJk@-m;N#j@<6a#qIL>YTkW=!&34-k^beCa3Rk#bvtEg0g96IWK+C2wI>YBY zu$H*VzQu0mEyQe=h4zv1RUAEzD}eoprTybC%j~;L(9u+vv<~bQV9lLpA;($Lzt|c*q<9Ff4g1h~b!i zEAjvODGE2{-a%i%eEPVwPd5I=(#PKtabSPoX8ry!#3A*FBHHpBMbR6yW~jH@j;Kj0 zJDsO>a7`JXo_#mfubHB3y(F{scbhYap}-IVldB*^l)Eh+FMd?~Cj=}A4&)FBCSZ2$ zuCHHXL6*#s`jO0V`F=ZTA{SFt6mJ&SGk`ET}>{?Sa-Is{&}EW$fY^*63~_zK3;U@lBw`_nSDyE zs}uL_tvjza%WLH7Q$sTa=wO{yDOypv{Ml#MM{1OsNH}1>v5N&m5u6$8Q1IL#(F!`) zkZpvtMi+{JQ>!APBc5QbDs@Ul9D)e!DLgFX)?f76J#;?@^v0k^ zjEtV~u3F`VmMxwu9(>RhS}|>-yQeXXR|cg8{6$N4JKz1~zGY)IEj5I|%(LSs;Re>4 zT!^Z)*G*%)Dk>|w9L39e;WhjAYjNu^14qCbD^zE#$oO+LXn&0RLID95Q=#fL1A^+; zs>Js;ZdZMAr;*#HZ*SJLW3)bmX|8EnZQ!`Ztx7IkO}UDlk1OZKK+m)g(WgoYLdJS; zr_FiG%3uAGLCJ?``{SG&vQwV+0D&gRgw-XPmAECBC4yujbeWgX=!S>E3~st-1PmnO zZBxtktP^Mn$z3K7<@*9BYC?73Eyw5RbFHRE9nuAtwYQfAFMVafa^~x?{vL?b#wKz@ zi>aS}`rXRGR&M2g*N8^x74P%{j&QY&-KJ3atDlnr{;4O6{#&M)4TjSugQr|RcaSIp z9On2L5s5qtiBiFcGc&Nc9P%|6u7SGs(NXs9C<}<7RGJ`B6q(!&@xsv^zaf_zryLWO z?FcW}O9A4<1e%DM3Er`Dkb{3#s(Erisrh)CL%ebQ^F|hoiI9a3hez$e$R_8=`jL_K zKD|lQ=x2b>jiNvi=2Q5j6D>ggezv|c=+AB6?S{JzW&pmM~{YdsoP8)0}o6lOdUNkuAK7wCtd2u z(ec+0mhYV(9r^EnM@D^KSWtUDYUPIV_D^L;kNW+beextIAzzY?s^^stE5QUHc{qKv zL|&_-;FQT|9(?yvgP-MU|GZpDl<~`U1(~xG?L`3!pU$TMUNs|rv?ESNmp*Ge?`UtCIz1cnm+$RHX5mqJJ`TayimjWv=!4{C)^cUPhB*Liho&0T(W zfK?B$t1b1g!oPH2e{0d|u5h+5dwq6gclYt`?#i63b=HTut!zswnlnx2jheB20?W>m zC&Dz7cBEWeRDVD6UB_g~3rp2h%2L0`sbXF|FPWFkN{W-WbpGEIk>->XtDcQc^LJE~CQbg3&E$mOh@8X%<=3(#AT8Jdenv=YXU_eI72xcZnt(2L z5n;r>F{Ii_TEV(+De;vS6^Lqkl$e%3X0-{ZFVg{iMq0~Tg zNu+$F;YD#6K#5lpp(+c?p$mfrj9r`Og(>$YmWG7333q+65} z2@dRWfUda#FOk+2xU zKzxn^H6j@QhR=#zxakqmG6IRQqnyVfdc@xg>t2+Pk|||T7G{oN1j|3itJ)R|G#_hz zhmWKMR09%b4y4r0f0aM`7@J=pj*hC=G5Px*dkj*QD$2Z=NKI+RsfdclmAWf^y${q) zDJKU9ry?V!h6X2rRq9UzrjY%Zh~F`iA61KXyOaENk1I8`#N|REasvw+Ug? zNAbO51sIj?)7R9PYxGhUvV|68B1}S!SJp^DcU~fsDN_thHAw5yyv58eCIr`a*MyxRQy+~4P(?9iCF?6jJf{xsaXN#vH$(sdqV z+NwtBHkG1XHrp6`N^!oXrX98OuH9lmU4qO)wFx{e6vXtDb;0hy{|t#B2&@}n1Zc6q z37CNT;LAcoUYhhuNI+>`;1w+3rhqhPSGu-LRuM1#XQ5%+$`?km^3$GK5gPsTPm5gv zD+3P1uJ|c7PyhEDS^&pk&M&frC5#)n0W^m={|w8rEW;tLUwcji_@P%5-gKJgWf=Pf z=c>1535f8BlT_8vZ)M>s@s>KcYnJ}FdC7`Dn`;{5imR(%R>!z~9(h&d-07bu06gXv z*1R+D>50_|4Qbmf*Hf!q$yF{*`*pc?Y8oNWXVY}o_6Qy<2w(3LbRV$by;73pUAVfN zM+~yMY|uljf)y6j(&)z1J~4b!&5P6S$^oJWdxYs_X4^zL!?>*q#4gw-wdgDH_ciTYJ2vn&d&8Cow^;TSPPkW(zoJ4XH8eUU1w zq*7l|+|~KZPvf%^T5^$^)cd2pP|X@Hspj!~9?Y#c^aRrRbhPZ+A+NOhcBLgJtEjme z+Hy(fgr~|tGLJzjxbj16EmUCQnLa+`_t&? z(Uh3^d0SFYRg;o}hWE4T6JJ2Ok|@>TdFADKs%>|-=DZq&zYr3T&%E|@bo^x{Wk zW9`Q$#cGzfzk2(NtOs?Ux2`(a}4aYQ(hIiIXCh9?LiQMND=dF!Lu=n zUQsipnZyejTLGHGN)3yMMt(9EuQWdhZ92!tJ8}KafjVqx<_uWp(_tl1GU8&>X%6f_ z0y9T)0q=c=kv;JX<*lAk!{+v{Qi&rQ0Z;=5^9&2i2hL0%Jc5V!kI-j2PSGNL%CQXU z5O_{v#RKTtPauTyol63o17q_pm!a{Ay;RlxyeIgd>$5ZpyXe+p@ZJ0{S5S0#8F*!i!3x z9UEI4xa?lT7TN@h|v^nOk z_!Wzeoc$(p2z;{$yzN_%=psVv_D36HP@ZqBRdCr|XB)PLlsPWjOZS2E1d~Bc2~Q9~ zY>{`f2rK!gxz@D+C~v|ivfwavAg+^ zqsXaObpC5@>3q6RDyd3YrKYm)re-qjsEj(AmR&CGljci%r7uf~n9oUp5R3w2Ase@s zNZ^Lqjueu2N!TwgN`eksN^-_}lx#{~`HRA*m|%{#-9RMQWa_9e<=$}rdQ$}iJw)(i zqHMuh#@UK%Sx+ z*@EmB--BkW#`vDs+rz^)22(Sl&5s)4onBkGl7S1Ta3i8xs(VOnzL5)8goi04B;m}0 zK>-Wsc8aDmES3z(jcbQcyo_As<`694AN*;^Ai_JMz@FQ}Y^YU}Y9_4I7-;sdEo8uP zT_Fo)!kL;i0Z}5~vH22rJr*pswOy*K4+xUX{@g+mB%M{NA|f@B5&u0i`$T``QjpX? z{r|93#8%Y{t|`BKik8QE^<+iOYh3!~_v66K0z-M!%n83_d1N^=k)iE5XW)W+U{~vC z8ES)*A#Vyy_U|mLfSR;law@sjRSI66yAu+kZIy!LpM^PTr5a2h&oG>RpDmrmfE2mLG|#O`%vwv0?*CA>VB$jBRSh@_~G zXv)6|h%%K*EeMN#Hbx1%t}k47v~1mx^R@J=_D|Ly`LwK3b=P+3^vbxVXELT~2YS!9 zP0M|q|F5SajUI+QB>OLiU`%(@RQ-fW^WN%_k5QoT#fn4y3teyigx`;?$cmYJYrnWa zM^heTL6AzRG0o(AH3#^}!XZWyY`ej@>+2B0TJ_e2F_DXm{s?PLAqiC&C?qnSrl~0) zCrR@Jv+Va-LhvH;T8rdjJz=Lq28vEyQy0dC5sIIe*~qX{s^uJo^wv;7`^lB|L^ma zm5q75Z@k{y`}!MR?^szGkrAM=K?mzxKTlgRF$%%#H(E=%)xQyocKAutSiTeAo!Hct ztm@9}JyqTNXkt%x=P#;$2s`tDSVW?B@js4S+{YiNi25CXI28mc1oK>&+xQEMvz5jv z5AtZIkPae2{?D&Sf5(yQ068nJk4*#s3AJ9uvaecXb@zinIemdEelzzht+71%Oj*WQ zZ{jSca*vDW=a__gj$g%8i&$iekqDDNT4)ENE z(dP~b(O2K6b*Ba!c_(s$(IOJ_XE;k#QI|ffucVYudrjTaLA`5}M#`rWv-7gkM#g{< z$GBgJTT60Sx2FCvSknDoyfqF)OJ96KPJ6{T_G02U|)b`xA8m#Rsn~exLdM;@oX@IjGC61K7=jxutXV1mf65p|>{l9FgV!UaWt3ZzuQ zvi)8$?6h>>C^A11sZT_PfS!+n-Dt5aB}5Pqhr8bp8RDTZwYJ?;YVG0iqZAh>CTm{| zkE;G+(jKuQK>}jkKnXn)6cbMfg2vRcqZDTKw(jDX70w!aLl^L#rN(5~aH?*>;=!^h zJPTzZ#LHn~#Lh&dY1+ujCMgCpafF(b(E#tsC1V=U^1n5QU>E1vMf;2cKDSElJ+b(r z4EI`{N{bA~3QRiu48HGx0DBcD9W`cacVaRWhSGDc1_sBf7atgO`8~YY&c_wkbD9G~ zTl`7Lb+@K{U3@e1>s{7YHsVc(dQR75#arxOij1$@wfTa#;15Sfe>akWBiwzx8+)75 zbtX&PXUde@x9=NH3Qk3Hb0{@9Y52bK3z?$)OxoS3RyTG_!zv+a0SQkCUTZv)<*fVO z&)pD%j`|Z18f;hWPe1WlhWo6)1Sf4Ci<}Om?MQlAoEjD_i6}$is6*oKP+LA{#OVC4gWg90XsI zBYJ%x?6+*ewNqL)#w<87RWbg8u`5+#2Hs)4=-iHC%^1M~V+`>T3TBBDrVO%@Ce>u} zrLF*=@|`r#nmH{$N)ev35!GNv2XFD$=np>>MKd)KcE)k>s932M2$!hx+*+fW+Qs6BMJ-%@Tx z$ENGlC=PTDgBWc)Xbhh<3qNDEm8D^n4BHmDHkML@RUBv@GDfAGE=j3WZzODw!<`)R z=bW|9svgtO;eI<+Te~i4FX^vW^AgL2%HsSdo3;jNwUXOvjQ_R0-M%?* zWf#V33+V`ujo*N5&kPLIBYt5*n5V+>eZ!sqxz~tu9Hpg{n2aLE|f zpeCFDCz2sN!^ePS&{ixH#X))x-xDz8;V^dEcQT}LTVr7K8RCR-lD+&h7_G}%h|BPn z-#fE|)#X{Aw|TSD6Gw`M6URp^eJ)9hMm3yMr9HliHlfW|!GL(d_N1o3U{$H~2GA>- z1O?U}*_O)2Rfgu~16;FVjim{C=|q`Q#zsp_K5w{*LBvXP_@_%bnsLUy58TyW+-wDW zl;Q4VE3EvFr9$$nVz^}s+(KvgkRzgsq9OwG+BNUd%DljtwO(BpyQ!ry_Pd7IR$mN{ z!FREZFG=|sYbY~8)|i;t7)|?o$}`gmHu3bvXiXzkdPEF1YF1Cb;+FD368YWk?;L&& zT$P^{9X#CA*x)hVbk?;y?OJUu(r*Y`TR%@X(_|Q$SsIM>dkD6h6|~|St!4x@QmfU9 zIwn#Ur5E&3GHanCQWL2c)QFDMymAhl3&g~X-d0NIoFkN2jG33yFEgfUyzp#s!u(0T zIiU(IzInV$nA>mU)X0{GyyxzoOEJuf2b{BpidOqo+A10pudnMb8LvDx4tnLcT>Bw7 z>RbGmlFH4Wj=wZ@Z0_i|XP2*I5r4n>q1rp%3!9kD@kMy!yU_Ld;B|P@ge`P2?fcq%YtOG zJZV?JeJAc+vHP!s=9=&oZ@es96Ko07Ca0&w2Ddc2GaGha)WxPh`7)LAWD=rd{_yIW zp0r>{wtWwSE>^`ZTNbF1t_*ApxKB7k@BV8~+v@!>tMi%Bo2jR--BtSkS4tA%eizHr z{%|_!6k4&X+x)c#%b)v@LXFwVlz8k> zFSTC%_0tcWR2!qs8Fm911@rTHS_9X7FWI+GB&yZ*J!{n!`T5-1RpouYsk3R@oH;#+TA~h2j6#408&*ihkIr;L~0jSSvSNt6A5WA6G0J zf(8ZP90poNVv%4CY=p%eCnr282cxVNaFNWitQ+AF!qb9Zl%|Y3k#kX7%XtJONI=qr zxcSf=;SP|}rGAcZF4se|7A0~k$8mES9wbUF!L1(beUEWq;+TPxa-4~=;1S1Iz?QyAC zB(E}wRyR-?H!=E9oN#NWxk%ZkfxJoxHZxRQH_?OW!&-2N3zblwc!b52q?woTY!912 z8gs?)5+3h1TM1s$1^fE@*wq$vFJq58tfp%NqAfrU zkbkAnO>N#>T+9_c@iU@0EzXD#MATHAVoss+%y}$t59gjcJv}pX%&IM3<-RsFM><}2 z4$mPBk=*62`tnT|W*zr%XilLmV1&o&7TD$To;hQ&c(owhn4Hc!w+EdpT23_&7HX_* z*4u#GV#IJyMP2g_-iOG@+eaP--D9|9m^C;JiQ{eFw$IxZ+Dx0iIE<{O;)@E|?CgF; z%#AU>4jUI>+rJH>!TF9Q8SRRZWq!j4nn~Vn9-y{Ck6k?NWxXI97oBzIH>W&HQ~B=1 zrgRhYv_e$O8vTBn^d@i`soIx5SK(P6*?2tjP0TynR57%m{G+oI^KAT5JRlNY`>rNf zp7Bt3<@4RfjU$Y}Fd^Ihd}ViKEFiC@rh`NtVMb?V9cD3$4`)4G+54>_eYxA-Fvre^{)m?{5IPk~0^1-;DDMp-JD`YJd3Y7oL0W+Ou-s zp_|}&i-g1TbBl4FgH~Wf6pR5vI|Z8U1ozHTa20D>gVarUowlILH44s>D^_U6DN;qi zgtwWRUXOzL?yc6SD$!+C2XAQ=U08tiiGXPaGsxPzGb0<3VJ20UDx_*s-QZ$=;vdoJ zmWLV-X1*m4iIU4QXJ{z0@Q8@Ghdrd4VpCBN?7dz+4IktNC|EzPp9A^@?`SPBIr z>=jgv^^V9$SXRN|XzFa_uRfAHGbWjCl z)pC6qI=^0#;`5~_{N>TtgB08GTZ*9T(FOWBaaTco5QHd81${tCG4@sa4Z}#CRG)#t zMq;;)HQXv#R}}eT=i^S<)Tce9ku@Cj!|0FS6BCx?irj-n{_x`-sPH=neh~4vv7`fzc@uz za7K{=cq@!R1OVMMA-eQ}0k;nCPc4d0CbHNv9}&r-*M8H^EHD^XeN)T2u+h~exMA>2 z^aRopms;OIr$@x~>zELY9I+G`Qq<_bzDFPRk^;Zf`Q(#}(PKVKs5i9MH|Bp%+1ff* zIp(mld{)1K_1{e6IlaEU`Pj^)dBMoqt|Ajg2EOsR$1&F$Y@o*i*2e>KjB|_9nBRSs zOXW)OLTy{TjBIAzZ@lie+Zo~EWud!9GSlC?3#;!g1G{1gr|$QiFe=*zPRq*OU!<9& zWMd-E4G=aC-oAbHsmlGn^6K_n(mCKEu|xmpqa(v)xX-siAAPU;8Vxz58-HwTR0giu zfOS`Owo)ahysj<5Rf0qyMwZsG|FIA}0*&QXPHvTpn8U(1_y29$I3+uZL>i1cyk<31 zl+2xsyDx3*V=MQw$t4%#nB?M%@sfFo$g|=v7AG@t7fU4cxndDjM1M-+V0Q<5;=Zl& zlyf_3P|uF+WoMSr|0;dUh^rPq`S3IrKCJ!-0B$izLAsj8nGD;caT}K8lM0`&uCB7u zM-N36u$X9{-k;{_RgXNfiiQuv4sXo!1<%LyK6e6dze&xcjM`eh&MZNIBgHEpuMd~m zR{VVZ$Futfz+|QniF&cH-|9dP&8O6yevbN7gEdunLttd>*v6j1^XBIJ_4H!HUH&7k z8T<6pg$p)1{hMlC8FW`w7BVSI{3;)=p=iK0kENH!8;VWw>5s+2Swlk8{EhqS{OPlo>~5R;(YknKK{gg4KpdQbhpCDdqeC`g)3Tf)l;i6OUe`p& zOycQ=>0DZ7!-SXXD!>Js$F{LO(Z328q7vU#2Kou`RKrwm7}fLt*bCb7&)hkRD=|k#*R@R2r zVE`EafLkIxyzU93C|vT-2G%HOc*HB(m^b_=fQ-j#1qmz>17{2jVxa~D&ar6F8X0h# z9BFvoTAwzqa|`+9Uw-NJ%kZ!lP7LBq!xD%(?S=Mt;a%4)(}1@l$V{_(@r%I)wot3Fd8BV61&t-t+Y0-VY8&Ea8v)W|SI>z#PVgW&|$ z)&cUbO`e{O`Xqodzbhgwx(CF*V=p98A27? z!dy_xz9{@6Np>DQSYF<@uw_fE@z+paem?bZ-^*YEnn3>Uu{V?3u?NFwl2#5>El(^% zd5#UF2lgftvdfQI)bb~f z+S1<6^Cr6k$YTelhc+oYqfFt7dObA_9o04 zO-1h1-J3}T#3#(x6xY{@)ICGG-G`mdc_u8a?oDoR+&a!e^gc5~bjhg7Vn3H|q&M9a zSlWDZv2|VuGNXQEEA_-yWF@@*w&A|sX*OOX3rR|8k8mvT$=Z7TOPyn5U8rv7&N}&` zK0#RB9i^E<9bR&QjiRC$=5vATHu7MP+|sk(jtnc(6@bCXmYbaRfhzb*8JZ3`~3rQ|ZFhb>bWoXqCZe7f&j`y+qpNYRKLIm^Bc*{mCV zr8MChSNIl!$Ac$0!uR2er)*QNtWT}BJCsD}6a-7cb5-_z7mhyAV|Q|0L3dR*haiuU zDTyhO9gYOlrrl&|`Ck#Ajlq>ehhQ@EJPfVb>CqjGoE4J(Z(3_lj>v}QeqX!4-uP&& zt}^kS)PdB1#vADNn(RBD(OegcCo=!QX+K5U4+{-(2HDGv#p!?hdsi{=qdv2Fo02H^ z$1KDI#Q1jx9#!TT4%V69kZ+&=tMjx$-y@yT+ut7T`YCFhJ7Y4~@t+|BZ|ua*`jK=jrQQ>24%on~_0koZU`rW>1mr3EBQYW334w=o2m2uioq5-;SS%RP+q{q^Z zqV?CfamNeW8G+HCc_BG4`2|y8!uZo_TM3DI_lDG`!Nt$dFHFxKoE4{Pr~FGxogFb9 z9b(=3FX+AiOpzD3MSK|BUMAnHK>kGolg2FhXBC5s{+5B4mzzA|_1FC)GkwdPrZ|m9 zoX%b!Irjc==7Nk556hPYWbKKTjmg4mcHGH;*HPJ5^^8{DKZm9!sXu)FkHIaJ1=yxW zb_Kt5inm>w0vG&(oj6nOW(ZTwix?)|D-ja;OJ!)BnP50Hu^U2*uF*WB>bZ34)Fme= zcL8%=Ik`kmny02_9;~ZdPEDEWsklUS2C*=nb(xWXIlT z?bZ;xy?@jC?8*(Tb@Xh`$<1#JN}QV#bF3fuL>jQ7GkO8~8s zC{w60&8*iun>u^NjcCTGl>J6FjBu@;Br8g~oPPX2i!NPkGU@9x8BBfV*QqHg+-fjb z!>Mssv713mEREh1s~7aTCp-SQIz_t6us(Lr$eMcKR7Jtz6%E33`zF>mYmzV|7eppk z9E`;b)|{wXQuR#OA!I^_!Y(28`AsGNjsy99Sc>e|N-{H@TbvQxrV017UsRFip^*6R zOv+XpSv0&Uv#wlO^HDSjGZ_8R>a66i*8yMnNdOYGp7kEBut>*x&5rAu$>$IF{u>{t z?b3k8fQGDIje?R*QHz2i;Jp9tG~Z!pRq3R`htxngtiex6PqwA`i%qpi;6wDA<^AH zNaxdqBxS7)sj2TDmhYav(6CXW+^{@j^&JS2o8cS$bjr~7r|P-x*G?4 z)t|9y>KLX(?YKQ%RpcpB`JHjj^5yVR*fyA*jyarurPbz2hGF>ce5?Ghq$l}L>(VW1 zB4eShD;bVaUa$U4Y7}lMywXC{5wStB5j(y}pGu#^jiA=3b_I?8+14I_3WiZ#=JnO1 z9{;3VUqt>V5pKG%WL|=>0Ho*W%zZxm8+2E$WUQCnTUVmHP<7I;D`}z=i$9(CKx?%9_NLT5?=Y5Rg^M(G^ z>~bZX4CHcMRlji;yTnnTS`w&3bnA^^M;~mV^}Gz^=?wDJeRUego}S5w;s;Tl)fuJk;5B&17iHYrvAtFzw|sO%PfwnY(|ZX&69Vs7K5#ITwTZypI7=^wG-?hL!}%gHyhKWqQ& zvv@t<(Y4_Fy%tMctV#6ks8SGBSAGKnj_qFfeO7Y!?&gHi=*Ljlm@XswXyWH500+lE z+S=d8^X26v>ddZIY`JIuN-Qa81;@V=kCjxE!Y#FCM}F(`KdDN7(m(9o!b~bPk&dVo zWlEGIl9Npp*f-sVv4UJ(Czjk2}p2pjX^ws&1QK9*{s-QbQi@i^``0U zongk22RX>8wFkjNZTRp+#G`BmU9##Rk?b7%VhZ=IVEs%uDxqDlra^9wmSK#S15b!& zg~wxMLj5Tkf&(CGxR^bQiC#p3MA7@;1AX4H|8h^Yczz{s?P6HMvdmL1`R2~@;JztK zzQuL>e^>=F4iKTkQp9dVM)>CM5@`=@&9+KI-hCqphY5=~;A27>dO=-!#-qz5X+r^_w>MH*9EV zj`ZJ^)_(;k49gN$q;T6Y-;1qs)i3;e41^a6T^e-sZ_;LaMad$dTX6Io?YfK-&4r+3 z@!EuX;uuSGuq>FYGq0<&O9adx04^h4g5i`Oc~Rg5m3c?d-YGa??`pRoEd8P=fV6VX zHM3UsBO@q<-^1Q?gz?(lJv7#};aRsjqZEv{P0TONB>6ek=n=LIz-ac~FOZ9u-X(b;H2t*BmM$YHhBDQ>t zKHlPm){Cy&S^wgT_1u!dp6UEYjC|ooHRQG8uI{cvjm|l@K^-T}mBy(XCSM$o8z49} zB!Q#jTvz#{sZ{i*CG9Y_s_WKkmPb@}nI)1&#a)FTt%0cVZb0hYsQay`oJ-0pD_>c( zabwX+z4yF~{H80WwQ$m&pZ~F8okBgMj&}}a4msnYO0jOkKYpg#*Tor3;x1)>tGlt( z7rWBUGgb}^a#?<7Gg9?VZ9_wXN_SJ2=*~LT?>B9JF6x?rd!+Zj!)tw8d|UbsV2aJi(m9@ z2735}Q#%f1edZ1FZfh<2-NBn~8IT*39gwY1NJ*dZyXNoyr8Y5=Z&Izhd!s&+ol|he zZY>A=^1gK?DrNcH8TpA$iaa-oh@@yIzFlltKT&ihJkZ1lOtDW*BY9+1H0ik14D?cv5~2V09Gfn=+c`pPOHFyWLVZBT4r1x2DwEZ#yrJ^ z{sRDpS*H@Pi>VCGbtz3&B|ZaoFzw#%;i73>}8!_{yV(CDNmlObGv5H4t z@#Mp_Sd$UFGjeB=CT_wVv+-$1> z@wZlvYh&oGo4^TI-xvv}yuVX@UiNRR6tO=4316&Y{Mg&t&V_4-BpF?Vks2T+I0;!u zsI{9VVzRch_IDRCEMWvBFxM+z9PG2wZsZ1Xo1*$MHfKD;)UopXGTIp9DC076^GQ~| zq!c=j@Or;f{@*2F@JPzzhyKHX=f|zOyY5GVw^@#f#Hkn>siNqziLCe6R^}M`rBZRu znt4BKB1@>r$=3xCZ$cumwUtdtnCwj9J>L<~p@}i2|r{-hEHX#xV3C zdP&UuhtvPXtgjDGazKEjIdW&EXKj#qqqFxmPnnBRBAwr|7Enc~mUu7cOs2tzXUf;Kn4}EWx2zfOwklUnPi>X0y4H={T0nJr zVz2K8Lihch{eL`Drt0>M!G;hxpnPW)2VwhsrjgsX&&XxYZx={E;?N!!AJ(3TaS2J1 zjmnmoa{2 z=<}02=uWx*&uI+%$=x$U<5o zY6pz0lX^6r7v+gHl$~M?1bzPlw6LLaW(FYz8dfsrX~D=dBJ;=yG~@a$1C2dIqL;WL zZ+ZGJ-X^9t7riw;{?B^!bfP)ppOvyGCQ3Ha53LfUsd>gF`7_V3JZCOIW;6fFGaTu7 zF?4%#mW(}?3$&b{lANx|Z-EeFEo;X6ZZ*c_F4c>=MmKW13&W&zmzlgbc-|;fm_0D- z^|kqmPHRX~D`z8tBuFp~$P}6zoU1ZIfrx&lEJr*uFZ`*3iuM%#N)gb*9+9R(*4FlNDV1kAi;@ z?(_lrfx1QHLExj}U7Vfk(8qR{Mo-Y@I+ZeaDOV|NZ_mx4B7$Fr40wCzIMdC)53=mG z*C(&L?=QC@4D@<}iQa5J_0f2Ru7(-sc|A@p82ST%sOTR*WR$ZkGl%9F@XqZd?t50Y zb=IuqADx=&Rf4CdDp-t~nC9_$;743T#pr6#F>0BvXnKORfFhZPxvRxay5RZN7yk5JD5! z7++@w1qfZcvh0&jdU>8@@4p|$s35@7*GeNL2(YIt#!fyRWZ9txfK#eKtqt#Y510Y= za0$1;Czf?_%xw!h0wX;~%jFEsV7fgGh~x(8e4~c(FaTtuZBPap%|OZL83&KnB5TV^ zxhL0fWs|rRnL)9iu=@m0kgB~Yq|(npm9r9#ki|DS7aW&vOhAPUxgGe8A+=7WAdnU} z_(y8nvJ!Ay$&mp~hDE&$_w+dv)_bFuX@I@#&VSlvN}>!px$zmdCOCFt zLfpGoG?jbLtgMT-_CvN==VyiT4DXKYx`XA|K8bg?eE9bZEhyM6{wa&hL@)me>Lz*e+j$~5+xz@QNgz_VYJ&UGEn0fP(u{kN=EDXA|= z54@WpXSDWfZe|-;{hEe`HAVIHMfnN>LJut_8gnVJt2jL+ic`~-buGRYkmzy<#yFF` z{4YEvID(Z_YQm4PC^q+?K8l*uOj0N{>PImG{Y%SRup}U%=@$G9KD38DBL-vo-$iY- zlB`b^SsQJOByn7Y42|ihU0*0X8)LOFs8V;R$?BL0TG=q?7pK5QkBM^1*w5I3ek0>D ziUKDv<>j+!wlpaAtKxTjo7bQ4(y=1f&ZM{B)0J#^YfIS#o`5|~THk$pzq*0mnG|o! zZTj|9e?s%*u}8;tCB1$0%cTwm+~ANq)aP%b5sQa!H_$~4jn#WcJCqaIa5IBG9OrR~ z(}rFc`O(%NBnv;%!{PXG@6MfLUiahJgJm%09iZ0a^777q-*CI6x%ogdIY2IHwi(HD zFevNa_Ro}=MZrax(YcZ7@r|X)nWs>&ws2p1ipG?f9S?}wSk{W z4h1RC{5~r4QB6^Jc-ZQ*K^pP5Ed@E1#f?#c<(oKy=!pl!pmHNAl@Nn&s(b;>%!26D^t+QEK zvt#j)DAnkzYpY1?s#Vt#^SHdNKN8)U^}pmbc<1K*vfjY1r3E_UG5xthgsxs;K?HvH z2LHCD6>AGC*H)C)xmfC`%!X_Nlu?)kC&JhPl*CGFCtdu6%?&M|t6L$sad>7;raUNm zXLxeNBavhM{m>;7pbn^x`dTVAN1&GN+L`Ap@Vn{gr|a*K^HG8<>IP3`=)Ag&pQ?1} zJ830R(jod!;~w7_5YR>5C|rqF$JO}EJ8uYCZPXO?H(bz=jW-^hLJpoVpEH5r2D+j3 zSM)^`k{y%L=;jY63949hk*L%JMx;wZ zV8!sH;yOV#^gXgFCE(cTw$=rQLQwGaVg`m&3oz$}pb}it6)Y#MZ$ut)_mM;Uan|Q; z3t938F?I0a47VRQc1Ns5n*jsVO-N8X%**d8jTL<-v zivS|WSkXii2lc_8updl2nl_R)ng*-GTE^*3`NMs#wEwmE^Z%6fr;9T>9!c_mCC@Am zR%}%g<$PM_;~9*r=WZ-Mz$MdCf{3&DfURHD6B8Yg*(XM2pZfn75Hl~|ugtet@^TmM zzh7N%N;qXt9OXC}S8E}ylW?rR8Z=;+8H4us3u;lNO8T$b5DqL%hC z^TY2x$gpiSy6bI))`YO6g$1F%ErAJcIG}W546}Mi0 zoEoDPoN?Ao{G1YUU_3HMXTCV>a;cc8@%PX+apkjMd0Jd}6DN35k@)#3hU(XBcGsp& zA_(eyEjM*V|8WvRt;$wiGR&$n+E-jIv&hlNeWAA;3PkR?ww;X(m9Ui6KP-vr|jhagjl0e(;u{$2!=rz1!tBH~>f?YQ&rbmD-AZ6fuTe>Q&gx^=#b z+sm`=$+1(IyS$QFsjlr?U;J@EZU8r-gxJTq@9Xf2`{6u5`i+Z(m)w>b<#elMh=guf8g0zF+W-JBEqeNcpd)Mmvq=OW*wL zqLebnS!o^>|H}$2xDK6xj!q<%jl{QZq9H@+`zkKO)kROGYUOlA2? zIzfJfDsJ%Br0LYUw7@jAw2x9Jr@yIY)OEb4@x^JYRkS-(suQ~xrKB;q zvEb%cNzGN~rUl59lB$y$$CK0FSs$pCjR^1iIB}@wm7cOG*B8C$Q?}V=KC$m z<%i3vK#u=EU--K*oB~f}Cjfr*ZiY|!cTfEwvh<*Js#4sXS3u{2>{A~sn$M0R72K0s zI8=ie-=(pm!l60v`mL)1?}Fk74?P)@_S0yx*Ft1}$PujNPeEhOtqs+|UoAO!paBmz z*n{$p_B$VZ?Ft_}lTexwO1rz%1oDary!i5l`)~&L!`;!B2Zfl!H~At2ul!5 zJtDgq!>XA@S&H=0GMf|VQoQ~R|2PtL>2&#Y+mF!JmkS7lqZ_pjoAU$dNwWS zO0&X7VwQs2n$}0Yk_JKk{XF_Lm2E1g- z=Y1U)uQPzwSV370dXs0>&JDEr2;vonwvYkBlul3`ii69q0_!e{e-?M>97SlbAw$}h zFYsJp(r}zPkg5@$##sP=NVtJHxpD=^`y*_VdTY?LV9LcfvSFi9HxV`3U@BCC$RK8d zW_R;e$^~E#Y`G9^+{!X>+}=dMj*K`=-QmMv8l3MaSe7-8&=_qt@VNx&WlZQ90BNV;w2nz>o8@6tD9MJe=-*!~dmG*n_gj{LQXkF8{(2#7 zl`Mu2K0vGu_IMVyTK6nM`|~X7t7%zw{45S^`BM>I`Au`Z^)XaGU3J#Q0JRO!Pk)1< zse0?JvmQFC3r*Kcd-b95dg!6H1ufiv<8{p2JL+eUybi6-Y;6tLguk^_$$0h1VylXhhE_c(^)D@3!>j9uBbt==Bc(c(rftQ_by<(>>?a QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/app/javascript/styles/mastodon-material-dev.scss b/app/javascript/styles/mastodon-material-dev.scss new file mode 100644 index 000000000..9cc10708d --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev.scss @@ -0,0 +1,15 @@ +@charset "UTF-8"; + +@import 'mastodon-material-dev/account'; +@import 'mastodon-material-dev/basics'; +@import 'mastodon-material-dev/button'; +// @import 'mastodon-material-dev/cards'; +@import 'mastodon-material-dev/columns'; +@import 'mastodon-material-dev/components'; +@import 'mastodon-material-dev/config'; +@import 'mastodon-material-dev/control'; +@import 'mastodon-material-dev/emoji-picker'; +@import 'mastodon-material-dev/icons'; +@import 'mastodon-material-dev/material-icons'; +@import 'mastodon-material-dev/media'; +@import 'mastodon-material-dev/statuses'; \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/_mixins.scss b/app/javascript/styles/mastodon-material-dev/_mixins.scss new file mode 100644 index 000000000..798e690e7 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/_mixins.scss @@ -0,0 +1,23 @@ +@charset "UTF-8"; + + +$shadow-color-1: rgba(0,0,0,.2); +$shadow-color-2: rgba(0,0,0,.14); +$shadow-color-3: rgba(0,0,0,.12); + +@mixin shadow-1dp { box-shadow: 0 2px 1px -1px $shadow-color-1, 0 1px 1px 0 $shadow-color-2, 0 1px 3px 0 $shadow-color-3 } +@mixin shadow-2dp { box-shadow: 0 3px 1px -2px $shadow-color-1, 0 2px 2px 0 $shadow-color-2, 0 1px 5px 0 $shadow-color-3 } +@mixin shadow-3dp { box-shadow: 0 3px 3px -2px $shadow-color-1, 0 3px 4px 0 $shadow-color-2, 0 1px 8px 0 $shadow-color-3 } +@mixin shadow-4dp { box-shadow: 0 2px 4px -1px $shadow-color-1, 0 4px 5px 0 $shadow-color-2, 0 1px 10px 0 $shadow-color-3 } +@mixin shadow-5dp { box-shadow: 0 3px 5px -1px $shadow-color-1, 0 5px 8px 0 $shadow-color-2, 0 1px 14px 0 $shadow-color-3 } +@mixin shadow-6dp { box-shadow: 0 3px 5px -1px $shadow-color-1, 0 6px 10px 0 $shadow-color-2, 0 1px 18px 0 $shadow-color-3 } +@mixin shadow-7dp { box-shadow: 0 4px 5px -2px $shadow-color-1, 0 7px 10px 1px $shadow-color-2, 0 2px 16px 1px $shadow-color-3 } +@mixin shadow-8dp { box-shadow: 0 5px 5px -3px $shadow-color-1, 0 8px 10px 1px $shadow-color-2, 0 3px 14px 2px $shadow-color-3 } +@mixin shadow-9dp { box-shadow: 0 5px 6px -3px $shadow-color-1, 0 9px 12px 1px $shadow-color-2, 0 3px 16px 2px $shadow-color-3 } +@mixin shadow-10dp { box-shadow: 0 6px 6px -3px $shadow-color-1, 0 10px 14px 1px $shadow-color-2, 0 4px 18px 3px $shadow-color-3 } +@mixin shadow-11dp { box-shadow: 0 6px 7px -4px $shadow-color-1, 0 11px 15px 1px $shadow-color-2, 0 4px 20px 3px $shadow-color-3 } +@mixin shadow-12dp { box-shadow: 0 7px 8px -4px $shadow-color-1, 0 12px 17px 2px $shadow-color-2, 0 5px 22px 4px $shadow-color-3 } +@mixin shadow-13dp { box-shadow: 0 7px 8px -4px $shadow-color-1, 0 13px 19px 2px $shadow-color-2, 0 5px 24px 4px $shadow-color-3 } +@mixin shadow-14dp { box-shadow: 0 7px 9px -4px $shadow-color-1, 0 14px 21px 2px $shadow-color-2, 0 5px 26px 4px $shadow-color-3 } +@mixin shadow-15dp { box-shadow: 0 8px 9px -5px $shadow-color-1, 0 15px 22px 2px $shadow-color-2, 0 6px 28px 5px $shadow-color-3 } +@mixin shadow-16dp { box-shadow: 0 8px 10px -5px $shadow-color-1, 0 16px 24px 2px $shadow-color-2, 0 6px 30px 5px $shadow-color-3 } diff --git a/app/javascript/styles/mastodon-material-dev/account.scss b/app/javascript/styles/mastodon-material-dev/account.scss new file mode 100644 index 000000000..46203b7e4 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/account.scss @@ -0,0 +1,127 @@ +@charset "UTF-8"; +@import 'config'; +@import 'mixins'; + +.account { + border-bottom: 1px solid $border-color; + + .account__display-name, + .account__display-name strong { color: $secondary-text-color } + + &__header { + &__bar { + background: $card-background-color; + padding: 8px; + border-bottom: 1px solid $border-color; + + .avatar .account__avatar { border: none } + } + + &__tabs { + padding: 8px; + + &__name { + padding: 8px; + + h1 { + color: $primary-text-color; + + small { color: $secondary-text-color } + } + } + + &__buttons { + .icon-button { + border: none; + border-radius: 50%; + padding: 0; + } + } + } + + &__extra { + margin-top: 0; + + &__links { + color: $secondary-text-color; + padding: 10px 0; + + a { + color: $secondary-text-color; + padding: 4px 12px; + + strong { color: $ui-text-color } + } + } + } + + &__bio { + margin: 0; + + .account__header { + &__content { + color: $primary-text-color; + padding: 8px; + } + + &__fields { + border: 1px solid $border-color; + border-radius: 4px; + + .verified { + border: none; + background: $verified-background-color; + + a, + &__mark { color: $primary-text-color } + } + + dl { + border-bottom: 1px solid $border-color; + + &:first-child .verified { border-radius: 0 } + + &:last-child { border-bottom: 0 } + } + + dt { + color: $primary-text-color; + background: $list-background-inactive-color; + } + + dd { color: $primary-text-color } + } + } + } + } + + &__section-headline { + background: $card-background-color; + border-bottom: 1px solid $border-color; + + a { + padding: 16px 0; + color: $secondary-text-color; + + &.active { + color: $tab-indicator-color; + border-bottom: 4px solid $tab-indicator-color; + + &:before, + &:after { border: none } + + &:focus { background: $tab-indicator-background-focus-color } + } + + &:hover { background: $tab-indicator-background-hover-color } + } + } +} + +.account-role { + padding: 4px 8px; + border-radius: 17px; + color: $ui-text-color; + background-color: $outlined-chip-color; + border: 1px solid $border-color; +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/basics.scss b/app/javascript/styles/mastodon-material-dev/basics.scss new file mode 100644 index 000000000..fd5abf7a8 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/basics.scss @@ -0,0 +1,20 @@ +@charset "UTF-8"; +@import 'config'; + + +body { + background: $background-color; +} + +::-webkit-scrollbar-thumb { + background: $scroll-bar-thumb-color; + + &:hover { background: $scroll-bar-thumb-hover-color } + &:active { background: $scroll-bar-thumb-active-color } +} + +::-webkit-scrollbar-track, +::-webkit-scrollbar-track:hover, +::-webkit-scrollbar-track:active { + background: transparent !important; +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/button.scss b/app/javascript/styles/mastodon-material-dev/button.scss new file mode 100644 index 000000000..b1a0b99a3 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/button.scss @@ -0,0 +1,59 @@ +@charset "UTF-8"; +@import 'config'; +@import 'mixins'; + +.icon-button { + color: $icon-button-color; + border-radius: 50%; + + &.active { color: $icon-button-active-color } + + &.disabled { color: $disabled-icon-color } + + &.inverted { + &:hover { + color: $icon-button-hover-color; + background-color: $icon-background-hover-color; + } + } + + &:hover { + color: $icon-button-hover-color; + background-color: $icon-background-hover-color; + } + + &:active, + &:focus { background-color: transparent } +} + +.text-icon-button { + color: $icon-button-color; + border-radius: 50%; + font-size: 12px; + + &:hover { + background-color: $icon-background-hover-color; + } +} + +.button, +.button:active, +.button:focus { + background-color: $contained-button-color; + border-radius: $button-radius; +} + +.button:hover { + @include shadow-2dp; + background-color: $contained-button-hover-color; +} + +.button.logo-button { + background: $contained-button-color; + + &:hover { background: $contained-button-hover-color } + + .button--destructive:hover { background: $contained-button-hover-color } +} + +.button.button--block { margin: 8px 0 } \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/cards.scss b/app/javascript/styles/mastodon-material-dev/cards.scss new file mode 100644 index 000000000..08778d7a8 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/cards.scss @@ -0,0 +1 @@ +{\rtf1} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/color/dark.scss b/app/javascript/styles/mastodon-material-dev/color/dark.scss new file mode 100644 index 000000000..75759126a --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/color/dark.scss @@ -0,0 +1,30 @@ +@charset "UTF-8"; + + +// Base color +$primary-color: #db4437; +$secondary-color: #ffffff; +$error-color: #d50000; + +// Text color +$ui-text-color: #ffffff; +$secondary-text-color: #80868b; +$info-text-color: #5e5e5e; +$tips-text-color: #ffffff; +$disabled-text-color: #ffffff; +$inverted-text-color: #ffffff; +$link-text-color: #4285f4; + +// Background-color +$background-color: #121212; + +// Icon color +$icon-color: #757575; + +// Button color +$icon-button-color: #757575; +$contained-button-color: #4285f4; + +// Derived color +$top-bar-color: lighten($background-color, 10%); +$search-bar-color: lighten($background-color, 20%); \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/color/light.scss b/app/javascript/styles/mastodon-material-dev/color/light.scss new file mode 100644 index 000000000..c2c47545a --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/color/light.scss @@ -0,0 +1,93 @@ +@charset "UTF-8"; + + +// Base color +$primary-color: #4285f4; +$secondary-color: #db4437; +$error-color: #B00020; +$verified-color: #4caf50; + +// Text color +$ui-text-color: #202124; +$ui-inverted-text-color: #ffffff; +$primary-text-color: #000000; +$secondary-text-color: #5f6368; +$section-text-color: $primary-color; +$info-text-color: #5e5e5e; +$tips-text-color: #c0c0c0; +$disabled-text-color: rgba(0,0,0,.54); +$link-text-color: #4285f4; + +// Background-color +$background-color: #ffffff; +$menu-background-color: $background-color; +$menu-background-hover-color: darken($background-color, 6%); +$menu-background-active-color: darken($background-color, 10%); +$card-background-color: $background-color; +$card-background-inactive-color: darken($card-background-color, 6%); +$list-background-color: $background-color; +$list-background-inactive-color: darken($list-background-color, 6%); +$verified-background-color: lighten($verified-color, 20%); + +// Chip color +$contained-chip-color: #e0e0e0; +$contained-chip-hover-color: darken($contained-chip-color, 6%); +$contained-chip-selected-color: darken($contained-chip-color, 12%); +$outlined-chip-color: #ffffff; +$outlined-chip-hover-color: darken($outlined-chip-color, 6%); +$outlined-chip-selected-color: darken($outlined-chip-color, 12%); + +// Badge color +$badge-color: $primary-color; +//$badge-color: $secondary-color; + +// Icon color +$icon-color: #757575; +$icon-hover-color: darken($icon-color, 30%); +$icon-background-hover-color: darken($background-color, 4%); +$icon-background-active-color: darken($background-color, 8%); +$disabled-icon-color: lighten($icon-color, 16%); +$top-bar-icon-color: $icon-color; +$media-icon-color: transparentize(#ffffff, 0.4); +$media-icon-hover-color: transparentize(#ffffff, 0.2); +$media-icon-background-color: transparentize(#000000, 0.5); +$control-border-color: $icon-color; + +// Button color +$icon-button-color: $icon-color; +$icon-button-hover-color: $icon-hover-color; +$icon-button-active-color: $primary-color; +$contained-button-color: $primary-color; +$contained-button-hover-color: lighten($contained-button-color, 10%); +$outlined-button-color: $primary-color; +$outlined-button-hover-color: lighten($primary-color, 36%); +$outlined-button-active-color: lighten($primary-color, 30%); +$text-button-color: $primary-color; +$text-button-hover-color: lighten($text-button-color, 36%); +$text-button-focus-color: lighten($text-button-color, 30%); + +// Toggle color +$toggle-thumb-color: #ffffff; +$toggle-track-color: $disabled-icon-color; +$toggle-thumb-active-color: $primary-color; +$toggle-track-active-color: lighten($primary-color, 26%); + +// Border color +$border-color: #dadce0; +$border-active-color: darken($border-color, 30%); + +// Scroll bar color +$scroll-bar-thumb-color: darken($background-color, 20%); +$scroll-bar-thumb-hover-color: darken($background-color, 30%); +$scroll-bar-thumb-active-color: darken($background-color, 38%); + +// App bar color +$top-bar-color: $background-color; +$top-bar-hover-color: $icon-background-hover-color; +$search-bar-color: darken($background-color, 6%); +$search-bar-focus-color: $background-color; + +// Tab color +$tab-indicator-color: $primary-color; +$tab-indicator-background-hover-color: lighten($tab-indicator-color, 36%); +$tab-indicator-background-focus-color: lighten($tab-indicator-color, 30%); \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/columns.scss b/app/javascript/styles/mastodon-material-dev/columns.scss new file mode 100644 index 000000000..796382d31 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/columns.scss @@ -0,0 +1,351 @@ +@charset "UTF-8"; +@import 'config'; +@import 'mixins'; + +.column { + @include shadow-1dp; + padding: 0; + margin: 10px 8px; + border-radius: $card-radius; + + &>.scrollable { background: $list-background-color } + + &:last-child { box-shadow: none } +} + +.column-header { + background: $top-bar-color; + border-radius: $bar-radius; + + > button { + padding: 16px 0 16px 16px; + color: $ui-text-color; + } + + &.active { + .column-header__icon { + color: $primary-color; + text-shadow: none; + } + } + + &__icon { + margin-right: 16px; + color: $top-bar-icon-color; + font-size: 20px; + } + + &__buttons { height: 56px } + + &__button { + background: $top-bar-color; + color: $icon-button-color; + margin: 8px 10px; + padding: 10px 12px; + border-radius: 50%; + + &.active { + color: $icon-button-active-color; + background: $icon-background-active-color; + + &:hover { + color: $icon-button-active-color; + background: $icon-background-hover-color; + } + } + + &:hover { + color: $icon-button-hover-color; + background: $icon-background-hover-color; + } + } + + &__setting-btn { + color: $icon-button-color; + + &:hover { + color: $icon-button-hover-color; + background: $icon-background-hover-color; + } + } + + &__setting-arrows { font-size: 16px } + + &__wrapper { + @include shadow-4dp; + border-radius: $bar-radius; + + .announcements { border-top: 1px solid $border-color } + + &.active { + @include shadow-4dp; + + &:before { background: transparent } + } + } + + &__collapsible { + color: $ui-text-color; + border-top: 1px solid $border-color; + + &-inner { + background: $top-bar-color; + padding: 16px; + } + } + + &__back-button { + background: $top-bar-color; + color: $icon-color; + padding: 8px; + margin: auto 0; + border-radius: 50%; + + span { display: none } + } +} + +.column-subheading { + color: $section-text-color; + background: $menu-background-color; + padding: 12px 16px; + border-top: 1px solid $border-color; +} + +.column-link { + color: $ui-text-color; + background: $menu-background-color; + padding: 16px; + border-radius: $nav-drawer-item-radius; + + &:hover { background: $menu-background-hover-color } + + &:active, + &:focus { background: $menu-background-active-color } + + &__icon { + margin-right: 32px; + font-size: 20px; + } +} + +.column-settings { + &__section { + color: $section-text-color; + margin-bottom: 0; + margin-top: 8px; + } +} + +.column-back-button { + @include shadow-4dp; + background: $top-bar-color; + color: $icon-color; + padding: 16px; +} + +.column-inline-form { + padding: 16px 0 16px 16px; + background: $card-background-color; + + .icon-button { margin: 0 16px } +} + +.setting-text { + color: $primary-text-color; + background: $search-bar-color; + border-radius: $bar-radius; + + &::placeholder { color: $tips-text-color } + + &:focus { + @include shadow-1dp; + background: $search-bar-focus-color; + } +} + +.empty-column-indicator { + color: $secondary-text-color; + background: $card-background-color; + font-size: 16px; +} + +.conversation { + border-bottom: 1px solid $border-color; + padding: 12px; + background: $list-background-inactive-color; + + &--unread { + background: $list-background-color; + + .conversation__content__relative-time { color: $info-text-color } + } + + &__unread { background: $primary-color } + + &__avatar { padding: 0 16px 0 0 } + + &__content { + padding: 0; + + &__relative-time { + font-size: 14px; + color: $info-text-color; + } + + &__names, + &__names a { + color: $primary-text-color; + font-size: 16px; + } + } +} + +.muted { + .status__content { + color: $primary-text-color; + + p { color: $primary-text-color } + + a { color: $secondary-text-color } + } +} + +.load-gap { border-bottom: 1px solid $border-color } + +.load-more { + color: $icon-color; + padding: 16px; + + &:hover { background: $menu-background-hover-color } +} + +.getting-started { + background: $background-color; + color: $ui-text-color; + + &__wrapper { + background: $background-color; + height: auto !important; + border-bottom: 1px solid $border-color; + } + + &__footer { + padding: 16px; + + p { + color: $secondary-text-color; + font-size: 12px; + margin-bottom: 16px; + } + + a { color: $ui-text-color } + + p a { color: $link-text-color } + + } +} + +.setting-toggle { + &__label { + color: $ui-text-color; + margin: 8px 8px 8px 14px; + } +} + +.announcements { + background: $background-color; + padding: 0; + + &__container { color: $primary-text-color } + + &__item { + padding: 16px; + font-size: 16px; + + &__unread { background: $badge-color } + } +} + +.reactions-bar { + .emoji-button { + color: $icon-button-color; + font-size: 20px; + + &:hover { color: $icon-button-hover-color } + + &:active { color: $icon-button-active-color } + } + + &__item { + background: $contained-chip-color; + border-radius: 17px; + margin: 2px 4px; + + &.active { + background-color: $contained-chip-selected-color; + .reactions-bar__item__count { color: $ui-text-color } + } + + &__emoji { + width: 24px; + height: 24px; + margin: 4px 0 4px 2px; + } + + &__count { + font-size: 16px; + margin: 0 8px; + color: $secondary-text-color; + } + + &:hover { background: $contained-chip-hover-color } + } +} + +.notification { + &__filter-bar { + background: $top-bar-color; + border-bottom: 1px solid $border-color; + + button { + background: $top-bar-color; + color: $secondary-text-color; + font-size: 16px; + + span { font-size: 14px } + + &.active { + color: $tab-indicator-color; + border-bottom: 4px solid $tab-indicator-color; + + &:before, + &:after { border: none } + + &:focus { background: $tab-indicator-background-focus-color } + } + + &:hover { background: $tab-indicator-background-hover-color } + } + } + + &__message { + color: $secondary-text-color; + margin: 0 16px 0 70px; + font-size: 16px; + } + + &__display-name:hover { color: inherit } +} + +div.notification.notification-favourite.focusable, +div.notification.notification-follow.focusable { background: $list-background-inactive-color } + +.notification-favourite .status.status-direct { background: transparent } + +.relationship-tag { + color: $ui-inverted-text-color; + background-color: $media-icon-background-color; + font-size: 12px; + border-radius: 17px; +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/components.scss b/app/javascript/styles/mastodon-material-dev/components.scss new file mode 100644 index 000000000..e2a0d6af8 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/components.scss @@ -0,0 +1,329 @@ +@charset "UTF-8"; +@import 'config'; +@import 'mixins'; + + +.drawer { + &__header { + @include shadow-4dp; + background: $top-bar-color; + border-radius: $bar-radius; + justify-content: space-around; + + a { transition: none } + + a:hover { + background: $top-bar-hover-color; + border-radius: 50%; + } + } + + &__tab { + color: $top-bar-icon-color; + font-size: 20px; + margin: 12px auto 12px; + padding: 8px; + flex: none; + height: 16px; + + &:hover { color: $icon-button-hover-color } + } + + &__pager { + @include shadow-1dp; + border-radius: $card-radius; + } + + &__inner { + background: $background-color; + + &.darker { background: $card-background-color } + + &__mastodon { + background: $background-color + } + } +} + +.search { + &__input { + background: $search-bar-color; + color: $tips-text-color; + border-radius: $bar-radius; + padding: 12px 12px 12px 40px; + + &:focus { + @include shadow-2dp; + background: $search-bar-focus-color; + color: $ui-text-color; + } + + &::placeholder { color: $tips-text-color } + } + + &__icon { + .fa { + color: $icon-color; + font-size: 20px; + top: 12px; + right: unset; + left: 12px; + height: 6px; + transition: none; + + &.active { opacity: 1 } + + &-search { + transform: none; + opacity: 1; + } + &-times-circle.active { + right: 10px; + left: unset; + transform: none; + } + } + } +} + +.search-popout { + @include shadow-2dp; + background: $search-bar-focus-color; + border-radius: 0px $bar-radius; + border-top: 1px solid $border-color; + margin-top: 0; + color: $tips-text-color; + + h4 { + color: $secondary-text-color; + } + + em { + color: $ui-text-color; + } +} + +.search-results { + &__header { + color: $secondary-text-color; + background-color: $card-background-color; + padding: 16px; + + .fa { margin-right: 8px } + } + + &__section { + h5 { + background: $card-background-color; + border-bottom: 1px solid $border-color; + padding: 16px; + color: $section-text-color; + + .fa { margin-right: 8px } + } + } +} + +.account__avatar { + border-radius: $avater-radius; + width: 40px; + height: 40px; +} + +.navigation-bar { + color: $secondary-text-color; + + strong { + color: $ui-text-color; + } +} + +.dropdown-menu { + @include shadow-8dp; + background: $menu-background-color; + padding: 8px 0; + border-radius: $menu-radius; + + &__arrow { visibility: hidden } + + &__item a { + font-size: 14px; + padding: 9px 16px; + background: $menu-background-color; + color: $ui-text-color; + + &:hover, &:active { + background: $menu-background-hover-color; + color: $ui-text-color; + } + } + + &__separator { + margin: 8px 0; + border-bottom: 1px solid $border-color; + } +} + +.compose-form { + .autosuggest-textarea__textarea { + background: $background-color; + color: $ui-text-color; + } + + .compose-form { + &__warning { + @include shadow-1dp; + color: $secondary-text-color; + background: $card-background-color; + padding: 16px; + + a { color: $link-text-color } + } + + &__modifiers { + background: $background-color; + color: $tips-text-color; + } + + &__buttons-wrapper { + background: $background-color; + color: $tips-text-color; + } + + &__poll-wrapper { + border-top: 1px solid $border-color; + + ul { padding: 12px } + + select { + color: $ui-text-color; + background-color: $background-color; + border: 0; + + &:focus { border-color: $border-active-color } + } + + .button.button-secondary { + box-shadow: none; + color: $outlined-button-color; + border-color: $outlined-button-color; + + &:hover { background-color: $outlined-button-hover-color } + + &:active { background-color: $outlined-button-active-color } + + &:focus { background-color: $outlined-button-color } + + + } + } + + &__utilBtns { padding-top: 0 } + + &__publish .compose-form__publish-button-wrapper { box-shadow: none } + } +} + +.poll__input { + border: 2px solid $control-border-color; + width: 20px; + height: 20px; + flex: 0 0 20px; +} + +.poll__text input[type=text] { + color: $ui-text-color; + background: $background-color; + border: 1px solid $border-color; + padding: 8px 12px; + + &:focus { border-color: $border-active-color } +} + +.privacy-dropdown { + &.active .privacy-dropdown__value.active { + background: $icon-background-hover-color; + border-radius: 50%; + box-shadow: none; + + .icon-button { color: $icon-button-active-color } + } + + &__dropdown { + @include shadow-8dp; + background: $menu-background-color; + border-radius: $dialog-radius; + } + + &__option { + color: $icon-color; + padding: 8px 16px; + + &__icon { + font-size: 20px; + margin-right: 12px; + } + + &__content { + color: $secondary-text-color; + + strong { color: $ui-text-color } + } + + &.active { + background: $menu-background-active-color; + color: $icon-hover-color; + + .privacy-dropdown__option__content { + color: $secondary-text-color; + + strong { color: $ui-text-color } + } + + &:hover { + background: $menu-background-active-color; + + .privacy-dropdown__option__content { + color: $secondary-text-color; + + strong { color: $ui-text-color } + } + } + } + + &:hover { + background: $menu-background-hover-color; + color: $icon-hover-color; + + .privacy-dropdown__option__content { + color: $secondary-text-color; + + strong { color: $ui-text-color } + } + } + } +} + +.character-counter { + color: $secondary-text-color; +} + +.reply-indicator { + @include shadow-1dp; + border-radius: $card-radius; + background: $card-background-color; + padding: 16px; + + &__header { margin-bottom: 4px } + + &__display { + &-name { + color: $primary-text-color; + padding-right: 24px; + } + + &-avatar { margin-right: 8px } + } + + &__content { color: $primary-text-color } +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/config.scss b/app/javascript/styles/mastodon-material-dev/config.scss new file mode 100644 index 000000000..e733bc8af --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/config.scss @@ -0,0 +1,21 @@ +@charset "UTF-8"; + + +// Color scheme +@import 'color/light'; + + +// Profile +@import 'profile/material-v1'; + + +// Material Design Icon settings +// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in .../fonts folder and configure below. +@font-face { + font-family: "Material Icons"; + src: + local("Material Icons"), + //url("https://raw.githubusercontent.com/google/material-design-icons/master/iconfont/MaterialIcons-Regular.woff2"); // GitHub + //url("https://fonts.gstatic.com/s/materialicons/v50/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2"); // Google Fonts + url("../fonts/MaterialIcons-Regular.woff2"); // Self-hosting +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/control.scss b/app/javascript/styles/mastodon-material-dev/control.scss new file mode 100644 index 000000000..9048d1228 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/control.scss @@ -0,0 +1,59 @@ +@charset "UTF-8"; +@import 'config'; +@import 'mixins'; + + +.react-toggle { + width: 36px; + height: 16px; + border-radius: 15px; + + &-track { + background-color: $disabled-icon-color; + margin: 4px; + width: 36px; + height: 16px; + + &-check { visibility: hidden } + &-x { visibility: hidden } + } + + &-thumb { + @include shadow-1dp; + width: 20px; + height: 20px; + border: 0; + background-color: $toggle-thumb-color; + } + + &--checked { + .react-toggle{ + &-track { background-color: $toggle-track-active-color } + + &-thumb { + background-color: $toggle-thumb-active-color; + left: 24px; + } + } + + &:hover:not(.react-toggle--disabled) .react-toggle-track { background-color: $toggle-track-active-color !important } + + } + + &:hover:not(.react-toggle--disabled) .react-toggle-track { background-color: $toggle-track-color } +} + +.radio-button { + padding: 8px 0; + + &__input { + border: 2px solid $border-color; + + &.checked { + border-color: $icon-button-active-color; + background: $icon-button-active-color; + padding: 3px; + background-clip: content-box; + } + } +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/emoji-picker.scss b/app/javascript/styles/mastodon-material-dev/emoji-picker.scss new file mode 100644 index 000000000..d5eada557 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/emoji-picker.scss @@ -0,0 +1,88 @@ +@charset "UTF-8"; +@import 'config'; +@import 'mixins'; + +.emoji-picker-dropdown { + &__menu { + @include shadow-8dp; + background: $menu-background-color; + border-radius: $menu-radius; + } + + &__modifiers__menu { + @include shadow-8dp; + background: $menu-background-color; + border-radius: $menu-radius; + + button { + padding: 8px; + } + } +} + +.emoji-mart { + width: 388px !important; + font-size: 14px; + color: $ui-text-color; + + &-bar { + border: 0 solid $border-color; + + &:first-child { + background: $menu-background-color; + } + } + + &-anchors { + color: $icon-button-color; + padding: 0; + } + + &-anchor { + padding: 10px 4px; + + &-selected { + color: $icon-button-active-color; + } + + &-bar { + background-color: $tab-indicator-color; + } + + &:hover { + color: $icon-button-hover-color; + } + } + + &-search { + background: $menu-background-color; + + input { + outline: none; + padding: 8px; + background: $search-bar-color; + color: $ui-text-color; + border: 0; + border-radius: $bar-radius; + + &:focus { + @include shadow-2dp; + background: $search-bar-focus-color; + } + } + } + + &-scroll { + padding: 0 8px 8px; + background: $menu-background-color; + } + + &-category-label span { + padding: 4px 6px; + background: $menu-background-color; + } + + &-emoji:hover:before { + background-color: $icon-background-hover-color; + } +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/icons.scss b/app/javascript/styles/mastodon-material-dev/icons.scss new file mode 100644 index 000000000..d4cc4ebff --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/icons.scss @@ -0,0 +1,36 @@ +@charset "UTF-8"; +@import 'config'; +@import 'mixins'; + +.fa.fa-users.column-link, +.fa.fa-globe.column-link, +.fa.fa-address-book.column-link, +.fa.fa-bullhorn.column-link, +.fa.fa-envelope.column-link, +.fa.fa-bookmark.column-link, +.fa.fa-star.column-link, +.fa.fa-list-ul.column-link { + &__icon.fa-fw { color: $icon-color } +} + + +.fa { vertical-align: sub } //マテリアルアイコンを文字の高さにそろえる + +.fa.fa-times, +.fa.fa-eraser { vertical-align: middle } //↑の例外 + +.fa.fa-lock { text-transform: none } + +.fa-fw { width: 16px } + +.fa.fa-chevron-left.column-back-button__icon.fa-fw { + font-size: 20px; + margin-right: 16px; +} + +.icon-with-badge__badge { + background: $badge-color; + border: none; + padding: 2px 6px; + border-radius: 12px; +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/material-icons.scss b/app/javascript/styles/mastodon-material-dev/material-icons.scss new file mode 100644 index 000000000..d7c8fcbd7 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/material-icons.scss @@ -0,0 +1,88 @@ +@charset "UTF-8"; +@import 'config'; + + +.fa { + &.fa-bars, + &.fa-navicon, + &.fa-reorder, + &.fa-globe, + &.fa-cog, + &.fa-cogs, + &.fa-gears, + &.fa-sign-out, + &.fa-search, + &.fa-times, + &.fa-times-circle, + &.fa-close, + &.fa-remove, + &.fa-chevron-down, + &.fa-ellipsis-v, + &.fa-paperclip, + &.fa-tasks, + &.fa-plus, + &.fa-unlock, + &.fa-lock, + &.fa-envelope, + &.fa-home, + &.fa-bullhorn, + &.fa-sliders, + &.fa-chevron-left, + &.fa-chevron-right, + &.fa-reply, + &.fa-reply-all, + &.fa-star, + &.fa-bookmark, + &.fa-ellipsis-h, + &.fa-bell, + &.fa-eraser, + &.fa-users, + &.fa-file-text, + &.fa-user-plus, + &.fa-address-book, + &.fa-list, + &.fa-list-ul, + &.fa-eye, + &.fa-eye-slash, + &.fa-pencil, + &.fa-trash { + font-family: "Material Icons"; + } +} + +.fa { + &.fa-bars:before, &.fa-navicon:before,&.fa-reorder:before { content: "menu" } + &.fa-globe:before { content: "public" } + &.fa-cog:before, &.fa-cogs:before, &.fa-gears:before { content: "settings" } + &.fa-sign-out:before { content: "exit_to_app" } + &.fa-search:before { content: "search" } + &.fa-times:before, &.fa-times-circle:before, &.fa-close:before, &.fa-remove:before { content: "close" } + &.fa-chevron-down:before, &.fa-ellipsis-v:before { content: "more_vert" } + &.fa-paperclip:before { content: "attach_file" } + &.fa-tasks:before { content: "poll" } + &.fa-plus:before { content: "add" } + &.fa-unlock:before { content: "lock_open" } + &.fa-lock:before { content: "lock" } + &.fa-envelope:before { content: "mail" } + &.fa-home:before { content: "home" } + &.fa-bullhorn:before { content: "announcement" } + &.fa-sliders:before { content: "tune" } + &.fa-chevron-left:before { content: "arrow_back" } + &.fa-chevron-right:before { content: "arrow_forward" } + &.fa-reply:before { content: "reply" } + &.fa-reply-all:before { content: "reply_all" } + &.fa-bookmark:before { content: "bookmark" } + &.fa-ellipsis-h:before { content: "more_horiz" } + &.fa-bell:before { content: "notifications" } + &.fa-eraser:before { content: "clear_all" } + &.fa-users:before { content: "people" } + &.fa-file-text:before { content: "web" } + &.fa-user-plus:before { content: "person_add" } + &.fa-address-book:before { content: "explore" } + &.fa-list:before { content: "list" } + &.fa-list-ul:before { content: "list" } + &.fa-eye:before { content: "visibility" } + &.fa-eye-slash:before { content : "visibility_off" } + &.fa-pencil:before { content: "create" } + &.fa-trash:before { content: "delete" } +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/media.scss b/app/javascript/styles/mastodon-material-dev/media.scss new file mode 100644 index 000000000..14b43d4ea --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/media.scss @@ -0,0 +1,17 @@ +@charset "UTF-8"; +@import 'config'; +@import 'mixins'; + + +.media-gallery { border-radius: $card-radius } + +.icon-button.overlayed { + border-radius: 50%; + background: $media-icon-background-color; + color: $media-icon-color; + + &:hover { + background: $media-icon-background-color; + color: $media-icon-hover-color; + } +} \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/mobile.scss b/app/javascript/styles/mastodon-material-dev/mobile.scss new file mode 100644 index 000000000..e69de29bb diff --git a/app/javascript/styles/mastodon-material-dev/profile/material-v1.scss b/app/javascript/styles/mastodon-material-dev/profile/material-v1.scss new file mode 100644 index 000000000..b18ec1b72 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/profile/material-v1.scss @@ -0,0 +1,52 @@ +@charset "UTF-8"; +@import '../mixins'; + + +// Bar radius settings +$bar-radius: 2px; + + +// Button radius settings +$button-radius: 2px; + + +// Card radius settings +$card-radius: 2px; + + +// Dialog radius settings +$dialog-radius: 2px; + + +// Menu radius settings +$menu-radius: 2px; + + +// Navigation drawer item settings +$nav-drawer-item-radius: 0; + + +// Avater cropping settings +$avater-radius: 50%; // Rounded cropping +//$avater-radius: 2px // Material v1 square + + +// Favorite icon settings +.fa { + &.fa-star:before { content: "star" } // Star + //&.fa-star:before { content: "favorite" } // Heart + //&.fa-star:before { content: "plus_one" } // +1 +} + +.star-icon.active, +.notification__favourite-icon-wrapper .star-icon { + color: #ffd600; // Star + //color: #ff4081; // Heart + //color: #db4437; // +1 +} + + +// Button shadow +// If you want to use material v2 styled non-shadow button, please comment out this section. +.button, +.compose-form .compose-form__publish-button-wrapper { @include shadow-2dp } \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/profile/material-v2.scss b/app/javascript/styles/mastodon-material-dev/profile/material-v2.scss new file mode 100644 index 000000000..3e19b60e4 --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/profile/material-v2.scss @@ -0,0 +1,66 @@ +@charset "UTF-8"; +@import '../mixins'; + + +// Bar radius settings +$bar-radius: 8px; + + +// Button radius settings +$button-radius: 8px; + + +// Card radius settings +$card-radius: 8px; + + +// Dialog radius settings +$dialog-radius: 8px; + + +// Menu radius settings +$menu-radius: 8px; + + +// Navigation drawer item settings +$nav-drawer-item-radius: 8px; // corner rounded +//$nav-drawer-item-radius: 32px; // full rounded +//$nav-drawer-item-radius: 32px 0 0 32px; // left rounded + + +// Avater cropping settings +$avater-radius: 50%; // Rounded cropping +//$avater-radius: 8px // Material v2 square + + +// Favorite icon settings +.fa { + &.fa-star:before { content: "star" } // Star + //&.fa-star:before { content: "favorite" } // Heart + //&.fa-star:before { content: "plus_one" } // +1 +} + +.star-icon.active, +.notification__favourite-icon-wrapper .star-icon { + color: #ffd600; // Star + //color: #ff4081; // Heart + //color: #db4437; // +1 +} + + +// Chip settings +// If you want to use contained-chip, please comment out below. +.reactions-bar__item { + background: $outlined-chip-color !important; + border: 1px solid $border-color !important; + + &.active { background-color: $outlined-chip-selected-color !important } + + &:hover { background: $outlined-chip-hover-color !important } +} + + +// Button shadow +// If you want to use material v2 styled non-shadow button, please comment out this section. +.button, +.compose-form .compose-form__publish-button-wrapper { @include shadow-2dp } \ No newline at end of file diff --git a/app/javascript/styles/mastodon-material-dev/statuses.scss b/app/javascript/styles/mastodon-material-dev/statuses.scss new file mode 100644 index 000000000..5f1da722f --- /dev/null +++ b/app/javascript/styles/mastodon-material-dev/statuses.scss @@ -0,0 +1,135 @@ +@charset "UTF-8"; +@import 'config'; +@import 'mixins'; + + +.status { + padding: 12px 12px 12px 70px; + border-bottom: 1px solid $border-color; + + &__expand { width: 70px } + + &__info { font-size: 16px } + + &__relative-time { color: $info-text-color } + + &__display-name { + color: $secondary-text-color; + + strong { color: $primary-text-color } + } + + &__avatar { + left: 12px; + top: 12px; + } + + &__content { + font-size: 16px; + padding-top: 4px; + color: $primary-text-color; + + a { + color: $link-text-color; + + &.unhandled-link { color: $link-text-color } + } + + .status__content__spoiler-link { + background: transparent; + + &:hover { background: $text-button-hover-color } + + &:focus { background: $text-button-focus-color } + } + + &__spoiler-link { + border: 0; + color: $text-button-color; + } + + &__read-more-button { + font-size: 14px; + color: $text-button-color; + border-radius: $button-radius; + padding: 4px 6px; + + &:hover { + background: $text-button-hover-color; + text-decoration: none; + } + + &:focus { background: $text-button-focus-color } + } + } + + &__action-bar { + &__counter__label { + font-size: 14px; + color: $info-text-color; + } + } + + &.status-direct:not(.read) { + background: transparent; + border-bottom-color: $border-color; + } +} + +.status-card { + color: $icon-color; + border-color: $border-color; + outline: none; + + &__image { + background: $card-background-color; + + &>.fa { + font-size: 26px; + } + } + + &__title { + color: $primary-text-color; + margin-bottom: 6px; + } + &.compact { + border-color: $border-color; + outline: none; + .status-card { + &__content { padding: 12px } + &__image { flex: 0 0 64px } + } + + &:hover { background-color: $card-background-color !important } + } + + &:hover { background-color: $card-background-color } +} + +.detailed-status { + background: $card-background-color; + padding: 16px; + + &__display-name { + color: $secondary-text-color; + + strong { color: $primary-text-color } + } + + &__meta { + margin-top: 16px; + color: $info-text-color; + } + + &__action-bar { + background: $card-background-color; + border-top: none; + border-bottom: 1px solid $border-color; + padding: 12px 0; + } + + &__button { + .icon-button { font-size: 20px !important } + } +} \ No newline at end of file diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index d49fcfa99..f82c25cd1 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -10,8 +10,6 @@ base_host = Rails.configuration.x.web_domain assets_host = Rails.configuration.action_controller.asset_host assets_host ||= "http#{Rails.configuration.x.use_https ? 's' : ''}://#{base_host}" -google_font_host = "https://fonts.gstatic.com" -gplus_theme_host = "https://raw.githubusercontent.com" assets_host ||= host_to_url(base_host) media_host = host_to_url(ENV['S3_ALIAS_HOST']) diff --git a/config/locales/en.yml b/config/locales/en.yml index 44c116dfb..0ec250025 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1192,7 +1192,8 @@ en: contrast: Mastodon (High contrast) default: Mastodon (Dark) mastodon-light: Mastodon (Light) - + # additional theme + mastodon-material-dev: Material Dev (Light) time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 24a159e57..2875d4fd7 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1173,6 +1173,8 @@ ja: contrast: Mastodon (ハイコントラスト) default: Mastodon (ダーク) mastodon-light: Mastodon (ライト) + # 追加テーマ + mastodon-material: Material Dev (ライト) time: formats: default: "%Y年%m月%d日 %H:%M" diff --git a/config/themes.yml b/config/themes.yml index 9c21c9459..e93b9f8f1 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,3 +1,6 @@ default: styles/application.scss contrast: styles/contrast.scss mastodon-light: styles/mastodon-light.scss + +# 追加テーマ +mastodon-material: styles/mastodon-material-dev.scss From 663b2f91e2d0b86f7ad0c6fd2eaaeec1befb9591 Mon Sep 17 00:00:00 2001 From: Rintan Date: Mon, 9 Mar 2020 11:05:55 +0900 Subject: [PATCH 023/200] fix CSP (#268) --- config/initializers/content_security_policy.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index f82c25cd1..af7d16aaf 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -9,7 +9,6 @@ end base_host = Rails.configuration.x.web_domain assets_host = Rails.configuration.action_controller.asset_host -assets_host ||= "http#{Rails.configuration.x.use_https ? 's' : ''}://#{base_host}" assets_host ||= host_to_url(base_host) media_host = host_to_url(ENV['S3_ALIAS_HOST']) @@ -21,7 +20,7 @@ Rails.application.config.content_security_policy do |p| p.base_uri :none p.default_src :none p.frame_ancestors :none - p.font_src :self, assets_host, google_font_host + p.font_src :self, assets_host p.img_src :self, :https, :data, :blob, assets_host p.style_src :self, :unsafe_inline, assets_host p.media_src :self, :https, :data, assets_host From f864de23f4996013e1b05b529214794e581f0611 Mon Sep 17 00:00:00 2001 From: Rintan Date: Mon, 9 Mar 2020 11:58:06 +0900 Subject: [PATCH 024/200] =?UTF-8?q?=E7=9B=B8=E5=AF=BE=E3=83=91=E3=82=B9?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3=20(#269)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix CSP * fix icon font path --- .../styles/mastodon-material-dev/config.scss | 4 ++-- .../fonts/MaterialIcons-Regular.woff2 | Bin 2 files changed, 2 insertions(+), 2 deletions(-) rename app/javascript/styles/{ => mastodon-material-dev}/fonts/MaterialIcons-Regular.woff2 (100%) diff --git a/app/javascript/styles/mastodon-material-dev/config.scss b/app/javascript/styles/mastodon-material-dev/config.scss index e733bc8af..cf04ac55b 100644 --- a/app/javascript/styles/mastodon-material-dev/config.scss +++ b/app/javascript/styles/mastodon-material-dev/config.scss @@ -10,12 +10,12 @@ // Material Design Icon settings -// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in .../fonts folder and configure below. +// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in 'fonts' folder and configure below. @font-face { font-family: "Material Icons"; src: local("Material Icons"), //url("https://raw.githubusercontent.com/google/material-design-icons/master/iconfont/MaterialIcons-Regular.woff2"); // GitHub //url("https://fonts.gstatic.com/s/materialicons/v50/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2"); // Google Fonts - url("../fonts/MaterialIcons-Regular.woff2"); // Self-hosting + url("fonts/MaterialIcons-Regular.woff2"); // Self-hosting } \ No newline at end of file diff --git a/app/javascript/styles/fonts/MaterialIcons-Regular.woff2 b/app/javascript/styles/mastodon-material-dev/fonts/MaterialIcons-Regular.woff2 similarity index 100% rename from app/javascript/styles/fonts/MaterialIcons-Regular.woff2 rename to app/javascript/styles/mastodon-material-dev/fonts/MaterialIcons-Regular.woff2 From 27998a80fe550f3161bf03f76724d01fb56fc2e3 Mon Sep 17 00:00:00 2001 From: Rintan Date: Mon, 9 Mar 2020 12:44:34 +0900 Subject: [PATCH 025/200] =?UTF-8?q?=E7=9B=B8=E5=AF=BE=E3=83=91=E3=82=B9?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3=20(#270)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix CSP * fix icon font path * fix font path --- app/javascript/styles/mastodon-material-dev/config.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon-material-dev/config.scss b/app/javascript/styles/mastodon-material-dev/config.scss index cf04ac55b..fbd0dd86d 100644 --- a/app/javascript/styles/mastodon-material-dev/config.scss +++ b/app/javascript/styles/mastodon-material-dev/config.scss @@ -10,7 +10,7 @@ // Material Design Icon settings -// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in 'fonts' folder and configure below. +// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in '../fonts' folder and configure below. @font-face { font-family: "Material Icons"; src: From 8f2dac1d9c6eccfe73966ea123817aa7fe33bf88 Mon Sep 17 00:00:00 2001 From: Rintan Date: Mon, 9 Mar 2020 19:11:50 +0900 Subject: [PATCH 026/200] =?UTF-8?q?Revert=20"=E7=9B=B8=E5=AF=BE=E3=83=91?= =?UTF-8?q?=E3=82=B9=E3=81=AE=E4=BF=AE=E6=AD=A3=20(#270)"=20(#271)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 27998a80fe550f3161bf03f76724d01fb56fc2e3. --- app/javascript/styles/mastodon-material-dev/config.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon-material-dev/config.scss b/app/javascript/styles/mastodon-material-dev/config.scss index fbd0dd86d..cf04ac55b 100644 --- a/app/javascript/styles/mastodon-material-dev/config.scss +++ b/app/javascript/styles/mastodon-material-dev/config.scss @@ -10,7 +10,7 @@ // Material Design Icon settings -// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in '../fonts' folder and configure below. +// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in 'fonts' folder and configure below. @font-face { font-family: "Material Icons"; src: From 088e10354215b5cce7463af8822bb527c339e6f1 Mon Sep 17 00:00:00 2001 From: Rintan Date: Mon, 9 Mar 2020 20:34:06 +0900 Subject: [PATCH 027/200] =?UTF-8?q?Revert=20"=E7=9B=B8=E5=AF=BE=E3=83=91?= =?UTF-8?q?=E3=82=B9=E3=81=AE=E4=BF=AE=E6=AD=A3=20(#269)"=20(#272)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f864de23f4996013e1b05b529214794e581f0611. --- .../fonts/MaterialIcons-Regular.woff2 | Bin .../styles/mastodon-material-dev/config.scss | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename app/javascript/styles/{mastodon-material-dev => }/fonts/MaterialIcons-Regular.woff2 (100%) diff --git a/app/javascript/styles/mastodon-material-dev/fonts/MaterialIcons-Regular.woff2 b/app/javascript/styles/fonts/MaterialIcons-Regular.woff2 similarity index 100% rename from app/javascript/styles/mastodon-material-dev/fonts/MaterialIcons-Regular.woff2 rename to app/javascript/styles/fonts/MaterialIcons-Regular.woff2 diff --git a/app/javascript/styles/mastodon-material-dev/config.scss b/app/javascript/styles/mastodon-material-dev/config.scss index cf04ac55b..e733bc8af 100644 --- a/app/javascript/styles/mastodon-material-dev/config.scss +++ b/app/javascript/styles/mastodon-material-dev/config.scss @@ -10,12 +10,12 @@ // Material Design Icon settings -// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in 'fonts' folder and configure below. +// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in .../fonts folder and configure below. @font-face { font-family: "Material Icons"; src: local("Material Icons"), //url("https://raw.githubusercontent.com/google/material-design-icons/master/iconfont/MaterialIcons-Regular.woff2"); // GitHub //url("https://fonts.gstatic.com/s/materialicons/v50/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2"); // Google Fonts - url("fonts/MaterialIcons-Regular.woff2"); // Self-hosting + url("../fonts/MaterialIcons-Regular.woff2"); // Self-hosting } \ No newline at end of file From 0d9aa65dc36a9d0cc859b9b3317a3527801a5092 Mon Sep 17 00:00:00 2001 From: Rintan Date: Mon, 9 Mar 2020 21:44:45 +0900 Subject: [PATCH 028/200] =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=83=91=E3=82=B9=E3=81=AE=E4=BF=AE=E6=AD=A3=20(#273)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix CSP * fix icon font path * fix relative path --- .../{styles => }/fonts/MaterialIcons-Regular.woff2 | Bin .../styles/mastodon-material-dev/config.scss | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename app/javascript/{styles => }/fonts/MaterialIcons-Regular.woff2 (100%) diff --git a/app/javascript/styles/fonts/MaterialIcons-Regular.woff2 b/app/javascript/fonts/MaterialIcons-Regular.woff2 similarity index 100% rename from app/javascript/styles/fonts/MaterialIcons-Regular.woff2 rename to app/javascript/fonts/MaterialIcons-Regular.woff2 diff --git a/app/javascript/styles/mastodon-material-dev/config.scss b/app/javascript/styles/mastodon-material-dev/config.scss index e733bc8af..3095407d8 100644 --- a/app/javascript/styles/mastodon-material-dev/config.scss +++ b/app/javascript/styles/mastodon-material-dev/config.scss @@ -10,7 +10,7 @@ // Material Design Icon settings -// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in .../fonts folder and configure below. +// If you want to use self-hosting font, please place MaterialIcons-Regular.woff2 file in '../../fonts' folder and configure below. @font-face { font-family: "Material Icons"; src: From 047567a657353b51712a54cc8180f3720174ee90 Mon Sep 17 00:00:00 2001 From: Rintan Date: Mon, 9 Mar 2020 22:36:11 +0900 Subject: [PATCH 029/200] =?UTF-8?q?=E3=82=AA=E3=83=BC=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=83=89=E8=A8=AD=E5=AE=9A=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20(#274)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix CSP * fix icon font path * fix relative path * fix override settings --- app/javascript/styles/mastodon-material-dev.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/mastodon-material-dev.scss b/app/javascript/styles/mastodon-material-dev.scss index 9cc10708d..18935348a 100644 --- a/app/javascript/styles/mastodon-material-dev.scss +++ b/app/javascript/styles/mastodon-material-dev.scss @@ -1,5 +1,6 @@ @charset "UTF-8"; +@import 'application'; @import 'mastodon-material-dev/account'; @import 'mastodon-material-dev/basics'; @import 'mastodon-material-dev/button'; From 5cf087ebf0a2ad25d37936edd064c4fc36705499 Mon Sep 17 00:00:00 2001 From: YoheiZuho Date: Sun, 5 Apr 2020 23:30:06 +0900 Subject: [PATCH 030/200] 3.1.3 (#275) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix announcements with fully-qualified mention to local user crashing WebUI (#13164) * [Security] Bump puma from 4.3.1 to 4.3.2 (#13167) Bumps [puma](https://github.com/puma/puma) from 4.3.1 to 4.3.2. **This update includes a security fix.** - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v4.3.1...v4.3.2) Signed-off-by: dependabot-preview[bot] * Fix installation failing when Redis password contains special characters (#13156) * Add support for special characters in Redis passwords Fixes #13154 * Refactor * Fix elasticsearch-api and faraday incompatibilities (#13166) * Bump puma from 4.3.2 to 4.3.3 (#13177) This fixes cookies and devise authentication being broken as a result of upgrading to puma 4.3.2, see https://github.com/puma/puma/issues/2132 * Bump strong_migrations from 0.5.1 to 0.6.2 (#13071) Bumps [strong_migrations](https://github.com/ankane/strong_migrations) from 0.5.1 to 0.6.2. - [Release notes](https://github.com/ankane/strong_migrations/releases) - [Changelog](https://github.com/ankane/strong_migrations/blob/master/CHANGELOG.md) - [Commits](https://github.com/ankane/strong_migrations/compare/v0.5.1...v0.6.2) Signed-off-by: dependabot-preview[bot] * Bump oj from 3.10.1 to 3.10.3 (#13187) Bumps [oj](https://github.com/ohler55/oj) from 3.10.1 to 3.10.3. - [Release notes](https://github.com/ohler55/oj/releases) - [Changelog](https://github.com/ohler55/oj/blob/develop/CHANGELOG.md) - [Commits](https://github.com/ohler55/oj/compare/v3.10.1...v3.10.3) Signed-off-by: dependabot-preview[bot] * Bump json-ld-preloaded from 3.1.0 to 3.1.1 (#13143) Bumps [json-ld-preloaded](https://github.com/ruby-rdf/json-ld-preloaded) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/ruby-rdf/json-ld-preloaded/releases) - [Commits](https://github.com/ruby-rdf/json-ld-preloaded/compare/3.1.0...3.1.1) Signed-off-by: dependabot-preview[bot] * Bump @babel/core from 7.8.4 to 7.8.6 (#13185) Bumps [@babel/core](https://github.com/babel/babel) from 7.8.4 to 7.8.6. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.4...v7.8.6) Signed-off-by: dependabot-preview[bot] * Bump webpack-dev-server from 3.10.1 to 3.10.3 (#13184) Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 3.10.1 to 3.10.3. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.10.1...v3.10.3) Signed-off-by: dependabot-preview[bot] * Bump @babel/runtime from 7.8.3 to 7.8.4 (#13183) Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.8.3 to 7.8.4. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.8.4/packages/babel-runtime) Signed-off-by: dependabot-preview[bot] * Add tooltips to audio/video player buttons (#13203) * Fix "tootctl media remove-orphans" crashing when encountering invalid media (#13170) Fixes #13168 * Change the string "Hide everything from …" to "Block domain …" in web UI (#13178) Blocking a domain is closer to blocking all its users than to a mute action. * Remove useless `respond_to` calls (#13208) * Change GIF label to be displayed even when autoplay is enabled in web UI (#13209) * Fix too large announcements not being scrollable in web UI (#13211) * Add specific rate limits for posting and following (#13172) * Fix text area above/right of emoji picker being accidentally clickable in web UI (#13148) * Add sorting by username, creation and last activity in moderation view (#13076) * Add ability to order accounts in moderation view * Display last status date in “Most recent activity” for remote users * Fix error when searching for URLs that contain the mention syntax (#13151) Fixes #13150 * Set BUNDLE_PATH in CircleCI (#13214) * Change description of privacy levels to be more intuitive in web UI (#13197) * Improve description of privacy levels in compose interface * Change strings in defaultMessage and source as well as english Co-authored-by: Thibaut Girka * Add ability to delete files uploaded for settings in admin UI (#13192) * Allow deleting site uploads * Refactor and move links into hints * Fix i18n tests * Fix HTML output of site_upload_delete_hint * Add `--skip-media-remove` option to `tootctl statuses remove` (#13080) * Add skip_media_remove option to tootctl statuses remove * Add skip_media_remove option to tootctl statuses remove Co-authored-by: tateisu * Code style improvements in JavaScript (#13159) * JS-linter: fix trailing comma's * Configure eslinter to ignore this onchange error. * Add submit button to the top of preferences pages (#13068) * Move submit button to the top of the edit page * Duplicate save button on long form * Fix click submit on profile spec * Update nginx.conf (#13066) * Change wording of media display preferences to be more intuitive (#13198) * Change the tooltip "Toggle visibility" to "Hide media" in web UI (#13199) * Add support for links to statuses in announcements to be opened in web UI (#13212) * Add support for links to public statuses in announcements to be opened in WebUI * Please CodeClimate * Fix public posts from silenced accounts not being changed to unlisted visibility (#13096) * Bump doorkeeper from 5.2.3 to 5.3.1 (#13144) Bumps [doorkeeper](https://github.com/doorkeeper-gem/doorkeeper) from 5.2.3 to 5.3.1. - [Release notes](https://github.com/doorkeeper-gem/doorkeeper/releases) - [Changelog](https://github.com/doorkeeper-gem/doorkeeper/blob/master/CHANGELOG.md) - [Commits](https://github.com/doorkeeper-gem/doorkeeper/compare/v5.2.3...v.5.3.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Change local media attachments to perform heavy processing asynchronously (#13210) Fix #9106 * Add federation support for the "hide network" preference (#11673) * Change ActivityPub follower/following collections to not link first page * Add support for hiding followers and following of remote users * Switch to using a single `hide_collections` column * Address code style remarks * Bump cld3 from 3.2.6 to 3.3.0 (#13107) * Bump cld3 from 3.2.6 to 3.3.0 Bumps [cld3](https://github.com/akihikodaki/cld3-ruby) from 3.2.6 to 3.3.0. - [Release notes](https://github.com/akihikodaki/cld3-ruby/releases) - [Commits](https://github.com/akihikodaki/cld3-ruby/compare/v3.2.6...v3.3.0) Signed-off-by: dependabot-preview[bot] * Fix compatibility with cld3 3.3.0 Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Eugen Rochko * Change video uploads to enforce certain limits (#13218) - Dimensions at most 1920x1200 - Frame rate at most 60 * Change video uploads to always be converted to H264/MP4 (#13220) Even if the container format is the same (.mp4), the codec could be different and not playable in web browsers * Change the string "hidden" to "blocked" in WebUI (#13221) * Change the string "hidden" to "blocked" in WebUI. * update * Bump file-loader from 5.0.2 to 5.1.0 (#13225) Bumps [file-loader](https://github.com/webpack-contrib/file-loader) from 5.0.2 to 5.1.0. - [Release notes](https://github.com/webpack-contrib/file-loader/releases) - [Changelog](https://github.com/webpack-contrib/file-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/file-loader/compare/v5.0.2...v5.1.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump wicg-inert from 3.0.0 to 3.0.2 (#13226) Bumps [wicg-inert](https://github.com/WICG/inert) from 3.0.0 to 3.0.2. - [Release notes](https://github.com/WICG/inert/releases) - [Commits](https://github.com/WICG/inert/compare/v3.0.0...v3.0.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump cross-env from 6.0.3 to 7.0.2 (#13228) Bumps [cross-env](https://github.com/kentcdodds/cross-env) from 6.0.3 to 7.0.2. - [Release notes](https://github.com/kentcdodds/cross-env/releases) - [Changelog](https://github.com/kentcdodds/cross-env/blob/master/CHANGELOG.md) - [Commits](https://github.com/kentcdodds/cross-env/compare/v6.0.3...v7.0.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump eslint-plugin-react from 7.17.0 to 7.19.0 (#13224) Bumps [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) from 7.17.0 to 7.19.0. - [Release notes](https://github.com/yannickcr/eslint-plugin-react/releases) - [Changelog](https://github.com/yannickcr/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/yannickcr/eslint-plugin-react/compare/v7.17.0...v7.19.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Fix MP4 (H264 + AAC) video files being needlessly re-encoded (#13239) * Fix videos with unsupported colorspace not being transcoded (#13242) * Fix regression in “Edit media” modal in web UI (#13243) * [Security] Bump Node.js from 12.14.0 to 12.16.1 in Docker (#13235) * Update Dockerfile * Update Dockerfile * Fix detailed view of direct messages displaying a 0 boost count (#13244) The boost count is already removed from private toots, do the same with direct messages. * Add titles to warning presets in admin UI (#13252) * Add option to include resolved DNS records when blacklisting e-mail domains in admin UI (#13254) * Add shortcuts to blacklist a user's e-mail domain in admin UI * Add option to blacklist resolved MX and IP records for e-mail domains * Fix some timeouts when searching URLs by limiting some database queries (#13253) Only look up private toots from database if the request failed because of 401, 403 or 404 errors, as those may indicate a private toot, rather than something that isn't a toot or cannot be processed. * Fix WebUI crash in single-column mode on prehistoric browsers (#13267) Fixes #13266 * Bump react-immutable-proptypes from 2.1.0 to 2.2.0 (#13259) Bumps [react-immutable-proptypes](https://github.com/HurricaneJames/react-immutable-proptypes) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/HurricaneJames/react-immutable-proptypes/releases) - [Changelog](https://github.com/HurricaneJames/react-immutable-proptypes/blob/master/CHANGELOG.md) - [Commits](https://github.com/HurricaneJames/react-immutable-proptypes/commits) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump babel-jest from 24.9.0 to 25.1.0 (#12973) Bumps [babel-jest](https://github.com/facebook/jest/tree/HEAD/packages/babel-jest) from 24.9.0 to 25.1.0. - [Release notes](https://github.com/facebook/jest/releases) - [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md) - [Commits](https://github.com/facebook/jest/commits/v25.1.0/packages/babel-jest) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump react-dom from 16.12.0 to 16.13.0 (#13181) Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) from 16.12.0 to 16.13.0. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/master/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/v16.13.0/packages/react-dom) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump react-test-renderer from 16.12.0 to 16.13.0 (#13260) Bumps [react-test-renderer](https://github.com/facebook/react/tree/HEAD/packages/react-test-renderer) from 16.12.0 to 16.13.0. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/master/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/v16.13.0/packages/react-test-renderer) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump sass from 1.25.0 to 1.26.3 (#13263) Bumps [sass](https://github.com/sass/dart-sass) from 1.25.0 to 1.26.3. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/master/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.25.0...1.26.3) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump mkdirp from 0.5.1 to 1.0.3 (#12979) Bumps [mkdirp](https://github.com/isaacs/node-mkdirp) from 0.5.1 to 1.0.3. - [Release notes](https://github.com/isaacs/node-mkdirp/releases) - [Changelog](https://github.com/isaacs/node-mkdirp/blob/master/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-mkdirp/commits/v1.0.3) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump redis from 2.8.0 to 3.0.2 (#13102) Bumps [redis](https://github.com/NodeRedis/node-redis) from 2.8.0 to 3.0.2. - [Release notes](https://github.com/NodeRedis/node-redis/releases) - [Changelog](https://github.com/NodeRedis/node-redis/blob/master/CHANGELOG.md) - [Commits](https://github.com/NodeRedis/node-redis/compare/v.2.8.0...v3.0.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump json-ld from 3.1.0 to 3.1.1 (#13230) Bumps [json-ld](https://github.com/ruby-rdf/json-ld) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/ruby-rdf/json-ld/releases) - [Commits](https://github.com/ruby-rdf/json-ld/compare/3.1.0...3.1.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump simple_form from 5.0.1 to 5.0.2 (#13231) Bumps [simple_form](https://github.com/plataformatec/simple_form) from 5.0.1 to 5.0.2. - [Release notes](https://github.com/plataformatec/simple_form/releases) - [Changelog](https://github.com/heartcombo/simple_form/blob/master/CHANGELOG.md) - [Commits](https://github.com/plataformatec/simple_form/compare/v5.0.1...v5.0.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump sidekiq-scheduler from 3.0.0 to 3.0.1 (#13233) Bumps [sidekiq-scheduler](https://github.com/moove-it/sidekiq-scheduler) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/moove-it/sidekiq-scheduler/releases) - [Commits](https://github.com/moove-it/sidekiq-scheduler/compare/v3.0.0...v3.0.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump webmock from 3.8.0 to 3.8.3 (#13265) Bumps [webmock](https://github.com/bblimke/webmock) from 3.8.0 to 3.8.3. - [Release notes](https://github.com/bblimke/webmock/releases) - [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md) - [Commits](https://github.com/bblimke/webmock/compare/v3.8.0...v3.8.3) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump capistrano from 3.11.2 to 3.12.1 (#13264) * Bump capistrano from 3.11.2 to 3.12.1 Bumps [capistrano](https://github.com/capistrano/capistrano) from 3.11.2 to 3.12.1. - [Release notes](https://github.com/capistrano/capistrano/releases) - [Commits](https://github.com/capistrano/capistrano/compare/v3.11.2...v3.12.1) Signed-off-by: dependabot-preview[bot] * Bump capistrano from 3.11.2 to 3.12.1 Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Yamagishi Kazutoshi * Fix reported accounts not being whitelisted when resolving a spamcheck report (#13289) * Decommission support for Ruby 2.4 (#13287) * Update Gemfile * Update README.md * Fix frontend crash when deleting announcements (#13283) This two-line change fixes a crash in the front end that occurred under the following circumstances: * A server had more than one announcement, * A user was displaying the announcements, and * An announcement was deleted (or unpublished, which amounts to the same thing.) As might be expected, the bug was caused by attempting to access a notification using an index value outside the bounds of the existing announcements. Specifically, in two places. First, `_markAnnouncementAsRead` attempts to modify announcements based on the current index. This is what caused the front end crash. Second, when rendering the `Announcements` component, the code paginates the announcements and displays the current one. This did not cause a crash, but caused the front end to confusingly display a blank announcement (in situations that would have caused a crash) with no way for the user to navigate back to previous announcements. This commit fixes both issues by adding a check to ensure that the code never attempts to access an announcement with an index greater than or equal to the number of announcements present. * Make bookmarks also searchable (#13271) * Add link to bookmarks in web UI dropdown (#13273) * Migrate Rails ujs as required for Rails 6 Upgrade. (#13280) * Update yarn.lock * Update package.json * Update public.js * Update admin.js * Update log_out.js * Update common.js * [Security] Bump omniauth from 1.9.0 to 1.9.1 (#13229) Bumps [omniauth](https://github.com/omniauth/omniauth) from 1.9.0 to 1.9.1. **This update includes a security fix.** - [Release notes](https://github.com/omniauth/omniauth/releases) - [Commits](https://github.com/omniauth/omniauth/compare/v1.9.0...v1.9.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump sidekiq from 5.2.7 to 6.0.4 (#11727) * Bump sidekiq from 5.2.7 to 6.0.0 Bumps [sidekiq](https://github.com/mperham/sidekiq) from 5.2.7 to 6.0.0. - [Release notes](https://github.com/mperham/sidekiq/releases) - [Changelog](https://github.com/mperham/sidekiq/blob/master/Changes.md) - [Commits](https://github.com/mperham/sidekiq/compare/v5.2.7...v6.0.0) Signed-off-by: dependabot-preview[bot] * Sidekiq::Logger.logger -> Sidekiq.logger * Drop support Ruby 2.4 * update Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Yamagishi Kazutoshi * Fix bookmarks also searchable (#13293) * Bump sidekiq-unique-jobs from 6.0.18 to 6.0.20 (#13294) * Change poll option hover/active styling to be less confusing (#13313) * Fix frontend crash when deleting announcements (#13312) Refactor and fix #13283, which only worked in some cases. * Fix media not being marked sensitive when client sets a CW but no text (#13277) Mastodon enforces the “sensitive” flag on media attachments whenever a toot is posted with a Content Warning. However, it does so *after* potentially converting the Content Warning to toot text (when there is no toot text), which leads to inconsistent and surprising behavior for API clients. This commit fixes this inconsistency. * Bump browser from 3.0.3 to 4.0.0 (#13307) Bumps [browser](https://github.com/fnando/browser) from 3.0.3 to 4.0.0. - [Release notes](https://github.com/fnando/browser/releases) - [Changelog](https://github.com/fnando/browser/blob/master/CHANGELOG.md) - [Commits](https://github.com/fnando/browser/compare/v3.0.3...v4.0.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump i18n-tasks from 0.9.30 to 0.9.31 (#13304) Bumps [i18n-tasks](https://github.com/glebm/i18n-tasks) from 0.9.30 to 0.9.31. - [Release notes](https://github.com/glebm/i18n-tasks/releases) - [Changelog](https://github.com/glebm/i18n-tasks/blob/master/CHANGES.md) - [Commits](https://github.com/glebm/i18n-tasks/compare/v0.9.30...v0.9.31) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump simplecov from 0.18.2 to 0.18.5 (#13310) Bumps [simplecov](https://github.com/colszowka/simplecov) from 0.18.2 to 0.18.5. - [Release notes](https://github.com/colszowka/simplecov/releases) - [Changelog](https://github.com/colszowka/simplecov/blob/master/CHANGELOG.md) - [Commits](https://github.com/colszowka/simplecov/compare/v0.18.2...v0.18.5) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump rspec-rails from 3.9.0 to 3.9.1 (#13305) Bumps [rspec-rails](https://github.com/rspec/rspec-rails) from 3.9.0 to 3.9.1. - [Release notes](https://github.com/rspec/rspec-rails/releases) - [Changelog](https://github.com/rspec/rspec-rails/blob/master/Changelog.md) - [Commits](https://github.com/rspec/rspec-rails/compare/v3.9.0...v3.9.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump discard from 1.1.0 to 1.2.0 (#13308) Bumps [discard](https://github.com/jhawthorn/discard) from 1.1.0 to 1.2.0. - [Release notes](https://github.com/jhawthorn/discard/releases) - [Changelog](https://github.com/jhawthorn/discard/blob/master/CHANGELOG.md) - [Commits](https://github.com/jhawthorn/discard/commits) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump aws-sdk-s3 from 1.60.1 to 1.61.1 (#13306) Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.60.1 to 1.61.1. - [Release notes](https://github.com/aws/aws-sdk-ruby/releases) - [Changelog](https://github.com/aws/aws-sdk-ruby/blob/master/gems/aws-sdk-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-ruby/commits) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * New Crowdin translations (#13064) * New translations en.yml (Russian) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.yml (Kabyle) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.json (Kabyle) [ci skip] * New translations en.yml (Kabyle) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations simple_form.en.yml (Greek) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations devise.en.yml (Icelandic) [ci skip] * New translations en.json (Italian) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations en.yml (Norwegian Nynorsk) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Serbian (Cyrillic)) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Kabyle) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations en.yml (Vietnamese) [ci skip] * New translations simple_form.en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Icelandic) [ci skip] * New translations simple_form.en.yml (Italian) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations simple_form.en.yml (Russian) [ci skip] * New translations simple_form.en.yml (Swedish) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Catalan) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations simple_form.en.yml (Portuguese) [ci skip] * New translations simple_form.en.yml (Arabic) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations devise.en.yml (Kabyle) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Icelandic) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations simple_form.en.yml (Catalan) [ci skip] * New translations simple_form.en.yml (Portuguese) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Galician) [ci skip] * New translations simple_form.en.yml (Icelandic) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Hungarian) [ci skip] * New translations en.json (Kabyle) [ci skip] * New translations simple_form.en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations simple_form.en.yml (Greek) [ci skip] * New translations en.yml (French) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations simple_form.en.yml (Asturian) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations simple_form.en.yml (Italian) [ci skip] * New translations devise.en.yml (Kabyle) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations simple_form.en.yml (Basque) [ci skip] * New translations simple_form.en.yml (Occitan) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations simple_form.en.yml (Slovak) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * New translations simple_form.en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations simple_form.en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.json (French) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations doorkeeper.en.yml (Slovak) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Indonesian) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.json (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations activerecord.en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Indonesian) [ci skip] * New translations activerecord.en.yml (Kabyle) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.yml (Breton) [ci skip] * New translations en.yml (Breton) [ci skip] * New translations en.yml (Breton) [ci skip] * New translations en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations en.json (Breton) [ci skip] * New translations doorkeeper.en.yml (Breton) [ci skip] * New translations simple_form.en.yml (Breton) [ci skip] * New translations en.yml (Breton) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations devise.en.yml (Russian) [ci skip] * New translations simple_form.en.yml (Russian) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * i18n-tasks normalize * yarn manage:translations * Bump babel-plugin-preval from 4.0.0 to 5.0.0 (#13297) Bumps [babel-plugin-preval](https://github.com/kentcdodds/babel-plugin-preval) from 4.0.0 to 5.0.0. - [Release notes](https://github.com/kentcdodds/babel-plugin-preval/releases) - [Changelog](https://github.com/kentcdodds/babel-plugin-preval/blob/master/CHANGELOG.md) - [Commits](https://github.com/kentcdodds/babel-plugin-preval/compare/v4.0.0...v5.0.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump @babel/plugin-transform-react-inline-elements from 7.8.3 to 7.9.0 (#13298) Bumps [@babel/plugin-transform-react-inline-elements](https://github.com/babel/babel) from 7.8.3 to 7.9.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.3...v7.9.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump @babel/core from 7.8.6 to 7.9.0 (#13303) Bumps [@babel/core](https://github.com/babel/babel) from 7.8.6 to 7.9.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.6...v7.9.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump webpack-bundle-analyzer from 3.6.0 to 3.6.1 (#13300) Bumps [webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer) from 3.6.0 to 3.6.1. - [Release notes](https://github.com/webpack-contrib/webpack-bundle-analyzer/releases) - [Changelog](https://github.com/webpack-contrib/webpack-bundle-analyzer/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/webpack-bundle-analyzer/compare/v3.6.0...v3.6.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Change `tootctl media remove-orphans` to work for all classes (#13316) Change `tootctl media lookup` to not use an interactive prompt * Bump react-select from 3.0.8 to 3.1.0 (#13296) Bumps [react-select](https://github.com/JedWatson/react-select) from 3.0.8 to 3.1.0. - [Release notes](https://github.com/JedWatson/react-select/releases) - [Changelog](https://github.com/JedWatson/react-select/blob/master/.sweet-changelogs.js) - [Commits](https://github.com/JedWatson/react-select/compare/react-select@3.0.8...react-select@3.1.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump @babel/plugin-transform-runtime from 7.8.3 to 7.9.0 (#13301) Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel) from 7.8.3 to 7.9.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.3...v7.9.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump webpack from 4.41.5 to 4.42.1 (#13319) Bumps [webpack](https://github.com/webpack/webpack) from 4.41.5 to 4.42.1. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v4.41.5...v4.42.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Fix Paperclip using deprecated URI.escape function (#13320) Monkey-patch Paperclip to perform URL escaping in a slightly more appropriate way, and get rid of runtime deprecation warnings. * Bump brakeman from 4.7.2 to 4.8.0 (#13309) Bumps [brakeman](https://github.com/presidentbeef/brakeman) from 4.7.2 to 4.8.0. - [Release notes](https://github.com/presidentbeef/brakeman/releases) - [Changelog](https://github.com/presidentbeef/brakeman/blob/master/CHANGES.md) - [Commits](https://github.com/presidentbeef/brakeman/compare/v4.7.2...v4.8.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Fix OCR not working on Safari because of unsupported worker-src CSP (#13323) Fixes #13321 * Fix 404 and 410 API errors being silently discarded in WebUI (#13279) * Fix 404 and 410 API errors being silently discarded in WebUI Fixes #13278 * Return more appropriate error when user replies to a deleted toot * Please CodeClimate * Fix 404/410 errors on fetching account timelines & identity proofs * Refactor error handling * Move error message string to statuses.errors * Fix incorrect deletion of local accounts imported by overwriting (#13350) * Fix wrong color for ellipsis in boost confirmation dialog in Web UI (#13355) * Bump pg from 1.2.2 to 1.2.3 (#13344) Bumps [pg](https://github.com/ged/ruby-pg) from 1.2.2 to 1.2.3. - [Release notes](https://github.com/ged/ruby-pg/releases) - [Changelog](https://github.com/ged/ruby-pg/blob/master/History.rdoc) - [Commits](https://github.com/ged/ruby-pg/compare/v1.2.2...v1.2.3) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump oj from 3.10.3 to 3.10.5 (#13345) Bumps [oj](https://github.com/ohler55/oj) from 3.10.3 to 3.10.5. - [Release notes](https://github.com/ohler55/oj/releases) - [Changelog](https://github.com/ohler55/oj/blob/develop/CHANGELOG.md) - [Commits](https://github.com/ohler55/oj/compare/v3.10.3...v3.10.5) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump iso-639 from 0.2.8 to 0.3.5 (#13343) Bumps [iso-639](https://github.com/xwmx/iso-639) from 0.2.8 to 0.3.5. - [Release notes](https://github.com/xwmx/iso-639/releases) - [Commits](https://github.com/xwmx/iso-639/compare/0.2.8...0.3.5) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump ox from 2.12.1 to 2.13.2 (#13342) Bumps [ox](https://github.com/ohler55/ox) from 2.12.1 to 2.13.2. - [Release notes](https://github.com/ohler55/ox/releases) - [Changelog](https://github.com/ohler55/ox/blob/develop/CHANGELOG.md) - [Commits](https://github.com/ohler55/ox/compare/v2.12.1...v2.13.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump better_errors from 2.5.1 to 2.6.0 (#13340) Bumps [better_errors](https://github.com/BetterErrors/better_errors) from 2.5.1 to 2.6.0. - [Release notes](https://github.com/BetterErrors/better_errors/releases) - [Commits](https://github.com/BetterErrors/better_errors/compare/v2.5.1...v2.6.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Fix ImportsController param to permit :mode (#13347) * Bump parallel_tests from 2.30.1 to 2.32.0 (#13341) Bumps [parallel_tests](https://github.com/grosser/parallel_tests) from 2.30.1 to 2.32.0. - [Release notes](https://github.com/grosser/parallel_tests/releases) - [Commits](https://github.com/grosser/parallel_tests/compare/v2.30.1...v2.32.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump uuid from 3.4.0 to 7.0.2 (#13295) Bumps [uuid](https://github.com/uuidjs/uuid) from 3.4.0 to 7.0.2. - [Release notes](https://github.com/uuidjs/uuid/releases) - [Changelog](https://github.com/uuidjs/uuid/blob/master/CHANGELOG.md) - [Commits](https://github.com/uuidjs/uuid/compare/v3.4.0...v7.0.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Fix content warning being unnecessarily cleared when enabling/disabling CW (#13348) * Bump concurrent-ruby from 1.1.5 to 1.1.6 (#13346) Bumps [concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby) from 1.1.5 to 1.1.6. - [Release notes](https://github.com/ruby-concurrency/concurrent-ruby/releases) - [Changelog](https://github.com/ruby-concurrency/concurrent-ruby/blob/master/CHANGELOG.md) - [Commits](https://github.com/ruby-concurrency/concurrent-ruby/compare/v1.1.5...v1.1.6) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump react from 16.12.0 to 16.13.1 (#13337) Bumps [react](https://github.com/facebook/react/tree/HEAD/packages/react) from 16.12.0 to 16.13.1. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/master/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/v16.13.1/packages/react) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump stringz from 2.0.0 to 2.1.0 (#13331) Bumps [stringz](https://github.com/sallar/stringz) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/sallar/stringz/releases) - [Changelog](https://github.com/sallar/stringz/blob/master/CHANGELOG.md) - [Commits](https://github.com/sallar/stringz/commits) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump babel-jest from 25.1.0 to 25.2.4 (#13332) Bumps [babel-jest](https://github.com/facebook/jest/tree/HEAD/packages/babel-jest) from 25.1.0 to 25.2.4. - [Release notes](https://github.com/facebook/jest/releases) - [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md) - [Commits](https://github.com/facebook/jest/commits/v25.2.4/packages/babel-jest) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump @babel/preset-env from 7.8.3 to 7.9.0 (#13336) Bumps [@babel/preset-env](https://github.com/babel/babel) from 7.8.3 to 7.9.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.3...v7.9.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump yargs from 15.1.0 to 15.3.1 (#13334) Bumps [yargs](https://github.com/yargs/yargs) from 15.1.0 to 15.3.1. - [Release notes](https://github.com/yargs/yargs/releases) - [Changelog](https://github.com/yargs/yargs/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/yargs/compare/v15.1.0...v15.3.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump babel-loader from 8.0.6 to 8.1.0 (#13333) Bumps [babel-loader](https://github.com/babel/babel-loader) from 8.0.6 to 8.1.0. - [Release notes](https://github.com/babel/babel-loader/releases) - [Changelog](https://github.com/babel/babel-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel-loader/compare/v8.0.6...v8.1.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump @babel/preset-react from 7.8.3 to 7.9.4 (#13335) Bumps [@babel/preset-react](https://github.com/babel/babel) from 7.8.3 to 7.9.4. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.3...v7.9.4) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump autoprefixer from 9.7.4 to 9.7.5 (#13338) Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 9.7.4 to 9.7.5. - [Release notes](https://github.com/postcss/autoprefixer/releases) - [Changelog](https://github.com/postcss/autoprefixer/blob/master/CHANGELOG.md) - [Commits](https://github.com/postcss/autoprefixer/compare/9.7.4...9.7.5) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Fix re-sending of e-mail confirmation not being rate limited (#13360) Fix #13330 * Improve toot clicking areas (#13327) * Make the area to the left “Show Thread” also expand the toot in Web UI * Clicking the left part of a conversation with the avatars now opens it in Web UI * Fix background jobs not using locks like they are supposed to (#13361) Also: - Fix locks not being removed when jobs go to the dead job queue - Add UI for managing locks to the Sidekiq dashboard - Remove unused Sidekiq workers Fix #13349 * Bump sidekiq-unique-jobs from 6.0.20 to 6.0.21 (#13367) Bumps [sidekiq-unique-jobs](https://github.com/mhenrixon/sidekiq-unique-jobs) from 6.0.20 to 6.0.21. - [Release notes](https://github.com/mhenrixon/sidekiq-unique-jobs/releases) - [Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/blob/master/CHANGELOG.md) - [Commits](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v6.0.20...v6.0.21) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump faker from 2.10.1 to 2.11.0 (#13363) Bumps [faker](https://github.com/faker-ruby/faker) from 2.10.1 to 2.11.0. - [Release notes](https://github.com/faker-ruby/faker/releases) - [Changelog](https://github.com/faker-ruby/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/faker-ruby/faker/commits/v2.11.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump tty-prompt from 0.20.0 to 0.21.0 (#13366) Bumps [tty-prompt](https://github.com/piotrmurach/tty-prompt) from 0.20.0 to 0.21.0. - [Release notes](https://github.com/piotrmurach/tty-prompt/releases) - [Changelog](https://github.com/piotrmurach/tty-prompt/blob/master/CHANGELOG.md) - [Commits](https://github.com/piotrmurach/tty-prompt/compare/v0.20.0...v0.21.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump bootsnap from 1.4.5 to 1.4.6 (#13369) Bumps [bootsnap](https://github.com/Shopify/bootsnap) from 1.4.5 to 1.4.6. - [Release notes](https://github.com/Shopify/bootsnap/releases) - [Changelog](https://github.com/Shopify/bootsnap/blob/master/CHANGELOG.md) - [Commits](https://github.com/Shopify/bootsnap/compare/v1.4.5...v1.4.6) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump json-ld-preloaded from 3.1.1 to 3.1.2 (#13365) Bumps [json-ld-preloaded](https://github.com/ruby-rdf/json-ld-preloaded) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/ruby-rdf/json-ld-preloaded/releases) - [Commits](https://github.com/ruby-rdf/json-ld-preloaded/compare/3.1.1...3.1.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump json-ld from 3.1.1 to 3.1.2 (#13368) Bumps [json-ld](https://github.com/ruby-rdf/json-ld) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/ruby-rdf/json-ld/releases) - [Commits](https://github.com/ruby-rdf/json-ld/compare/3.1.1...3.1.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Fix pinning a column in web UI sometimes redirecting out of web UI (#13376) Fix #13216 * Fix returning results when searching for URL with non-zero offset (#13377) Fix #13083 * Fix `tootctl media remove-orphans` ignoring `PAPERCLIP_ROOT_PATH` (#13375) Fix #13371 * Improve polls: option lengths & redesign (#13257) This commit redesign the polls and increases characters limit for the options from 25 to 50 characters, giving pollsters more freedom. Summarizing, the redesign is making the polls more adaptive for upcoming changes to the options characters limit: the bar, or a "chart", is now displayed separately from the option itself; vote check mark is moved next to the option text, making the percentages take less space. Option lengths are taken into account and text is wrapped to multiple lines if necessary to avoid overflow. * Bump rspec-rails from 3.9.1 to 4.0.0 (#13364) Bumps [rspec-rails](https://github.com/rspec/rspec-rails) from 3.9.1 to 4.0.0. - [Release notes](https://github.com/rspec/rspec-rails/releases) - [Changelog](https://github.com/rspec/rspec-rails/blob/master/Changelog.md) - [Commits](https://github.com/rspec/rspec-rails/compare/v3.9.1...v4.0.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Add ability to filter audit log in admin UI (#13381) * Update Vagrant box to Bionic (#13384) * Update config.yml (#13379) * Add explanation as to why unlocked accounts may have follow requests (#13385) * Add explanation as to why unlocked accounts may have follow requests * Change wording to avoid “silenced” * Bump rails from 5.2.4.1 to 5.2.4.2 and kind-of from 6.0.2 to 6.0.3 (#13387) * Bump rails from 5.2.4.1 to 5.2.4.2 * Bump kind-of from 6.0.2 to 6.0.3 * Bump version to 3.1.3 (#13389) * Fix PostgreSQL load when linking in announcements (#13250) * Fix PostgreSQL load when linking in announcements Fixes #13245 by caching status lookups Since statuses are supposed to be known already and we only need their URLs and a few other things, caching them should be fine. Since it's only used by announcements so far, there won't be much statuses to cache. * Perform status lookup when saving announcements, not when rendering them * Change EntityCache#status to fetch URLs instead of looking into the database * Move announcement link lookup to publishing worker * Address issues pointed out during review * [Security] Update Dockerfile for Ruby 2.6.6 (#13393) * Update .ruby-version (#13395) * Fix “Show more” not switching to “Show less” on public pages (#13174) * Fix “Show more” not switching to “Show less” on public pages Fixes #13169 * Fix initial text of CW button on public pages when CW are unfolded by default * Add rate limit for reporting (#13390) * New Crowdin translations (#13317) * New translations en.yml (Italian) [ci skip] * New translations doorkeeper.en.yml (Indonesian) [ci skip] * New translations simple_form.en.yml (Indonesian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations devise.en.yml (Ido) [ci skip] * New translations doorkeeper.en.yml (Ido) [ci skip] * New translations en.json (Hebrew) [ci skip] * New translations activerecord.en.yml (Georgian) [ci skip] * New translations doorkeeper.en.yml (Georgian) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations doorkeeper.en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations simple_form.en.yml (Greek) [ci skip] * New translations doorkeeper.en.yml (Greek) [ci skip] * New translations en.yml (Hebrew) [ci skip] * New translations simple_form.en.yml (Hebrew) [ci skip] * New translations activerecord.en.yml (Hebrew) [ci skip] * New translations devise.en.yml (Hebrew) [ci skip] * New translations doorkeeper.en.yml (Hebrew) [ci skip] * New translations en.yml (Hindi) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations doorkeeper.en.yml (Esperanto) [ci skip] * New translations doorkeeper.en.yml (French) [ci skip] * New translations devise.en.yml (French) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations doorkeeper.en.yml (Finnish) [ci skip] * New translations simple_form.en.yml (Finnish) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations doorkeeper.en.yml (Estonian) [ci skip] * New translations simple_form.en.yml (Estonian) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations doorkeeper.en.yml (Welsh) [ci skip] * New translations activerecord.en.yml (Serbian (Latin)) [ci skip] * New translations devise.en.yml (Serbian (Latin)) [ci skip] * New translations devise.en.yml (Urdu (Pakistan)) [ci skip] * New translations activerecord.en.yml (Vietnamese) [ci skip] * New translations devise.en.yml (Vietnamese) [ci skip] * New translations en.yml (Tamil) [ci skip] * New translations en.yml (Tamil) [ci skip] * New translations simple_form.en.yml (Tamil) [ci skip] * New translations simple_form.en.yml (Tamil) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.json (Basque) [ci skip] * New translations simple_form.en.yml (Basque) [ci skip] * New translations simple_form.en.yml (Basque) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (French) [ci skip] * New translations devise.en.yml (German) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations simple_form.en.yml (Italian) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Tamil) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Indonesian) [ci skip] * New translations simple_form.en.yml (Indonesian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.json (Galician) [ci skip] * New translations devise.en.yml (Galician) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.json (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.json (Hungarian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations en.json (Albanian) [ci skip] * New translations en.json (Indonesian) [ci skip] * New translations en.json (Italian) [ci skip] * New translations en.json (Ido) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Kabyle) [ci skip] * New translations en.json (Kannada) [ci skip] * New translations en.json (Hebrew) [ci skip] * New translations en.json (Hindi) [ci skip] * New translations en.json (Hungarian) [ci skip] * New translations en.json (Icelandic) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.json (Malayalam) [ci skip] * New translations en.json (Marathi) [ci skip] * New translations en.json (Norwegian) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.json (Malay) [ci skip] * New translations en.json (Kazakh) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.json (Latvian) [ci skip] * New translations en.json (Lithuanian) [ci skip] * New translations en.json (Macedonian) [ci skip] * New translations en.json (Bulgarian) [ci skip] * New translations en.json (Catalan) [ci skip] * New translations en.json (Chinese Simplified) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.json (Asturian) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.json (Basque) [ci skip] * New translations en.json (Bengali) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations en.json (French) [ci skip] * New translations en.json (Estonian) [ci skip] * New translations en.json (Georgian) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (Croatian) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Danish) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.json (Telugu) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.json (Tamil) [ci skip] * New translations en.json (Swedish) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.json (Welsh) [ci skip] * New translations en.json (Vietnamese) [ci skip] * New translations en.json (Urdu (Pakistan)) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations en.json (Serbian (Latin)) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations en.json (Polish) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations en.json (Slovenian) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.json (Romanian) [ci skip] * New translations en.json (Serbian (Cyrillic)) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.json (Swedish) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.json (Icelandic) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations activerecord.en.yml (Icelandic) [ci skip] * New translations en.yml (Icelandic) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.json (Catalan) [ci skip] * New translations en.json (Italian) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.json (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.json (Hungarian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.json (Thai) [ci skip] * New translations doorkeeper.en.yml (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * i18n-tasks normalize * yarn manage:translations * Update CHANGELOG.md (#13397) Co-authored-by: ThibG Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Eugen Rochko Co-authored-by: koyu Co-authored-by: Mélanie Chauvel (ariasuni) Co-authored-by: David Cook Co-authored-by: tateisu Co-authored-by: tateisu Co-authored-by: Bèr Kessels Co-authored-by: guigeekz Co-authored-by: Shlee Co-authored-by: mayaeh Co-authored-by: Yamagishi Kazutoshi Co-authored-by: Daniel Sockwell Co-authored-by: Jeong Arm Co-authored-by: Takeshi Umeda Co-authored-by: Sasha Sorokin Co-authored-by: fuyu <54523771+mfmfuyu@users.noreply.github.com> --- .circleci/config.yml | 13 +- .ruby-version | 2 +- CHANGELOG.md | 73 + Dockerfile | 6 +- Gemfile | 32 +- Gemfile.lock | 258 +-- README.md | 4 +- Vagrantfile | 2 +- app/chewy/statuses_index.rb | 5 + app/controllers/account_follow_controller.rb | 2 +- .../admin/action_logs_controller.rb | 14 +- .../admin/email_domain_blocks_controller.rb | 28 +- .../admin/site_uploads_controller.rb | 21 + .../admin/warning_presets_controller.rb | 6 +- app/controllers/api/base_controller.rb | 4 + .../accounts/follower_accounts_controller.rb | 4 +- .../accounts/following_accounts_controller.rb | 4 +- .../v1/accounts/identity_proofs_controller.rb | 2 - .../api/v1/accounts/lists_controller.rb | 2 - .../api/v1/accounts/pins_controller.rb | 2 - .../v1/accounts/relationships_controller.rb | 2 - .../api/v1/accounts/search_controller.rb | 2 - .../api/v1/accounts/statuses_controller.rb | 2 - app/controllers/api/v1/accounts_controller.rb | 4 +- .../api/v1/apps/credentials_controller.rb | 2 - app/controllers/api/v1/blocks_controller.rb | 2 - .../api/v1/bookmarks_controller.rb | 2 - .../api/v1/conversations_controller.rb | 2 - .../api/v1/custom_emojis_controller.rb | 2 - .../api/v1/domain_blocks_controller.rb | 2 - .../api/v1/endorsements_controller.rb | 2 - .../api/v1/favourites_controller.rb | 2 - .../featured_tags/suggestions_controller.rb | 3 - app/controllers/api/v1/filters_controller.rb | 2 - .../api/v1/instances/activity_controller.rb | 2 - .../api/v1/instances/peers_controller.rb | 2 - .../api/v1/instances_controller.rb | 2 - app/controllers/api/v1/media_controller.rb | 31 +- app/controllers/api/v1/mutes_controller.rb | 2 - .../api/v1/notifications_controller.rb | 2 - .../api/v1/polls/votes_controller.rb | 2 - app/controllers/api/v1/polls_controller.rb | 2 - .../api/v1/preferences_controller.rb | 2 - app/controllers/api/v1/reports_controller.rb | 2 +- .../api/v1/statuses/bookmarks_controller.rb | 2 - .../favourited_by_accounts_controller.rb | 2 - .../api/v1/statuses/favourites_controller.rb | 2 - .../api/v1/statuses/mutes_controller.rb | 2 - .../api/v1/statuses/pins_controller.rb | 2 - .../reblogged_by_accounts_controller.rb | 2 - .../api/v1/statuses/reblogs_controller.rb | 3 +- app/controllers/api/v1/statuses_controller.rb | 14 +- .../api/v1/streaming_controller.rb | 2 - .../api/v1/suggestions_controller.rb | 2 - .../api/v1/timelines/home_controller.rb | 2 - .../api/v1/timelines/public_controller.rb | 2 - .../api/v1/timelines/tag_controller.rb | 2 - app/controllers/api/v1/trends_controller.rb | 2 - app/controllers/api/v2/media_controller.rb | 12 + app/controllers/api/v2/search_controller.rb | 2 - app/controllers/api/web/embeds_controller.rb | 2 - .../api/web/push_subscriptions_controller.rb | 2 - .../api/web/settings_controller.rb | 2 - app/controllers/application_controller.rb | 5 + .../authorize_interactions_controller.rb | 2 +- .../concerns/rate_limit_headers.rb | 16 +- .../follower_accounts_controller.rb | 11 +- .../following_accounts_controller.rb | 11 +- .../settings/imports_controller.rb | 2 +- app/helpers/admin/action_logs_helper.rb | 75 +- app/helpers/admin/filter_helper.rb | 1 + app/helpers/admin/settings_helper.rb | 11 + app/javascript/mastodon/actions/accounts.js | 5 +- app/javascript/mastodon/actions/alerts.js | 4 +- app/javascript/mastodon/actions/compose.js | 23 +- .../mastodon/actions/identity_proofs.js | 1 + app/javascript/mastodon/actions/timelines.js | 1 + app/javascript/mastodon/common.js | 2 +- .../mastodon/components/column_header.js | 3 +- app/javascript/mastodon/components/domain.js | 2 +- .../intersection_observer_article.js | 2 +- .../mastodon/components/media_gallery.js | 2 +- app/javascript/mastodon/components/poll.js | 28 +- .../mastodon/components/scrollable_list.js | 20 +- app/javascript/mastodon/components/status.js | 8 +- .../mastodon/components/status_action_bar.js | 4 +- .../mastodon/components/status_content.js | 14 + .../mastodon/containers/domain_container.js | 2 +- .../features/account/components/header.js | 8 +- .../mastodon/features/audio/index.js | 6 +- .../mastodon/features/blocks/index.js | 2 +- .../features/compose/components/action_bar.js | 2 + .../features/compose/components/poll_form.js | 5 +- .../compose/components/privacy_dropdown.js | 8 +- .../components/conversation.js | 2 +- .../mastodon/features/domain_blocks/index.js | 8 +- .../mastodon/features/favourites/index.js | 2 +- .../features/follow_requests/index.js | 19 +- .../mastodon/features/followers/index.js | 2 +- .../mastodon/features/following/index.js | 2 +- .../components/announcements.js | 19 + .../features/getting_started/index.js | 2 +- .../mastodon/features/lists/index.js | 2 +- .../mastodon/features/mutes/index.js | 2 +- .../mastodon/features/reblogs/index.js | 2 +- .../features/status/components/action_bar.js | 4 +- .../features/status/components/card.js | 2 +- .../status/components/detailed_status.js | 2 +- .../ui/components/__tests__/column-test.js | 2 +- .../mastodon/features/video/index.js | 14 +- app/javascript/mastodon/locales/ast.json | 4 +- app/javascript/mastodon/locales/bg.json | 2 +- app/javascript/mastodon/locales/br.json | 486 ++--- app/javascript/mastodon/locales/cs.json | 6 +- app/javascript/mastodon/locales/de.json | 14 +- .../mastodon/locales/defaultMessages.json | 46 +- app/javascript/mastodon/locales/el.json | 12 +- app/javascript/mastodon/locales/en.json | 25 +- app/javascript/mastodon/locales/eo.json | 4 +- app/javascript/mastodon/locales/es-AR.json | 4 +- app/javascript/mastodon/locales/eu.json | 18 +- app/javascript/mastodon/locales/fa.json | 10 +- app/javascript/mastodon/locales/fi.json | 40 +- app/javascript/mastodon/locales/fr.json | 166 +- app/javascript/mastodon/locales/ga.json | 2 +- app/javascript/mastodon/locales/gl.json | 36 +- app/javascript/mastodon/locales/hi.json | 2 +- app/javascript/mastodon/locales/hu.json | 2 +- app/javascript/mastodon/locales/hy.json | 124 +- app/javascript/mastodon/locales/it.json | 4 +- app/javascript/mastodon/locales/ja.json | 24 +- app/javascript/mastodon/locales/kab.json | 124 +- app/javascript/mastodon/locales/kn.json | 2 +- app/javascript/mastodon/locales/ko.json | 12 +- app/javascript/mastodon/locales/lt.json | 2 +- app/javascript/mastodon/locales/lv.json | 2 +- app/javascript/mastodon/locales/mk.json | 2 +- app/javascript/mastodon/locales/ml.json | 2 +- app/javascript/mastodon/locales/mr.json | 2 +- app/javascript/mastodon/locales/ms.json | 2 +- app/javascript/mastodon/locales/nl.json | 32 +- app/javascript/mastodon/locales/nn.json | 16 +- app/javascript/mastodon/locales/pt-BR.json | 20 +- app/javascript/mastodon/locales/pt-PT.json | 34 +- app/javascript/mastodon/locales/ru.json | 18 +- app/javascript/mastodon/locales/sk.json | 12 +- app/javascript/mastodon/locales/sr.json | 130 +- app/javascript/mastodon/locales/sv.json | 6 +- app/javascript/mastodon/locales/th.json | 40 +- app/javascript/mastodon/locales/ur.json | 2 +- app/javascript/mastodon/locales/zh-CN.json | 2 +- app/javascript/mastodon/locales/zh-HK.json | 14 +- app/javascript/mastodon/locales/zh-TW.json | 14 +- app/javascript/mastodon/middleware/errors.js | 2 +- app/javascript/mastodon/reducers/compose.js | 1 - .../mastodon/reducers/notifications.js | 4 +- app/javascript/mastodon/reducers/timelines.js | 4 +- app/javascript/mastodon/selectors/index.js | 2 +- .../service_worker/web_push_notifications.js | 2 +- .../mastodon/store/configureStore.js | 2 +- app/javascript/mastodon/utils/log_out.js | 2 +- app/javascript/packs/admin.js | 6 +- app/javascript/packs/public.js | 38 +- .../styles/mastodon-light/diff.scss | 2 +- app/javascript/styles/mastodon/admin.scss | 68 +- .../styles/mastodon/components.scss | 39 +- app/javascript/styles/mastodon/polls.scss | 42 +- app/lib/activitypub/tag_manager.rb | 2 + app/lib/entity_cache.rb | 4 + app/lib/exceptions.rb | 1 + app/lib/language_detector.rb | 4 +- app/lib/rate_limiter.rb | 64 + app/models/account.rb | 21 +- app/models/account_filter.rb | 27 +- app/models/account_warning_preset.rb | 3 + app/models/admin/account_action.rb | 12 - app/models/admin/action_log_filter.rb | 81 + app/models/announcement.rb | 11 + app/models/concerns/account_interactions.rb | 16 +- app/models/concerns/attachmentable.rb | 2 +- app/models/concerns/rate_limitable.rb | 36 + app/models/email_domain_block.rb | 14 + app/models/follow.rb | 3 + app/models/follow_request.rb | 3 + app/models/media_attachment.rb | 142 +- app/models/report.rb | 11 + app/models/status.rb | 20 + app/policies/settings_policy.rb | 4 + .../rest/announcement_serializer.rb | 13 + .../rest/media_attachment_serializer.rb | 4 +- app/services/account_search_service.rb | 2 +- .../activitypub/process_account_service.rb | 25 +- app/services/fetch_resource_service.rb | 3 + app/services/follow_service.rb | 74 +- app/services/import_service.rb | 3 +- app/services/post_status_service.rb | 17 +- app/services/reblog_service.rb | 16 +- app/services/resolve_url_service.rb | 10 +- app/services/search_service.rb | 4 +- app/validators/poll_validator.rb | 2 +- app/views/admin/account_actions/new.html.haml | 2 +- app/views/admin/accounts/_account.html.haml | 2 + app/views/admin/accounts/index.html.haml | 6 + app/views/admin/accounts/show.html.haml | 15 +- .../admin/action_logs/_action_log.html.haml | 6 - app/views/admin/action_logs/index.html.haml | 24 +- .../_email_domain_block.html.haml | 10 + .../admin/email_domain_blocks/new.html.haml | 5 +- app/views/admin/settings/edit.html.haml | 11 +- .../warning_presets/_warning_preset.html.haml | 10 + .../admin/warning_presets/edit.html.haml | 3 + .../admin/warning_presets/index.html.haml | 24 +- app/views/errors/429.html.haml | 5 + .../preferences/appearance/show.html.haml | 5 +- .../preferences/notifications/show.html.haml | 8 +- .../settings/preferences/other/show.html.haml | 5 +- app/views/settings/profiles/show.html.haml | 5 +- app/views/statuses/_poll.html.haml | 10 +- .../distribute_poll_update_worker.rb | 2 +- .../synchronize_featured_collection_worker.rb | 2 +- .../after_remote_follow_request_worker.rb | 9 - app/workers/after_remote_follow_worker.rb | 9 - app/workers/backup_worker.rb | 8 +- app/workers/notification_worker.rb | 9 - app/workers/poll_expiration_notify_worker.rb | 2 +- app/workers/post_process_media_worker.rb | 34 + app/workers/processing_worker.rb | 9 - .../publish_scheduled_announcement_worker.rb | 15 +- .../publish_scheduled_status_worker.rb | 2 +- .../pubsubhubbub/confirmation_worker.rb | 9 - app/workers/pubsubhubbub/delivery_worker.rb | 9 - .../pubsubhubbub/distribution_worker.rb | 9 - .../pubsubhubbub/raw_distribution_worker.rb | 9 - app/workers/pubsubhubbub/subscribe_worker.rb | 9 - .../pubsubhubbub/unsubscribe_worker.rb | 9 - app/workers/regeneration_worker.rb | 2 +- app/workers/remote_profile_update_worker.rb | 9 - app/workers/resolve_account_worker.rb | 2 +- app/workers/salmon_worker.rb | 9 - .../scheduler/backup_cleanup_scheduler.rb | 2 +- .../scheduler/doorkeeper_cleanup_scheduler.rb | 2 +- app/workers/scheduler/email_scheduler.rb | 2 +- .../scheduler/feed_cleanup_scheduler.rb | 2 +- app/workers/scheduler/ip_cleanup_scheduler.rb | 2 +- .../scheduler/media_cleanup_scheduler.rb | 2 +- app/workers/scheduler/pghero_scheduler.rb | 2 +- .../scheduler/scheduled_statuses_scheduler.rb | 2 +- .../subscriptions_cleanup_scheduler.rb | 9 - .../scheduler/subscriptions_scheduler.rb | 9 - .../scheduler/trending_tags_scheduler.rb | 2 +- .../scheduler/user_cleanup_scheduler.rb | 2 +- app/workers/verify_account_links_worker.rb | 2 +- config/application.rb | 2 + config/deploy.rb | 2 +- .../initializers/content_security_policy.rb | 2 + config/initializers/kaminari_config.rb | 2 +- config/initializers/rack_attack.rb | 2 +- config/initializers/sidekiq.rb | 7 +- config/locales/activerecord.br.yml | 6 +- config/locales/activerecord.hy.yml | 16 + config/locales/activerecord.kab.yml | 5 + config/locales/activerecord.zh-HK.yml | 4 + config/locales/ar.yml | 70 +- config/locales/ast.yml | 3 +- config/locales/bg.yml | 2 +- config/locales/bn.yml | 2 +- config/locales/br.yml | 219 ++- config/locales/ca.yml | 50 +- config/locales/co.yml | 50 +- config/locales/cs.yml | 4 +- config/locales/cy.yml | 6 +- config/locales/da.yml | 1 - config/locales/de.yml | 50 +- config/locales/devise.br.yml | 8 + config/locales/devise.fr.yml | 20 +- config/locales/devise.hy.yml | 6 + config/locales/devise.is.yml | 4 +- config/locales/devise.kab.yml | 9 +- config/locales/devise.nn.yml | 62 +- config/locales/devise.pt-BR.yml | 106 +- config/locales/devise.pt-PT.yml | 4 +- config/locales/devise.ru.yml | 24 +- config/locales/devise.zh-HK.yml | 16 + config/locales/doorkeeper.br.yml | 51 + config/locales/doorkeeper.fr.yml | 10 +- config/locales/doorkeeper.kab.yml | 10 +- config/locales/doorkeeper.ko.yml | 4 +- config/locales/doorkeeper.nn.yml | 24 +- config/locales/doorkeeper.pt-BR.yml | 2 +- config/locales/doorkeeper.sk.yml | 4 +- config/locales/doorkeeper.th.yml | 2 +- config/locales/el.yml | 60 +- config/locales/en.yml | 51 +- config/locales/en_GB.yml | 1 - config/locales/eo.yml | 13 +- config/locales/es-AR.yml | 52 +- config/locales/es.yml | 50 +- config/locales/et.yml | 1 - config/locales/eu.yml | 21 +- config/locales/fa.yml | 59 +- config/locales/fi.yml | 19 + config/locales/fr.yml | 194 +- config/locales/gl.yml | 50 +- config/locales/hi.yml | 2 +- config/locales/hr.yml | 2 +- config/locales/hu.yml | 88 +- config/locales/hy.yml | 7 +- config/locales/id.yml | 31 +- config/locales/io.yml | 2 +- config/locales/is.yml | 54 +- config/locales/it.yml | 52 +- config/locales/ja.yml | 50 +- config/locales/kab.yml | 105 +- config/locales/kk.yml | 1 - config/locales/kn.yml | 2 +- config/locales/ko.yml | 50 +- config/locales/lt.yml | 1 - config/locales/lv.yml | 2 +- config/locales/mk.yml | 2 +- config/locales/ml.yml | 2 +- config/locales/mr.yml | 2 +- config/locales/ms.yml | 2 +- config/locales/nl.yml | 5 +- config/locales/nn.yml | 5 +- config/locales/no.yml | 1 - config/locales/oc.yml | 31 +- config/locales/pl.yml | 212 ++- config/locales/pt-BR.yml | 76 +- config/locales/pt-PT.yml | 84 +- config/locales/ru.yml | 81 +- config/locales/simple_form.ar.yml | 2 + config/locales/simple_form.ast.yml | 2 + config/locales/simple_form.br.yml | 22 + config/locales/simple_form.ca.yml | 7 + config/locales/simple_form.co.yml | 7 + config/locales/simple_form.cy.yml | 2 + config/locales/simple_form.de.yml | 9 +- config/locales/simple_form.el.yml | 20 +- config/locales/simple_form.en.yml | 11 +- config/locales/simple_form.eo.yml | 6 +- config/locales/simple_form.es-AR.yml | 7 + config/locales/simple_form.es.yml | 7 + config/locales/simple_form.eu.yml | 25 +- config/locales/simple_form.fa.yml | 13 +- config/locales/simple_form.fr.yml | 43 +- config/locales/simple_form.gl.yml | 7 + config/locales/simple_form.hu.yml | 7 + config/locales/simple_form.id.yml | 7 + config/locales/simple_form.is.yml | 7 + config/locales/simple_form.it.yml | 9 + config/locales/simple_form.ja.yml | 13 +- config/locales/simple_form.kab.yml | 20 +- config/locales/simple_form.ko.yml | 7 + config/locales/simple_form.nl.yml | 2 +- config/locales/simple_form.oc.yml | 4 + config/locales/simple_form.pl.yml | 24 + config/locales/simple_form.pt-BR.yml | 13 +- config/locales/simple_form.pt-PT.yml | 17 +- config/locales/simple_form.ru.yml | 9 +- config/locales/simple_form.sk.yml | 8 +- config/locales/simple_form.sv.yml | 3 + config/locales/simple_form.ta.yml | 9 + config/locales/simple_form.th.yml | 20 +- config/locales/simple_form.zh-CN.yml | 7 + config/locales/simple_form.zh-HK.yml | 33 + config/locales/simple_form.zh-TW.yml | 33 + config/locales/sk.yml | 29 +- config/locales/sl.yml | 1 - config/locales/sq.yml | 1 - config/locales/sr.yml | 1 - config/locales/sv.yml | 9 +- config/locales/ta.yml | 15 +- config/locales/te.yml | 2 +- config/locales/th.yml | 67 +- config/locales/tr.yml | 1 - config/locales/uk.yml | 1 - config/locales/ur.yml | 2 +- config/locales/vi.yml | 1 - config/locales/zh-CN.yml | 17 +- config/locales/zh-HK.yml | 89 +- config/locales/zh-TW.yml | 89 +- config/routes.rb | 6 +- config/webpack/development.js | 2 +- config/webpack/shared.js | 4 +- ...163405_add_hide_collections_to_accounts.rb | 5 + ...625_add_processing_to_media_attachments.rb | 5 + ...58_add_title_to_account_warning_presets.rb | 15 + ...2162302_add_status_ids_to_announcements.rb | 6 + ...43_add_parent_id_to_email_domain_blocks.rb | 5 + db/schema.rb | 8 +- dist/nginx.conf | 12 +- lib/mastodon/media_cli.rb | 113 +- lib/mastodon/redis_config.rb | 4 +- lib/mastodon/statuses_cli.rb | 8 +- lib/mastodon/version.rb | 2 +- lib/paperclip/attachment_extensions.rb | 43 + lib/paperclip/url_generator_extensions.rb | 17 + lib/paperclip/video_transcoder.rb | 18 +- lib/tasks/mastodon.rake | 15 +- package.json | 61 +- .../account_follow_controller_spec.rb | 2 +- .../admin/reports_controller_spec.rb | 20 + .../api/v1/statuses_controller_spec.rb | 46 +- spec/features/profile_spec.rb | 2 +- spec/helpers/admin/action_log_helper_spec.rb | 238 --- spec/rails_helper.rb | 2 +- spec/services/import_service_spec.rb | 8 - spec/services/post_status_service_spec.rb | 7 + yarn.lock | 1611 +++++++++++------ 409 files changed, 6155 insertions(+), 3050 deletions(-) create mode 100644 app/controllers/admin/site_uploads_controller.rb create mode 100644 app/controllers/api/v2/media_controller.rb create mode 100644 app/helpers/admin/settings_helper.rb create mode 100644 app/lib/rate_limiter.rb create mode 100644 app/models/admin/action_log_filter.rb create mode 100644 app/models/concerns/rate_limitable.rb create mode 100644 app/views/admin/warning_presets/_warning_preset.html.haml create mode 100644 app/views/errors/429.html.haml delete mode 100644 app/workers/after_remote_follow_request_worker.rb delete mode 100644 app/workers/after_remote_follow_worker.rb delete mode 100644 app/workers/notification_worker.rb create mode 100644 app/workers/post_process_media_worker.rb delete mode 100644 app/workers/processing_worker.rb delete mode 100644 app/workers/pubsubhubbub/confirmation_worker.rb delete mode 100644 app/workers/pubsubhubbub/delivery_worker.rb delete mode 100644 app/workers/pubsubhubbub/distribution_worker.rb delete mode 100644 app/workers/pubsubhubbub/raw_distribution_worker.rb delete mode 100644 app/workers/pubsubhubbub/subscribe_worker.rb delete mode 100644 app/workers/pubsubhubbub/unsubscribe_worker.rb delete mode 100644 app/workers/remote_profile_update_worker.rb delete mode 100644 app/workers/salmon_worker.rb delete mode 100644 app/workers/scheduler/subscriptions_cleanup_scheduler.rb delete mode 100644 app/workers/scheduler/subscriptions_scheduler.rb create mode 100644 db/migrate/20191212163405_add_hide_collections_to_accounts.rb create mode 100644 db/migrate/20200306035625_add_processing_to_media_attachments.rb create mode 100644 db/migrate/20200312144258_add_title_to_account_warning_presets.rb create mode 100644 db/migrate/20200312162302_add_status_ids_to_announcements.rb create mode 100644 db/migrate/20200312185443_add_parent_id_to_email_domain_blocks.rb create mode 100644 lib/paperclip/attachment_extensions.rb create mode 100644 lib/paperclip/url_generator_extensions.rb diff --git a/.circleci/config.yml b/.circleci/config.yml index 3ba027d95..dd943e327 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,6 +6,7 @@ aliases: - image: circleci/ruby:2.7-buster-node environment: &ruby_environment BUNDLE_APP_CONFIG: ./.bundle/ + BUNDLE_PATH: ./vendor/bundle/ DB_HOST: localhost DB_USER: root RAILS_ENV: test @@ -138,9 +139,10 @@ jobs: docker: - image: circleci/ruby:2.7-buster-node environment: *ruby_environment - - image: circleci/postgres:10.6-alpine + - image: circleci/postgres:12.2 environment: POSTGRES_USER: root + POSTGRES_HOST_AUTH_METHOD: trust - image: circleci/redis:5-alpine steps: - *attach_workspace @@ -157,9 +159,10 @@ jobs: docker: - image: circleci/ruby:2.7-buster-node environment: *ruby_environment - - image: circleci/postgres:10.6-alpine + - image: circleci/postgres:12.2 environment: POSTGRES_USER: root + POSTGRES_HOST_AUTH_METHOD: trust - image: circleci/redis:5-alpine <<: *test_steps @@ -168,9 +171,10 @@ jobs: docker: - image: circleci/ruby:2.6-buster-node environment: *ruby_environment - - image: circleci/postgres:10.6-alpine + - image: circleci/postgres:12.2 environment: POSTGRES_USER: root + POSTGRES_HOST_AUTH_METHOD: trust - image: circleci/redis:5-alpine <<: *test_steps @@ -179,9 +183,10 @@ jobs: docker: - image: circleci/ruby:2.5-buster-node environment: *ruby_environment - - image: circleci/postgres:10.6-alpine + - image: circleci/postgres:12.2 environment: POSTGRES_USER: root + POSTGRES_HOST_AUTH_METHOD: trust - image: circleci/redis:5-alpine <<: *test_steps diff --git a/.ruby-version b/.ruby-version index 57cf282eb..338a5b5d8 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.5 +2.6.6 diff --git a/CHANGELOG.md b/CHANGELOG.md index 33663c2ad..ad353e2ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,79 @@ Changelog All notable changes to this project will be documented in this file. +## [v3.1.3] - 2020-04-05 +### Added + +- Add ability to filter audit log in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13381)) +- Add titles to warning presets in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13252)) +- Add option to include resolved DNS records when blacklisting e-mail domains in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13254)) +- Add ability to delete files uploaded for settings in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13192)) +- Add sorting by username, creation and last activity in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13076)) +- Add explanation as to why unlocked accounts may have follow requests in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13385)) +- Add link to bookmarks to dropdown in web UI ([mayaeh](https://github.com/tootsuite/mastodon/pull/13273)) +- Add support for links to statuses in announcements to be opened in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13212), [ThibG](https://github.com/tootsuite/mastodon/pull/13250)) +- Add tooltips to audio/video player buttons in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13203)) +- Add submit button to the top of preferences pages ([guigeekz](https://github.com/tootsuite/mastodon/pull/13068)) +- Add specific rate limits for posting, following and reporting ([Gargron](https://github.com/tootsuite/mastodon/pull/13172), [Gargron](https://github.com/tootsuite/mastodon/pull/13390)) + - 300 posts every 3 hours + - 400 follows or follow requests every 24 hours + - 400 reports every 24 hours +- Add federation support for the "hide network" preference ([ThibG](https://github.com/tootsuite/mastodon/pull/11673)) +- Add `--skip-media-remove` option to `tootctl statuses remove` ([tateisu](https://github.com/tootsuite/mastodon/pull/13080)) + +### Changed + +- **Change design of polls in web UI** ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/13257), [ThibG](https://github.com/tootsuite/mastodon/pull/13313)) +- Change status click areas in web UI to be bigger ([ariasuni](https://github.com/tootsuite/mastodon/pull/13327)) +- **Change `tootctl media remove-orphans` to work for all classes** ([Gargron](https://github.com/tootsuite/mastodon/pull/13316)) +- **Change local media attachments to perform heavy processing asynchronously** ([Gargron](https://github.com/tootsuite/mastodon/pull/13210)) +- Change video uploads to always be converted to H264/MP4 ([Gargron](https://github.com/tootsuite/mastodon/pull/13220), [ThibG](https://github.com/tootsuite/mastodon/pull/13239), [ThibG](https://github.com/tootsuite/mastodon/pull/13242)) +- Change video uploads to enforce certain limits ([Gargron](https://github.com/tootsuite/mastodon/pull/13218)) + - Dimensions smaller than 1920x1200px + - Frame rate at most 60fps +- Change the tooltip "Toggle visibility" to "Hide media" in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13199)) +- Change description of privacy levels to be more intuitive in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13197)) +- Change GIF label to be displayed even when autoplay is enabled in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/13209)) +- Change the string "Hide everything from …" to "Block domain …" in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13178), [mayaeh](https://github.com/tootsuite/mastodon/pull/13221)) +- Change wording of media display preferences to be more intuitive ([ariasuni](https://github.com/tootsuite/mastodon/pull/13198)) + +### Deprecated + +- `POST /api/v1/media` → `POST /api/v2/media` ([Gargron](https://github.com/tootsuite/mastodon/pull/13210)) + +### Fixed + +- Fix `tootctl media remove-orphans` ignoring `PAPERCLIP_ROOT_PATH` ([Gargron](https://github.com/tootsuite/mastodon/pull/13375)) +- Fix returning results when searching for URL with non-zero offset ([Gargron](https://github.com/tootsuite/mastodon/pull/13377)) +- Fix pinning a column in web UI sometimes redirecting out of web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13376)) +- Fix background jobs not using locks like they are supposed to ([Gargron](https://github.com/tootsuite/mastodon/pull/13361)) +- Fix content warning being unnecessarily cleared when hiding content warning input in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13348)) +- Fix "Show more" not switching to "Show less" on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/13174)) +- Fix import overwrite option not being selectable ([noellabo](https://github.com/tootsuite/mastodon/pull/13347)) +- Fix wrong color for ellipsis in boost confirmation dialog in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13355)) +- Fix unnecessary unfollowing when importing follows with overwrite option ([noellabo](https://github.com/tootsuite/mastodon/pull/13350)) +- Fix 404 and 410 API errors being silently discarded in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13279)) +- Fix OCR not working on Safari because of unsupported worker-src CSP ([ThibG](https://github.com/tootsuite/mastodon/pull/13323)) +- Fix media not being marked sensitive when a content warning is set with no text ([ThibG](https://github.com/tootsuite/mastodon/pull/13277)) +- Fix crash after deleting announcements in web UI ([codesections](https://github.com/tootsuite/mastodon/pull/13283), [ThibG](https://github.com/tootsuite/mastodon/pull/13312)) +- Fix bookmarks not being searchable ([Kjwon15](https://github.com/tootsuite/mastodon/pull/13271), [noellabo](https://github.com/tootsuite/mastodon/pull/13293)) +- Fix reported accounts not being whitelisted from further spam checks when resolving a spam check report ([ThibG](https://github.com/tootsuite/mastodon/pull/13289)) +- Fix web UI crash in single-column mode on prehistoric browsers ([ThibG](https://github.com/tootsuite/mastodon/pull/13267)) +- Fix some timeouts when searching for URLs ([ThibG](https://github.com/tootsuite/mastodon/pull/13253)) +- Fix detailed view of direct messages displaying a 0 boost count in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13244)) +- Fix regression in “Edit media” modal in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13243)) +- Fix public posts from silenced accounts not being changed to unlisted visibility ([ThibG](https://github.com/tootsuite/mastodon/pull/13096)) +- Fix error when searching for URLs that contain the mention syntax ([ThibG](https://github.com/tootsuite/mastodon/pull/13151)) +- Fix text area above/right of emoji picker being accidentally clickable in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13148)) +- Fix too large announcements not being scrollable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13211)) +- Fix `tootctl media remove-orphans` crashing when encountering invalid media ([ThibG](https://github.com/tootsuite/mastodon/pull/13170)) +- Fix installation failing when Redis password contains special characters ([ThibG](https://github.com/tootsuite/mastodon/pull/13156)) +- Fix announcements with fully-qualified mentions to local users crashing web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13164)) + +### Security + +- Fix re-sending of e-mail confirmation not being rate limited ([Gargron](https://github.com/tootsuite/mastodon/pull/13360)) + ## [v3.1.2] - 2020-02-27 ### Added diff --git a/Dockerfile b/Dockerfile index a22efe672..0537d8fac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ FROM ubuntu:18.04 as build-dep SHELL ["bash", "-c"] # Install Node v12 (LTS) -ENV NODE_VER="12.14.0" +ENV NODE_VER="12.16.1" RUN ARCH= && \ dpkgArch="$(dpkg --print-architecture)" && \ case "${dpkgArch##*-}" in \ @@ -38,8 +38,8 @@ RUN apt update && \ make -j$(nproc) > /dev/null && \ make install_bin install_include install_lib -# Install ruby -ENV RUBY_VER="2.6.5" +# Install Ruby +ENV RUBY_VER="2.6.6" ENV CPPFLAGS="-I/opt/jemalloc/include" ENV LDFLAGS="-L/opt/jemalloc/lib/" RUN apt update && \ diff --git a/Gemfile b/Gemfile index c35b21be4..57bf27183 100644 --- a/Gemfile +++ b/Gemfile @@ -1,12 +1,12 @@ # frozen_string_literal: true source 'https://rubygems.org' -ruby '>= 2.4.0', '< 3.0.0' +ruby '>= 2.5.0', '< 3.0.0' gem 'pkg-config', '~> 1.4' gem 'puma', '~> 4.3' -gem 'rails', '~> 5.2.4' +gem 'rails', '~> 5.2.4.2' gem 'sprockets', '~> 3.7.2' gem 'thor', '~> 0.20' gem 'rack', '~> 2.2.2' @@ -20,7 +20,7 @@ gem 'makara', '~> 0.4' gem 'pghero', '~> 2.4' gem 'dotenv-rails', '~> 2.7' -gem 'aws-sdk-s3', '~> 1.60', require: false +gem 'aws-sdk-s3', '~> 1.61', require: false gem 'fog-core', '<= 2.1.0' gem 'fog-openstack', '~> 0.3', require: false gem 'paperclip', '~> 6.0' @@ -35,7 +35,7 @@ gem 'browser' gem 'charlock_holmes', '~> 0.7.7' gem 'iso-639' gem 'chewy', '~> 5.1' -gem 'cld3', '~> 3.2.6' +gem 'cld3', '~> 3.3.0' gem 'devise', '~> 4.7' gem 'devise-two-factor', '~> 3.1' @@ -48,8 +48,8 @@ gem 'omniauth-cas', '~> 1.1' gem 'omniauth-saml', '~> 1.10' gem 'omniauth', '~> 1.9' -gem 'discard', '~> 1.1' -gem 'doorkeeper', '~> 5.2' +gem 'discard', '~> 1.2' +gem 'doorkeeper', '~> 5.3' gem 'fast_blank', '~> 1.0' gem 'fastimage' gem 'goldfinger', '~> 2.1' @@ -69,7 +69,7 @@ gem 'nilsimsa', git: 'https://github.com/witgo/nilsimsa', ref: 'fd184883048b922b gem 'nokogiri', '~> 1.10' gem 'nsa', '~> 0.2' gem 'oj', '~> 3.10' -gem 'ox', '~> 2.12' +gem 'ox', '~> 2.13' gem 'parslet' gem 'parallel', '~> 1.19' gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c' @@ -84,7 +84,7 @@ gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock' gem 'rqrcode', '~> 1.1' gem 'ruby-progressbar', '~> 1.10' gem 'sanitize', '~> 5.1' -gem 'sidekiq', '~> 5.2' +gem 'sidekiq', '~> 6.0' gem 'sidekiq-scheduler', '~> 3.0' gem 'sidekiq-unique-jobs', '~> 6.0' gem 'sidekiq-bulk', '~>0.2.0' @@ -92,9 +92,9 @@ gem 'simple-navigation', '~> 4.1' gem 'simple_form', '~> 5.0' gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie' gem 'stoplight', '~> 2.2.0' -gem 'strong_migrations', '~> 0.5' +gem 'strong_migrations', '~> 0.6' gem 'tty-command', '~> 0.9', require: false -gem 'tty-prompt', '~> 0.20', require: false +gem 'tty-prompt', '~> 0.21', require: false gem 'twitter-text', '~> 1.14' gem 'tzinfo-data', '~> 1.2019' gem 'webpacker', '~> 4.2' @@ -112,7 +112,7 @@ group :development, :test do gem 'i18n-tasks', '~> 0.9', require: false gem 'pry-byebug', '~> 3.8' gem 'pry-rails', '~> 0.3' - gem 'rspec-rails', '~> 3.9' + gem 'rspec-rails', '~> 4.0' end group :production, :test do @@ -122,19 +122,19 @@ end group :test do gem 'capybara', '~> 3.31' gem 'climate_control', '~> 0.2' - gem 'faker', '~> 2.10' + gem 'faker', '~> 2.11' gem 'microformats', '~> 4.2' gem 'rails-controller-testing', '~> 1.0' gem 'rspec-sidekiq', '~> 3.0' gem 'simplecov', '~> 0.18', require: false gem 'webmock', '~> 3.8' - gem 'parallel_tests', '~> 2.30' + gem 'parallel_tests', '~> 2.32' end group :development do gem 'active_record_query_trace', '~> 1.7' gem 'annotate', '~> 3.0' - gem 'better_errors', '~> 2.5' + gem 'better_errors', '~> 2.6' gem 'binding_of_caller', '~> 0.7' gem 'bullet', '~> 6.1' gem 'letter_opener', '~> 1.7' @@ -142,10 +142,10 @@ group :development do gem 'memory_profiler' gem 'rubocop', '~> 0.79', require: false gem 'rubocop-rails', '~> 2.4', require: false - gem 'brakeman', '~> 4.7', require: false + gem 'brakeman', '~> 4.8', require: false gem 'bundler-audit', '~> 0.6', require: false - gem 'capistrano', '~> 3.11' + gem 'capistrano', '~> 3.12' gem 'capistrano-rails', '~> 1.4' gem 'capistrano-rbenv', '~> 2.1' gem 'capistrano-yarn', '~> 2.0' diff --git a/Gemfile.lock b/Gemfile.lock index 9d0b75f91..3ac0a06ed 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,25 +31,25 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (5.2.4.1) - actionpack (= 5.2.4.1) + actioncable (5.2.4.2) + actionpack (= 5.2.4.2) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.4.1) - actionpack (= 5.2.4.1) - actionview (= 5.2.4.1) - activejob (= 5.2.4.1) + actionmailer (5.2.4.2) + actionpack (= 5.2.4.2) + actionview (= 5.2.4.2) + activejob (= 5.2.4.2) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.4.1) - actionview (= 5.2.4.1) - activesupport (= 5.2.4.1) + actionpack (5.2.4.2) + actionview (= 5.2.4.2) + activesupport (= 5.2.4.2) rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.4.1) - activesupport (= 5.2.4.1) + actionview (5.2.4.2) + activesupport (= 5.2.4.2) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -60,20 +60,20 @@ GEM case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) active_record_query_trace (1.7) - activejob (5.2.4.1) - activesupport (= 5.2.4.1) + activejob (5.2.4.2) + activesupport (= 5.2.4.2) globalid (>= 0.3.6) - activemodel (5.2.4.1) - activesupport (= 5.2.4.1) - activerecord (5.2.4.1) - activemodel (= 5.2.4.1) - activesupport (= 5.2.4.1) + activemodel (5.2.4.2) + activesupport (= 5.2.4.2) + activerecord (5.2.4.2) + activemodel (= 5.2.4.2) + activesupport (= 5.2.4.2) arel (>= 9.0) - activestorage (5.2.4.1) - actionpack (= 5.2.4.1) - activerecord (= 5.2.4.1) + activestorage (5.2.4.2) + actionpack (= 5.2.4.2) + activerecord (= 5.2.4.2) marcel (~> 0.3.1) - activesupport (5.2.4.1) + activesupport (5.2.4.2) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -92,23 +92,23 @@ GEM av (0.9.0) cocaine (~> 0.5.3) aws-eventstream (1.0.3) - aws-partitions (1.261.0) - aws-sdk-core (3.86.0) + aws-partitions (1.286.0) + aws-sdk-core (3.92.0) aws-eventstream (~> 1.0, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.27.0) + aws-sdk-kms (1.30.0) aws-sdk-core (~> 3, >= 3.71.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.60.1) + aws-sdk-s3 (1.61.1) aws-sdk-core (~> 3, >= 3.83.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) - aws-sigv4 (1.1.0) + aws-sigv4 (1.1.1) aws-eventstream (~> 1.0, >= 1.0.2) bcrypt (3.1.12) - better_errors (2.5.1) + better_errors (2.6.0) coderay (>= 1.0.0) erubi (>= 1.0.0) rack (>= 0.9.0) @@ -116,10 +116,10 @@ GEM debug_inspector (>= 0.0.1) blurhash (0.1.4) ffi (~> 1.10.0) - bootsnap (1.4.5) + bootsnap (1.4.6) msgpack (~> 1.0) - brakeman (4.7.2) - browser (3.0.3) + brakeman (4.8.0) + browser (4.0.0) builder (3.2.4) bullet (6.1.0) activesupport (>= 3.0.0) @@ -128,7 +128,7 @@ GEM bundler (>= 1.2.0, < 3) thor (~> 0.18) byebug (11.1.1) - capistrano (3.11.2) + capistrano (3.12.1) airbrussh (>= 1.0.0) i18n rake (>= 10.0.0) @@ -160,13 +160,13 @@ GEM elasticsearch (>= 2.0.0) elasticsearch-dsl chunky_png (1.3.11) - cld3 (3.2.6) + cld3 (3.3.0) ffi (>= 1.1.0, < 1.12.0) climate_control (0.2.0) cocaine (0.5.8) climate_control (>= 0.0.3, < 1.0) coderay (1.1.2) - concurrent-ruby (1.1.5) + concurrent-ruby (1.1.6) connection_pool (2.2.2) crack (0.4.3) safe_yaml (~> 1.0.0) @@ -190,37 +190,37 @@ GEM devise (>= 4.0.0) rpam2 (~> 4.0) diff-lcs (1.3) - discard (1.1.0) + discard (1.2.0) activerecord (>= 4.2, < 7) docile (1.3.2) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.2.3) + doorkeeper (5.3.1) railties (>= 5) dotenv (2.7.5) dotenv-rails (2.7.5) dotenv (= 2.7.5) railties (>= 3.2, < 6.1) e2mmap (0.1.0) - elasticsearch (7.3.0) - elasticsearch-api (= 7.3.0) - elasticsearch-transport (= 7.3.0) - elasticsearch-api (7.3.0) + elasticsearch (7.5.0) + elasticsearch-api (= 7.5.0) + elasticsearch-transport (= 7.5.0) + elasticsearch-api (7.5.0) multi_json elasticsearch-dsl (0.1.8) - elasticsearch-transport (7.3.0) - faraday + elasticsearch-transport (7.5.0) + faraday (>= 0.14, < 1) multi_json encryptor (3.0.0) equatable (0.6.1) erubi (1.9.0) - et-orbi (1.1.6) + et-orbi (1.2.3) tzinfo excon (0.71.0) fabrication (2.21.0) - faker (2.10.1) + faker (2.11.0) i18n (>= 1.6, < 2) - faraday (1.0.0) + faraday (0.17.3) multipart-post (>= 1.2, < 3) fast_blank (1.0.0) fastimage (2.1.7) @@ -241,8 +241,8 @@ GEM fog-json (>= 1.0) ipaddress (>= 0.8) formatador (0.2.5) - fugit (1.1.6) - et-orbi (~> 1.1, >= 1.1.6) + fugit (1.3.3) + et-orbi (~> 1.1, >= 1.1.8) raabro (~> 1.1) fuubar (2.5.0) rspec-core (~> 3.0) @@ -265,8 +265,8 @@ GEM railties (>= 4.0.1) hamster (3.0.0) concurrent-ruby (~> 1.0) - hashdiff (1.0.0) - hashie (3.6.0) + hashdiff (1.0.1) + hashie (4.1.0) highline (2.0.3) hiredis (0.6.3) hkdf (0.3.0) @@ -287,7 +287,7 @@ GEM rainbow (>= 2.0.0) i18n (1.8.2) concurrent-ruby (~> 1.0) - i18n-tasks (0.9.30) + i18n-tasks (0.9.31) activesupport (>= 4.0.2) ast (>= 2.1.0) erubi @@ -299,19 +299,19 @@ GEM terminal-table (>= 1.5.1) idn-ruby (0.1.0) ipaddress (0.8.3) - iso-639 (0.2.8) + iso-639 (0.3.5) jaro_winkler (1.5.4) jmespath (1.4.0) json (2.3.0) json-canonicalization (0.2.0) - json-ld (3.1.0) + json-ld (3.1.2) htmlentities (~> 4.3) - json-canonicalization (~> 0.1) + json-canonicalization (~> 0.2) link_header (~> 0.0, >= 0.0.8) multi_json (~> 1.14) rack (~> 2.0) rdf (~> 3.1) - json-ld-preloaded (3.1.0) + json-ld-preloaded (3.1.2) json-ld (~> 3.1) rdf (~> 3.1) jsonapi-renderer (0.2.2) @@ -361,11 +361,11 @@ GEM mime-types (3.3.1) mime-types-data (~> 3.2015) mime-types-data (3.2019.1009) - mimemagic (0.3.3) + mimemagic (0.3.4) mini_mime (1.0.2) mini_portile2 (2.4.0) minitest (5.14.0) - msgpack (1.3.1) + msgpack (1.3.3) multi_json (1.14.1) multipart-post (2.1.1) necromancer (0.5.1) @@ -374,7 +374,7 @@ GEM net-ssh (>= 2.6.5, < 6.0.0) net-ssh (5.2.0) nio4r (2.5.2) - nokogiri (1.10.8) + nokogiri (1.10.9) mini_portile2 (~> 2.4.0) nokogumbo (2.0.1) nokogiri (~> 1.8, >= 1.8.4) @@ -383,9 +383,9 @@ GEM concurrent-ruby (~> 1.0, >= 1.0.2) sidekiq (>= 3.5) statsd-ruby (~> 1.4, >= 1.4.0) - oj (3.10.1) - omniauth (1.9.0) - hashie (>= 3.4.6, < 3.7.0) + oj (3.10.5) + omniauth (1.9.1) + hashie (>= 3.4.6) rack (>= 1.6.2, < 3) omniauth-cas (1.1.1) addressable (~> 2.3) @@ -395,7 +395,7 @@ GEM omniauth (~> 1.3, >= 1.3.2) ruby-saml (~> 1.7) orm_adapter (0.5.0) - ox (2.12.1) + ox (2.13.2) paperclip (6.0.0) activemodel (>= 4.2.0) activesupport (>= 4.2.0) @@ -406,15 +406,15 @@ GEM av (~> 0.9.0) paperclip (>= 2.5.2) parallel (1.19.1) - parallel_tests (2.30.1) + parallel_tests (2.32.0) parallel - parser (2.7.0.2) + parser (2.7.0.5) ast (~> 2.4.0) parslet (1.8.2) pastel (0.7.3) equatable (~> 0.6) tty-color (~> 0.5) - pg (1.2.2) + pg (1.2.3) pghero (2.4.1) activerecord (>= 5) pkg-config (1.4.1) @@ -435,7 +435,7 @@ GEM pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (4.0.3) - puma (4.3.1) + puma (4.3.3) nio4r (~> 2.0) pundit (2.1.0) activesupport (>= 3.0.0) @@ -445,24 +445,24 @@ GEM rack (>= 1.0, < 3) rack-cors (1.1.1) rack (>= 2.0.0) - rack-protection (2.0.7) + rack-protection (2.0.8.1) rack rack-proxy (0.6.5) rack rack-test (1.1.0) rack (>= 1.0, < 3) - rails (5.2.4.1) - actioncable (= 5.2.4.1) - actionmailer (= 5.2.4.1) - actionpack (= 5.2.4.1) - actionview (= 5.2.4.1) - activejob (= 5.2.4.1) - activemodel (= 5.2.4.1) - activerecord (= 5.2.4.1) - activestorage (= 5.2.4.1) - activesupport (= 5.2.4.1) + rails (5.2.4.2) + actioncable (= 5.2.4.2) + actionmailer (= 5.2.4.2) + actionpack (= 5.2.4.2) + actionview (= 5.2.4.2) + activejob (= 5.2.4.2) + activemodel (= 5.2.4.2) + activerecord (= 5.2.4.2) + activestorage (= 5.2.4.2) + activesupport (= 5.2.4.2) bundler (>= 1.3.0) - railties (= 5.2.4.1) + railties (= 5.2.4.2) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.4) actionpack (>= 5.0.1.x) @@ -478,9 +478,9 @@ GEM railties (>= 5.0, < 6) rails-settings-cached (0.6.6) rails (>= 4.2.0) - railties (5.2.4.1) - actionpack (= 5.2.4.1) - activesupport (= 5.2.4.1) + railties (5.2.4.2) + actionpack (= 5.2.4.2) + activesupport (= 5.2.4.2) method_source rake (>= 0.8.7) thor (>= 0.19.0, < 2.0) @@ -523,26 +523,26 @@ GEM chunky_png (~> 1.0) rqrcode_core (~> 0.1) rqrcode_core (0.1.1) - rspec-core (3.9.0) - rspec-support (~> 3.9.0) - rspec-expectations (3.9.0) + rspec-core (3.9.1) + rspec-support (~> 3.9.1) + rspec-expectations (3.9.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.9.0) - rspec-mocks (3.9.0) + rspec-mocks (3.9.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.9.0) - rspec-rails (3.9.0) - actionpack (>= 3.0) - activesupport (>= 3.0) - railties (>= 3.0) - rspec-core (~> 3.9.0) - rspec-expectations (~> 3.9.0) - rspec-mocks (~> 3.9.0) - rspec-support (~> 3.9.0) + rspec-rails (4.0.0) + actionpack (>= 4.2) + activesupport (>= 4.2) + railties (>= 4.2) + rspec-core (~> 3.9) + rspec-expectations (~> 3.9) + rspec-mocks (~> 3.9) + rspec-support (~> 3.9) rspec-sidekiq (3.0.3) rspec-core (~> 3.0, >= 3.0.0) sidekiq (>= 2.4.0) - rspec-support (3.9.0) + rspec-support (3.9.2) rubocop (0.79.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) @@ -556,38 +556,40 @@ GEM ruby-progressbar (1.10.1) ruby-saml (1.9.0) nokogiri (>= 1.5.10) - rufus-scheduler (3.5.2) - fugit (~> 1.1, >= 1.1.5) + rufus-scheduler (3.6.0) + fugit (~> 1.1, >= 1.1.6) safe_yaml (1.0.5) sanitize (5.1.0) crass (~> 1.0.2) nokogiri (>= 1.8.0) nokogumbo (~> 2.0) - sidekiq (5.2.7) - connection_pool (~> 2.2, >= 2.2.2) - rack (>= 1.5.0) - rack-protection (>= 1.5.0) - redis (>= 3.3.5, < 5) + sidekiq (6.0.4) + connection_pool (>= 2.2.2) + rack (>= 2.0.0) + rack-protection (>= 2.0.0) + redis (>= 4.1.0) sidekiq-bulk (0.2.0) sidekiq - sidekiq-scheduler (3.0.0) + sidekiq-scheduler (3.0.1) + e2mmap redis (>= 3, < 5) rufus-scheduler (~> 3.2) sidekiq (>= 3) + thwait tilt (>= 1.4.0) - sidekiq-unique-jobs (6.0.18) + sidekiq-unique-jobs (6.0.21) concurrent-ruby (~> 1.0, >= 1.0.5) sidekiq (>= 4.0, < 7.0) thor (~> 0) simple-navigation (4.1.0) activesupport (>= 2.3.2) - simple_form (5.0.1) + simple_form (5.0.2) actionpack (>= 5.0) activemodel (>= 5.0) - simplecov (0.18.2) + simplecov (0.18.5) docile (~> 1.1) simplecov-html (~> 0.11) - simplecov-html (0.12.0) + simplecov-html (0.12.2) sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) @@ -595,7 +597,7 @@ GEM actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) - sshkit (1.20.0) + sshkit (1.21.0) net-scp (>= 1.1.2) net-ssh (>= 2.8.0) stackprof (0.2.15) @@ -603,7 +605,7 @@ GEM stoplight (2.2.0) streamio-ffmpeg (3.0.2) multi_json (~> 1.8) - strong_migrations (0.5.1) + strong_migrations (0.6.2) activerecord (>= 5) temple (0.8.2) terminal-table (1.8.0) @@ -614,11 +616,11 @@ GEM thread_safe (0.3.6) thwait (0.1.0) tilt (2.0.10) - tty-color (0.5.0) + tty-color (0.5.1) tty-command (0.9.0) pastel (~> 0.7.0) - tty-cursor (0.7.0) - tty-prompt (0.20.0) + tty-cursor (0.7.1) + tty-prompt (0.21.0) necromancer (~> 0.5.0) pastel (~> 0.7.0) tty-reader (~> 0.7.0) @@ -626,10 +628,10 @@ GEM tty-cursor (~> 0.7) tty-screen (~> 0.7) wisper (~> 2.0.0) - tty-screen (0.7.0) + tty-screen (0.7.1) twitter-text (1.14.7) unf (~> 0.1.0) - tzinfo (1.2.6) + tzinfo (1.2.7) thread_safe (~> 0.1) tzinfo-data (1.2019.3) tzinfo (>= 1.0.0) @@ -640,7 +642,7 @@ GEM uniform_notifier (1.13.0) warden (1.2.8) rack (>= 2.0.6) - webmock (3.8.0) + webmock (3.8.3) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -666,35 +668,35 @@ DEPENDENCIES active_record_query_trace (~> 1.7) addressable (~> 2.7) annotate (~> 3.0) - aws-sdk-s3 (~> 1.60) - better_errors (~> 2.5) + aws-sdk-s3 (~> 1.61) + better_errors (~> 2.6) binding_of_caller (~> 0.7) blurhash (~> 0.1) bootsnap (~> 1.4) - brakeman (~> 4.7) + brakeman (~> 4.8) browser bullet (~> 6.1) bundler-audit (~> 0.6) - capistrano (~> 3.11) + capistrano (~> 3.12) capistrano-rails (~> 1.4) capistrano-rbenv (~> 2.1) capistrano-yarn (~> 2.0) capybara (~> 3.31) charlock_holmes (~> 0.7.7) chewy (~> 5.1) - cld3 (~> 3.2.6) + cld3 (~> 3.3.0) climate_control (~> 0.2) concurrent-ruby connection_pool devise (~> 4.7) devise-two-factor (~> 3.1) devise_pam_authenticatable2 (~> 9.2) - discard (~> 1.1) - doorkeeper (~> 5.2) + discard (~> 1.2) + doorkeeper (~> 5.3) dotenv-rails (~> 2.7) e2mmap (~> 0.1.0) fabrication (~> 2.21) - faker (~> 2.10) + faker (~> 2.11) fast_blank (~> 1.0) fastimage fog-core (<= 2.1.0) @@ -732,11 +734,11 @@ DEPENDENCIES omniauth (~> 1.9) omniauth-cas (~> 1.1) omniauth-saml (~> 1.10) - ox (~> 2.12) + ox (~> 2.13) paperclip (~> 6.0) paperclip-av-transcoder (~> 0.6) parallel (~> 1.19) - parallel_tests (~> 2.30) + parallel_tests (~> 2.32) parslet pg (~> 1.2) pghero (~> 2.4) @@ -751,7 +753,7 @@ DEPENDENCIES rack (~> 2.2.2) rack-attack (~> 6.2) rack-cors (~> 1.1) - rails (~> 5.2.4) + rails (~> 5.2.4.2) rails-controller-testing (~> 1.0) rails-i18n (~> 5.1) rails-settings-cached (~> 0.6) @@ -761,13 +763,13 @@ DEPENDENCIES redis-namespace (~> 1.7) redis-rails (~> 5.0) rqrcode (~> 1.1) - rspec-rails (~> 3.9) + rspec-rails (~> 4.0) rspec-sidekiq (~> 3.0) rubocop (~> 0.79) rubocop-rails (~> 2.4) ruby-progressbar (~> 1.10) sanitize (~> 5.1) - sidekiq (~> 5.2) + sidekiq (~> 6.0) sidekiq-bulk (~> 0.2.0) sidekiq-scheduler (~> 3.0) sidekiq-unique-jobs (~> 6.0) @@ -779,11 +781,11 @@ DEPENDENCIES stackprof stoplight (~> 2.2.0) streamio-ffmpeg (~> 3.0) - strong_migrations (~> 0.5) + strong_migrations (~> 0.6) thor (~> 0.20) thwait (~> 0.1.0) tty-command (~> 0.9) - tty-prompt (~> 0.20) + tty-prompt (~> 0.21) twitter-text (~> 1.14) tzinfo-data (~> 1.2019) webmock (~> 3.8) diff --git a/README.md b/README.md index 7db66abfa..9ef4acb17 100644 --- a/README.md +++ b/README.md @@ -68,8 +68,8 @@ Mastodon acts as an OAuth2 provider so 3rd party apps can use the REST and Strea **Requirements:** - **PostgreSQL** 9.5+ -- **Redis** -- **Ruby** 2.4+ +- **Redis** 4+ +- **Ruby** 2.5+ - **Node.js** 10.13+ The repository includes deployment configurations for **Docker and docker-compose**, but also a few specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**stand-alone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation. diff --git a/Vagrantfile b/Vagrantfile index 79af1dc5d..7d0f7b3de 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -91,7 +91,7 @@ VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| - config.vm.box = "ubuntu/xenial64" + config.vm.box = "ubuntu/bionic64" config.vm.provider :virtualbox do |vb| vb.name = "mastodon" diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb index f5735421c..bec9ed88b 100644 --- a/app/chewy/statuses_index.rb +++ b/app/chewy/statuses_index.rb @@ -47,6 +47,11 @@ class StatusesIndex < Chewy::Index data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } end + crutch :bookmarks do |collection| + data = ::Bookmark.where(status_id: collection.map(&:id)).where(account: Account.local).pluck(:status_id, :account_id) + data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } + end + root date_detection: false do field :id, type: 'long' field :account_id, type: 'long' diff --git a/app/controllers/account_follow_controller.rb b/app/controllers/account_follow_controller.rb index 185a355f8..33394074d 100644 --- a/app/controllers/account_follow_controller.rb +++ b/app/controllers/account_follow_controller.rb @@ -6,7 +6,7 @@ class AccountFollowController < ApplicationController before_action :authenticate_user! def create - FollowService.new.call(current_user.account, @account.acct) + FollowService.new.call(current_user.account, @account, with_rate_limit: true) redirect_to account_path(@account) end end diff --git a/app/controllers/admin/action_logs_controller.rb b/app/controllers/admin/action_logs_controller.rb index e273dfeae..2d77620df 100644 --- a/app/controllers/admin/action_logs_controller.rb +++ b/app/controllers/admin/action_logs_controller.rb @@ -2,8 +2,18 @@ module Admin class ActionLogsController < BaseController - def index - @action_logs = Admin::ActionLog.page(params[:page]) + before_action :set_action_logs + + def index; end + + private + + def set_action_logs + @action_logs = Admin::ActionLogFilter.new(filter_params).results.page(params[:page]) + end + + def filter_params + params.slice(:page, *Admin::ActionLogFilter::KEYS).permit(:page, *Admin::ActionLogFilter::KEYS) end end end diff --git a/app/controllers/admin/email_domain_blocks_controller.rb b/app/controllers/admin/email_domain_blocks_controller.rb index 9fe85064e..c25919726 100644 --- a/app/controllers/admin/email_domain_blocks_controller.rb +++ b/app/controllers/admin/email_domain_blocks_controller.rb @@ -6,12 +6,12 @@ module Admin def index authorize :email_domain_block, :index? - @email_domain_blocks = EmailDomainBlock.page(params[:page]) + @email_domain_blocks = EmailDomainBlock.where(parent_id: nil).includes(:children).order(id: :desc).page(params[:page]) end def new authorize :email_domain_block, :create? - @email_domain_block = EmailDomainBlock.new + @email_domain_block = EmailDomainBlock.new(domain: params[:_domain]) end def create @@ -21,6 +21,28 @@ module Admin if @email_domain_block.save log_action :create, @email_domain_block + + if @email_domain_block.with_dns_records? + hostnames = [] + ips = [] + + Resolv::DNS.open do |dns| + dns.timeouts = 1 + + hostnames = dns.getresources(@email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s } + + ([@email_domain_block.domain] + hostnames).uniq.each do |hostname| + ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s }) + ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::AAAA).to_a.map { |e| e.address.to_s }) + end + end + + (hostnames + ips).each do |hostname| + another_email_domain_block = EmailDomainBlock.new(domain: hostname, parent: @email_domain_block) + log_action :create, another_email_domain_block if another_email_domain_block.save + end + end + redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.created_msg') else render :new @@ -41,7 +63,7 @@ module Admin end def resource_params - params.require(:email_domain_block).permit(:domain) + params.require(:email_domain_block).permit(:domain, :with_dns_records) end end end diff --git a/app/controllers/admin/site_uploads_controller.rb b/app/controllers/admin/site_uploads_controller.rb new file mode 100644 index 000000000..cacecedb0 --- /dev/null +++ b/app/controllers/admin/site_uploads_controller.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Admin + class SiteUploadsController < BaseController + before_action :set_site_upload + + def destroy + authorize :settings, :destroy? + + @site_upload.destroy! + + redirect_to edit_admin_settings_path, notice: I18n.t('admin.site_uploads.destroyed_msg') + end + + private + + def set_site_upload + @site_upload = SiteUpload.find(params[:id]) + end + end +end diff --git a/app/controllers/admin/warning_presets_controller.rb b/app/controllers/admin/warning_presets_controller.rb index 37be842c5..b376f8d9b 100644 --- a/app/controllers/admin/warning_presets_controller.rb +++ b/app/controllers/admin/warning_presets_controller.rb @@ -7,7 +7,7 @@ module Admin def index authorize :account_warning_preset, :index? - @warning_presets = AccountWarningPreset.all + @warning_presets = AccountWarningPreset.alphabetic @warning_preset = AccountWarningPreset.new end @@ -19,7 +19,7 @@ module Admin if @warning_preset.save redirect_to admin_warning_presets_path else - @warning_presets = AccountWarningPreset.all + @warning_presets = AccountWarningPreset.alphabetic render :index end end @@ -52,7 +52,7 @@ module Admin end def warning_preset_params - params.require(:account_warning_preset).permit(:text) + params.require(:account_warning_preset).permit(:title, :text) end end end diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index 68bf425f4..153ade253 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -44,6 +44,10 @@ class Api::BaseController < ApplicationController render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503 end + rescue_from Mastodon::RateLimitExceededError do + render json: { error: I18n.t('errors.429') }, status: 429 + end + rescue_from ActionController::ParameterMissing do |e| render json: { error: e.to_s }, status: 400 end diff --git a/app/controllers/api/v1/accounts/follower_accounts_controller.rb b/app/controllers/api/v1/accounts/follower_accounts_controller.rb index e360b8a92..1daa1ed0d 100644 --- a/app/controllers/api/v1/accounts/follower_accounts_controller.rb +++ b/app/controllers/api/v1/accounts/follower_accounts_controller.rb @@ -5,8 +5,6 @@ class Api::V1::Accounts::FollowerAccountsController < Api::BaseController before_action :set_account after_action :insert_pagination_headers - respond_to :json - def index @accounts = load_accounts render json: @accounts, each_serializer: REST::AccountSerializer @@ -27,7 +25,7 @@ class Api::V1::Accounts::FollowerAccountsController < Api::BaseController end def hide_results? - (@account.user_hides_network? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account)) + (@account.hides_followers? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account)) end def default_accounts diff --git a/app/controllers/api/v1/accounts/following_accounts_controller.rb b/app/controllers/api/v1/accounts/following_accounts_controller.rb index a405b365f..6fc23cf75 100644 --- a/app/controllers/api/v1/accounts/following_accounts_controller.rb +++ b/app/controllers/api/v1/accounts/following_accounts_controller.rb @@ -5,8 +5,6 @@ class Api::V1::Accounts::FollowingAccountsController < Api::BaseController before_action :set_account after_action :insert_pagination_headers - respond_to :json - def index @accounts = load_accounts render json: @accounts, each_serializer: REST::AccountSerializer @@ -27,7 +25,7 @@ class Api::V1::Accounts::FollowingAccountsController < Api::BaseController end def hide_results? - (@account.user_hides_network? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account)) + (@account.hides_following? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account)) end def default_accounts diff --git a/app/controllers/api/v1/accounts/identity_proofs_controller.rb b/app/controllers/api/v1/accounts/identity_proofs_controller.rb index bea51ae11..8dad6fee9 100644 --- a/app/controllers/api/v1/accounts/identity_proofs_controller.rb +++ b/app/controllers/api/v1/accounts/identity_proofs_controller.rb @@ -4,8 +4,6 @@ class Api::V1::Accounts::IdentityProofsController < Api::BaseController before_action :require_user! before_action :set_account - respond_to :json - def index @proofs = @account.identity_proofs.active render json: @proofs, each_serializer: REST::IdentityProofSerializer diff --git a/app/controllers/api/v1/accounts/lists_controller.rb b/app/controllers/api/v1/accounts/lists_controller.rb index 72392453c..ccb751f8f 100644 --- a/app/controllers/api/v1/accounts/lists_controller.rb +++ b/app/controllers/api/v1/accounts/lists_controller.rb @@ -5,8 +5,6 @@ class Api::V1::Accounts::ListsController < Api::BaseController before_action :require_user! before_action :set_account - respond_to :json - def index @lists = @account.lists.where(account: current_account) render json: @lists, each_serializer: REST::ListSerializer diff --git a/app/controllers/api/v1/accounts/pins_controller.rb b/app/controllers/api/v1/accounts/pins_controller.rb index 0a0239c42..3915b5669 100644 --- a/app/controllers/api/v1/accounts/pins_controller.rb +++ b/app/controllers/api/v1/accounts/pins_controller.rb @@ -7,8 +7,6 @@ class Api::V1::Accounts::PinsController < Api::BaseController before_action :require_user! before_action :set_account - respond_to :json - def create AccountPin.create!(account: current_account, target_account: @account) render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships_presenter diff --git a/app/controllers/api/v1/accounts/relationships_controller.rb b/app/controllers/api/v1/accounts/relationships_controller.rb index ab8a0461f..1d3992a28 100644 --- a/app/controllers/api/v1/accounts/relationships_controller.rb +++ b/app/controllers/api/v1/accounts/relationships_controller.rb @@ -4,8 +4,6 @@ class Api::V1::Accounts::RelationshipsController < Api::BaseController before_action -> { doorkeeper_authorize! :read, :'read:follows' } before_action :require_user! - respond_to :json - def index accounts = Account.where(id: account_ids).select('id') # .where doesn't guarantee that our results are in the same order diff --git a/app/controllers/api/v1/accounts/search_controller.rb b/app/controllers/api/v1/accounts/search_controller.rb index 4217b527a..3061fcb7e 100644 --- a/app/controllers/api/v1/accounts/search_controller.rb +++ b/app/controllers/api/v1/accounts/search_controller.rb @@ -4,8 +4,6 @@ class Api::V1::Accounts::SearchController < Api::BaseController before_action -> { doorkeeper_authorize! :read, :'read:accounts' } before_action :require_user! - respond_to :json - def show @accounts = account_search render json: @accounts, each_serializer: REST::AccountSerializer diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb index 333db9618..114ee0a82 100644 --- a/app/controllers/api/v1/accounts/statuses_controller.rb +++ b/app/controllers/api/v1/accounts/statuses_controller.rb @@ -6,8 +6,6 @@ class Api::V1::Accounts::StatusesController < Api::BaseController after_action :insert_pagination_headers, unless: -> { truthy_param?(:pinned) } - respond_to :json - def index @statuses = load_statuses render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id) diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index d68d2715f..0080faf33 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -14,7 +14,7 @@ class Api::V1::AccountsController < Api::BaseController skip_before_action :require_authenticated_user!, only: :create - respond_to :json + override_rate_limit_headers :follow, family: :follows def show render json: @account, serializer: REST::AccountSerializer @@ -31,7 +31,7 @@ class Api::V1::AccountsController < Api::BaseController end def follow - FollowService.new.call(current_user.account, @account, reblogs: truthy_param?(:reblogs)) + FollowService.new.call(current_user.account, @account, reblogs: truthy_param?(:reblogs), with_rate_limit: true) options = @account.locked? || current_user.account.silenced? ? {} : { following_map: { @account.id => { reblogs: truthy_param?(:reblogs) } }, requested_map: { @account.id => false } } diff --git a/app/controllers/api/v1/apps/credentials_controller.rb b/app/controllers/api/v1/apps/credentials_controller.rb index 8b63d0490..0475b2d4a 100644 --- a/app/controllers/api/v1/apps/credentials_controller.rb +++ b/app/controllers/api/v1/apps/credentials_controller.rb @@ -3,8 +3,6 @@ class Api::V1::Apps::CredentialsController < Api::BaseController before_action -> { doorkeeper_authorize! :read } - respond_to :json - def show render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer, fields: %i(name website vapid_key) end diff --git a/app/controllers/api/v1/blocks_controller.rb b/app/controllers/api/v1/blocks_controller.rb index 4cff04cad..a2baeef90 100644 --- a/app/controllers/api/v1/blocks_controller.rb +++ b/app/controllers/api/v1/blocks_controller.rb @@ -5,8 +5,6 @@ class Api::V1::BlocksController < Api::BaseController before_action :require_user! after_action :insert_pagination_headers - respond_to :json - def index @accounts = load_accounts render json: @accounts, each_serializer: REST::AccountSerializer diff --git a/app/controllers/api/v1/bookmarks_controller.rb b/app/controllers/api/v1/bookmarks_controller.rb index e1b244e76..c15212f0a 100644 --- a/app/controllers/api/v1/bookmarks_controller.rb +++ b/app/controllers/api/v1/bookmarks_controller.rb @@ -5,8 +5,6 @@ class Api::V1::BookmarksController < Api::BaseController before_action :require_user! after_action :insert_pagination_headers - respond_to :json - def index @statuses = load_statuses render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id) diff --git a/app/controllers/api/v1/conversations_controller.rb b/app/controllers/api/v1/conversations_controller.rb index b19f27ebf..bc8013379 100644 --- a/app/controllers/api/v1/conversations_controller.rb +++ b/app/controllers/api/v1/conversations_controller.rb @@ -9,8 +9,6 @@ class Api::V1::ConversationsController < Api::BaseController before_action :set_conversation, except: :index after_action :insert_pagination_headers, only: :index - respond_to :json - def index @conversations = paginated_conversations render json: @conversations, each_serializer: REST::ConversationSerializer diff --git a/app/controllers/api/v1/custom_emojis_controller.rb b/app/controllers/api/v1/custom_emojis_controller.rb index 4e6d5d7c6..08b3474cc 100644 --- a/app/controllers/api/v1/custom_emojis_controller.rb +++ b/app/controllers/api/v1/custom_emojis_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class Api::V1::CustomEmojisController < Api::BaseController - respond_to :json - skip_before_action :set_cache_headers def index diff --git a/app/controllers/api/v1/domain_blocks_controller.rb b/app/controllers/api/v1/domain_blocks_controller.rb index af9e7a20f..5bb02d834 100644 --- a/app/controllers/api/v1/domain_blocks_controller.rb +++ b/app/controllers/api/v1/domain_blocks_controller.rb @@ -8,8 +8,6 @@ class Api::V1::DomainBlocksController < Api::BaseController before_action :require_user! after_action :insert_pagination_headers, only: :show - respond_to :json - def show @blocks = load_domain_blocks render json: @blocks.map(&:domain) diff --git a/app/controllers/api/v1/endorsements_controller.rb b/app/controllers/api/v1/endorsements_controller.rb index 2770c7aef..c87dbc4ce 100644 --- a/app/controllers/api/v1/endorsements_controller.rb +++ b/app/controllers/api/v1/endorsements_controller.rb @@ -5,8 +5,6 @@ class Api::V1::EndorsementsController < Api::BaseController before_action :require_user! after_action :insert_pagination_headers - respond_to :json - def index @accounts = load_accounts render json: @accounts, each_serializer: REST::AccountSerializer diff --git a/app/controllers/api/v1/favourites_controller.rb b/app/controllers/api/v1/favourites_controller.rb index db827f9d4..3e242905d 100644 --- a/app/controllers/api/v1/favourites_controller.rb +++ b/app/controllers/api/v1/favourites_controller.rb @@ -5,8 +5,6 @@ class Api::V1::FavouritesController < Api::BaseController before_action :require_user! after_action :insert_pagination_headers - respond_to :json - def index @statuses = load_statuses render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id) diff --git a/app/controllers/api/v1/featured_tags/suggestions_controller.rb b/app/controllers/api/v1/featured_tags/suggestions_controller.rb index fb27ef88b..8c1b81a0f 100644 --- a/app/controllers/api/v1/featured_tags/suggestions_controller.rb +++ b/app/controllers/api/v1/featured_tags/suggestions_controller.rb @@ -2,12 +2,9 @@ class Api::V1::FeaturedTags::SuggestionsController < Api::BaseController before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, only: :index - before_action :require_user! before_action :set_most_used_tags, only: :index - respond_to :json - def index render json: @most_used_tags, each_serializer: REST::TagSerializer end diff --git a/app/controllers/api/v1/filters_controller.rb b/app/controllers/api/v1/filters_controller.rb index e5ebaff4d..b0ace3af0 100644 --- a/app/controllers/api/v1/filters_controller.rb +++ b/app/controllers/api/v1/filters_controller.rb @@ -7,8 +7,6 @@ class Api::V1::FiltersController < Api::BaseController before_action :set_filters, only: :index before_action :set_filter, only: [:show, :update, :destroy] - respond_to :json - def index render json: @filters, each_serializer: REST::FilterSerializer end diff --git a/app/controllers/api/v1/instances/activity_controller.rb b/app/controllers/api/v1/instances/activity_controller.rb index b30e8464c..4f6b4bcbf 100644 --- a/app/controllers/api/v1/instances/activity_controller.rb +++ b/app/controllers/api/v1/instances/activity_controller.rb @@ -6,8 +6,6 @@ class Api::V1::Instances::ActivityController < Api::BaseController skip_before_action :set_cache_headers skip_before_action :require_authenticated_user!, unless: :whitelist_mode? - respond_to :json - def show expires_in 1.day, public: true render_with_cache json: :activity, expires_in: 1.day diff --git a/app/controllers/api/v1/instances/peers_controller.rb b/app/controllers/api/v1/instances/peers_controller.rb index cc00d8a6b..9fa440935 100644 --- a/app/controllers/api/v1/instances/peers_controller.rb +++ b/app/controllers/api/v1/instances/peers_controller.rb @@ -6,8 +6,6 @@ class Api::V1::Instances::PeersController < Api::BaseController skip_before_action :set_cache_headers skip_before_action :require_authenticated_user!, unless: :whitelist_mode? - respond_to :json - def index expires_in 1.day, public: true render_with_cache(expires_in: 1.day) { Account.remote.domains } diff --git a/app/controllers/api/v1/instances_controller.rb b/app/controllers/api/v1/instances_controller.rb index c323b60b4..5b5058a7b 100644 --- a/app/controllers/api/v1/instances_controller.rb +++ b/app/controllers/api/v1/instances_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class Api::V1::InstancesController < Api::BaseController - respond_to :json - skip_before_action :set_cache_headers skip_before_action :require_authenticated_user!, unless: :whitelist_mode? diff --git a/app/controllers/api/v1/media_controller.rb b/app/controllers/api/v1/media_controller.rb index 81825db15..0bb3d0d27 100644 --- a/app/controllers/api/v1/media_controller.rb +++ b/app/controllers/api/v1/media_controller.rb @@ -3,27 +3,42 @@ class Api::V1::MediaController < Api::BaseController before_action -> { doorkeeper_authorize! :write, :'write:media' } before_action :require_user! - - respond_to :json + before_action :set_media_attachment, except: [:create] + before_action :check_processing, except: [:create] def create - @media = current_account.media_attachments.create!(media_params) - render json: @media, serializer: REST::MediaAttachmentSerializer + @media_attachment = current_account.media_attachments.create!(media_attachment_params) + render json: @media_attachment, serializer: REST::MediaAttachmentSerializer rescue Paperclip::Errors::NotIdentifiedByImageMagickError render json: file_type_error, status: 422 rescue Paperclip::Error render json: processing_error, status: 500 end + def show + render json: @media_attachment, serializer: REST::MediaAttachmentSerializer, status: status_code_for_media_attachment + end + def update - @media = current_account.media_attachments.where(status_id: nil).find(params[:id]) - @media.update!(media_params) - render json: @media, serializer: REST::MediaAttachmentSerializer + @media_attachment.update!(media_attachment_params) + render json: @media_attachment, serializer: REST::MediaAttachmentSerializer, status: status_code_for_media_attachment end private - def media_params + def status_code_for_media_attachment + @media_attachment.not_processed? ? 206 : 200 + end + + def set_media_attachment + @media_attachment = current_account.media_attachments.unattached.find(params[:id]) + end + + def check_processing + render json: processing_error, status: 422 if @media_attachment.processing_failed? + end + + def media_attachment_params params.permit(:file, :description, :focus) end diff --git a/app/controllers/api/v1/mutes_controller.rb b/app/controllers/api/v1/mutes_controller.rb index df6c8e86c..65439fe9b 100644 --- a/app/controllers/api/v1/mutes_controller.rb +++ b/app/controllers/api/v1/mutes_controller.rb @@ -5,8 +5,6 @@ class Api::V1::MutesController < Api::BaseController before_action :require_user! after_action :insert_pagination_headers - respond_to :json - def index @accounts = load_accounts render json: @accounts, each_serializer: REST::AccountSerializer diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index bf3002e79..8ac227765 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -6,8 +6,6 @@ class Api::V1::NotificationsController < Api::BaseController before_action :require_user! after_action :insert_pagination_headers, only: :index - respond_to :json - DEFAULT_NOTIFICATIONS_LIMIT = 15 def index diff --git a/app/controllers/api/v1/polls/votes_controller.rb b/app/controllers/api/v1/polls/votes_controller.rb index 3fa0b6a76..e1d26106a 100644 --- a/app/controllers/api/v1/polls/votes_controller.rb +++ b/app/controllers/api/v1/polls/votes_controller.rb @@ -7,8 +7,6 @@ class Api::V1::Polls::VotesController < Api::BaseController before_action :require_user! before_action :set_poll - respond_to :json - def create VoteService.new.call(current_account, @poll, vote_params[:choices]) render json: @poll, serializer: REST::PollSerializer diff --git a/app/controllers/api/v1/polls_controller.rb b/app/controllers/api/v1/polls_controller.rb index 031e6d42d..744baf7bb 100644 --- a/app/controllers/api/v1/polls_controller.rb +++ b/app/controllers/api/v1/polls_controller.rb @@ -7,8 +7,6 @@ class Api::V1::PollsController < Api::BaseController before_action :set_poll before_action :refresh_poll - respond_to :json - def show render json: @poll, serializer: REST::PollSerializer, include_results: true end diff --git a/app/controllers/api/v1/preferences_controller.rb b/app/controllers/api/v1/preferences_controller.rb index 077d39f5d..1640a8224 100644 --- a/app/controllers/api/v1/preferences_controller.rb +++ b/app/controllers/api/v1/preferences_controller.rb @@ -4,8 +4,6 @@ class Api::V1::PreferencesController < Api::BaseController before_action -> { doorkeeper_authorize! :read, :'read:accounts' } before_action :require_user! - respond_to :json - def index render json: current_account, serializer: REST::PreferencesSerializer end diff --git a/app/controllers/api/v1/reports_controller.rb b/app/controllers/api/v1/reports_controller.rb index 1b0b4b05b..e10083d45 100644 --- a/app/controllers/api/v1/reports_controller.rb +++ b/app/controllers/api/v1/reports_controller.rb @@ -4,7 +4,7 @@ class Api::V1::ReportsController < Api::BaseController before_action -> { doorkeeper_authorize! :write, :'write:reports' }, only: [:create] before_action :require_user! - respond_to :json + override_rate_limit_headers :create, family: :reports def create @report = ReportService.new.call( diff --git a/app/controllers/api/v1/statuses/bookmarks_controller.rb b/app/controllers/api/v1/statuses/bookmarks_controller.rb index a7f1eed00..3954af3c9 100644 --- a/app/controllers/api/v1/statuses/bookmarks_controller.rb +++ b/app/controllers/api/v1/statuses/bookmarks_controller.rb @@ -7,8 +7,6 @@ class Api::V1::Statuses::BookmarksController < Api::BaseController before_action :require_user! before_action :set_status - respond_to :json - def create current_account.bookmarks.find_or_create_by!(account: current_account, status: @status) render json: @status, serializer: REST::StatusSerializer diff --git a/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb b/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb index 05f4acc33..8229786d6 100644 --- a/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb +++ b/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb @@ -7,8 +7,6 @@ class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController before_action :set_status after_action :insert_pagination_headers - respond_to :json - def index @accounts = load_accounts render json: @accounts, each_serializer: REST::AccountSerializer diff --git a/app/controllers/api/v1/statuses/favourites_controller.rb b/app/controllers/api/v1/statuses/favourites_controller.rb index f18ace996..7afa822ed 100644 --- a/app/controllers/api/v1/statuses/favourites_controller.rb +++ b/app/controllers/api/v1/statuses/favourites_controller.rb @@ -7,8 +7,6 @@ class Api::V1::Statuses::FavouritesController < Api::BaseController before_action :require_user! before_action :set_status - respond_to :json - def create FavouriteService.new.call(current_account, @status) render json: @status, serializer: REST::StatusSerializer diff --git a/app/controllers/api/v1/statuses/mutes_controller.rb b/app/controllers/api/v1/statuses/mutes_controller.rb index b02469b4f..43c7a525a 100644 --- a/app/controllers/api/v1/statuses/mutes_controller.rb +++ b/app/controllers/api/v1/statuses/mutes_controller.rb @@ -8,8 +8,6 @@ class Api::V1::Statuses::MutesController < Api::BaseController before_action :set_status before_action :set_conversation - respond_to :json - def create current_account.mute_conversation!(@conversation) @mutes_map = { @conversation.id => true } diff --git a/app/controllers/api/v1/statuses/pins_controller.rb b/app/controllers/api/v1/statuses/pins_controller.rb index 4118a8ce4..51b1621b6 100644 --- a/app/controllers/api/v1/statuses/pins_controller.rb +++ b/app/controllers/api/v1/statuses/pins_controller.rb @@ -7,8 +7,6 @@ class Api::V1::Statuses::PinsController < Api::BaseController before_action :require_user! before_action :set_status - respond_to :json - def create StatusPin.create!(account: current_account, status: @status) distribute_add_activity! diff --git a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb index fa60e7d84..6c9e49d90 100644 --- a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb +++ b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb @@ -7,8 +7,6 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController before_action :set_status after_action :insert_pagination_headers - respond_to :json - def index @accounts = load_accounts render json: @accounts, each_serializer: REST::AccountSerializer diff --git a/app/controllers/api/v1/statuses/reblogs_controller.rb b/app/controllers/api/v1/statuses/reblogs_controller.rb index 67106ccbe..7fa774a4d 100644 --- a/app/controllers/api/v1/statuses/reblogs_controller.rb +++ b/app/controllers/api/v1/statuses/reblogs_controller.rb @@ -7,10 +7,11 @@ class Api::V1::Statuses::ReblogsController < Api::BaseController before_action :require_user! before_action :set_reblog - respond_to :json + override_rate_limit_headers :create, family: :statuses def create @status = ReblogService.new.call(current_account, @reblog, reblog_params) + render json: @status, serializer: REST::StatusSerializer end diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index bba3c0651..93a253cbb 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -7,8 +7,9 @@ class Api::V1::StatusesController < Api::BaseController before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :destroy] before_action :require_user!, except: [:show, :context] before_action :set_status, only: [:show, :context] + before_action :set_thread, only: [:create] - respond_to :json + override_rate_limit_headers :create, family: :statuses # This API was originally unlimited, pagination cannot be introduced without # breaking backwards-compatibility. Arbitrarily high number to cover most @@ -36,7 +37,7 @@ class Api::V1::StatusesController < Api::BaseController def create @status = PostStatusService.new.call(current_user.account, text: status_params[:status], - thread: status_params[:in_reply_to_id].blank? ? nil : Status.find(status_params[:in_reply_to_id]), + thread: @thread, media_ids: status_params[:media_ids], sensitive: status_params[:sensitive], spoiler_text: status_params[:spoiler_text], @@ -44,7 +45,8 @@ class Api::V1::StatusesController < Api::BaseController scheduled_at: status_params[:scheduled_at], application: doorkeeper_token.application, poll: status_params[:poll], - idempotency: request.headers['Idempotency-Key']) + idempotency: request.headers['Idempotency-Key'], + with_rate_limit: true) render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer end @@ -68,6 +70,12 @@ class Api::V1::StatusesController < Api::BaseController raise ActiveRecord::RecordNotFound end + def set_thread + @thread = status_params[:in_reply_to_id].blank? ? nil : Status.find(status_params[:in_reply_to_id]) + rescue ActiveRecord::RecordNotFound + render json: { error: I18n.t('statuses.errors.in_reply_not_found') }, status: 404 + end + def status_params params.permit( :status, diff --git a/app/controllers/api/v1/streaming_controller.rb b/app/controllers/api/v1/streaming_controller.rb index ebb17608c..7cd60615a 100644 --- a/app/controllers/api/v1/streaming_controller.rb +++ b/app/controllers/api/v1/streaming_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class Api::V1::StreamingController < Api::BaseController - respond_to :json - def index if Rails.configuration.x.streaming_api_base_url != request.host redirect_to streaming_api_url, status: 301 diff --git a/app/controllers/api/v1/suggestions_controller.rb b/app/controllers/api/v1/suggestions_controller.rb index 9da2b60ae..52054160d 100644 --- a/app/controllers/api/v1/suggestions_controller.rb +++ b/app/controllers/api/v1/suggestions_controller.rb @@ -7,8 +7,6 @@ class Api::V1::SuggestionsController < Api::BaseController before_action :require_user! before_action :set_accounts - respond_to :json - def index render json: @accounts, each_serializer: REST::AccountSerializer end diff --git a/app/controllers/api/v1/timelines/home_controller.rb b/app/controllers/api/v1/timelines/home_controller.rb index ff5ede138..ae6dbcb8b 100644 --- a/app/controllers/api/v1/timelines/home_controller.rb +++ b/app/controllers/api/v1/timelines/home_controller.rb @@ -5,8 +5,6 @@ class Api::V1::Timelines::HomeController < Api::BaseController before_action :require_user!, only: [:show] after_action :insert_pagination_headers, unless: -> { @statuses.empty? } - respond_to :json - def show @statuses = load_statuses diff --git a/app/controllers/api/v1/timelines/public_controller.rb b/app/controllers/api/v1/timelines/public_controller.rb index ccc10f966..581befef1 100644 --- a/app/controllers/api/v1/timelines/public_controller.rb +++ b/app/controllers/api/v1/timelines/public_controller.rb @@ -4,8 +4,6 @@ class Api::V1::Timelines::PublicController < Api::BaseController before_action :require_user!, only: [:show], if: :require_auth? after_action :insert_pagination_headers, unless: -> { @statuses.empty? } - respond_to :json - def show @statuses = load_statuses render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id) diff --git a/app/controllers/api/v1/timelines/tag_controller.rb b/app/controllers/api/v1/timelines/tag_controller.rb index 9adc4ad29..2d6ad5a80 100644 --- a/app/controllers/api/v1/timelines/tag_controller.rb +++ b/app/controllers/api/v1/timelines/tag_controller.rb @@ -4,8 +4,6 @@ class Api::V1::Timelines::TagController < Api::BaseController before_action :load_tag after_action :insert_pagination_headers, unless: -> { @statuses.empty? } - respond_to :json - def show @statuses = load_statuses render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id) diff --git a/app/controllers/api/v1/trends_controller.rb b/app/controllers/api/v1/trends_controller.rb index bcea9857e..c875e9041 100644 --- a/app/controllers/api/v1/trends_controller.rb +++ b/app/controllers/api/v1/trends_controller.rb @@ -3,8 +3,6 @@ class Api::V1::TrendsController < Api::BaseController before_action :set_tags - respond_to :json - def index render json: @tags, each_serializer: REST::TagSerializer end diff --git a/app/controllers/api/v2/media_controller.rb b/app/controllers/api/v2/media_controller.rb new file mode 100644 index 000000000..0c1baf01d --- /dev/null +++ b/app/controllers/api/v2/media_controller.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class Api::V2::MediaController < Api::V1::MediaController + def create + @media_attachment = current_account.media_attachments.create!({ delay_processing: true }.merge(media_attachment_params)) + render json: @media_attachment, serializer: REST::MediaAttachmentSerializer, status: 202 + rescue Paperclip::Errors::NotIdentifiedByImageMagickError + render json: file_type_error, status: 422 + rescue Paperclip::Error + render json: processing_error, status: 500 + end +end diff --git a/app/controllers/api/v2/search_controller.rb b/app/controllers/api/v2/search_controller.rb index cbd9b551d..f17431dd1 100644 --- a/app/controllers/api/v2/search_controller.rb +++ b/app/controllers/api/v2/search_controller.rb @@ -8,8 +8,6 @@ class Api::V2::SearchController < Api::BaseController before_action -> { doorkeeper_authorize! :read, :'read:search' } before_action :require_user! - respond_to :json - def index @search = Search.new(search_results) render json: @search, serializer: REST::SearchSerializer diff --git a/app/controllers/api/web/embeds_controller.rb b/app/controllers/api/web/embeds_controller.rb index 4aa31695c..741ba910f 100644 --- a/app/controllers/api/web/embeds_controller.rb +++ b/app/controllers/api/web/embeds_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class Api::Web::EmbedsController < Api::Web::BaseController - respond_to :json - before_action :require_user! def create diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb index f388b17e5..7916b82fa 100644 --- a/app/controllers/api/web/push_subscriptions_controller.rb +++ b/app/controllers/api/web/push_subscriptions_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class Api::Web::PushSubscriptionsController < Api::Web::BaseController - respond_to :json - before_action :require_user! def create diff --git a/app/controllers/api/web/settings_controller.rb b/app/controllers/api/web/settings_controller.rb index e3178bf48..3d65e46ed 100644 --- a/app/controllers/api/web/settings_controller.rb +++ b/app/controllers/api/web/settings_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class Api::Web::SettingsController < Api::Web::BaseController - respond_to :json - before_action :require_user! def update diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0cfa2b386..973db6aca 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -29,6 +29,7 @@ class ApplicationController < ActionController::Base rescue_from Mastodon::NotPermittedError, with: :forbidden rescue_from HTTP::Error, OpenSSL::SSL::SSLError, with: :internal_server_error rescue_from Mastodon::RaceConditionError, with: :service_unavailable + rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests before_action :store_current_location, except: :raise_not_found, unless: :devise_controller? before_action :require_functional!, if: :user_signed_in? @@ -111,6 +112,10 @@ class ApplicationController < ActionController::Base respond_with_error(503) end + def too_many_requests + respond_with_error(429) + end + def single_user_mode? @single_user_mode ||= Rails.configuration.x.single_user_mode && Account.where('id > 0').exists? end diff --git a/app/controllers/authorize_interactions_controller.rb b/app/controllers/authorize_interactions_controller.rb index e27366ea3..29c0288d0 100644 --- a/app/controllers/authorize_interactions_controller.rb +++ b/app/controllers/authorize_interactions_controller.rb @@ -20,7 +20,7 @@ class AuthorizeInteractionsController < ApplicationController end def create - if @resource.is_a?(Account) && FollowService.new.call(current_account, @resource) + if @resource.is_a?(Account) && FollowService.new.call(current_account, @resource, with_rate_limit: true) render :success else render :error diff --git a/app/controllers/concerns/rate_limit_headers.rb b/app/controllers/concerns/rate_limit_headers.rb index b79c558d8..86fe58a71 100644 --- a/app/controllers/concerns/rate_limit_headers.rb +++ b/app/controllers/concerns/rate_limit_headers.rb @@ -3,6 +3,20 @@ module RateLimitHeaders extend ActiveSupport::Concern + class_methods do + def override_rate_limit_headers(method_name, options = {}) + around_action(only: method_name, if: :current_account) do |_controller, block| + begin + block.call + ensure + rate_limiter = RateLimiter.new(current_account, options) + rate_limit_headers = rate_limiter.to_headers + response.headers.merge!(rate_limit_headers) unless response.headers['X-RateLimit-Remaining'].present? && rate_limit_headers['X-RateLimit-Remaining'].to_i > response.headers['X-RateLimit-Remaining'].to_i + end + end + end + end + included do before_action :set_rate_limit_headers, if: :rate_limited_request? end @@ -44,7 +58,7 @@ module RateLimitHeaders end def api_throttle_data - most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_, v| v[:limit] } + most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_, v| v[:limit] - v[:count] } request.env['rack.attack.throttle_data'][most_limited_type] end diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb index 7103749ad..14e22dd1e 100644 --- a/app/controllers/follower_accounts_controller.rb +++ b/app/controllers/follower_accounts_controller.rb @@ -28,7 +28,8 @@ class FollowerAccountsController < ApplicationController render json: collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, - content_type: 'application/activity+json' + content_type: 'application/activity+json', + fields: restrict_fields_to end end end @@ -71,4 +72,12 @@ class FollowerAccountsController < ApplicationController ) end end + + def restrict_fields_to + if page_requested? || !@account.user_hides_network? + # Return all fields + else + %i(id type totalItems) + end + end end diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb index 6c8fb84d8..95849ffb9 100644 --- a/app/controllers/following_accounts_controller.rb +++ b/app/controllers/following_accounts_controller.rb @@ -28,7 +28,8 @@ class FollowingAccountsController < ApplicationController render json: collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, - content_type: 'application/activity+json' + content_type: 'application/activity+json', + fields: restrict_fields_to end end end @@ -71,4 +72,12 @@ class FollowingAccountsController < ApplicationController ) end end + + def restrict_fields_to + if page_requested? || !@account.user_hides_network? + # Return all fields + else + %i(id type totalItems) + end + end end diff --git a/app/controllers/settings/imports_controller.rb b/app/controllers/settings/imports_controller.rb index 38f2e39c1..7b8c4ae23 100644 --- a/app/controllers/settings/imports_controller.rb +++ b/app/controllers/settings/imports_controller.rb @@ -29,6 +29,6 @@ class Settings::ImportsController < Settings::BaseController end def import_params - params.require(:import).permit(:data, :type) + params.require(:import).permit(:data, :type, :mode) end end diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb index 6bc75aa56..88d6e4580 100644 --- a/app/helpers/admin/action_logs_helper.rb +++ b/app/helpers/admin/action_logs_helper.rb @@ -9,79 +9,8 @@ module Admin::ActionLogsHelper end end - def relevant_log_changes(log) - if log.target_type == 'CustomEmoji' && [:enable, :disable, :destroy].include?(log.action) - log.recorded_changes.slice('domain') - elsif log.target_type == 'CustomEmoji' && log.action == :update - log.recorded_changes.slice('domain', 'visible_in_picker') - elsif log.target_type == 'User' && [:promote, :demote].include?(log.action) - log.recorded_changes.slice('moderator', 'admin') - elsif log.target_type == 'User' && [:change_email].include?(log.action) - log.recorded_changes.slice('email', 'unconfirmed_email') - elsif log.target_type == 'DomainBlock' - log.recorded_changes.slice('severity', 'reject_media') - elsif log.target_type == 'Status' && log.action == :update - log.recorded_changes.slice('sensitive') - elsif log.target_type == 'Announcement' && log.action == :update - log.recorded_changes.slice('text', 'starts_at', 'ends_at', 'all_day') - end - end - - def log_extra_attributes(hash) - safe_join(hash.to_a.map { |key, value| safe_join([content_tag(:span, key, class: 'diff-key'), '=', log_change(value)]) }, ' ') - end - - def log_change(val) - return content_tag(:span, val, class: 'diff-neutral') unless val.is_a?(Array) - safe_join([content_tag(:span, val.first, class: 'diff-old'), content_tag(:span, val.last, class: 'diff-new')], '→') - end - - def icon_for_log(log) - case log.target_type - when 'Account', 'User' - 'user' - when 'CustomEmoji' - 'file' - when 'Report' - 'flag' - when 'DomainBlock' - 'lock' - when 'DomainAllow' - 'plus-circle' - when 'EmailDomainBlock' - 'envelope' - when 'Status' - 'pencil' - when 'AccountWarning' - 'warning' - when 'Announcement' - 'bullhorn' - end - end - - def class_for_log_icon(log) - case log.action - when :enable, :unsuspend, :unsilence, :confirm, :promote, :resolve - 'positive' - when :create - opposite_verbs?(log) ? 'negative' : 'positive' - when :update, :reset_password, :disable_2fa, :memorialize, :change_email - 'neutral' - when :demote, :silence, :disable, :suspend, :remove_avatar, :remove_header, :reopen - 'negative' - when :destroy - opposite_verbs?(log) ? 'positive' : 'negative' - else - '' - end - end - private - def opposite_verbs?(log) - %w(DomainBlock EmailDomainBlock AccountWarning).include?(log.target_type) - end - def linkable_log_target(record) case record.class.name when 'Account' @@ -99,7 +28,7 @@ module Admin::ActionLogsHelper when 'AccountWarning' link_to record.target_account.acct, admin_account_path(record.target_account_id) when 'Announcement' - link_to "##{record.id}", edit_admin_announcement_path(record.id) + link_to truncate(record.text), edit_admin_announcement_path(record.id) end end @@ -118,7 +47,7 @@ module Admin::ActionLogsHelper I18n.t('admin.action_logs.deleted_status') end when 'Announcement' - "##{attributes['id']}" + truncate(attributes['text']) end end end diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb index 6ab92939d..ba0ca9638 100644 --- a/app/helpers/admin/filter_helper.rb +++ b/app/helpers/admin/filter_helper.rb @@ -10,6 +10,7 @@ module Admin::FilterHelper InviteFilter::KEYS, RelationshipFilter::KEYS, AnnouncementFilter::KEYS, + Admin::ActionLogFilter::KEYS, ].flatten.freeze def filter_link_to(text, link_to_params, link_class_params = link_to_params) diff --git a/app/helpers/admin/settings_helper.rb b/app/helpers/admin/settings_helper.rb new file mode 100644 index 000000000..baf14ab25 --- /dev/null +++ b/app/helpers/admin/settings_helper.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Admin::SettingsHelper + def site_upload_delete_hint(hint, var) + upload = SiteUpload.find_by(var: var.to_s) + return hint unless upload + + link = link_to t('admin.site_uploads.delete'), admin_site_upload_path(upload), data: { method: :delete } + safe_join([hint, link], '
    '.html_safe) + end +end diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js index d4a824e2c..cb2c682a4 100644 --- a/app/javascript/mastodon/actions/accounts.js +++ b/app/javascript/mastodon/actions/accounts.js @@ -106,7 +106,7 @@ export function fetchAccount(id) { dispatch, getState, db.transaction('accounts', 'read').objectStore('accounts').index('id'), - id + id, ).then(() => db.close(), error => { db.close(); throw error; @@ -396,6 +396,7 @@ export function fetchFollowersFail(id, error) { type: FOLLOWERS_FETCH_FAIL, id, error, + skipNotFound: true, }; }; @@ -482,6 +483,7 @@ export function fetchFollowingFail(id, error) { type: FOLLOWING_FETCH_FAIL, id, error, + skipNotFound: true, }; }; @@ -571,6 +573,7 @@ export function fetchRelationshipsFail(error) { type: RELATIONSHIPS_FETCH_FAIL, error, skipLoading: true, + skipNotFound: true, }; }; diff --git a/app/javascript/mastodon/actions/alerts.js b/app/javascript/mastodon/actions/alerts.js index cd36d8007..1670f9c10 100644 --- a/app/javascript/mastodon/actions/alerts.js +++ b/app/javascript/mastodon/actions/alerts.js @@ -34,11 +34,11 @@ export function showAlert(title = messages.unexpectedTitle, message = messages.u }; }; -export function showAlertForError(error) { +export function showAlertForError(error, skipNotFound = false) { if (error.response) { const { data, status, statusText, headers } = error.response; - if (status === 404 || status === 410) { + if (skipNotFound && (status === 404 || status === 410)) { // Skip these errors as they are reflected in the UI return { type: ALERT_NOOP }; } diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index c3c6ff1a1..6b73fc90e 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -230,12 +230,31 @@ export function uploadCompose(files) { // Account for disparity in size of original image and resized data total += file.size - f.size; - return api(getState).post('/api/v1/media', data, { + return api(getState).post('/api/v2/media', data, { onUploadProgress: function({ loaded }){ progress[i] = loaded; dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); }, - }).then(({ data }) => dispatch(uploadComposeSuccess(data, f))); + }).then(({ status, data }) => { + // If server-side processing of the media attachment has not completed yet, + // poll the server until it is, before showing the media attachment as uploaded + + if (status === 200) { + dispatch(uploadComposeSuccess(data, f)); + } else if (status === 202) { + const poll = () => { + api(getState).get(`/api/v1/media/${data.id}`).then(response => { + if (response.status === 200) { + dispatch(uploadComposeSuccess(response.data, f)); + } else if (response.status === 206) { + setTimeout(() => poll(), 1000); + } + }).catch(error => dispatch(uploadComposeFail(error))); + }; + + poll(); + } + }); }).catch(error => dispatch(uploadComposeFail(error))); }; }; diff --git a/app/javascript/mastodon/actions/identity_proofs.js b/app/javascript/mastodon/actions/identity_proofs.js index 449debf61..103983956 100644 --- a/app/javascript/mastodon/actions/identity_proofs.js +++ b/app/javascript/mastodon/actions/identity_proofs.js @@ -27,4 +27,5 @@ export const fetchAccountIdentityProofsFail = (accountId, err) => ({ type: IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL, accountId, err, + skipNotFound: true, }); diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js index 054668655..cdd2111f8 100644 --- a/app/javascript/mastodon/actions/timelines.js +++ b/app/javascript/mastodon/actions/timelines.js @@ -149,6 +149,7 @@ export function expandTimelineFail(timeline, error, isLoadingMore) { timeline, error, skipLoading: !isLoadingMore, + skipNotFound: timeline.startsWith('account:'), }; }; diff --git a/app/javascript/mastodon/common.js b/app/javascript/mastodon/common.js index fba21316a..6818aa5d5 100644 --- a/app/javascript/mastodon/common.js +++ b/app/javascript/mastodon/common.js @@ -1,4 +1,4 @@ -import Rails from 'rails-ujs'; +import Rails from '@rails/ujs'; export function start() { require('font-awesome/css/font-awesome.css'); diff --git a/app/javascript/mastodon/components/column_header.js b/app/javascript/mastodon/components/column_header.js index ea82f9ef9..1bb583583 100644 --- a/app/javascript/mastodon/components/column_header.js +++ b/app/javascript/mastodon/components/column_header.js @@ -76,8 +76,9 @@ class ColumnHeader extends React.PureComponent { handlePin = () => { if (!this.props.pinned) { - this.historyBack(); + this.context.router.history.replace('/'); } + this.props.onPin(); } diff --git a/app/javascript/mastodon/components/domain.js b/app/javascript/mastodon/components/domain.js index 85729ca94..697065d87 100644 --- a/app/javascript/mastodon/components/domain.js +++ b/app/javascript/mastodon/components/domain.js @@ -5,7 +5,7 @@ import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; const messages = defineMessages({ - unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' }, + unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' }, }); export default @injectIntl diff --git a/app/javascript/mastodon/components/intersection_observer_article.js b/app/javascript/mastodon/components/intersection_observer_article.js index e453730ba..124b34b02 100644 --- a/app/javascript/mastodon/components/intersection_observer_article.js +++ b/app/javascript/mastodon/components/intersection_observer_article.js @@ -44,7 +44,7 @@ export default class IntersectionObserverArticle extends React.Component { intersectionObserverWrapper.observe( id, this.node, - this.handleIntersection + this.handleIntersection, ); this.componentMounted = true; diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js index cfe164a50..283d7e0a5 100644 --- a/app/javascript/mastodon/components/media_gallery.js +++ b/app/javascript/mastodon/components/media_gallery.js @@ -10,7 +10,7 @@ import { autoPlayGif, cropImages, displayMedia, useBlurhash } from '../initial_s import { decode } from 'blurhash'; const messages = defineMessages({ - toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' }, + toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Hide media' }, }); class Item extends React.PureComponent { diff --git a/app/javascript/mastodon/components/poll.js b/app/javascript/mastodon/components/poll.js index 3a17e80e7..7525a1030 100644 --- a/app/javascript/mastodon/components/poll.js +++ b/app/javascript/mastodon/components/poll.js @@ -127,15 +127,7 @@ class Poll extends ImmutablePureComponent { return (
  • - {showResults && ( - - {({ width }) => - - } - - )} - -
  • ); } diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js index 3a490e78e..65ca43911 100644 --- a/app/javascript/mastodon/components/scrollable_list.js +++ b/app/javascript/mastodon/components/scrollable_list.js @@ -82,15 +82,19 @@ export default class ScrollableList extends PureComponent { lastScrollWasSynthetic = false; scrollToTopOnMouseIdle = false; + _getScrollingElement = () => { + if (this.props.bindToDocument) { + return (document.scrollingElement || document.body); + } else { + return this.node; + } + } + setScrollTop = newScrollTop => { if (this.getScrollTop() !== newScrollTop) { this.lastScrollWasSynthetic = true; - if (this.props.bindToDocument) { - document.scrollingElement.scrollTop = newScrollTop; - } else { - this.node.scrollTop = newScrollTop; - } + this._getScrollingElement().scrollTop = newScrollTop; } }; @@ -151,15 +155,15 @@ export default class ScrollableList extends PureComponent { } getScrollTop = () => { - return this.props.bindToDocument ? document.scrollingElement.scrollTop : this.node.scrollTop; + return this._getScrollingElement().scrollTop; } getScrollHeight = () => { - return this.props.bindToDocument ? document.scrollingElement.scrollHeight : this.node.scrollHeight; + return this._getScrollingElement().scrollHeight; } getClientHeight = () => { - return this.props.bindToDocument ? document.scrollingElement.clientHeight : this.node.clientHeight; + return this._getScrollingElement().clientHeight; } updateScrollBottom = (snapshot) => { diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 0dc00cb98..075ee1b87 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -432,16 +432,10 @@ class Status extends ImmutablePureComponent {