diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index f6d90580b..f20a752fc 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -18,10 +18,12 @@ 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' },
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' },
@@ -99,7 +101,7 @@ class GettingStarted extends ImmutablePureComponent {
if (multiColumn) {
navItems.push(
,
);
@@ -107,32 +109,35 @@ 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(
);
- height += 48*3;
+ height += 48*4;
if (myAccount.get('locked')) {
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 3e511b7a6..4b9980653 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' },
@@ -43,6 +44,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,
@@ -67,6 +69,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);
}
@@ -198,6 +204,7 @@ class ActionBar extends React.PureComponent {
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js
index f78a9489a..bbb49b045 100644
--- a/app/javascript/mastodon/features/status/index.js
+++ b/app/javascript/mastodon/features/status/index.js
@@ -13,6 +13,8 @@ import Column from '../ui/components/column';
import {
favourite,
unfavourite,
+ bookmark,
+ unbookmark,
reblog,
unreblog,
pin,
@@ -234,6 +236,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;
@@ -511,6 +521,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 8a4e89b3d..16b660c51 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -21,6 +21,7 @@ import {
HashtagTimeline,
DirectTimeline,
FavouritedStatuses,
+ BookmarkedStatuses,
ListTimeline,
Directory,
} from '../../ui/util/async-components';
@@ -40,6 +41,7 @@ const componentMap = {
'HASHTAG': HashtagTimeline,
'DIRECT': DirectTimeline,
'FAVOURITES': FavouritedStatuses,
+ 'BOOKMARKS': BookmarkedStatuses,
'LIST': ListTimeline,
'DIRECTORY': Directory,
};
diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js
index 51e3ec037..e5b511270 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.js
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js
@@ -16,6 +16,8 @@ const NavigationPanel = () => (
+
+
{profile_directory &&
}
diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index f5e48ed31..b5b8b5784 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -41,6 +41,7 @@ import {
FollowRequests,
GenericNotFound,
FavouritedStatuses,
+ BookmarkedStatuses,
ListTimeline,
Blocks,
DomainBlocks,
@@ -188,6 +189,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 0084c1510..3651a5d5c 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/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 27fa7e93f..a8c5009ea 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -61,7 +61,7 @@
"column.lists": "リスト",
"column.mutes": "ミュートしたユーザー",
"column.notifications": "通知",
- "column.pins": "固定されたトゥート",
+ "column.pins": "固定された投稿",
"column.public": "連合タイムライン",
"column.status": "トゥート",
"column_back_button.label": "戻る",
@@ -78,7 +78,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}",
@@ -91,6 +91,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": "ブロック",
@@ -161,7 +163,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} を除く)",
@@ -171,6 +173,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": "返信表示",
@@ -258,7 +261,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": "ログアウト",
@@ -268,8 +272,11 @@
"navigation_bar.preferences": "ユーザー設定",
"navigation_bar.public_timeline": "連合タイムライン",
"navigation_bar.security": "セキュリティ",
+ "navigation_bar.announcements": "運営からのお知らせ",
+ "navigation_bar.trends": "トレンド",
+ "navigation_bar.bookmarks": "ブックマーク",
"notification.and_n_others": "と、その他 {count, plural, one {#} other {#}}",
- "notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました",
+ "notification.favourite": "{name}さんがあなたのトゥートに╰( ^o^)╮-=ニ=一=三★しました",
"notification.follow": "{name}さんにフォローされました",
"notification.mention": "{name}さんがあなたに返信しました",
"notification.poll": "アンケートが終了しました",
@@ -310,6 +317,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}日前",
@@ -378,6 +386,7 @@
"status.unpin": "プロフィールへの固定を解除",
"suggestions.dismiss": "隠す",
"suggestions.header": "興味あるかもしれません…",
+ "tabs_bar.admin_notifications": "Adminからのお知らせ",
"tabs_bar.federated_timeline": "連合",
"tabs_bar.home": "ホーム",
"tabs_bar.local_timeline": "ローカル",
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:
diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss
index 8ebc45b62..4a4975a21 100644
--- a/app/javascript/styles/application.scss
+++ b/app/javascript/styles/application.scss
@@ -26,3 +26,6 @@
@import 'mastodon/dashboard';
@import 'mastodon/rtl';
@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/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/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..250491a45
--- /dev/null
+++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/_variables.scss
@@ -0,0 +1,99 @@
+@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
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..7c4bcb5bf
--- /dev/null
+++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/accounts.scss
@@ -0,0 +1,194 @@
+@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
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..ce5f082b1
--- /dev/null
+++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/columns.scss
@@ -0,0 +1,335 @@
+@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
new file mode 100644
index 000000000..8abd2ad5e
--- /dev/null
+++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-button.scss
@@ -0,0 +1,60 @@
+@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
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..b84fae3be
--- /dev/null
+++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/components-dropdown.scss
@@ -0,0 +1,71 @@
+@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
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..ee45f5712
--- /dev/null
+++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/icons.scss
@@ -0,0 +1,205 @@
+@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
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..bfabd1e6e
--- /dev/null
+++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/settings.scss
@@ -0,0 +1,245 @@
+@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
new file mode 100644
index 000000000..b3f5ffae3
--- /dev/null
+++ b/app/javascript/styles/dark-gplus-theme-for-mastodon-dev/statuses.scss
@@ -0,0 +1,123 @@
+@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
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..8ae2a027a
--- /dev/null
+++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/_variables.scss
@@ -0,0 +1,99 @@
+@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
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..7c4bcb5bf
--- /dev/null
+++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/accounts.scss
@@ -0,0 +1,194 @@
+@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
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..ce5f082b1
--- /dev/null
+++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/columns.scss
@@ -0,0 +1,335 @@
+@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
new file mode 100644
index 000000000..8abd2ad5e
--- /dev/null
+++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-button.scss
@@ -0,0 +1,60 @@
+@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
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..b84fae3be
--- /dev/null
+++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/components-dropdown.scss
@@ -0,0 +1,71 @@
+@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
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..ee45f5712
--- /dev/null
+++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/icons.scss
@@ -0,0 +1,205 @@
+@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
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..bfabd1e6e
--- /dev/null
+++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/settings.scss
@@ -0,0 +1,245 @@
+@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
new file mode 100644
index 000000000..b3f5ffae3
--- /dev/null
+++ b/app/javascript/styles/gplus-theme-for-mastodon-dev/statuses.scss
@@ -0,0 +1,123 @@
+@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
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/app/javascript/styles/markdown.scss b/app/javascript/styles/markdown.scss
new file mode 100644
index 000000000..be08de0cd
--- /dev/null
+++ b/app/javascript/styles/markdown.scss
@@ -0,0 +1,266 @@
+.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/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';
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index f4f26203e..95d85269c 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -685,10 +685,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;
}
}
}
@@ -1914,7 +1933,7 @@ a.account__display-name {
}
&__inner {
- position: fixed;
+ position: static;
width: 285px;
pointer-events: auto;
height: 100%;
@@ -2283,6 +2302,7 @@ a.account__display-name {
}
.getting-started__wrapper,
+ .getting-started__trends,
.search {
margin-bottom: 10px;
}
@@ -2389,24 +2409,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 {
@@ -2798,10 +2807,8 @@ a.account__display-name {
}
&__trends {
+ background: $ui-base-color;
flex: 0 1 auto;
- opacity: 1;
- animation: fade 150ms linear;
- margin-top: 10px;
h4 {
font-size: 12px;
@@ -2827,15 +2834,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;
}
}
@@ -5877,6 +5880,12 @@ noscript {
}
}
+.embed-modal__qrcode {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
.account__moved-note {
padding: 14px 10px;
padding-bottom: 16px;
@@ -6375,7 +6384,7 @@ noscript {
font-size: 24px;
line-height: 36px;
font-weight: 500;
- text-align: right;
+ text-align: center;
padding-right: 15px;
margin-left: 5px;
color: $secondary-text-color;
@@ -6385,12 +6394,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;
}
}
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index 990b9f63e..5b4d94a7a 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
@@ -110,13 +120,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..13399069a
--- /dev/null
+++ b/app/lib/formatter_markdown.rb
@@ -0,0 +1,367 @@
+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 block_code(code, language)
+ %(
#{code.strip})
+ end
+
+ def codespan(code)
+ urlRemoved = "#{remove_url(code)}"
+ escapedCode = "#{escape_bbcode(urlRemoved)}"
+ encoded = "#{encode(escapedCode)}"
+ %(
#{code_contents(encoded)}
)
+ end
+
+ def list(contents, list_type)
+ if list_type == :unordered
+ %(
)
+ elsif list_type == :ordered
+ %(
#{contents.strip}
)
+ else
+ %(<#{list_type} class='md-contents'>#{contents.strip}#{list_type}>)
+ 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
+
+ #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(/['&\"<>\/]/, {
+ '&' => '&',
+ '<' => '<',
+ '>' => '>',
+ '"' => '"',
+ "'" => ''',
+ "/" => '/',
+ })
+ 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"),
+ extractByHTMLTagName("span")
+ ].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
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 c9cc5c610..499edbf4e 100644
--- a/app/models/concerns/account_associations.rb
+++ b/app/models/concerns/account_associations.rb
@@ -13,6 +13,7 @@ module AccountAssociations
# Timelines
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 471bb03b4..406b86cec 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -54,6 +54,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
@@ -304,6 +305,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 2dc4a1b61..08bc4d82a 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?
attribute :content, unless: :source_requested?
@@ -93,6 +94,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/app/services/backup_service.rb b/app/services/backup_service.rb
index 12e4fa8b4..fe26d7aa0 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',
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?
diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb
index af7d16aaf..d49fcfa99 100644
--- a/config/initializers/content_security_policy.rb
+++ b/config/initializers/content_security_policy.rb
@@ -9,6 +9,9 @@ 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}"
+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'])
@@ -20,7 +23,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
+ 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/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 914b3c001..a5c9caa4a 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 d9b7c2c8e..4e9c83a8f 100644
--- a/config/locales/doorkeeper.en.yml
+++ b/config/locales/doorkeeper.en.yml
@@ -125,6 +125,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
@@ -137,6 +138,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/config/locales/en.yml b/config/locales/en.yml
index c29c7f871..ab1ce9778 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1129,6 +1129,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 2649fb2a3..4e3ab2625 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -1074,6 +1074,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/routes.rb b/config/routes.rb
index 37e0cbdee..35c28a217 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -287,6 +287,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'
@@ -322,6 +325,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 :trends, only: [:index]
resources :filters, only: [:index, :create, :show, :update, :destroy]
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
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 fabeb16f3..0ec96d2b1 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -216,6 +216,16 @@ ActiveRecord::Schema.define(version: 2019_09_17_213523) 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
@@ -808,6 +818,8 @@ ActiveRecord::Schema.define(version: 2019_09_17_213523) 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
diff --git a/public/avatars/original/missing.png b/public/avatars/original/missing.png
index 34c8e45e6..fb27b84df 100644
Binary files a/public/avatars/original/missing.png and b/public/avatars/original/missing.png differ
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..79601b6e6
--- /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:bookmarks') }
+
+ 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..b79853718
--- /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:bookmarks', 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