diff --git a/.gitignore b/.gitignore
index 7d76b827511f4..ce6d6ed771c3c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -69,3 +69,7 @@ yarn-debug.log
# Ignore Docker option files
docker-compose.override.yml
+
+# Add by highemerly
+public/announcements.json
+public/server-info.html
diff --git a/Gemfile b/Gemfile
index 355b7e43f87ad..9eb93b4c5e589 100644
--- a/Gemfile
+++ b/Gemfile
@@ -10,7 +10,7 @@ gem 'puma', '~> 5.6'
gem 'rails', '~> 6.1.7'
gem 'sprockets', '~> 3.7.2'
gem 'thor', '~> 1.2'
-gem 'rack', '~> 2.2.4'
+gem 'rack', '~> 2.2.6'
gem 'hamlit-rails', '~> 0.2'
gem 'pg', '~> 1.4'
diff --git a/Gemfile.lock b/Gemfile.lock
index b6e09e5dfe105..d818a02e880ec 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -483,7 +483,7 @@ GEM
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.6.0)
- rack (2.2.4)
+ rack (2.2.6.3)
rack-attack (6.6.1)
rack (>= 1.0, < 3)
rack-cors (1.1.1)
@@ -812,7 +812,7 @@ DEPENDENCIES
pry-rails (~> 0.3)
puma (~> 5.6)
pundit (~> 2.2)
- rack (~> 2.2.4)
+ rack (~> 2.2.6)
rack-attack (~> 6.6)
rack-cors (~> 1.1)
rack-test (~> 2.0)
diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb
index 6dd4fb18b024d..6f5d0bcca79f0 100644
--- a/app/chewy/statuses_index.rb
+++ b/app/chewy/statuses_index.rb
@@ -4,30 +4,21 @@ class StatusesIndex < Chewy::Index
include FormattingHelper
settings index: { refresh_interval: '30s' }, analysis: {
- filter: {
- english_stop: {
- type: 'stop',
- stopwords: '_english_',
- },
- english_stemmer: {
- type: 'stemmer',
- language: 'english',
- },
- english_possessive_stemmer: {
- type: 'stemmer',
- language: 'possessive_english',
+ tokenizer: {
+ kuromoji_user_dict: {
+ type: 'kuromoji_tokenizer',
+ user_dictionary: 'userdic.txt',
},
},
analyzer: {
content: {
- tokenizer: 'uax_url_email',
+ type: 'custom',
+ tokenizer: 'kuromoji_user_dict',
filter: %w(
- english_possessive_stemmer
- lowercase
- asciifolding
+ kuromoji_baseform
+ kuromoji_stemmer
cjk_width
- english_stop
- english_stemmer
+ lowercase
),
},
},
diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb
index f5d5c12449b52..956d2e586f378 100644
--- a/app/controllers/settings/preferences_controller.rb
+++ b/app/controllers/settings/preferences_controller.rb
@@ -52,6 +52,7 @@ def user_settings_params
:setting_advanced_layout,
:setting_use_blurhash,
:setting_use_pending_items,
+ :setting_hidden_direct,
:setting_trends,
:setting_crop_images,
:setting_always_send_emails,
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index a9b7efc4a3dd9..3882a51edc7fd 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -520,7 +520,11 @@ export function fetchComposeSuggestions(token) {
return (dispatch, getState) => {
switch (token[0]) {
case ':':
- fetchComposeSuggestionsEmojis(dispatch, getState, token);
+ if (token[1] == '@') {
+ fetchComposeSuggestionsAccounts(dispatch, getState, token.substr(1, token.length));
+ } else {
+ fetchComposeSuggestionsEmojis(dispatch, getState, token);
+ }
break;
case '#':
fetchComposeSuggestionsTags(dispatch, getState, token);
@@ -569,6 +573,9 @@ export function selectComposeSuggestion(position, token, suggestion, path) {
} else if (suggestion.type === 'account') {
completion = getState().getIn(['accounts', suggestion.id, 'acct']);
startPosition = position;
+ if (token[0] == ':') {
+ completion = `@${completion}:`;
+ }
}
// We don't want to replace hashtags that vary only in case due to accessibility, but we need to fire off an event so that
diff --git a/app/javascript/mastodon/components/display_name.js b/app/javascript/mastodon/components/display_name.js
index e9139ab0faf7d..06a7e2a952d06 100644
--- a/app/javascript/mastodon/components/display_name.js
+++ b/app/javascript/mastodon/components/display_name.js
@@ -62,8 +62,14 @@ export default class DisplayName extends React.PureComponent {
acct = `${acct}@${localDomain}`;
}
+ let suffixClassName = 'display-name__account';
+
+ if (acct.indexOf('@') === -1) {
+ suffixClassName = suffixClassName + ' handon-local-account';
+ }
+
displayName = ;
- suffix = @{acct};
+ suffix = @{acct};
} else {
displayName = ;
suffix = ;
diff --git a/app/javascript/mastodon/components/logo.js b/app/javascript/mastodon/components/logo.js
index ee5c22496cc60..177e6d8d02e1d 100644
--- a/app/javascript/mastodon/components/logo.js
+++ b/app/javascript/mastodon/components/logo.js
@@ -1,10 +1,7 @@
import React from 'react';
const Logo = () => (
-
+
);
export default Logo;
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index a1384ba5838db..f10c29b0cc0a9 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -510,6 +510,7 @@ class Status extends ImmutablePureComponent {
{prepend}
+
diff --git a/app/javascript/mastodon/features/compose/components/announcements.js b/app/javascript/mastodon/features/compose/components/announcements.js
new file mode 100644
index 0000000000000..08d45ff181fd0
--- /dev/null
+++ b/app/javascript/mastodon/features/compose/components/announcements.js
@@ -0,0 +1,120 @@
+import React from 'react';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import Immutable from 'immutable';
+import { Link } from 'react-router-dom';
+import axios from 'axios';
+import classnames from 'classnames';
+
+class Announcement extends React.PureComponent {
+
+ static propTypes = {
+ item: ImmutablePropTypes.map,
+ }
+
+ render() {
+ const { item } = this.props;
+
+ const contents = [];
+ contents.push({item.get('body')}
);
+ if (item.get('icon')) {
+ contents.push(
+
+
+
+ );
+ }
+
+ const href = item.get('href');
+
+ const classname = classnames({
+ 'announcements2__item': true,
+ 'announcements2__item--clickable': !!href,
+ });
+
+ if (!href) {
+ return ({contents}
);
+ } else if (href.startsWith('/web/')) {
+ return ({contents});
+ } else {
+ return ({contents});
+ }
+ }
+
+}
+
+export default class Announcements extends React.PureComponent {
+
+ state = {
+ items: Announcements.cache || Immutable.Map(),
+ }
+
+ static isCacheControlled = false
+ static lastDate = null
+ static cache = null
+
+ constructor () {
+ super();
+ this.refresh();
+ }
+
+ componentWillUnmount() {
+ this.cancelPolling();
+ }
+
+ setPolling = () => {
+ this.timer = setTimeout(this.refresh, 2 * 60 * 1000);
+ }
+
+ cancelPolling = () => {
+ if (this.timer !== null) {
+ clearTimeout(this.timer);
+ this.timer = null;
+ }
+ }
+
+ deleteServiceWorkerCache = () => {
+ // files in /system/ will be cached by SW
+ if (self.caches) {
+ return caches.open('mastodon-system')
+ .then(cache => cache.delete(window.origin + '/system/announcements.json'))
+ .catch(() => {});
+ } else {
+ return Promise.resolve();
+ }
+ }
+
+ refresh = () => {
+ this.timer = null;
+
+ axios.get('/announcements.json', {
+ headers: {
+ 'If-Modified-Since': !Announcements.isCacheControlled && Announcements.lastDate || '',
+ },
+ })
+ .then(resp => {
+ Announcements.isCacheControlled = !!resp.headers['cache-control'];
+ Announcements.lastDate = resp.headers['last-modified'];
+ return resp;
+ })
+ .then(resp => this.setState({ items: Announcements.cache = Immutable.fromJS(resp.data) || {} }))
+ .catch(err => err.response.status !== 304 && console.warn(err))
+ .then(this.deleteServiceWorkerCache)
+ .then(this.setPolling)
+ .catch(err => err && console.warn(err));
+ }
+
+ render() {
+ const { items } = this.state;
+
+ return (
+
+ {items.entrySeq().map(([key, item]) =>
+ (-
+
+
)
+ )}
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/compose/components/poll_form.js b/app/javascript/mastodon/features/compose/components/poll_form.js
index ede29b8a08a97..763343d7d65b1 100644
--- a/app/javascript/mastodon/features/compose/components/poll_form.js
+++ b/app/javascript/mastodon/features/compose/components/poll_form.js
@@ -157,13 +157,16 @@ class PollForm extends ImmutablePureComponent {
-
+
{/* eslint-disable-next-line jsx-a11y/no-onchange */}
-
+
);
}
diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js
index 52a8458fbb5cc..d47a45c4bc782 100644
--- a/app/javascript/mastodon/features/emoji/emoji.js
+++ b/app/javascript/mastodon/features/emoji/emoji.js
@@ -21,8 +21,10 @@ const emojiFilename = (filename) => {
const domParser = new DOMParser();
-const emojifyTextNode = (node, customEmojis) => {
+const emojifyTextNode = (node, customEmojis, natural) => {
let str = node.textContent;
+ let contentNaturalFlag = natural;
+ let contentEmojiFlag = false;
const fragment = new DocumentFragment();
@@ -31,10 +33,12 @@ const emojifyTextNode = (node, customEmojis) => {
if (customEmojis === null) {
while (i < str.length && !(match = trie.search(str.slice(i)))) {
+ contentNaturalFlag = true;
i += str.codePointAt(i) < 65536 ? 1 : 2;
}
} else {
while (i < str.length && str[i] !== ':' && !(match = trie.search(str.slice(i)))) {
+ contentNaturalFlag = true;
i += str.codePointAt(i) < 65536 ? 1 : 2;
}
}
@@ -51,7 +55,9 @@ const emojifyTextNode = (node, customEmojis) => {
// if you want additional emoji handler, add statements below which set replacement and return true.
if (shortname in customEmojis) {
const filename = autoPlayGif ? customEmojis[shortname].url : customEmojis[shortname].static_url;
- replacement = ``;
+ const classname = contentEmojiFlag ? 'emojione custom-emoji' : 'emojione custom-emoji handon-emojione-first'
+ contentEmojiFlag = true;
+ replacement = ``;
return true;
}
return false;
@@ -77,30 +83,37 @@ const emojifyTextNode = (node, customEmojis) => {
fragment.append(document.createTextNode(str));
node.parentElement.replaceChild(fragment, node);
+ return contentNaturalFlag;
};
-const emojifyNode = (node, customEmojis) => {
+const emojifyNode = (node, customEmojis, contentNaturalFlag) => {
for (const child of node.childNodes) {
switch(child.nodeType) {
case Node.TEXT_NODE:
- emojifyTextNode(child, customEmojis);
+ contentNaturalFlag = emojifyTextNode(child, customEmojis, contentNaturalFlag);
break;
case Node.ELEMENT_NODE:
if (!child.classList.contains('invisible'))
- emojifyNode(child, customEmojis);
+ contentNaturalFlag = emojifyNode(child, customEmojis, contentNaturalFlag);
break;
}
}
+ return contentNaturalFlag;
};
const emojify = (str, customEmojis = {}) => {
+ let contentNatural;
const wrapper = document.createElement('div');
wrapper.innerHTML = str;
if (!Object.keys(customEmojis).length)
customEmojis = null;
- emojifyNode(wrapper, customEmojis);
+ contentNatural = emojifyNode(wrapper, customEmojis, false);
+
+ if (!contentNatural) {
+ wrapper.innerHTML = '' + wrapper.innerHTML + '';
+ }
return wrapper.innerHTML;
};
diff --git a/app/javascript/mastodon/features/ui/components/compose_panel.js b/app/javascript/mastodon/features/ui/components/compose_panel.js
index 92d16b5b34e05..a8598d3af8f4d 100644
--- a/app/javascript/mastodon/features/ui/components/compose_panel.js
+++ b/app/javascript/mastodon/features/ui/components/compose_panel.js
@@ -6,6 +6,7 @@ import ComposeFormContainer from 'mastodon/features/compose/containers/compose_f
import NavigationContainer from 'mastodon/features/compose/containers/navigation_container';
import LinkFooter from './link_footer';
import ServerBanner from 'mastodon/components/server_banner';
+import Announcements from 'mastodon/features/compose/components/announcements';
import { changeComposing, mountCompose, unmountCompose } from 'mastodon/actions/compose';
export default @connect()
@@ -57,6 +58,7 @@ class ComposePanel extends React.PureComponent {
+
)}
diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js
index 9a9309be059a6..366aa91e2a64c 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.js
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js
@@ -26,6 +26,7 @@ const messages = defineMessages({
followsAndFollowers: { id: 'navigation_bar.follows_and_followers', defaultMessage: 'Follows and followers' },
about: { id: 'navigation_bar.about', defaultMessage: 'About' },
search: { id: 'navigation_bar.search', defaultMessage: 'Search' },
+ post: { id: 'compose_form.publish', defaultMessage: 'Toot!' },
});
export default @injectIntl
@@ -91,6 +92,8 @@ class NavigationPanel extends React.Component {
+
+
)}
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index b8cb2479918b6..8e6d20c022f84 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -137,7 +137,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Publish",
+ "compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index fbf8ab628eaee..30954095d009d 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -137,7 +137,7 @@
"compose_form.poll.remove_option": "この項目を削除",
"compose_form.poll.switch_to_multiple": "複数選択に変更",
"compose_form.poll.switch_to_single": "単一選択に変更",
- "compose_form.publish": "投稿",
+ "compose_form.publish": "トゥート",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "変更を保存",
"compose_form.sensitive.hide": "メディアを閲覧注意にする",
diff --git a/app/javascript/mastodon/utils/resize_image.js b/app/javascript/mastodon/utils/resize_image.js
index fb8c3c11e6ae9..59513a085a124 100644
--- a/app/javascript/mastodon/utils/resize_image.js
+++ b/app/javascript/mastodon/utils/resize_image.js
@@ -1,6 +1,6 @@
import EXIF from 'exif-js';
-const MAX_IMAGE_PIXELS = 2073600; // 1920x1080px
+const MAX_IMAGE_PIXELS = 4147200; // 2880x1440px
const _browser_quirks = {};
diff --git a/app/javascript/styles/contrast.scss b/app/javascript/styles/contrast.scss
index 5b43aecbe7d87..065002d980efc 100644
--- a/app/javascript/styles/contrast.scss
+++ b/app/javascript/styles/contrast.scss
@@ -1,3 +1,4 @@
@import 'contrast/variables';
@import 'application';
@import 'contrast/diff';
+@import 'handon/compatibility';
diff --git a/app/javascript/styles/default.scss b/app/javascript/styles/default.scss
new file mode 100644
index 0000000000000..5fb01fd1611fe
--- /dev/null
+++ b/app/javascript/styles/default.scss
@@ -0,0 +1,2 @@
+@import 'application';
+@import 'handon/compatibility';
diff --git a/app/javascript/styles/handon-blacklead.scss b/app/javascript/styles/handon-blacklead.scss
new file mode 100644
index 0000000000000..601ff2f0eb3b4
--- /dev/null
+++ b/app/javascript/styles/handon-blacklead.scss
@@ -0,0 +1,4 @@
+@import 'application';
+@import 'handon/blacklead/variables';
+@import 'handon/handon';
+@import 'mods/blacklead';
diff --git a/app/javascript/styles/handon-cantadark.scss b/app/javascript/styles/handon-cantadark.scss
new file mode 100644
index 0000000000000..514cb9b3fa2ba
--- /dev/null
+++ b/app/javascript/styles/handon-cantadark.scss
@@ -0,0 +1,4 @@
+@import 'application';
+@import 'handon/cantadark/variables';
+@import 'handon/handon';
+@import 'mods/cantadark';
diff --git a/app/javascript/styles/handon-contrast.scss b/app/javascript/styles/handon-contrast.scss
new file mode 100644
index 0000000000000..287956c0b9bb6
--- /dev/null
+++ b/app/javascript/styles/handon-contrast.scss
@@ -0,0 +1,5 @@
+@import 'contrast/variables';
+@import 'application';
+@import 'contrast/diff';
+@import 'handon/contrast/variables';
+@import 'handon/handon';
diff --git a/app/javascript/styles/handon-default.scss b/app/javascript/styles/handon-default.scss
new file mode 100644
index 0000000000000..4fa87bba3923d
--- /dev/null
+++ b/app/javascript/styles/handon-default.scss
@@ -0,0 +1,3 @@
+@import 'application';
+@import 'handon/default/variables';
+@import 'handon/handon';
diff --git a/app/javascript/styles/handon-light.scss b/app/javascript/styles/handon-light.scss
new file mode 100644
index 0000000000000..0ddb3fcb45feb
--- /dev/null
+++ b/app/javascript/styles/handon-light.scss
@@ -0,0 +1,5 @@
+@import 'mastodon-light/variables';
+@import 'application';
+@import 'mastodon-light/diff';
+@import 'handon/light/variables';
+@import 'handon/handon';
diff --git a/app/javascript/styles/handon/blacklead/variables.scss b/app/javascript/styles/handon/blacklead/variables.scss
new file mode 100644
index 0000000000000..147a955eed761
--- /dev/null
+++ b/app/javascript/styles/handon/blacklead/variables.scss
@@ -0,0 +1,5 @@
+$lock-color: #a0a1a1;
+$envelop-color: #a0a1a1;
+
+$announcements2-background-color: #2f2f2f !default;
+$announcements2-color: #a0a1a1 !default;
diff --git a/app/javascript/styles/handon/cantadark/variables.scss b/app/javascript/styles/handon/cantadark/variables.scss
new file mode 100644
index 0000000000000..298a064ad7ecb
--- /dev/null
+++ b/app/javascript/styles/handon/cantadark/variables.scss
@@ -0,0 +1,5 @@
+$lock-color: #ffaa00;
+$envelop-color: #ffaa00;
+
+$announcements2-background-color: #505050 !default;
+$announcements2-color: $white !default;
diff --git a/app/javascript/styles/handon/compatibility.scss b/app/javascript/styles/handon/compatibility.scss
new file mode 100644
index 0000000000000..01f7ef0242b35
--- /dev/null
+++ b/app/javascript/styles/handon/compatibility.scss
@@ -0,0 +1,18 @@
+.announcements2 {
+ display: none;
+}
+.drawer__inner__mastodon > img {
+ display: none;
+}
+
+.handon-only-visible {
+ display: none;
+ margin: 0;
+ padding: 0;
+}
+
+div.columns-area__panels__pane__inner a.column-link[href="/publish"] {
+ display: none;
+ width: 0;
+}
+
diff --git a/app/javascript/styles/handon/contrast/variables.scss b/app/javascript/styles/handon/contrast/variables.scss
new file mode 100644
index 0000000000000..9f3519f670781
--- /dev/null
+++ b/app/javascript/styles/handon/contrast/variables.scss
@@ -0,0 +1,5 @@
+$lock-color: #fffacd;
+$envelop-color: #FD0;
+
+$announcements2-background-color: $white !default;
+$announcements2-color: $black !default;
diff --git a/app/javascript/styles/handon/default/variables.scss b/app/javascript/styles/handon/default/variables.scss
new file mode 100644
index 0000000000000..7af325e0ae3e2
--- /dev/null
+++ b/app/javascript/styles/handon/default/variables.scss
@@ -0,0 +1,5 @@
+$lock-color: #fffacd;
+$envelop-color: #FD0;
+
+$announcements2-background-color: $white !default;
+$announcements2-color: $ui-base-color !default;
diff --git a/app/javascript/styles/handon/handon.scss b/app/javascript/styles/handon/handon.scss
new file mode 100644
index 0000000000000..049446e5a9998
--- /dev/null
+++ b/app/javascript/styles/handon/handon.scss
@@ -0,0 +1,132 @@
+@import '../mods/announcements.scss';
+
+/* Change visibility icon color (Followers-only) */
+.status .fa-lock:before {
+ color: $lock-color !important ;
+}
+.detailed-status .fa-lock:before {
+ color: $lock-color !important ;
+}
+/* Change visibility icon color (Direct) */
+.status .fa-at::before {
+ color: $envelop-color !important ;
+}
+.detailed-status .fa-at::before {
+ color: $envelop-color !important ;
+}
+/* Disable visibility icon when it is public */
+.status-public .fa-globe:before {
+ display: none !important ;
+}
+
+/* TL view: contract spaces*/
+.status {
+ padding: 10px 16px 8px 16px !important;
+}
+.status div.status__info {
+ margin-bottom: 6px;
+}
+.status div.status__action-bar {
+ margin-top: 6px;
+}
+.status div.status__prepend {
+ padding-top: 8px;
+}
+
+.status span.display-name__account {
+ font-size: 0.9em;
+}
+
+.status div.status__avatar div.account__avatar {
+ width: 40px !important;
+ height: 40px !important;
+}
+
+.status div.status__avatar div.account__avatar-overlay {
+ width: 40px !important;
+ height: 40px !important;
+}
+
+.status div.status__avatar div.account__avatar-overlay div.account__avatar-overlay-base div.account__avatar {
+ width: 35px !important;
+ height: 35px !important;
+}
+
+.status div.status__avatar div.account__avatar-overlay div.account__avatar-overlay-overlay div.account__avatar {
+ width: 23px !important;
+ height: 23px !important;
+}
+
+.ui__header .ui__header__links div.account__avatar {
+ width: 30px !important;
+ height: 30px !important;
+}
+
+/* Contract side bar */
+@media screen and (max-width: 889px){
+ .columns-area__panels__pane--navigational .columns-area__panels__pane__inner {
+ width: 51px !important;
+ }
+ .columns-area__panels__pane--navigational {
+ width: 51px !important;
+ min-width: 51px !important;
+ }
+ .columns-area__panels__main {
+ width: calc(100% - 51px) !important;
+ }
+}
+
+.columns-area__panels .column-link {
+ padding: 15px 13px;
+}
+
+/* Add post button to side bar */
+//div.ui__header div.ui__header__links a[href="/publish"] {
+// display: none;
+//}
+
+div.columns-area__panels__pane__inner a.column-link[href="/publish"] {
+ background-color: #595aff;
+ border: 6px;
+ border-radius: 6px;
+ color: $white;
+}
+
+div.columns-area__panels__pane__inner a.column-link.active[href="/publish"] {
+ display: none;
+}
+
+/* Contract top navi bar */
+
+@media screen and (max-width: 1174px) {
+ .ui__header {
+ height: 45px !important;
+ }
+ .tabs-bar__wrapper {
+ //height: 45px !important;
+ top: 45px !important;
+ }
+}
+
+.ui__header .ui__header__links .button {
+ padding: 5px 19px;
+}
+
+.ui__header_ .ui__header__logo {
+ padding: 1px 3px 1px 15px;
+}
+
+/* Change color of display-name who is belong to handon.club */
+.status .handon-local-account {
+ color: #ff6347 !important ;
+}
+
+/* Enlarge custom emojis */
+p > .emojione[alt^=":"]:active {
+ width: 7em; height: 7em; margin: 0;
+}
+
+/* Stamp feature for emojis */
+span.handon-emoji-only-content > p:only-child > .handon-emojione-first[alt^=":"] {
+ width: 7em; height: 7em; margin: 0;
+}
diff --git a/app/javascript/styles/handon/light/variables.scss b/app/javascript/styles/handon/light/variables.scss
new file mode 100644
index 0000000000000..0050f0f404eea
--- /dev/null
+++ b/app/javascript/styles/handon/light/variables.scss
@@ -0,0 +1,5 @@
+$lock-color: #ffa500;
+$envelop-color: #0000cd;
+
+$announcements2-background-color: $white !default;
+$announcements2-color: $black !default;
diff --git a/app/javascript/styles/instance-ticker-type1-blacklead.scss b/app/javascript/styles/instance-ticker-type1-blacklead.scss
new file mode 100644
index 0000000000000..fc721ce5845fd
--- /dev/null
+++ b/app/javascript/styles/instance-ticker-type1-blacklead.scss
@@ -0,0 +1,6 @@
+@import 'application';
+@import 'handon/blacklead/variables';
+@import 'handon/handon';
+@import 'mods/instance-ticker';
+@import url("https://34.si/402/1.css");
+@import 'mods/blacklead';
diff --git a/app/javascript/styles/instance-ticker-type1-cantadark.scss b/app/javascript/styles/instance-ticker-type1-cantadark.scss
new file mode 100644
index 0000000000000..8a4f9e6c58f25
--- /dev/null
+++ b/app/javascript/styles/instance-ticker-type1-cantadark.scss
@@ -0,0 +1,6 @@
+@import 'application';
+@import 'handon/cantadark/variables';
+@import 'handon/handon';
+@import 'mods/instance-ticker';
+@import url("https://34.si/402/1.css");
+@import 'mods/cantadark';
diff --git a/app/javascript/styles/instance-ticker-type1-contrast.scss b/app/javascript/styles/instance-ticker-type1-contrast.scss
new file mode 100644
index 0000000000000..ae1c771e439ab
--- /dev/null
+++ b/app/javascript/styles/instance-ticker-type1-contrast.scss
@@ -0,0 +1,7 @@
+@import 'contrast/variables';
+@import 'application';
+@import 'contrast/diff';
+@import 'handon/contrast/variables';
+@import 'handon/handon';
+@import 'mods/instance-ticker';
+@import url("https://34.si/402/1.css");
diff --git a/app/javascript/styles/instance-ticker-type1-default.scss b/app/javascript/styles/instance-ticker-type1-default.scss
new file mode 100644
index 0000000000000..2db7fb5f704b0
--- /dev/null
+++ b/app/javascript/styles/instance-ticker-type1-default.scss
@@ -0,0 +1,5 @@
+@import 'application';
+@import 'handon/default/variables';
+@import 'handon/handon';
+@import 'mods/instance-ticker';
+@import url("https://34.si/402/1.css");
diff --git a/app/javascript/styles/instance-ticker-type1-light.scss b/app/javascript/styles/instance-ticker-type1-light.scss
new file mode 100644
index 0000000000000..137413f7db89e
--- /dev/null
+++ b/app/javascript/styles/instance-ticker-type1-light.scss
@@ -0,0 +1,7 @@
+@import 'mastodon-light/variables';
+@import 'application';
+@import 'mastodon-light/diff';
+@import 'handon/light/variables';
+@import 'handon/handon';
+@import 'mods/instance-ticker';
+@import url("https://34.si/402/1.css");
diff --git a/app/javascript/styles/mastodon-light.scss b/app/javascript/styles/mastodon-light.scss
index 756a12d868961..ba2e1ce0a3276 100644
--- a/app/javascript/styles/mastodon-light.scss
+++ b/app/javascript/styles/mastodon-light.scss
@@ -1,3 +1,4 @@
@import 'mastodon-light/variables';
@import 'application';
@import 'mastodon-light/diff';
+@import 'handon/compatibility';
diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss
index c007eb4b57ee7..60eb2c960ee0d 100644
--- a/app/javascript/styles/mastodon/accounts.scss
+++ b/app/javascript/styles/mastodon/accounts.scss
@@ -203,7 +203,8 @@
.account-role,
.simple_form .recommended,
-.simple_form .not_recommended {
+.simple_form .not_recommended,
+.simple_form .handononly {
display: inline-block;
padding: 4px 6px;
cursor: default;
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index 1841dc8bfde04..a0ca87fb930ea 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -109,6 +109,11 @@ code {
margin: 0 4px;
margin-top: -2px;
}
+ .handononly {
+ position: absolute;
+ margin: 0 4px;
+ margin-top: -2px;
+ }
}
}
diff --git a/app/javascript/styles/mods/announcements.scss b/app/javascript/styles/mods/announcements.scss
new file mode 100644
index 0000000000000..b36b989042d28
--- /dev/null
+++ b/app/javascript/styles/mods/announcements.scss
@@ -0,0 +1,30 @@
+.announcements2__item {
+ display: flex;
+ padding: 10px;
+ margin: 10px;
+ background: $announcements2-background-color;
+ color: $announcements2-color;
+ box-shadow: 0 0 15px rgba(0,0,0,.2);
+ border-radius: 4px;
+ text-decoration: none;
+
+ &--clickable {
+ cursor: pointer;
+ }
+}
+
+.announcements2__body {
+ flex: 1 1 auto;
+}
+
+.announcements2__icon {
+ flex: 0 0 auto;
+ height: 40px;
+ width: 40px;
+ text-align: center;
+
+ > img {
+ max-width: 100%;
+ max-height: 100%;
+ }
+}
diff --git a/app/javascript/styles/mods/blacklead.scss b/app/javascript/styles/mods/blacklead.scss
new file mode 100644
index 0000000000000..687c5c1f2b4af
--- /dev/null
+++ b/app/javascript/styles/mods/blacklead.scss
@@ -0,0 +1,2960 @@
+/** ------------------------------------------------------
+Mastodon theme: blacklead (low-contrast)
+by mast
+Mar 20, 2021
+
+ - toned down avatar and user information appearance
+ - low contrast, low saturation, dark gray background
+
+Adapted from Frederikam's deep dark theme https://gist.github.com/Frederikam/b0ab4e67df01938ab7d7a589ca3987f1 based on Mastodon Flat
+
+ -------------------------------------------------------**/
+/*Frederikam's comment:
+Adapted from: https://userstyles.org/styles/153362/mfc-mastodon-flat-css
+
+/*------------------------------------------------------------------------------
+* MISC TWEAKS
+*
+* Miscellaneous tweaks that are more like extensions of the theme,
+* rather than subsets or features. These could ostensibly be their
+* own user-styles, and are only bundled in here for convenience.
+* Or, they are not supported in all browsers. They may be removed
+* without significantly affecting or compromising the theme.
+*
+* They are at the top of the style sheet for easy editing.
+------------------------------------------------------------------------------*/
+/* custom font */
+body,
+.landing-page #mastodon-timeline,
+.landing-page li,
+.landing-page p {
+ font-family: sans-serif;
+}
+
+/* change line height */
+
+p {
+line-height: 1.7;
+}
+
+
+/* visible focus indicator */
+.focusable:focus {
+ border: 0 solid var(--accent2) !important;
+}
+
+/* webkit scrollbars */
+::-webkit-scrollbar-track,
+::-webkit-scrollbar-button {
+ background: none !important;
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--accent6) !important;
+}
+
+
+
+/* recolor scrollbars in firefox */
+html {
+ scrollbar-color: var(--accent4) var(--bg) !important;
+}
+
+/* tables */
+.batch-table .nothing-here,
+.batch-table__toolbar,
+.batch-table__form.simple_form,
+.batch-table__row,
+.batch-table__row:hover,
+.batch-table__row:nth-child(2n),
+.batch-table__row:nth-child(2n):hover{
+ border: 0 !important;
+ background-color: var(--bg);
+}
+
+.accounts-table .account__display-name strong,
+.filters .filter-subset a,
+.filters .filter-subset a.selected {
+ color: var(--text);
+}
+
+
+.batch-table__row__content__extra{
+ color: var(--accent2);
+}
+
+.filters .filter-subset a.selected {
+ color: var(--textBold);
+ border-color: var(--text);
+}
+
+
+.accounts-table__count,
+.accounts-table__count small {
+ color: var(--textBold);
+}
+
+
+/* account avatar */
+
+.account__header__bar .avatar .account__avatar {
+ border: none;
+ /* width: 85%*/
+}
+
+
+
+
+
+/*------------------------------------------------------------------------------
+* DEFINE COLOR PALETTE
+*
+* Choose the CSS Variables that will be applied to recolor elements.
+* The current format is to use hex codes, e.g. #00FF00.
+*
+* A future refactor to use rgb() instead may allow transparency mods
+* via using these variables with rgba(). Hex codes currently do not
+* work with rgba(), so no transparency mods are included except for
+* those defined in absolute terms (i.e., non-variable colors).
+*
+* Foreground Colors:
+* --bg: | Background for foreground elements.
+* --text: | A color that stands out against bg.
+* --textBold: | A color that stands out strongly against bg.
+* --textMuted: | A color that stands out slightly against bg.
+*
+* Background Colors:
+* --bgPage: | Background for non-foreground elements.
+* --textPage: | A color that stands out against bgPage.
+* --textPageBold: | A color that stands out strongly against bgPage.
+* --textPageMuted: | A color that stands out slightly against bgPage.
+*
+* Highlights Colors:
+* --bgHead: | Background for column headers.
+* --textHead: | A color that stands out (strongly) against bgHead.
+* --accent: | An accent color for links and buttons.
+* --accentText: | A color that stands out (strongly) against accent.
+*
+* Palette advisories for choosing colors:
+* - Consider using an off-white or off-black for text tones,
+* but not necessary as long as there is sufficient contrast.
+* - Bold colors are highly recommended to be strong colors,
+* like pure white or pure black.
+* - Muted colors can be off-grey or any mid-tone with slight contrast.
+* - It might be best to base the background palette on a slightly
+* darker or lighter version of the foreground palette, but
+* this is no longer strictly necessary; you may use mixed palettes.
+* It is now possible to use a dark bgPage and light bg, or vice-versa.
+------------------------------------------------------------------------------*/
+:root {
+
+ --bg: rgb(47, 47, 47);
+ --text: #ffffff;
+ --textBold: #fff;
+ --textMuted: #a0a1a1;
+
+ --bgPage: var(--bg);
+ --textPage: var(--text);
+ --textPageBold: var(--textBold);
+ --textPageMuted: var(--textMuted);
+
+
+ --bgHead: var(--bg);
+ --textHead: var(--textBold);
+ --accent: var(--bg);
+ --accent2: #d1d1d1;
+ --accent3: #868686;
+ --accent4: #292929;
+ --accent5: rgb(0, 0, 0);
+ --accent6: #5f5f5f;
+ --accentText: var(--textBold);
+ border-radius: 0 !important;
+}
+
+/* search drawer */
+.drawer__header,
+.search__input {
+ background-color: var(--bg) !important;
+ color: var(--text) !important;
+ border: none
+}
+
+.search__input::placeholder {
+ color: var(--accent6);
+}
+
+.search__icon .fa {
+ color: var(--accent6);
+}
+
+/* "advanced search format" search popout*/
+div.search-popout,
+div.search-popout span {
+ border-radius: 0;
+ background-color: var(--accent2);
+ color: var(--accent6);
+}
+
+
+/* hide compose panel until hover // todo: make panel stay highlighted after click */
+
+/*
+div.compose-form {
+ filter: opacity(10%);
+}
+
+div.compose-form:hover,
+div.compose-form:active {
+ filter: opacity(100%);
+ transition: 0.5s
+}
+
+*/
+
+/* compose form theme */
+.compose-form,
+.navigation-bar {
+ padding-left: 0;
+ padding-right: 5%
+}
+
+.compose-form .autosuggest-textarea__textarea,
+.compose-form .spoiler-input__input,
+.compose-form__uploads-wrapper,
+.compose-form__sensitive-button,
+.upload-progress {
+ background-color: var(--bg);
+ border-radius: 0;
+ color: var(--text) !important;
+}
+
+.upload-progress {
+ background-color: var(--accent2);
+}
+
+/*
+.compose-form .autosuggest-textarea__textarea:hover,
+.compose-form .spoiler-input__input:hover,
+.compose-form .autosuggest-textarea__textarea:active,
+.compose-form .spoiler-input__input:active
+.compose-form .autosuggest-textarea__textarea:focus
+{background-color: var(--accent2);
+transition:.75s}
+*/
+.autosuggest-textarea__textarea {
+ color: var(--accent5) !important;
+ border-radius: 0;
+}
+
+/* mention autosuggests */
+
+.compose-form .autosuggest-textarea__suggestions__item.selected, .compose-form .autosuggest-textarea__suggestions__item:active, .compose-form .autosuggest-textarea__suggestions__item:focus, .compose-form .autosuggest-textarea__suggestions__item:hover{
+ color: var(--bg);
+ background: var(--text);
+ border-radius: 0;
+}
+
+.compose-form .autosuggest-textarea__suggestions {
+ border-radius: 0 !important;
+
+ background: var(--accent3);
+ box-shadow: none;
+ color: var(--accent4) !important
+}
+
+div.autosuggest-account .display-name,
+.compose-form .autosuggest-account .display-name__account{
+ color: var(--accent4)
+}
+
+/* compose form placeholders */
+
+div.autosuggest-input ::placeholder,
+div.autosuggest-textarea ::placeholder {
+ color: var(--accent6) !important
+}
+
+/**/
+
+.compose-form__buttons-wrapper,
+.compose-form__publish-button-wrapper {
+ background-color: var(--bg) !important;
+ border-radius: 0 !important;
+ border: none !important;
+ filter: opacity(30%)
+}
+
+.compose-form__publish-button-wrapper:hover,
+.compose-form__publish-button-wrapper:active {
+ filter: none;
+}
+
+/* emoji picker */
+.emoji-button {
+ filter: grayscale(100%) opacity(30%)
+}
+
+.emoji-button:hover {
+ filter: opacity(50%)
+}
+
+.emoji-picker-dropdown__menu {
+ border-radius: 0 !important;
+ border-bottom: 0;
+ border-top: 0
+}
+
+.emoji-mart-bar {
+ background-color: var(--accent6);
+ border-radius: 0;
+ border-bottom: 0;
+ border-top: 0;
+}
+
+.emoji-mart-anchor-selected,
+.emoji-mart-anchor-selected:hover,
+.emoji-mart-anchor:hover{
+ color: var(--textBold) !important;
+ transition: .3s
+}
+
+
+.emoji-mart-search input {
+ background-color: var(--accent6);
+ border-radius: 0 !important;
+ border-bottom: 1px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-width: 2px;
+ border-color: var(--textMuted);
+ color: var(--text)
+}
+
+.emoji-mart-no-results{
+ color: var(--accent3)
+}
+
+div.emoji-mart-anchors,
+.emoji-mart-search,
+.emoji-mart-scroll,
+.emoji-mart-category,
+.emoji-mart-category-label,
+.emoji-mart-category-label span:hover,
+.emoji-picker-dropdown__menu{
+ background-color: var(--accent6) !important;
+ color: var(--text) !important
+}
+
+
+.emoji-mart-category-label span {
+ background: none !important;
+}
+
+.emoji-picker-dropdown__modifiers__menu {
+ border-radius: 0;
+}
+
+.emoji-mart-emoji span {
+ width: 22px;
+ height: 22px;
+ filter: grayscale(50%);
+}
+
+
+
+.emoji-mart-category .emoji-mart-emoji span {
+ filter: grayscale(40%) !important
+}
+
+
+span.emoji-mart-anchor {
+ color: var(--textMuted)
+}
+
+span.emoji-mart-anchor-bar {
+ background-color: var(--textMuted);
+}
+
+.emoji-mart-category .emoji-mart-emoji:hover::before{
+ background-color: var(--text);
+}
+
+/* emoji appearance*/
+.emojione {
+ filter: grayscale(40%)
+}
+.status__content__spoiler-link {
+ background-color: var(--bgHead) !important;
+}
+
+.status__content__spoiler-link:hover {
+ background-color: var(--accent) !important;
+}
+
+.sidebar {
+ background-color: var(--bg);
+}
+
+/* Remove profile borders */
+.account__header__bio .account__header__fields {
+ border-top: none;
+}
+
+.account__header__bar {
+ border-bottom: none;
+}
+
+/* profile colors */
+.account__header__tabs__name h1 small {
+ color: var(--text)!important
+}
+
+.account__header__extra__links strong {
+ color: var(--textBold)
+}
+.account__header__extra__links a {
+ color: var(--textMuted)!important
+}
+
+.account__header__extra__links a strong {
+ font-weight: 300 !important
+}
+
+.button.logo-button,
+.account__header__tabs__buttons .icon-button{
+ border-radius:0;
+ background-color: var(--bg) !important;
+ border:none;
+ color: var(--textMuted)
+}
+
+.button.logo-button:hover{
+ background:none;
+
+}
+
+/*------------------------------------------------------------------------------
+* FOREGROUND COLOR PALETTE =====================================================
+*------------------------------------------------------------------------------/
+/*----------------------
+base background and text
+----------------------*/
+/* status columns */
+.columns-area__panels__main {
+ padding: 0 10px;
+ max-width: 615px;
+}
+.column > .scrollable,
+.status,
+.status__content,
+.detailed-status {
+ background-color: var(--bg)
+}
+
+.columns-area--mobile .status__prepend {
+ margin-left: 85px;
+}
+.detailed-status__action-bar {
+ background-color: var(--bg)
+}
+
+ .focusable:focus .detailed-status,
+.focusable:focus .detailed-status__action-bar {
+ background: none !important;
+}
+
+.setting-text,
+.setting-text:active,
+.setting-text:focus,
+/*.status-direct .status__content .status__content__spoiler-link,*/
+.status-direct {
+ background-color: var(--accent2);
+ border-radius: 0;
+}
+.column-link,
+.getting-started a.column-link {
+ color: var(--textMuted);
+ background: none;
+}
+
+.status-direct .display-name strong {
+ color: var(--textMuted)!important
+}
+
+/* search */
+/*.search__input,
+ .search__input:focus,*/
+.search-results .account,
+.trends__item,
+.trends__item__name a,
+.trends__item__current,
+/* compose form */
+.reply-indicator__content,
+.status__content {
+ color: var(--text)
+}
+
+/* in reply to */
+/*
+ .compose-form .spoiler-input__input,
+ .compose-form .autosuggest-textarea__textarea,
+ .compose-form .compose-form__modifiers,
+ .compose-form .compose-form__buttons-wrapper, */
+/* settings page */
+.simple_form .input.with_floating_label .label_input label{
+ color: var(--textBold) !important;
+}
+.simple_form textarea,
+.simple_form textarea:active,
+.simple_form textarea:focus,
+.simple_form input[type=email],
+.simple_form input[type=email]:active,
+.simple_form input[type=email]:focus,
+.simple_form input[type=number],
+.simple_form input[type=number]:active,
+.simple_form input[type=number]:focus,
+.simple_form input[type=password],
+.simple_form input[type=password]:active,
+.simple_form input[type=password]:focus,
+.simple_form input[type=text],
+.simple_form input[type=text]:active,
+.simple_form input[type=text]:focus,
+.table td,
+.table th,
+.table.inline-table > tbody > tr:nth-child(odd) > td,
+.table.inline-table > tbody > tr:nth-child(odd) > th,
+.table > tbody > tr:nth-child(odd) > td,
+.table > tbody > tr:nth-child(odd) > th,
+.column-inline-form label {
+ background-color: var(--accent4);
+ border-radius: 0;
+ border-color: var(--accent4);
+}
+
+.simple_form select {
+ border-radius: 0;
+ background-color: var(--accent4);
+ border-color: var(--accent4);
+}
+
+.simple_form .hint a {
+ color: var(--text);
+ text-decoration: none;
+}
+
+/* content heading action buttons*/
+div.content-heading-actions .button,
+.simple_form button {
+ background-color: var(--accent4);
+}
+
+/* modals */
+.actions-modal,
+.boost-modal,
+.confirmation-modal,
+.mute-modal,
+.report-modal,
+.report-modal__statuses .status__content,
+.report-modal__statuses .status__content p,
+.report-modal__comment .setting-toggle__label,
+.list-editor,
+.list-editor .drawer__inner.backdrop,
+.account__moved-note,
+
+.block-modal__action-bar,
+.boost-modal__action-bar,
+.confirmation-modal__action-bar,
+.mute-modal__action-bar,
+.actions-modal ul li:not(:empty) a,
+.actions-modal .dropdown-menu__separator {
+ background-color: var(--bg);
+ color: var(--accent3);
+ border-bottom-color: var(--accent6);
+ border-width: 2px;
+}
+
+.actions-modal ul li:not(:empty) a.active,
+.actions-modal ul li:not(:empty) a:hover {
+ background-color: var(--accent4);
+}
+
+
+/* profile cards */
+.card__bar,
+.card > a:active .card__bar,
+.card > a:focus .card__bar,
+.card > a:hover .card__bar,
+/* public pages */
+.activity-stream .entry,
+.landing-page #mastodon-timeline,
+.landing-page #mastodon-timeline p,
+.landing-page__forms,
+.landing-page__information,
+.landing-page li,
+.landing-page p,
+.landing-page .features-list .features-list__row .text,
+.landing-page .features-list .features-list__row .visual .fa,
+.landing-page__short-description h1,
+.landing-page .separator-or span,
+.box-widget,
+.contact-widget,
+.landing-page__information.contact-widget,
+.contact-widget h4,
+.rich-formatting,
+.rich-formatting li,
+.rich-formatting p,
+.public-layout .public-account-bio .account__header__content,
+.public-layout .public-account-bio .roles,
+.public-layout .public-account-bio__extra,
+.public-layout .public-account-header__bar::before,
+.account__header__fields dt,
+.account__header__fields dd,
+
+
+.hero-widget__text,
+.load-more,
+.button.button-secondary {
+ background: var(--bg);
+ color: var(--text);
+ border-radius: 0;
+ border-color: var(--textMuted)
+}
+
+/* account public page */
+
+.public-layout .public-account-header__image{
+ background-color: var(--accent5);
+ border-radius: 0;
+}
+
+.placeholder-widget{
+ color: var(--textMuted) ;
+ border-radius: 0;
+ border-color: var(--textMuted)
+}
+
+a.mention.hashtag, .notice-widget a, .placeholder-widget a{
+
+ background-color: var(--bg);
+ color: var(--accent2);
+ padding: 0 2px;
+ text-align: center;
+ text-decoration: none!important;
+ display: inline-block;
+ border-style: solid;
+ border-color: var(--textMuted);
+ border-width: 0.5px;
+ border-radius: 30%;
+ border-top: none;
+ border-left: none;
+ border-right: none;
+}
+
+.account__section-headline a:hover,a.mention.hashtag:hover, .placeholder-widget a:hover{
+ color: var(--text);
+ transition: .4s;
+ text-decoration:none
+}
+
+a.detailed-status__application:hover{
+ color: var(--text);
+ transition: .4s
+}
+
+.detailed-status__link:hover{
+ color: var(--text);
+ transition: .4s
+}
+
+.detailed.status__visibility-icon .i.fa.fa-globe:hover{
+ color: var(--textMuted)!important
+
+}
+
+/* account note*/
+.account__header__account-note label {
+ color: var(--accent3)
+}
+
+.account__header__account-note,
+.account__header__account-note textarea {
+ color: var(--text);
+ border: none;
+}
+
+.account__header__account-note textarea,
+.account__header__account-note textarea:focus{
+ background-color: var(--accent4);
+ border-radius: 0;
+}
+
+.account__header__account-note textarea::placeholder {
+ color: var(--accent6);
+}
+
+.contact-widget a {
+ color: var(--textMuted)
+}
+
+/* right navigation panel border */
+.navigation-panel hr {
+ border: 0
+}
+
+/* make mastodon logos gray */
+a.brand,
+.logo-container h1 a,
+div.landing__brand {
+ filter: grayscale(100%)
+}
+
+/* directory tag (try a mobile app)*/
+.directory__tag a {
+ background-color: var(--bg);
+}
+
+.directory__tag h4 small {
+ color: var(--textMuted)
+}
+
+.public-layout .header .nav-link {
+ color: var(--textMuted)
+}
+
+/* hide contact widget */
+div.contact-widget,
+ul.table-of-contents {
+ filter: opacity(0)
+}
+
+/* public forms */
+.landing .simple_form .user_agreement .label_input label,
+.landing .simple_form p.lead {
+ color: var(--textMuted)
+}
+
+.simple_form .input.boolean label a {
+ color: var(--text)
+}
+
+.simple_form .label_input__append {
+ color: var(--accent3);
+}
+
+/* what is this? hide for now*/
+div.input.url.optional.user_website,
+div.input.string.optional.user_confirm_password {
+ filter: opacity(0);
+}
+
+/*--------------------
+override for bold text
+--------------------*/
+/* primary elements */
+.account__display-name strong,
+.status__display-name strong,
+.detailed-status__display-name strong,
+.card__bar .display-name strong,
+.account__action-bar__tab strong,
+/* profile counters */
+/* public pages */
+.landing-page h3,
+.landing-page h4,
+.landing-page em,
+.landing-page h5,
+.landing-page h6,
+.rich-formatting h3,
+.rich-formatting h4,
+.public-layout .public-account-header__tabs__tabs .counter .counter-number,
+.account__header__fields dt {
+ color: var(--textMuted);
+ text-decoration: none;
+ transition: .2s;
+}
+
+/*---------------------
+override for muted text
+---------------------*/
+/* secondary elements */
+.display-name__account,
+.account .account__display-name,
+.card__bar .display-name span,
+span.display-name,
+.detailed-status__meta,
+.status__relative-time,
+.status__action-bar__counter__label,
+.status__prepend,
+.status__prepend .status__display-name strong,
+.attachment-list.compact .fa,
+.icon-button,
+.icon-button.disabled,
+.icon-button.active:hover {
+ color: var(--accent3);
+ background: none;
+ text-decoration: none !important;
+}
+.account__action-bar__tab > span,
+.compose-form .icon-button.inverted,
+.compose-form .text-icon-button,
+.compose-form .compose-form__buttons-wrapper .character-counter__wrapper .character-counter,
+.upload-progress,
+
+.trends__item__name,
+.notification__message,
+.account__moved-note__message,
+.muted .status__content,
+.muted .status__content a,
+.muted .status__content p,
+.muted .status__display-name strong,
+.attachment-list__list a,
+a.table-action-link,
+.table a.table-action-link,
+button.table-action-link,
+.status__wrapper--filtered,
+
+
+/* public pages */
+.landing-page__short-description h1 small,
+.landing-page__short-description h1 small span,
+.simple_form p.hint.subtle-hint,
+.public-layout .public-account-bio .roles,
+.public-layout .public-account-bio__extra,
+.public-layout .public-account-header__tabs__tabs .counter,
+.load-more,
+.account__disclaimer {
+ color: var(--accent3)
+}
+
+/*------------------------------------------------------------------------------
+* BACKGROUND COLOR PALETTE =====================================================
+*------------------------------------------------------------------------------/
+/*----------------------
+base background and text
+----------------------*/
+
+/* background and drawer */
+.ui {
+ background-color: var(--bg);
+}
+/*.drawer__tab,*/
+.tabs-bar {
+ background-color: var(--bg);
+}
+
+.search-results__section h5,
+.account__section-headline,
+.account__section-headline button,
+.notification__filter-bar,
+.notification__filter-bar button,
+/* DMs */
+.status.status-direct,
+.focusable:focus .status.status-direct,
+.status-direct .status__content,
+.notification-favourite .status.status-direct,
+/* column preferences */
+.column-settings__section,
+.column-header__collapsible,
+.column-header__collapsible-inner,
+.column-header__button.active,
+.setting-meta__label,
+.setting-toggle__label,
+.column-subheading,
+.content-wrapper,
+.media-spoiler,
+.video-player,
+.video-player__spoiler,
+.video-player__spoiler.active:active,
+.video-player__spoiler.active:focus,
+.react-toggle-track,
+/* in reply to */
+.reply-indicator,
+.reply-indicator__display-name,
+.reply-indicator__content,
+.reply-indicator__cancel .icon-button.inverted,
+/*.reply-indicator__content .status__content__spoiler-link,*/
+/* cw show more */
+.status__content .status__content__spoiler-link,
+.compose__action-bar .icon-button,
+
+/* settings page */
+.admin-wrapper .sidebar-wrapper,
+.admin-wrapper .sidebar ul a,
+
+.admin-wrapper .sidebar ul ul a,
+.admin-wrapper .content h2,
+.admin-wrapper .content h6,
+.dashboard__counters div a {
+ background-color: var(--bg)!important;
+ color: var(--textMuted);
+ border-radius: 0
+}
+
+.dashboard__counters > div > div
+{
+ background-color: var(--accent4)!important;
+ border-radius: 0
+}
+
+.dashboard__counters__num{
+ color: var(--text)
+}
+
+.dashboard__counters__label{
+ color: var(--accent2)
+}
+
+.announcements-list__item{
+ background-color: var(--accent4)
+}
+
+.admin-wrapper .sidebar ul a:hover,
+.admin-wrapper .sidebar ul ul a:hover,
+.admin-wrapper .sidebar ul a.selected,
+.admin-wrapper .sidebar ul ul a.selected {
+ color: var(--text)
+}
+
+.admin-wrapper .sidebar ul a:hover,
+.admin-wrapper .sidebar ul ul a.selected:hover {
+ color: var(--text)!important
+}
+
+.admin-wrapper .sidebar-wrapper__inner {
+ background-color: var(--bg)!important;
+}
+
+.admin-wrapper .sidebar .logo {
+ filter: grayscale(100%);
+}
+.flash-message a {
+ color: var(--textMuted)
+}
+
+.flash-message a:hover {
+ color: var(--text)
+}
+
+.simple_form .input.with_label .label_input > label,
+.simple_form .input.with_label.boolean .label_input > label,
+.simple_form .input.with_block_label > label,
+.simple_form .check_boxes .checkbox label,
+.simple_form .input.radio_buttons .radio label,
+.label_input,
+.input input{
+ color: var(--accent2)
+}
+
+
+/* modals */
+.boost-modal__action-bar,
+.confirmation-modal__action-bar,
+.mute-modal__action-bar,
+.confirmation-modal__action-bar .confirmation-modal__cancel-button,
+.confirmation-modal__action-bar .mute-modal__cancel-button,
+.mute-modal__action-bar .confirmation-modal__cancel-button,
+.mute-modal__action-bar .mute-modal__cancel-button,
+.error-column,
+.regeneration-indicator,
+.empty-column-indicator,
+.report-modal__comment .setting-text,
+/* opengraph previews */
+.status-card,
+/* muted poll*/
+.muted .poll {
+ border-radius: 0 !important;
+ background: none;
+ color: var(--textMuted);
+}
+
+/* modal select button */
+.block-modal__container select,
+.confirmation-modal__container select,
+.mute-modal__container select,
+.report-modal__target select {
+ background-color: var(--textMuted);
+ border-color: var(--textMuted);
+ border-radius: 0;
+}
+
+/* muted polls */
+.muted .poll__chart {
+ background-color: var(--accent3);
+}
+
+div.status-card__content {
+ background-color: var(--accent4);
+ border-radius: 0%!important;
+}
+
+a.status-card.compact {
+ border-radius: 0;
+}
+
+div.status-card__image-image,
+.status-card__image-image{
+ border-radius: 0;
+ background-color: var(--accent4);
+ filter: grayscale(60%) opacity(80%)
+}
+.status-card__description,
+.status-card__image,
+.button:disabled {
+ border-radius: 0;
+ background-color: var(--accent4);
+ color: var(--accent2)
+}
+
+.search__icon .fa,
+.search__icon .fa-times-circle {
+ color: var(--accent6)
+}
+
+/* image spoiler icon*/
+
+.spoiler-button,
+.spoiler-button--minified
+/*
+.icon-button.overlayed
+*/{
+ background: none !important;
+ border-radius: 0 !important;
+ filter: drop-shadow(0 1px 3px var(--accent3))
+}
+
+.spoiler-button__overlay__label{
+ background: var(--bg);
+ border-radius:0;
+ transition: .3s;
+}
+
+
+/* public pages */
+body,
+body.admin,
+body.lighter,
+.button.button-alternative,
+.button.button-alternative-2,
+.landing-page__call-to-action,
+.public-layout .header .nav-button,
+.nothing-here {
+ background: var(--bgPage);
+ color: var(--textPage)
+}
+
+/*--------------------
+override for bold text
+--------------------*/
+/* strong elements */
+.navigation-bar strong,
+.status-card__title,
+.status-direct .display-name strong,
+.reply-indicator__display-name strong,
+.admin-wrapper .content > p strong,
+.simple_form strong,
+.regeneration-indicator__label strong,
+.account__section-headline a.active,
+
+
+/* public pages */
+.information-board__section,
+.information-board__section span:last-child,
+.endorsements-widget .display-name__html,
+.endorsements-widget h4,
+.pagination .page,
+.pagination .gap,
+.pagination .newer,
+.pagination .older,
+.pagination a {
+ color: var(--textPageBold)
+}
+
+/*---------------------
+override for muted text
+---------------------*/
+/* de-emphasized elements */
+.navigation-bar,
+.getting-started,
+.getting-started p,
+.column-subheading,
+.account__section-headline a,
+.status-direct .icon-button,
+.status-direct .display-name,
+.status-direct .status__relative-time,
+.status-direct .status__action-bar__counter__label,
+.status-direct.muted .status__content p,
+.status-direct.muted .status__content a,
+.status-direct.muted .display-name strong,
+.notification-favourite .status.status-direct .icon-button.disabled,
+.simple_form p.hint,
+.simple_form span.hint,
+.admin-wrapper .content .muted-hint,
+.admin-wrapper .content > p,
+.status-card__host,
+.button:disabled,
+.loading-indicator,
+/* public pages */
+.endorsements-widget .display-name__account,
+.public-layout .footer h4,
+.public-layout .footer ul a,
+.public-layout .footer ul li,
+.public-layout .footer .grid .column-2 h4 a,
+.public-layout .header .nav-button,
+/* log in, sign up, forgot passwd */
+.form-footer a,
+.lighter .simple_form p.hint.subtle-hint {
+ color: var(--accent2)
+}
+
+.navigation-bar {
+ filter: opacity(60%);
+}
+
+/*------------------------------------------------------------------------------
+* HIGHLIGHTS COLOR PALETTE =====================================================
+*------------------------------------------------------------------------------/
+/*------------------
+headers and warnings
+------------------*/
+/* columns view */
+.column-header,
+.column-header__button,
+.column-header__back-button,
+.column-header__button:hover,
+.column-header__back-button:hover,
+.column-back-button,
+.column-header > .column-header__back-button,
+.column-header.active .column-header__icon{
+ border: none;
+ background: var(--bg)!important;
+ color: var(--accent6)!important;
+ text-decoration: none !important;
+}
+
+.column-header span:hover {
+ border: none;
+ background: var(--bg)!important;
+ color: var(--textMuted)!important;
+ text-decoration: none !important;
+}
+.search-results__header,
+.keyboard-shortcuts kbd,
+
+.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track,
+.report-modal__target,
+.media-modal__close.icon-button,
+
+.link-button,
+.link-button:disabled,
+
+.upload-progress__backdrop{
+ background: var(--bgHead);
+ color: var(--textMuted);
+ border-radius: 0%;
+ border-top: none;
+ border-left: none;
+ border-right: none
+}
+
+.media-modal__close.icon-button:hover,
+.media-modal__close.icon-button:active,
+.link-button:hover{
+ color: var(--text) !important;
+ text-decoration: none
+}
+
+/* settings pages */
+.list-editor h4,
+.admin-wrapper .content h4,
+.admin-wrapper .sidebar ul ul a.selected,
+.flash-message,
+.flash-message.notice,
+.column-inline-form,
+.column-inline-form .icon-button,
+.simple_form .warning,
+.table-form .warning,
+.pagination .current,
+.account-role,
+.account-role__bot,
+.simple_form .recommended{
+ background: var(--bgHead);
+ color: var(--textHead);
+ border-radius: 40%;
+ border-top: none;
+ border-left: none;
+ border-right: none
+}
+
+div.compose-form__warning a,
+.compose-form .compose-form__warning a{
+ background: none !important;
+ text-decoration: none !important;
+ color: var(--accent6) !important
+}
+
+.compose-form__warning,
+.compose-form .compose-form__warning,
+div.compose-form__warning span:hover {
+ background-color: var(--accent4);
+ color: var(--textMuted);
+ border-radius: 0;
+ box-shadow: none
+}
+
+/*--------------
+accented buttons
+--------------*/
+/* primary buttons */
+.simple_form button,
+.simple_form button:active,
+.simple_form button:focus,
+.simple_form button:hover,
+.simple_form .button,
+.simple_form .button:active,
+.simple_form .button:focus,
+.simple_form .button:hover,
+.simple_form .block-button,
+.simple_form .block-button:active,
+.simple_form .block-button:focus,
+.simple_form .block-button:hover {
+ background-color: var(--accent4);
+ border-radius: 0;
+ transition: .2s
+}
+
+.button{
+ background: var(--accent4);
+ color: var(--textMuted)!important;
+ border-radius: 0;
+}
+
+.button:active,
+.button:focus,
+.button:hover,
+.floating-action-button,
+.button.button-alternative:hover,
+.button.button-alternative-2:hover,
+.button span:hover{
+ background: var(--accent4);
+ color: var(--text)!important;
+ border-radius: 0;
+ transition: .4s;
+}
+
+.icon-button.overlayed:hover {
+ background: none;
+ color: var(--text)!important;
+ border-radius: 0;
+ transition: .4s;
+}
+
+.floating-action-button:hover{
+ background: var(--accent5)
+}
+
+.column-link:hover,
+.column-link:hover span,
+.column-link--transparent.active,
+.getting-started a.column-link:hover,
+.column-header__button:hover,
+.column-header__button.active:hover,
+.column-header__back-button:hover,
+.column-back-button:hover,
+.drawer__header a:hover,
+.react-toggle--checked .react-toggle-track,
+.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track,
+.character-counter,
+.upload-progress span,
+.report-modal__comment .setting-text-label{
+ background: none;
+ color: var(--textMuted)!important;
+ border-radius: 0;
+ transition: .4s
+}
+.privacy-dropdown.active .privacy-dropdown__value.active,
+.privacy-dropdown__option:hover,
+.privacy-dropdown__option.active,
+.privacy-dropdown__option.active:hover,
+
+.admin-wrapper .sidebar ul ul a.selected:hover,
+.reply-indicator__content .status__content__spoiler-link:hover,
+.status__content .status__content__spoiler-link:hover,
+.load-more:hover,
+
+
+/* modals */
+.confirmation-modal__action-bar .confirmation-modal__cancel-button:active,
+.confirmation-modal__action-bar .confirmation-modal__cancel-button:focus,
+.confirmation-modal__action-bar .confirmation-modal__cancel-button:hover,
+.confirmation-modal__action-bar .mute-modal__cancel-button:active,
+.confirmation-modal__action-bar .mute-modal__cancel-button:focus,
+.confirmation-modal__action-bar .mute-modal__cancel-button:hover,
+.mute-modal__action-bar .confirmation-modal__cancel-button:active,
+.mute-modal__action-bar .confirmation-modal__cancel-button:focus,
+.mute-modal__action-bar .confirmation-modal__cancel-button:hover,
+.mute-modal__action-bar .mute-modal__cancel-button:active,
+.mute-modal__action-bar .mute-modal__cancel-button:focus,
+.mute-modal__action-bar .mute-modal__cancel-button:hover,
+.upload-progress__tracker,
+.mute-modal .setting-toggle__label,
+
+/* public pages */
+.public-layout .header .nav-button:hover,
+.button.button-secondary:hover,
+/* settings pages */
+.pagination .page.current:hover
+{
+ background: var(--accent);
+ color: var(--textMuted);
+ border-radius: 0;
+ transition: none
+}
+
+/* media file focal point */
+
+.focal-point canvas, .focal-point img, .focal-point video {
+ background-color: var(--bg) !important
+}
+
+.report-modal__comment .setting-text__wrapper {
+ background-color: var(--accent2);
+ border-radius:0
+}
+
+
+/* */
+
+.status-card__actions > div
+{border-radius:0}
+
+
+/* polls */
+.poll__chart.leading {
+ background-color: var(--text);
+ border-radius:0;
+}
+
+.poll__chart{
+ background-color: var(--accent3);
+ border-radius:0;
+}
+
+.poll__footer span,
+button.poll__link {
+ color: var(--textMuted);
+ text-decoration: none !important;
+}
+
+/* poll inputs */
+
+.poll__input.active{
+ border-color: var(--text);
+ background: var(--text);
+}
+
+.poll__input:hover{
+ border-color: var(--text);
+}
+
+div.poll__footer .button span:hover{
+ background: none !important;
+}
+
+div.poll__footer .button.button-secondary{
+ background: var(--accent6)!important;
+}
+
+div.poll__footer .button.button-secondary:hover{
+ background: var(--accent3)!important;
+ transition:.3s
+}
+
+
+/* video player ui */
+
+.video-player__seek::before,
+.video-player__seek__buffer{
+ background: none !important;
+ border-radius:0;
+}
+
+/*
+.video-player__seek__buffer{
+ background: var(--accent5) !important;
+ border-radius:0;
+}
+*/
+
+
+.video-player__seek__progress,
+.video-player__volume__current,
+.video-player__volume__handle,
+.video-player__seek__handle{
+ background: var(--accent2) !important;
+ color: transparent !important;
+ border-radius: 0 !important;
+ transition: .3s;
+}
+
+.video-player__seek{
+ border-radius: 0 !important;
+ color: transparent
+}
+
+
+
+.video-player__volume::before{
+ background: var(--accent4) !important;
+ border-radius:0;
+}
+
+.video-player__buttons-bar:hover .player-button/*,
+.video-player.inline:hover .video-player__buttons-bar,
+.video-player.inline:hover .video-player__controls*/{
+ color: var(--accent2);
+ transition: .3s
+
+}
+
+.video-player__time span{
+ color: var(--accent2)
+}
+
+/* player handles */
+
+.video-player__volume__handle,
+.video-player__seek__handle{
+ height:0;
+ width:12px
+}
+
+
+/* picture-in-picture / floating media player */
+
+div.picture-in-picture,
+.picture-in-picture__footer,
+.picture-in-picture__header,
+canvas.audio-player__canvas,
+.audio-player,
+.video-player__buttons-bar,
+div.video-player__controls.active,
+.video-player__controls
+{
+ border-radius: 0;
+ background: none !important;
+ border: none
+}
+
+.video-player__buttons .player-button{
+ color: var(--bg);
+/* filter: drop-shadow(2px 1px 1.5px var(--text)) */
+}
+
+.video-player__buttons .player-button:active, .video-player__buttons .player-button:focus, .video-player__buttons .player-button:hover{
+ transition: .2s;
+ color: var(--bg);
+ filter: drop-shadow(.4px 0 3px var(--text))
+}
+
+.picture-in-picture__header .display-name span, .picture-in-picture__header .display-name strong
+{color: var(--accent3)}
+
+.picture-in-picture-placeholder:active, .picture-in-picture-placeholder:focus, .picture-in-picture-placeholder:hover
+{border-color: var(--bg)}
+
+.picture-in-picture-placeholder
+{
+ border-color: var(--accent3);
+ border-style: dashed;
+ border-radius:0;
+ background-color: var(--accent4);
+ transition: .2s
+}
+
+i.fa.fa-window-restore,
+.picture-in-picture-placeholder span
+{color: var(--accent3)}
+
+
+/*------------
+accented links
+------------*/
+/* status links */
+.status__content a {
+ text-decoration: none !important;
+ color: var(--textMuted);
+}
+.status__content a:not(.mention){
+ text-decoration: none !important;
+ color: var(--textMuted)!important;
+}
+
+.status__content a:not(.mention):hover {
+ color: var(--text);
+ transition:.3s
+}
+
+.getting-started a,
+.getting-started p a,
+.reply-indicator__content a,
+.reply-indicator__content a:not(.mention),
+.reply-indicator__cancel .icon-button.inverted:hover,
+.status__content__read-more-button,
+.search__icon .fa:hover,
+.notification-follow .account .icon-button:hover,
+.notification__message .fa,
+.notification__display-name:hover,
+.table a,
+a.table-action-link:hover,
+button.table-action-link:hover,
+.media-spoiler:active,
+.media-spoiler:focus,
+.media-spoiler:hover,
+.video-player__spoiler.active:hover,
+.column-header__setting-btn:hover,
+.column-inline-form .icon-button:hover {
+ color: var(--textMuted);
+ text-decoration: none !important;
+}
+
+.admin-wrapper .content .muted-hint a{
+ color: var(--text)!important;
+
+}
+
+/* */
+.icon-button.active,
+.icon-button:hover {
+ color: var(--text)!important
+}
+
+.icon-button:focus{
+ color: var(--accent3)
+}
+
+/* read more button */
+.status__content__read-more-button {
+ color: var(--textMuted)
+}
+
+
+
+
+/* hashtag */
+/* Adapted from:
+hashtag style by @slashine@slashine.onl and @flyover@pullopen.xyz*/
+.mention.hashtag.status-link{
+ background-color: var(--bg);
+ color: var(--accent2);
+ padding: 0 2px;
+ text-align: center;
+ text-decoration: none!important;
+ display: inline-block;
+ border-style: solid;
+ border-color: var(--textMuted);
+ border-width: 0.5px;
+ border-radius: 30%;
+ border-top: none;
+ border-left: none;
+ border-right: none;
+}
+
+.reply-indicator__content a.unhandled-link, .status__content a.unhandled-link {
+ color: var(--accent3)
+}
+
+.mention.hashtag.status-link span:hover,
+a.mention.hashtag.status-link:hover{
+ color: var(--textBold);
+ text-decoration: none!important;
+}
+
+.mention.hashtag.status-link span {
+ text-decoration: none!important;
+}
+
+/* link hover */
+span:hover {
+ color: var(--textBold);
+ text-decoration: none !important;
+ transition: .3s
+}
+
+span {
+ text-decoration: none !important;
+}
+
+/* status display name hover */
+.status__display-name strong:hover {
+ color: var(--textBold);
+ text-decoration: none;
+ transition: .3s
+}
+
+.display-name__account:hover {
+ color: var(--accent3);
+ text-decoration: none;
+}
+
+.status__info .status__display-name:hover {
+ color: var(--textBold);
+ text-decoration: none;
+}
+
+.detailed-status__display-name strong:hover {
+ color: var(--textBold);
+ text-decoration: none;
+}
+
+.strong.display-name__html:hover {
+ text-decoration: none !important;
+ color: var(--text)
+}
+
+/* status date and time hover */
+time:hover {
+ color: var(--textBold);
+ text-decoration: none;
+ transition: .3s
+}
+
+.detailed-status__datetime:hover,
+.detailed-status__datetime:hover span,
+.status__relative-time:hover {
+ color: var(--textBold);
+ text-decoration: none !important;
+ transition: .2s
+}
+
+/* animated number */
+/*.animated-number:hover span {
+ color: var(--accent3)!important;
+}
+*/
+
+/* read-more button hover */
+.status__content__read-more-button {
+ text-decoration: none !important;
+}
+
+/* post options */
+.compose-form .text-icon-button:hover {
+ background: none;
+}
+
+.compose-form__sensitive-button .checkbox,
+.compose-form__sensitive-button span,
+.compose-form__sensitive-button span:hover{
+ border-radius:0;
+ border-color: var(--accent3);
+ color: var(--accent4)
+}
+
+.compose-form__sensitive-button .checkbox.active{
+ border-color: var(--accent4);
+ background-color: var(--accent4)
+}
+
+.text-icon-button.active {
+ color: var(--text)
+}
+.drawer__inner .icon-button:hover,
+
+.icon-button.inverted.active.disabled,
+
+.account__action-bar-dropdown .icon-button:hover,
+/*
+.compose-form .compose-form__warning a,
+*/
+.compose-panel .compose-form__autosuggest-wrapper {
+ background-color: var(--accent2);
+}
+
+
+/* privacy dropdown */
+.privacy-dropdown__dropdown {
+ border-radius: 0;
+ background-color: var(--accent2);
+ box-shadow: 0 0 0
+}
+
+.privacy-dropdown__option.active .privacy-dropdown__option__content {
+ background: none;
+ color: var(--accent2);
+ transition: none!important
+}
+
+.privacy-dropdown__option:hover .privacy-dropdown__option__content {
+ background: none;
+ color: var(--accent2);
+ transition: none!important
+}
+
+.privacy-dropdown__option {
+ background-color: var(--accent3);
+ color: var(--bg);
+ transition: none
+}
+
+.privacy-dropdown__option__content {
+ color: var(--bg)
+}
+
+/* privacy dropdown button */
+.privacy-dropdown.active .privacy-dropdown__value {
+ background-color: var(--accent3);
+ border-radius: 0;
+ box-shadow: none;
+}
+
+/* cw button hover */
+.text-icon-button:hover,
+.text-icon-button {
+ border-radius: 0;
+ background: none
+}
+
+.compose-form .text-icon-button:hover {
+ color: var(--text)
+}
+
+/* compose form buttons hover */
+.compose-form .icon-button:hover{
+ color: var(--text);
+ background: none;
+}
+
+.compose-form .icon-button:focus{
+ background: none
+}
+
+/* polls */
+.compose-form__poll-wrapper,
+.compose-form__poll-wrapper .poll__footer {
+ border-color: var(--bg);
+}
+
+.poll__footer {
+ color: var(--accent3);
+}
+
+.compose-form .compose-form__modifiers,
+.compose-form__upload-thumbnail,
+.focal-point__preview div{
+ color: var(--accent3);
+ background-color: var(--bg);
+ border-radius:0 !important;
+}
+
+/* compose poll */
+
+.poll__input {
+ border-color: var(--text);
+ border-width: 2px
+}
+
+.poll__input.checkbox {
+ border-radius: 0;
+}
+
+.poll__option input[type="text"] {
+ color: var(--bg);
+ border: none;
+ border-radius: 0;
+ background-color: #eee;
+ border-color: #eee;
+ border-width: 2px;
+}
+
+.poll__option input[type="text"]:focus {
+ background-color: var(--textBold);
+ border: none;
+}
+
+/* new option button */
+.button.button-secondary {
+ background-color: var(--accent3)!important;
+ border-radius: 0;
+ color: var(--text) !important
+}
+
+.poll__footer span {
+ color: var(--text);
+}
+
+/* poll period dropdown */
+.compose-form__poll-wrapper select {
+ color: var(--accent3);
+ border-radius: 0;
+ border: none;
+ background-color: #eee;
+ padding: 5px 30px 6px 10px;
+}
+
+/* inverted (selected) composer buttons */
+.icon-button.inverted.active {
+ color: var(--text);
+}
+
+/* modals */
+
+div.modal-root__modal.list-editor
+{
+ border-radius: 0 !important;
+}
+
+div.modal-root__modal.list-editor,
+
+.list-editor .account .icon-button:hover,
+.list-editor .account .icon-button:active,
+.list-editor .account .icon-button:focus,
+.report-modal__statuses .status__content a,
+.media-modal__close.icon-button:hover,
+.media-modal__close.icon-button:focus,
+/* public pages */
+.landing-page__short-description p a,
+.landing-page #mastodon-timeline p a,
+.simple_form p.hint.subtle-hint a,
+.contact-widget__mail a,
+.public-layout .footer ul a:hover,
+.public-layout .footer .grid .column-2 h4 a:hover,
+.public-layout .public-account-bio .account__header__fields a,
+.form-footer a:hover,
+/* settings pages */
+.pagination a:hover,
+.pagination .newer:hover,
+.pagination .older:hover,
+
+/* mobile elements */
+a.tabs-bar__link.active,
+a.tabs-bar__link:hover {
+ background: var(--bg);
+ text-decoration: none;
+ color: var(--accent2);
+ border-color: var(--accent6);
+ border-radius: 30%;
+ border-width: 1px;
+ transition: .3s
+}
+
+.tabs-bar__link span:hover,
+.tabs-bar__link span:active {
+ background: var(--bg);
+ color: var(--accent2);
+ transition: .2s;
+
+}
+
+.tabs-bar__link {
+ border-width: 2px;
+ border-color: var(--bg);
+ border-radius: 30%;
+ background: none;
+ transition: .3s
+}
+
+a.tabs-bar__link {
+ color: var(--accent6);
+
+}
+
+.column-link {
+ background: none;
+ color: var(--accent6)!important
+}
+
+.column-link:hover,
+.column-link:active{
+ transition: .3s;
+ color: var(--accent3);
+ background: none;
+}
+
+div.item-list .column-link{
+ background: none;
+ color: var(--accent2)!important
+}
+
+div.item-list:active .column-link,
+div.item-list:hover .column-link {
+ background: none;
+ color: var(--text)!important;
+ transition: .5s
+}
+
+.admin-wrapper .sidebar__toggle__logo {
+ filter: grayscale(100%);
+}
+
+.admin-wrapper .sidebar__toggle {
+ background-color: var(--bg);
+ color: var(--accent3)
+}
+
+.admin-wrapper .sidebar__toggle__icon {
+ color: var(--accent3)
+}
+
+.admin-wrapper .sidebar__toggle__icon:hover {
+ background: none;
+ color: var(--accent2)
+}
+
+
+/* center top bar */
+.tabs-bar__wrapper {
+ background-color: var(--bg);
+ color: var(--bg)
+}
+
+.column-header__wrapper.active {
+ box-shadow: var(--textBold);
+ border: none!important
+}
+
+.column-header button {
+ color: var(--accent3)!important
+}
+
+.tabs-bar__link.active {
+ border-color: var(--accent3) !important;
+ border-right: none;
+ border-left: none
+}
+
+.tabs-bar {
+ background-color: var(--bg)!important;
+ border-bottom-color: var(--accent3);
+}
+
+/* notification */
+.icon-with-badge__badge {
+ background-color: var(--bg);
+ border-radius: 50%;
+ border-color: var(--bg);
+ border-width: 0
+}
+
+.conversation__unread {
+ background-color: var(--accent2);
+}
+
+.conversation {
+ border-color: var(--accent6);
+ border-radius: 30%;
+}
+
+
+/* .notification__display-name, */
+.notification__display-name:hover {
+ color: var(--text);
+ text-decoration: none !important;
+ transition: .3s
+}
+
+.notification__message span{
+ color: var(--textMuted);
+}
+
+/*------------------------------------------------------------------------------
+* FIXES
+*
+* Due to the extensive level of recolors, some elements will need slight fixes.
+* This section contains any overrides that are mostly necessary to beautify or
+* otherwise make elements look like they belong in the new palette.
+*------------------------------------------------------------------------------/
+@media screen and (max-width: 600px) {
+ .public-layout .public-account-header__bar
+ {background: var(--bg)}
+ .public-layout .public-account-header__tabs__name h1,
+ .public-layout .public-account-header__extra__links a strong
+ {color: var(--textBold)}
+ .public-layout .public-account-header__extra__links a,
+ .public-layout .public-account-header__tabs__name h1 small
+ {color: var(--textMuted)}
+}
+@media screen and (max-width: 415px) {
+ .public-layout .card-grid>div .card__bar
+ {background: var(--bg)}
+ .public-layout .card-grid>div .card__bar:active,
+ .public-layout .card-grid>div .card__bar:focus,
+ .public-layout .card-grid>div .card__bar:hover
+ {background: var(--bgPage)}
+}
+/* transparent drawer / gs columns */
+.getting-started,
+.getting-started__wrapper,
+/*.drawer__header,*/
+.flex-spacer,
+.focusable:focus,
+.drawer__inner.darker {
+ background: none !important
+}
+
+/* service footer */
+.getting-started__footer {
+ filter: opacity(10%)
+}
+
+.getting-started__footer:hover {
+ filter: opacity(70%);
+ transition: .7s;
+}
+
+.getting-started__footer a,
+.getting-started__footer p,
+.getting-started__footer p a {
+ color: var(--textMuted) !important;
+}
+
+
+
+
+/*navigation dropdown menu */
+.dropdown-menu__arrow.bottom {
+ border-bottom-color: var(--accent2)!important
+}
+
+.dropdown-menu {
+ background-color: var(--accent2)!important;
+ border-radius: 0!important
+}
+
+.dropdown-menu__item a {
+ background: var(--accent2) !important;
+ color: var(--accent4)
+}
+
+.dropdown-menu__item a:hover {
+ background-color: var(--textBold) !important;
+ color: var(--accent4)
+}
+
+.navigation-bar,
+.navigation-bar__actions,
+.compose__action-bar.icon-button:focus {
+ opacity: .6 !important
+}
+
+/* column header */
+.column-header button {
+ color: var(--acc) !important
+}
+
+/* gallery borders*/
+.media-gallery,
+.media-gallery__item {
+ border-radius: 0 !important;
+}
+.account-gallery__item {
+ border-radius: 0 !important
+}
+/* make search results look better*/
+.search__icon .fa.active {
+ opacity: 0.5
+}
+.drawer__inner {
+ height: auto;
+}
+
+/* triangle tab popout (from toots/replies/media) */
+.account__section-headline a.active:after,
+.account__section-headline a.active:before,
+.community-timeline__section-headline a.active:after,
+.community-timeline__section-headline a.active:before,
+.public-timeline__section-headline a.active:after,
+.public-timeline__section-headline a.active:before {
+ border-color: transparent transparent var(--bg);
+ border-radius: 0;
+}
+
+/* color trending taglines with accent color */
+.trends__item__sparkline path {
+ stroke: var(--accent) !important
+}
+
+/* hover feedback for buttons */
+.button:hover,
+.block-button:hover,
+.simple_form button:hover,
+.compose-form__publish button:hover {
+ color: var(--textBold)
+}
+
+/* fixes for 70ch maxwidths */
+.landing-page__footer p {
+ margin: 0 auto
+}
+
+/* remove black artefacts from settings menu */
+.admin-wrapper .sidebar ul,
+.admin-wrapper .sidebar ul a,
+.admin-wrapper .sidebar ul a.selected,
+.admin-wrapper .sidebar ul ul {
+ border-radius: 0;
+ background: none;
+}
+
+/* make tables in settings look consistent //todo:cleanup */
+.admin-wrapper .content h4 {
+ padding: 8px;
+ font-weight: 700;
+ font-size: 16px
+}
+.table thead th,
+.table thead td {
+ font-family: "Arial Black"
+}
+.table td:first-child,
+.table > tbody > tr:nth-child(odd) > td:first-child {
+ background: var(--bg);
+ color: #ddd
+}
+.column-inline-form label input {
+ padding: 6px
+}
+
+/*---------------
+public page fixes
+---------------*/
+/* colorize logo */
+.landing-page__logo img {
+ filter: sepia(100%) hue-rotate(160deg) saturate(400%) brightness(40%);
+ mix-blend-mode: normal
+}
+
+/* add shadow to help with visibility on light bg */
+.brand img {
+ filter: drop-shadow(0 0 0 black)
+}
+
+/* footer logo recolor */
+.public-layout .footer .brand svg path {
+ fill: var(--textPageMuted)
+}
+.public-layout .footer .brand:hover svg path {
+ fill: var(--accent)
+}
+
+/* cleanup stray background elements */
+.endorsements-widget .account,
+.public-layout .header,
+.public-layout .public-account-header__bar .avatar img,
+.simple_form .input-with-append .append::after,
+.public-layout .header .brand:active,
+.public-layout .header .brand:focus,
+.public-layout .header .brand:hover,
+.input-copy {
+ background: none;
+ border-radius: 0;
+ border: none;
+}
+
+/* flatten toots view */
+.activity-stream,
+.activity-stream .entry:first-child .status,
+.activity-stream .entry:first-child .detailed-status,
+.activity-stream .entry:first-child .load-more,
+.activity-stream .entry:last-child .status,
+.activity-stream .entry:last-child .detailed-status,
+.activity-stream .entry:last-child .load-more,
+.public-layout .header,
+.nothing-here {
+ box-shadow: none;
+ border-radius: 0
+}
+
+/* toots, following, followers */
+.public-layout .public-account-header__tabs__tabs .counter::after {
+ border-bottom: 0 solid var(--textMuted)
+}
+.public-layout .public-account-header__tabs__tabs .counter.active::after,
+.public-layout .public-account-header__tabs__tabs .counter:hover::after {
+ border-bottom: 0 solid var(--accent)
+}
+
+/* make profile field keys bold */
+.account__header__fields dt {
+ font-weight: 700
+}
+
+/* improve avatar and profile-card look */
+.card__bar .avatar img {
+ background: none
+}
+.card__img {
+ background: var(--bg)
+}
+
+/*---------------
+deal with borders
+---------------*/
+/* remove most borders */
+.status-card,
+.setting-text,
+.flash-message.notice,
+.account__moved-note,
+.account__header__fields dl,
+.account__header .account__header__fields dl,
+.account__section-headline,
+.notification__filter-bar,
+.search-results__section h5,
+.public-layout .public-account-header__bar .avatar img,
+.public-layout .public-account-header__tabs__tabs .counter {
+ border: none
+}
+
+/* recolor some other borders */
+.account,
+.status,
+.status__wrapper--filtered,
+.load-gap,
+.loading-indicator__figure,
+.button.button-secondary,
+.account__header__fields,
+.account__header__fields dl:last-child,
+.account__action-bar,
+.account__action-bar__tab,
+.account__disclaimer,
+.admin-wrapper .content h4 {
+ border: none
+}
+
+/* active tabs //check later */
+.account__action-bar__tab {
+ border-bottom: 0 solid transparent
+}
+.account__action-bar__tab.active,
+.tabs-bar__link.active {
+ border-color: var(--textMuted);
+ color: var(--accent2);
+}
+
+/* fix detailed status borders */
+.detailed-status__action-bar {
+ border-color: transparent transparent var(--bgPage) transparent !important;
+ border-radius: 0;
+}
+
+/* domain blocks and report modal */
+.domain,
+.report-modal__container,
+.report-modal__comment,
+.report-modal__comment:active,
+.report-modal__comment:focus,
+.report-modal__comment .setting-text,
+.status-check-box {
+ border-color: transparent;
+ border-radius: 0;
+}
+.domain .domain__domain-name {
+ background: transparent;
+ border-radius: 0;
+}
+
+.actions-modal,
+.block-modal,
+.boost-modal,
+.confirmation-modal,
+.mute-modal,
+.report-modal {
+ border-radius: 0;
+}
+
+/* toggle button */
+.react-toggle--checked .react-toggle-track {
+ background-color: var(--accent3);
+}
+
+.react-toggle--checked .react-toggle-thumb {
+ border-color: var(--textBold);
+}
+
+.react-toggle-thumb {
+ border-width: 2px;
+}
+
+
+
+
+/*------------------------------------------------------------------------------
+* ADDITIONS AND MODS
+*
+* Tweaks and redesigns that improve the look of the overall style.
+* These may be enabled or disabled, but are recommended to enable.
+* They may also be extensions, but not "miscellaneous" enough.
+*------------------------------------------------------------------------------/
+/*
+* Add a line break between display name and account handle:
+* - this allows user/display names to expand more.
+*/
+.display-name__html {
+ display: block;
+ text-decoration:none !important
+}
+
+/*
+* Always show full name and handle:
+* - this removes the `...` and allows text to overflow past the column.
+* - this can look worse, but it can also prevent having to mouse over
+* to see the full name or handle.
+*/
+/*
+* Rounded avatars:
+* - adjust the border radius around all avatar elements.
+* - default override is 50% (i.e. turn squares into circles),
+* but you can set it to whatever you want.
+*/
+.card .avatar img,
+.activity-stream .status.light .status__avatar img,
+.account__avatar,
+.account__avatar-overlay-base,
+.account__avatar-overlay-overlay {
+ border-radius: 50%;
+ filter: grayscale(100%) opacity(45%) !important;
+}
+
+
+/*
+* Fade out faved/boosted toots in notifications:
+* - for "x favourited your toot" / "x boosted your toot",
+* - make the faved/boosted toot half-transparent.
+*/
+.status.muted {
+ opacity: 0.8
+}
+
+/*
+* Collapse fave/boost notifications
+* - limits display to just a few lines (~3), so you can at least identify it
+* - hides the display name, because you already know you posted it
+* - tighter margins, remove space between CW and content
+* - hides the buttons, but you can expand a status to interact with it
+*/
+.notification-favourite .status,
+.notification-reblog .status {
+ //max-height: 4em;
+ overflow: hidden;
+}
+.notification-favourite .display-name,
+.notification-reblog .display-name {
+ display: none;
+}
+.notification-favourite .status__content,
+.notification-reblog .status__content {
+ margin-top: -4px;
+}
+.notification-favourite .status__content p,
+.notification-reblog .status__content p {
+ margin-bottom: 0;
+}
+.notification-favourite .status__action-bar,
+.notification-reblog .status__action-bar {
+ display: none;
+}
+
+/*
+* Release elephant friend from their confines:
+* - elephant friend will now hang out in the corner of your browser,
+* instead of being trapped in the drawer.
+*/
+.drawer__inner,
+.drawer__inner__mastodon {
+ background: none;
+ z-index: 0
+}
+.drawer__inner__mastodon > img {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ height: 180px;
+ z-index: -1
+}
+.drawer__inner {
+ height: 100%
+}
+/* firefox bug highlights drawer text on click */
+/*
+* Make "getting started" column height consistent with all other columns:
+* - puts the footer back at the bottom of the page, instead of floating.
+*/
+.getting-started {
+ height: 100%;
+ display: flex;
+ flex-flow: column;
+ justify-content: space-between
+}
+
+
+
+/*
+* Remove the checker-board background from the media modal:
+* - this makes transparent images actually transparent
+*/
+.media-modal canvas,
+.media-modal img {
+ background: none;
+ border-radius: 0;
+}
+
+/*
+* Fix glowing elements when there are new toots to be fetched
+* - this is technically a fix, but it hasn't been fully fixed.
+* //todo: try to find a way to make this look good against bgHead
+*/
+.column-header.active .column-header__icon {
+ text-shadow: 0 0 0 var(--bg);
+}
+.column-header.active {
+ box-shadow: 0 0 0;
+}
+.column-header__wrapper.active:before {
+ background: radial-gradient(ellipse, var(--bg) 0, var(--bg) 30%);
+}
+
+/*
+* Fix highlights on unread DM conversations
+* - new conversations view in 2.6.0
+* - 2.6.0 adds highlight, :not(.read) has its own bg
+* - instead, let's add a dot next to the timestamp
+*/
+.status.status-direct:not(.read) {
+ background: var(--bg);
+}
+.column[aria-label="Direct messages"] .status.status-direct:not(.read) .status__relative-time:before {
+ content: "? ";
+ font-size: 1em;
+ color: var(--accent);
+}
+.conversation.focusable.muted {
+ background: var(--bg);
+}
+.conversation__avatar {
+ filter: grayscale(100%)
+}
+
+.conversation__content__names {
+ color: var(--textMuted)
+}
+
+.conversation__content__names a {
+ color: var(--textBold)
+}
+.conversation__content__relative-time {
+ color: var(--textMuted)
+}
+/* ------------------------------------------------------------
+various tweaks related to making account view look a bit better
+-------------------------------------------------------------*/
+/* profile field keys //todo */
+.account__header .account__header__fields dd,
+.public-account-bio .account__header__fields dd {
+ background: var(--bg);
+ color: var(--text)
+}
+
+/* profile field values //todo */
+.account__header .account__header__fields dt,
+.public-account-bio .account__header__fields dt {
+ background: var(--bg);
+ color: var(--text)
+}
+
+/* account h1 */
+.account__header__tabs__name h1 {
+ color: var(--textBold)
+}
+
+/* verified links */
+.account__header .account__header__fields dd.verified {
+ background: var(--bg)
+}
+
+/* bold profile field keys */
+.account__header .account__header__fields dt {
+ font-weight: 700
+}
+
+/* view profile - shadow overlay style */
+.account__header {
+ background: var(--bgHead)
+}
+.account__header > div {
+ background: var(--bg)
+}
+.account__header .account__header__display-name {
+ color: #fff
+}
+.account__header .account__header__content {
+ color: #eee
+}
+.account__header .account__header__content a,
+.account__header__fields a
+{
+ color: var(--textMuted) !important;
+ text-decoration: none !important
+}
+
+/* padded background around @handle */
+.account__header .account__header__username {
+ display: inline-block;
+ padding: 7px 7px 8px 7px;
+ border-radius: 0;
+ margin-bottom: 0;
+ background: var(--bg);
+ color: var(--textMuted);
+}
+
+/* adjust margins to account for padding */
+.account__header__content p {
+ margin-bottom: 16px;
+}
+
+/* floating follow/edit profile button */
+.account--action-button {
+ background: rgba(255, 255, 255, 0.5);
+ padding: 0.5em;
+ border-radius: 0;
+}
+.account--action-button .icon-button,
+.account--action-button .icon-button.active {
+ color: #fff;
+ border-radius: 0;
+}
+.account--action-button:hover {
+ background: var(--accent)
+}
+.account--action-button:hover .icon-button {
+ color: var(--accentText)
+}
+
+/* account page tab underline */
+.card .counter.active:after {
+ border-bottom: 0 solid var(--accent)
+}
+
+/* make footer logo visible against light bg */
+.footer .powered-by a {
+ filter: drop-shadow( 0 0 0 var(--textMuted))
+}
+
+/*
+Hide buttons that can't be clicked
+- columns on /about and tag pages have buttons that don't work.
+- so, this snippet hides those nonworking buttons to save space
+- and to avoid confusion.
+- unboostable buttons are made transparent on hover instead.
+*/
+.status__action-bar .icon-button.disabled:hover,
+.notification-favourite .status.status-direct .icon-button.disabled:hover {
+ color: transparent !important
+}
+#mastodon-timeline .status__action-bar {
+ display: none
+}
+
+/*-----------------------
+material design overrides
+-----------------------*/
+/* turn statuses into cards */
+.drawer__inner.darker {
+ filter: drop-shadow(0 0 0 rgb(68, 68, 68));
+ background: transparent
+}
+.status {
+ box-shadow: 0 0 0 rgb(68, 68, 68);
+ background: var(--bg);
+ margin: 8px;
+ border-radius: 0;
+ border: 0
+}
+.status__wrapper--filtered {
+ border: none
+}
+.detailed-status__wrapper {
+ margin: 10px;
+}
+/*might look weird in older versions pre-2.6?*/
+/* recolors */
+.column > .scrollable,
+.landing-page #mastodon-timeline,
+.activity-stream .entry {
+ background: none !important;
+ border: none
+}
+.account-timeline__header,
+.account {
+ background: var(--bg)
+}
+.notification .account,
+.load-more {
+ background: var(--bgPage)
+}
+.status__prepend,
+.notification__message,
+.status__prepend .status__display-name strong {
+ color: var(--textMuted)
+}
+.keyboard-shortcuts {
+ color: var(--textPage) !important
+}
+.notification-follow .display-name__html {
+ color: var(--textPageBold)
+}
+.notification-follow .display-name__account,
+.notification-follow .account .icon-button,
+.status__wrapper--filtered,
+.load-more {
+ color: var(--textPageMuted)
+}
+
+
+
+.status__prepend > span:hover,
+div.status__prepend-icon-wrapper:hover {
+ color: var(--textMuted);
+}
+
+/* triangle tab indicator */
+.account__section-headline a.active:after,
+.account__section-headline a.active:before,
+.community-timeline__section-headline a.active:after,
+.community-timeline__section-headline a.active:before,
+.public-timeline__section-headline a.active:after,
+.public-timeline__section-headline a.active:before,
+.notification__filter-bar button.active::before,
+.notification__filter-bar button.active::after {
+ border-color: transparent transparent var(--bgHead)
+}
+
+/* fix rounding on end toots in stream */
+.activity-stream .entry:first-child .status,
+.activity-stream .entry:last-child .status {
+ border-radius: 0
+}
+
+/* remove borders from account view */
+.account,
+.account__header__fields,
+.account__header__fields dl:last-child,
+.account__action-bar,
+.account__action-bar__tab,
+.account__disclaimer {
+ border: none
+}
+
+/*------------------------------------------------------------------------------
+* RECOLOR STATUS ACTIONS
+*
+* This tweak gets its own section because it's pretty messy and long.
+*
+* Replies, follows, faves, dropdown menu, and share can easily be themed,
+* but I can't figure out how to make them look good against the palette.
+* Manual color selection may be required, if these colors don't fit well.
+*
+* Recoloring boosts is another nightmare altogether, because of improper
+* SVG embedding in the background-image rather than directly in HTML.
+* This leads to two options:
+*
+* 1) attempt to use filter() to manually add sepia tones and hue-shift
+* - complicated and imprecise adjustments of filter()
+* - cannot use CSS variables in url()s (as in background-image)
+* + however, it does preserve the SVG boosting animation
+*
+* 2) replace the background-image with a mask-image
+* + less complicated; override background-image with color
+* + can apply CSS variable colors from palette easily
+* - requires extremely long rule to add mask-image
+* - breaks boosting animation
+*
+
+------------------------------------------------------------------------------*/
+/* add shadow on hover and active states */
+.status__action-bar .icon-button:hover,
+.status__action-bar .icon-button:active,
+.status__action-bar .icon-button.active,
+.detailed-status__action-bar .icon-button:hover,
+.detailed-status__action-bar .icon-button:active,
+.detailed-status__action-bar .icon-button.active {
+ filter: drop-shadow(0 1px 0 rgba(0, 0, 0, 0.6))
+}
+
+/* replies and follows */
+.status__action-bar-button.icon-button:nth-child(1):hover,
+.status__action-bar-button.icon-button:nth-child(1):active,
+.status__action-bar-button.icon-button:nth-child(1).active,
+.status__action-bar-button.icon-button:nth-child(1):focus,
+.detailed-status__action-bar .detailed-status__button:nth-child(1) .icon-button:hover,
+.detailed-status__action-bar .detailed-status__button:nth-child(1) .icon-button:active,
+.detailed-status__action-bar .detailed-status__button:nth-child(1) .icon-button.active,
+.detailed-status__action-bar .detailed-status__button:nth-child(1) .icon-button:focus,
+.notification__message .fa.fa-user-plus,
+.account .icon-button:active,
+.account .icon-button.active,
+.account .icon-button:focus,
+.account .icon-button:hover {
+ color: var(--text);
+ background: none
+}
+
+/* favourites */
+.status__action-bar-button.icon-button:nth-child(3):hover,
+.status__action-bar-button.icon-button:nth-child(3):active,
+.status__action-bar-button.icon-button:nth-child(3).active,
+/*.status__action-bar-button.icon-button:nth-child(3):focus,*/
+.detailed-status__action-bar .detailed-status__button:nth-child(3) .icon-button:hover,
+.detailed-status__action-bar .detailed-status__button:nth-child(3) .icon-button:active,
+.detailed-status__action-bar .detailed-status__button:nth-child(3) .icon-button.active,
+/*.detailed-status__action-bar .detailed-status__button:nth-child(3) .icon-button:focus,*/
+.notification__favourite-icon-wrapper .star-icon {
+ color: var(--text);
+ background: none
+}
+
+/* menu */
+.status__action-bar-dropdown .icon-button:hover,
+.status__action-bar-dropdown .icon-button:active,
+.status__action-bar-dropdown .icon-button.active,
+.status__action-bar-dropdown .icon-button.focus,
+.detailed-status__action-bar-dropdown .icon-button:hover,
+.detailed-status__action-bar-dropdown .icon-button:active,
+.detailed-status__action-bar-dropdown .icon-button.active,
+.detailed-status__action-bar-dropdown .icon-button:focus {
+ color: var(--text);
+ background: none
+}
+
+/* share */
+.icon-button:hover .fa-share-alt {
+ color: var(--textMuted);
+ background: none
+}
+
+span.status__action-bar__counter__label:hover {
+ color: var(--textMuted);
+ background: none
+}
+
+/* boosts notifications */
+.notification__message .fa.fa-retweet,
+.icon-button:hover .fa-retweet {
+ color: var(--text)!important;
+/* background: none */
+}
+
+/* remove icon backgrounds */
+
+.status__action-bar-button.icon-button--with-counter,
+.status__action-bar-button.icon-button,
+.status__action-bar-dropdown .icon-button {
+ background:none
+}
+
+.status__action-bar-button.icon-button--with-counter:focus,
+.status__action-bar-button.icon-button:focus,
+.status__action-bar-dropdown .icon-button:focus{
+ color: var(--textMuted);
+}
+
+/* recolor boosts */
+i.fa.fa-retweet.fa-fw {
+ filter: grayscale(100%) brightness(120%) !important
+}
+
+i.fa.fa-retweet.fa-fw:hover{
+ filter: grayscale(100%) brightness(200%)!important;
+ transition: .3s
+}
+
+
+button.status__action-bar-button.icon-button.active,
+.icon.button.active i.fa.fa-retweet.fa-fw,
+button.icon-button.active i.fa-retweet{
+ filter: grayscale(100%) brightness(200%)!important;
+ transition: .9s
+}
+
+button.icon-button.active i.fa-retweet:focus{
+ filter: grayscale(100%) brightness(120%) !important
+}
+
+/* hover to hide disabled button */
+button.icon-button.disabled i.fa-retweet:hover {
+ filter: grayscale(100%) opacity(60%);
+ transition: .5s !important;
+}
+
+/* */
+strong.navigation-bar__profile-account {
+ color: var(--textmuted)
+}
+
+/*getting started footer */
+div.getting-started__footer {
+ color: var(--textMuted)
+}
+
+div.getting-started__footer span:hover {
+ color: var(--textMuted);
+ text-decoration: none;
+}
+
+/* buttons */
+button.icon-button {
+ border: 0;
+ border-radius: 0;
+ background: none !important;
+}
+
+div.status__prepend {
+ color: var(--textMuted);
+ filter: opacity(70%)
+}
+
+/* announcements */
+div.announcements {
+ background-color: var(--accent2)
+}
+
+.announcements__item__content a.unhandled-link {
+ color: teal
+}
+
+.announcements__item__content a {
+ color: teal
+}
+
+.tabs-bar__link.active {
+ border-color: var(--textMuted)
+}
+
+.tabs-bar__link {
+ color: var(--textMuted);
+ border-width: 2px;
+}
+
+/* fade banner image */
+img.parallax {
+ filter: opacity(20%) grayscale(50%)
+}
+
+/**/
+.reactions-bar__item {
+ background-color: var(--text);
+ border-radius: 50%;
+}
+
+.reactions-bar__item__count {
+ color: var(--accent3)
+}
+
+.reactions-bar .emoji-button {
+ color: var(--accent4)
+}
+
+div.detailed-status__button {
+ background-color: var(--bg);
+}
+
+.detailed-status {
+ background-color: var(--bg);
+}
+
+div.drawer__inner__mastodon {
+ filter: opacity(0);
+}
+
+/* timeline hint*/
+.timeline-hint,
+.timeline-hint span:hover {
+ color: var(--accent2)
+}
+
+.timeline-hint a,
+.timeline-hint a:hover {
+ color: var(--accent2)!important;
+}
+
+div.trends__header,
+div.trends__header span:hover {
+ background-color: var(--bg);
+ border: none;
+ color: var(--accent3)
+}
+
+/* fix double column head on list page // todo*/
+.column-header h1 {display:none !important;
+}
+
+/* loading animations */
+.no-reduce-motion .loading-indicator__figure,
+.loading-bar{
+ background-color: var(--accent2)!important;
+ color: var(--accent2)!important;
+ border-color: var(--textBold)!important;
+ border-radius: 0 !important
+}
+
+div.status__wrapper.status__wrapper-public {
+ border-color: var(--textBold)
+}
+
+/* unread notification left border color // not working */
+div.notifications-bar-message,
+div.notification-bar.notification-bar-active {
+ border-radius: 0 !important;
+}
+
+div.notification.notification-reblog.focusable.unread,
+div.status__wrapper.status__wrapper-direct.unread.focusable,
+div.status__wrapper.status__wrapper-private.focusable,
+div.item-list article,
+.status.status-direct:not(.read){
+ border-color: var(--textBold) !important;
+ border-radius: 30% !important;
+}
+
+/* follow request page */
+.account__header__content {
+ color: var(--textBold)
+}
+
+.account--panel {
+ background-color: var(--accent4);
+ border-color: var(--accent4);
+}
+
+.notifications-permission-banner{
+ border-color: var(--accent3)
+}
+
+.notifications-permission-banner p,.notifications-permission-banner span:hover{
+ color: var(--textMuted);
+}
+
+
+/* directory list */
+
+.radio-button__input.checked {
+ background-color: var(--accent2);
+ border-color: var(--accent2)
+}
+
+.radio-button__input{
+ border-color: var(--accent2)
+}
+
+.filter-form,
+.directory__card__bar,
+.directory__card__extra{
+ background: none;
+}
+
+.directory__card__extra .account__header__content{
+ border: none;
+}
+
+.directory__card__bar .display-name span {
+ color: var(--textMuted);
+}
+
diff --git a/app/javascript/styles/mods/cantadark.scss b/app/javascript/styles/mods/cantadark.scss
new file mode 100644
index 0000000000000..13e2fc9ce2686
--- /dev/null
+++ b/app/javascript/styles/mods/cantadark.scss
@@ -0,0 +1,2369 @@
+ :root
+ {
+ --orange: #FFAC00;
+ --orangelight: #FFAC004D;
+ --green: #00CE99;
+ --darkest: #323232;
+ --lightgrey: #dbdbdb;
+ --darkgrey: #505050;
+ --notifgrey: #3e3e3e;
+ }
+
+ html
+ {
+ scrollbar-color: var(--darkgrey) var(--darkest);
+ }
+
+ .scrollbar-color,
+.scrollable
+ {
+ /* Replace the color by the color of column headers for a better effect. */
+ scrollbar-color: var(--darkgrey) var(--darkest);
+ /* This is optional but I find the default scrollbars way too fat. */
+ scrollbar-width: thin;
+ }
+
+ body.error
+ {
+ color: var(--lightgrey);
+ background: var(--darkest);
+ }
+
+ div[data-reactroot]
+ {
+ background: none !important;
+ }
+
+ body
+ {
+ background: var(--darkgrey);
+ }
+
+ .ui
+ {
+ background: var(--darkest);
+ }
+
+ body.app-body
+ {
+ background: var(--darkest);
+ }
+
+ .loading-bar
+ {
+ background-color: var(--green);
+ }
+
+ .loading-indicator__figure
+ {
+ border: 6px solid var(--orange);
+ }
+
+ .loading-indicator span
+ {
+ color: var(--orange);
+ }
+
+ div.column
+ {
+ opacity: 0.9;
+ flex-grow: 1;
+ flex-shrink: 1;
+ }
+
+ div.drawer
+ {
+ opacity: 0.95;
+ background-color: transparent !important;
+ }
+
+ .status__content a .fa,
+.status__content a .fa:hover
+ {
+ color: var(--green);
+ }
+
+ .status__content a,
+.reply-indicator__content a,
+.getting-started a,
+.muted .status__content a,
+.account__header .account__header__username
+ {
+ color: var(--green);
+ }
+
+ .account__display-name strong,
+.status__display-name strong
+ {
+ color: var(--green);
+ }
+
+ .account__section-headline
+ {
+ background: var(--darkest);
+ border-bottom: 1px solid var(--orangelight);
+ }
+
+ .column-header
+ {
+ background: var(--darkest);
+ }
+
+ .column-header__button
+ {
+ background: var(--darkest);
+ }
+
+ .column-header__back-button
+ {
+ background: var(--darkest);
+ }
+
+ .column-header__back-button
+ {
+ color: var(--green);
+ }
+
+ .column-header > .column-header__back-button
+ {
+ color: var(--green);
+ }
+
+ .column-header__buttons:hover
+ {
+ background-color: var(--darkgrey);
+ }
+
+ .status
+ {
+ border-bottom: 1px solid var(--orangelight);
+ }
+
+ .account
+ {
+ border-bottom: 1px solid var(--orangelight);
+ }
+
+ .status__content
+ {
+ font-size: 14px !important;
+ }
+
+ .search
+ {
+ width: 95%;
+ margin: 0 auto;
+ margin-bottom: 10px;
+ }
+
+ .search__input
+ {
+ background: var(--darkgrey);
+ color: var(--lightgrey);
+ Border-radius: 4px;
+ }
+
+ .search__input:focus
+ {
+ background: var(--darkgrey);
+ }
+
+ .search__icon .fa-times-circle:hover
+ {
+ color: var(--lightgrey);
+ }
+
+ .search__icon .fa-times-circle
+ {
+ color: var(--lightgrey);
+ }
+
+ .search__icon .fa.active
+ {
+ opacity: .8;
+ }
+
+ .drawer__inner__mastodon
+ {
+ background: var(--darkgrey);
+ background-color: var(--darkgrey);
+ }
+
+ .compose-form .autosuggest-textarea__textarea,
+.compose-form .spoiler-input__input
+ {
+ color: var(--lightgrey);
+ background: var(--darkgrey);
+ border-bottom: 1px solid var(--orange);
+ outline: 0;
+ }
+
+ .compose-form .compose-form__modifiers .compose-form__uploads-wrapper
+ {
+ color: var(--lightgrey);
+ background: var(--darkgrey);
+ }
+
+ .account__header .account__header__fields dd
+ {
+ color: var(--lightgrey);
+ background: var(--notifgrey);
+ }
+
+ .account__header .account__header__fields dt
+ {
+ color: var(--lightgrey);
+ background: var(--notifgrey);
+ }
+
+ .account__action-bar__tab strong
+ {
+ color: var(--lightgrey);
+ }
+
+ .account__header > div
+ {
+ background: var(--notifgrey);
+ opacity: 0.9;
+ }
+
+ .account__header__bar
+ {
+ border-bottom: 1px solid var(--orangelight);
+ }
+
+ .account__header__fields
+ {
+ border-style: solid none;
+ border-width: 1px 0;
+ }
+
+ .compose-form .compose-form__buttons-wrapper
+ {
+ background: var(--darkgrey);
+ }
+
+ .compose-form .compose-form__buttons-wrapper .character-counter__wrapper .character-counter
+ {
+ color: var(--lightgrey);
+ }
+
+ .text-icon-button
+ {
+ color: var(--lightgrey);
+ }
+
+ .star-icon.active
+ {
+ color: var(--orange);
+ }
+
+ .drawer__inner__mastodon
+ {
+ display: none !important;
+ }
+
+ .column > .scrollable
+ {
+ background: var(--darkest);
+ border-top: 1px solid var(--orangelight);
+ }
+
+ .drawer__inner
+ {
+ background: var(--darkest);
+ }
+
+ .drawer__header
+ {
+ background: var(--darkest);
+ }
+
+ .drawer__header a:hover
+ {
+ background: var(--darkgrey);
+ -webkit-transition: background 200ms ease-out;
+ transition: background 200ms ease-out;
+ }
+
+ .status.status-direct:not(.read)
+ {
+ background: var(--darkgrey);
+ border-bottom-color: var(--darkgrey);
+ }
+
+ .status__display-name,
+.status__prepend .status__display-name strong
+ {
+ color: var(--green);
+ }
+
+ .display-name__account
+ {
+ font-size: 14px;
+ color: var(--orange);
+ }
+
+ .muted .status__content p
+ {
+ color: var(--lightgrey);
+ }
+
+ .muted .status__content a
+ {
+ color: var(--green);
+ }
+
+ .muted .status__display-name strong
+ {
+ color: var(--lightgrey);
+ }
+
+ .attachment-list__list a
+ {
+ color: var(--green);
+ }
+
+ .status__prepend > span
+ {
+ color: var(--lightgrey) !important;
+ }
+
+ .notification__message > span
+ {
+ color: var(--lightgrey) !important;
+ }
+
+ .notification__display-name
+ {
+ color: var(--orange);
+ }
+
+ .status__relative-time
+ {
+ color: var(--green);
+ }
+
+ .detailed-status
+ {
+ background: var(--notifgrey);
+ }
+
+ .reply-indicator
+ {
+ background: var(--darkgrey);
+ }
+
+ .reply-indicator__content
+ {
+ color: var(--lightgrey);
+ }
+
+ .detailed-status__meta
+ {
+ color: var(--lightgrey);
+ }
+
+ .detailed-status__action-bar
+ {
+ background: var(--notifgrey);
+ border-bottom: 1px solid var(--orangelight);
+ }
+
+ .icon-button.inverted
+ {
+ color: var(--lightgrey);
+ }
+
+ .drawer__tab
+ {
+ color: var(--lightgrey);
+ }
+
+ .icon-button.inverted:hover,
+.icon-button.inverted:active,
+.icon-button.inverted:focus
+ {
+ color: var(--lightgrey);
+ }
+
+ .icon-button
+ {
+ color: var(--lightgrey);
+ }
+
+ .icon-button:hover,
+.icon-button:active,
+.icon-button:focus
+ {
+ color: var(--orange);
+ -webkit-transition: color 200ms ease-out !important;
+ transition: color 200ms ease-out !important;
+ }
+
+ .reduce-motion button.icon-button i.fa-retweet
+ {
+ color: var(--lightgrey);
+ }
+
+ .status.status-direct:not(.read)
+ {
+ background: var(--notifgrey);
+ border-bottom-color: var(--orangelight);
+ }
+
+ .icon-button.disabled
+ {
+ color: var(--lightgrey);
+ }
+
+ .status__content__read-more-button
+ {
+ color: var(--green);
+ }
+
+ .column-header__button:hover
+ {
+ color: var(--lightgrey);
+ }
+
+ .column-header__button
+ {
+ color: var(--lightgrey);
+ }
+
+ .status-card
+ {
+ border: 1px solid var(--orange);
+ }
+
+ .status-card__title
+ {
+ color: var(--orange);
+ }
+
+ .status-card.compact
+ {
+ border-color: var(--orange);
+ }
+
+ .status-card
+ {
+ color: var(--orange);
+ }
+
+ .status-card__content
+ {
+ color: var(--orange);
+ }
+
+ a.status-card:hover,
+a.status-card.compact:hover
+ {
+ background-color: var(--darkgrey);
+ }
+
+ .status-card__image:hover
+ {
+ background-color: var(--darkgrey);
+ }
+
+ .column-back-button
+ {
+ background: var(--darkest);
+ color: var(--green);
+ }
+
+ .upload-progress
+ {
+ color: var(--lightgrey);
+ background: var(--darkgrey);
+ }
+
+ .upload-progress__tracker
+ {
+ background: var(--green);
+ }
+
+ .navigation-bar a
+ {
+ color: var(--green);
+ }
+
+ .navigation-bar strong
+ {
+ color: var(--orange);
+ font-size: 1.2em;
+ }
+
+ .column-header__collapsible-inner
+ {
+ background: var(--notifgrey);
+ }
+
+ .column-header__button.active:hover
+ {
+ background: transparent !important;
+ }
+
+ .react-toggle--checked .react-toggle-track
+ {
+ background-color: var(--orange);
+ }
+
+ .react-toggle--checked .react-toggle-thumb
+ {
+ left: 27px;
+ border-color: var(--orange);
+ }
+
+ .react-toggle-track
+ {
+ background-color: var(--darkgrey);
+ }
+
+ .react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track
+ {
+ background-color: var(--orangelight);
+ }
+
+ .button
+ {
+ background-color: var(--orange);
+ }
+
+ .button:hover
+ {
+ background-color: var(--orangelight);
+ -webkit-transition: all 200ms ease-out;
+ transition: all 200ms ease-out;
+ }
+
+ .button:disabled
+ {
+ background-color: var(--orangelight);
+ cursor: default;
+ }
+
+ .column-header.active
+ {
+ -webkit-box-shadow: 0 1px 0 var(--orangelight);
+ box-shadow: 0 1px 0 var(--orangelight);
+ }
+
+ .column-header__wrapper.active::before
+ {
+ background: radial-gradient(ellipse,var(--orangelight) 0%,transparent 70%);
+ }
+
+ .column-header
+ {
+ background: var(--darkest);
+ }
+
+ .column-subheading
+ {
+ background: var(--darkest);
+ color: var(--lightgrey);
+ border-top: 1px solid var(--orangelight);
+ }
+
+ .column-link
+ {
+ background: var(--darkest);
+ }
+
+ .column-link:hover
+ {
+ background: var(--darkgrey);
+ }
+
+ .getting-started__footer
+ {
+ background-color: var(--darkest);
+ border-top: 1px solid var(--orangelight);
+ }
+
+ .getting-started__footer p
+ {
+ color: var(--lightgrey);
+ }
+
+ .getting-started__footer p a
+ {
+ color: var(--green);
+ text-decoration: none !important;
+ }
+
+ .getting-started__footer p a:hover
+ {
+ text-decoration: underline !important;
+ }
+
+ .account__action-bar__tab.active
+ {
+ border-bottom: 2px solid var(--orange);
+ }
+
+ .account__section-headline a.active::after
+ {
+ border-color: transparent transparent var(--orange);
+ }
+
+ .status__action-bar__counter__label
+ {
+ color: var(--lightgrey);
+ }
+
+ .column-header > button
+ {
+ color: var(--orange);
+ }
+
+ .column-header__button.active,
+.column-header__button.active:hover
+ {
+ background: var(--notifgrey);
+ }
+
+ .setting-toggle__label,
+.column-settings__section
+ {
+ color: var(--lightgrey);
+ }
+
+ .text-btn
+ {
+ color: var(--lightgrey);
+ }
+
+ .notification-favourite
+ {
+ background-color: var(--notifgrey);
+ }
+
+ .text-icon-button:hover,
+.text-icon-button:active,
+.text-icon-button:focus
+ {
+ color: var(--lightgrey);
+ -webkit-transition: color 200ms ease-out;
+ transition: color 200ms ease-out;
+ }
+
+ .detailed-status__application,
+.detailed-status__datetime
+ {
+ color: var(--green);
+ }
+
+ .load-gap
+ {
+ border-bottom: 1px solid var(--darkest);
+ }
+
+ .load-more
+ {
+ color: var(--lightgrey);
+ }
+
+ .load-more:hover
+ {
+ background-color: var(--darkest);
+ color: var(--lightgrey);
+ }
+
+ .privacy-dropdown__option.active:hover
+ {
+ background: var(--green);
+ }
+
+ .privacy-dropdown__option:hover,
+.privacy-dropdown__option.active
+ {
+ background: var(--green);
+ }
+
+ .privacy-dropdown.active .privacy-dropdown__value.active .icon-button
+ {
+ background-color: var(--green);
+ }
+
+ .compose-form .compose-form__warning
+ {
+ background: var(--lightgrey);
+ }
+
+ .dropdown-menu
+ {
+ background: var(--lightgrey);
+ }
+
+ .dropdown-menu__item a
+ {
+ background: var(--lightgrey);
+ }
+
+ .dropdown-menu__item a:focus,
+.dropdown-menu__item a:hover,
+.dropdown-menu__item a:active
+ {
+ background: var(--green);
+ color: var(--darkgrey);
+ }
+
+ .status__content .status__content__spoiler-link,
+.reply-indicator__content .status__content__spoiler-link
+ {
+ background: var(--orange);
+ color: var(--darkest);
+ }
+
+ .status__content .status__content__spoiler-link:hover,
+.reply-indicator__content .status__content__spoiler-link:hover
+ {
+ background: var(--orange);
+ text-decoration: none;
+ opacity: .8;
+ }
+
+ .emoji-button img
+ {
+ -webkit-filter: grayscale(70%);
+ filter: grayscale(70%);
+ }
+
+ .focusable:focus
+ {
+ outline: 0 ! important;
+ background: var(--darkgrey);
+ }
+
+ .column-header.active .column-header__icon
+ {
+ color: var(--orange);
+ text-shadow: none ! important;
+ }
+
+ .account__header__fields a
+ {
+ color: var(--orange);
+ text-decoration: none;
+ }
+
+ .fa-user-times::before
+ {
+ color: var(--orange);
+ }
+
+ .tabs-bar
+ {
+ background: var(--darkest);
+ }
+
+ .tabs-bar__link
+ {
+ border-bottom: 2px solid var(--darkest);
+ }
+
+ .tabs-bar__link.active
+ {
+ border-bottom: 2px solid var(--orange);
+ color: var(--orange);
+ }
+
+ .floating-action-button,
+.floating-action-button:hover,
+.floating-action-button:focus,
+.floating-action-button:active
+ {
+ background: var(--orange);
+ }
+
+ .video-player__spoiler.active:hover,
+.video-player__spoiler.active:active,
+.video-player__spoiler.active:focus
+ {
+ color: #00CE99B3;
+ }
+
+ .video-player__spoiler
+ {
+ color: var(--green);
+ }
+
+ .media-spoiler
+ {
+ background: var(--darkgrey);
+ color: var(--orange);
+ }
+
+ .media-spoiler:hover,
+.media-spoiler:active,
+.media-spoiler:focus
+ {
+ background: var(--darkgrey);
+ color: var(--orangelight);
+ }
+
+ .account__disclaimer
+ {
+ color: var(--lightgrey);
+ }
+
+ .account__action-bar
+ {
+ border-top: 0px solid var(--darkest);
+ border-bottom: 0px solid var(--darkest);
+ }
+
+ .account__action-bar__tab
+ {
+ border-right: 0px solid var(--darkest);
+ }
+
+ .account__header .account__header__fields dl
+ {
+ border-top: 0px solid var(--darkgrey);
+ }
+
+ .account__header__content a:hover
+ {
+ color: var(--orange);
+ text-decoration: underline !important;
+ }
+
+ .account__header__bio .account__header__fields
+ {
+ border-top: 0px solid var(--darkest);
+ }
+
+ .account__header__fields dl:last-child
+ {
+ border-bottom: 0px solid var(--darkest);
+ }
+
+ .account__header__fields
+ {
+ border-color: transparent !important;
+ }
+
+ .account__action-bar__tab > span
+ {
+ color: var(--lightgrey);
+ }
+
+ .fa-thumb-tack::before
+ {
+ color: var(--lightgrey);
+ }
+
+ .account__section-headline a
+ {
+ color: var(--lightgrey);
+ }
+
+ .text-icon-button.active
+ {
+ color: var(--orange);
+ }
+
+ .button
+ {
+ color: var(--darkest);
+ }
+
+ .button:disabled
+ {
+ color: var(--darkgrey);
+ cursor: default;
+ }
+
+ .fa-bell::before
+ {
+ content: "\f075";
+ }
+
+ .fa-home::before
+ {
+ content: "\f10e";
+ }
+
+ .fa-group::before,
+.fa-users::before
+ {
+ content: "\f0e8";
+ }
+
+ .fa-hourglass::before
+ {
+ color: var(--orange);
+ }
+
+ .fa-sliders::before
+ {
+ color: var(--orange);
+ }
+
+ .search-popout
+ {
+ background: var(--lightgrey);
+ color: var(--darkgrey);
+ }
+
+ .search-popout h4
+ {
+ color: var(--darkgrey);
+ }
+
+ .search-popout em
+ {
+ color: var(--darkgrey);
+ }
+
+ .attachment-list.compact .fa
+ {
+ color: var(--orange);
+ }
+
+ .status__prepend
+ {
+ color: var(--orange);
+ }
+
+ .detailed-status__display-name strong
+ {
+ color: var(--green);
+ }
+
+ .status-card__actions button,
+.status-card__actions a
+ {
+ color: var(--orange);
+ }
+
+ .status-card__image
+ {
+ background: transparent;
+ }
+
+ .icon-button.inverted.active
+ {
+ color: var(--green);
+ }
+
+ .getting-started__wrapper,
+.getting-started,
+.flex-spacer
+ {
+ background: var(--darkest);
+ }
+
+ .focusable:focus .status.status-direct
+ {
+ background: var(--notifgrey);
+ }
+
+ .muted .emojione
+ {
+ opacity: 1;
+ }
+
+ .empty-column-indicator,
+.error-column
+ {
+ color: var(--lightgrey);
+ background: var(--darkest);
+ }
+
+ .column-inline-form
+ {
+ background: var(--darkgrey);
+ color: var(--lightgrey);
+ }
+
+ .setting-text
+ {
+ color: var(--lightgrey);
+ border-bottom: 2px solid var(--lightgrey);
+ }
+
+ .column-back-button--slim-button
+ {
+ top: -49px;
+ }
+
+ .drawer__inner.darker
+ {
+ background: var(--darkest);
+ }
+
+ .search-results__header
+ {
+ background-color: var(--darkest);
+ color: var(--lightgrey);
+ }
+
+ .search-results__section h5
+ {
+ background: var(--darkest);
+ border-bottom: 1px solid var(--orange);
+ color: var(--lightgrey);
+ }
+
+ .trends__item__name
+ {
+ color: var(--lightgrey);
+ }
+
+ .trends__item__name a
+ {
+ color: var(--orange);
+ }
+
+ .trends__item__sparkline path
+ {
+ stroke: var(--orange) !important;
+ }
+
+ .account__section-headline button,
+.notification__filter-bar button
+ {
+ background: var(--darkest);
+ }
+
+ .account__section-headline,
+.notification__filter-bar
+ {
+ background: var(--notifgrey);
+ }
+
+ .account__section-headline a,
+.account__section-headline button,
+.notification__filter-bar a,
+.notification__filter-bar button
+ {
+ color: var(--lightgrey);
+ }
+
+ .account__section-headline a.active::after,
+.account__section-headline button.active::after,
+.notification__filter-bar a.active::after,
+.notification__filter-bar button.active::after
+ {
+ bottom: -1px;
+ border-color: transparent transparent var(--orange);
+ }
+
+ .account__section-headline a.active,
+.account__section-headline button.active,
+.notification__filter-bar a.active,
+.notification__filter-bar button.active
+ {
+ color: var(--orange);
+ }
+
+ .account__moved-note
+ {
+ background: var(--darkgrey);
+ border-top: 1px solid var(--darkest);
+ border-bottom: 1px solid var(--darkest);
+ }
+
+ .account__moved-note__message
+ {
+ color: var(--orange);
+ }
+
+ .emoji-mart-anchors
+ {
+ color: var(--lightgrey);
+ }
+
+ .emoji-mart-anchor:hover
+ {
+ color: var(--orange);
+ }
+
+ .emoji-mart-bar:first-child
+ {
+ background: var(--darkest);
+ border-bottom: 1px solid var(--orange);
+ }
+
+ .emoji-mart-anchor-selected:hover
+ {
+ color: var(--orange);
+ }
+
+ .emoji-mart-anchor-bar
+ {
+ background-color: var(--orange);
+ }
+
+ .emoji-mart-search
+ {
+ background: var(--darkest);
+ }
+
+ .emoji-picker-dropdown__menu
+ {
+ background: var(--darkest);
+ }
+
+ .emoji-mart-category-label span
+ {
+ background: var(--darkest);
+ color: var(--lightgrey);
+ }
+
+ .emoji-mart-search input
+ {
+ background: var(--darkgrey);
+ color: var(--lightgrey);
+ border: 1px solid var(--darkest);
+ }
+
+ .emoji-mart-scroll
+ {
+ background: var(--darkest);
+ }
+
+ .emoji-mart-anchor-selected
+ {
+ color: var(--orange);
+ }
+
+ .reduce-motion button.icon-button.active i.fa-retweet
+ {
+ color: var(--orange);
+ }
+
+ .notification__message .fa
+ {
+ color: var(--orange);
+ }
+
+ .emoji-mart-no-results
+ {
+ color: var(--lightgrey);
+ }
+
+ .emoji-picker-dropdown__modifiers__menu
+ {
+ background: var(--darkgrey);
+ }
+
+ .activity-stream .entry
+ {
+ background: var(--darkest);
+ }
+
+ .public-layout .header
+ {
+ background: var(--darkest);
+ }
+
+ .button.logo-button
+ {
+ background: var(--darkgrey);
+ color: var(--orange);
+ border: 1px solid var(--orangelight);
+ }
+
+ .button.logo-button:active,
+.button.logo-button:focus,
+.button.logo-button:hover
+ {
+ background: var(--orange);
+ color: var(--darkgrey);
+ }
+
+ .button.logo-button:active svg path:last-child,
+.button.logo-button:focus svg path:last-child,
+.button.logo-button:hover svg path:last-child
+ {
+ fill: var(--orange);
+ }
+
+ .button.logo-button:active svg path:first-child,
+.button.logo-button:focus svg path:first-child,
+.button.logo-button:hover svg path:first-child
+ {
+ fill: var(--darkgrey);
+ }
+
+ .public-layout .public-account-header__tabs__tabs .counter.active::after
+ {
+ border-bottom: 4px solid var(--orange);
+ }
+
+ .account__header__fields dt,
+.account__header__fields dd
+ {
+ color: var(--lightgrey);
+ background-color: var(--darkest);
+ box-sizing: inherit;
+ text-align: left;
+ }
+
+ .account__header__fields dl
+ {
+ border-bottom: 0px solid var(--darkest);
+ }
+
+ .public-layout .public-account-bio .account__header__content
+ {
+ color: var(--lightgrey);
+ background-color: var(--darkest);
+ }
+
+ .public-layout .public-account-bio .roles,
+.public-layout .public-account-bio__extra
+ {
+ color: var(--lightgrey);
+ background-color: var(--darkest);
+ }
+
+ .public-layout .header .nav-link
+ {
+ color: var(--orange);
+ }
+
+ .public-layout .public-account-header__tabs__tabs .counter .counter-label
+ {
+ color: var(--lightgrey);
+ }
+
+ .public-layout .public-account-bio .account__header__fields a
+ {
+ color: var(--orange);
+ }
+
+ .public-layout .public-account-header__tabs__tabs
+ {
+ background-color: var(--darkest);
+ }
+
+ .public-layout .public-account-header__bar .avatar img
+ {
+ border: 4px solid var(--orange);
+ background: var(--orange);
+ }
+
+ .simple_form p.hint
+ {
+ color: var(--lightgrey);
+ }
+
+ .hero-widget__text
+ {
+ background: var(--darkest);
+ color: var(--lightgrey);
+ }
+
+ .public-layout .public-account-header
+ {
+ background-color: var(--darkest);
+ }
+
+ .status-card__description
+ {
+ color: var(--lightgrey);
+ }
+
+ .card__bar
+ {
+ background: var(--darkest);
+ }
+
+ .card__bar .display-name span
+ {
+ color: var(--green);
+ }
+
+ .card__bar .display-name strong
+ {
+ color: var(--orange);
+ }
+
+ .card > a:active .card__bar,
+.card > a:focus .card__bar,
+.card > a:hover .card__bar
+ {
+ background: var(--darkgrey);
+ }
+
+ .public-layout .footer h4,
+.public-layout .footer .grid .column-2 h4 a
+ {
+ color: var(--green);
+ }
+
+ .public-layout .footer,
+.public-layout .footer ul a
+ {
+ color: var(--lightgrey);
+ }
+
+ .public-layout .footer .brand svg path
+ {
+ fill: var(--orange);
+ }
+
+ .public-layout .footer .brand:active svg path,
+.public-layout .footer .brand:focus svg path,
+.public-layout .footer .brand:hover svg path
+ {
+ fill: var(--orangelight);
+ }
+
+ .button.logo-button svg path:first-child
+ {
+ fill: var(--orange);
+ }
+
+ .button.logo-button svg path:last-child
+ {
+ fill: var(--darkest);
+ }
+
+ .public-layout .header .nav-button
+ {
+ background: var(--darkgrey);
+ }
+
+ .public-layout .header .nav-button:active,
+.public-layout .header .nav-button:focus,
+.public-layout .header .nav-button:hover
+ {
+ background: var(--orange);
+ }
+
+ .public-layout .header .nav-link:active,
+.public-layout .header .nav-link:focus,
+.public-layout .header .nav-link:hover
+ {
+ color: var(--darkgrey);
+ }
+
+ .public-layout .header .brand:active,
+.public-layout .header .brand:focus,
+.public-layout .header .brand:hover
+ {
+ background: var(--darkgrey);
+ }
+
+ .public-layout .public-account-header__image
+ {
+ background: var(--darkest);
+ opacity: .2;
+ }
+
+ .video-player__seek__handle
+ {
+ background: var(--orange);
+ }
+
+ .video-player__seek__progress
+ {
+ background: var(--orange);
+ }
+
+ .video-player__volume__current
+ {
+ background: var(--orange);
+ }
+
+ .video-player__volume__handle
+ {
+ background: var(--orange);
+ }
+
+ .regeneration-indicator
+ {
+ color: var(--green);
+ background: var(--darkest);
+ }
+
+ .regeneration-indicator__label strong
+ {
+ color: var(--orange);
+ }
+
+ .icon-button.inverted.active.disabled
+ {
+ color: var(--orange);
+ }
+
+ .media-modal__button--active
+ {
+ background-color: var(--orange);
+ }
+
+ .status.status-direct:not(.read)
+ {
+ background: var(--notifgrey);
+ }
+
+ .focusable:focus .detailed-status,
+.focusable:focus .detailed-status__action-bar
+ {
+ background: var(--darkgrey);
+ }
+
+ .display-name__html
+ {
+ color: var(--orange);
+ }
+
+ .compose-form__poll-wrapper
+ {
+ background-color: var(--darkgrey);
+ }
+
+ .compose-form__poll-wrapper .button.button-secondary
+ {
+ background-color: var(--orange);
+ }
+
+ .compose-form__poll-wrapper .poll__footer button,
+.compose-form__poll-wrapper .poll__footer select
+ {
+ background-color: var(--orange);
+ border: 1px solid var(--orange);
+ }
+
+ .compose-form__poll-wrapper
+ {
+ border-top: 1px solid var(--darkgrey);
+ }
+
+ .poll__text input[type="text"]
+ {
+ background: var(--lightgrey);
+ }
+
+ .poll__input
+ {
+ border: 1px solid var(--orange);
+ }
+
+ .compose-form__poll-wrapper .poll__footer
+ {
+ border-top: 1px solid var(--darkgrey);
+ }
+
+ .poll__chart
+ {
+ background: var(--orange);
+ }
+
+ .poll__chart.leading,
+.muted .poll__chart.leading
+ {
+ background: var(--green);
+ }
+
+ .muted .poll
+ {
+ color: var(--lightgrey);
+ text-shadow: 1px 1px 2px var(--darkest);
+ }
+
+ .poll__link
+ {
+ color: var(--orange);
+ }
+
+ .poll__footer
+ {
+ color: var(--orange);
+ }
+
+ .account__header__tabs__name h1 small
+ {
+ color: var(--green);
+ }
+
+ .account__header__extra__links a
+ {
+ color: var(--orange);
+ }
+
+ .account__header__extra__links a strong
+ {
+ color: var(--orange);
+ }
+
+ .account__header__bio .account__header__fields a
+ {
+ color: var(--green);
+ }
+
+ .fa-ellipsis-h::before
+ {
+ color: var(--orange);
+ }
+
+ button.icon-button i.fa-retweet
+ {
+ background-image: url("data:image/svg+xml;utf8,");
+ }
+
+ button.icon-button i.fa-retweet:hover
+ {
+ background-image: url("data:image/svg+xml;utf8,");
+ }
+
+ .compose-form__sensitive-button
+ {
+ background-color: var(--darkgrey);
+ }
+
+ .compose-form__sensitive-button .icon-button
+ {
+ color: var(--lightgrey);
+ }
+
+ .icon-button.active
+ {
+ color: var(--orange);
+ }
+
+ .upload-area
+ {
+ background: rgba(50, 56, 55, .8);
+ }
+
+ .upload-area__background
+ {
+ background: var(--darkgrey);
+ }
+
+ .upload-area__content
+ {
+ color: var(--orange);
+ border: 2px dashed var(--orange);
+ }
+
+ .boost-modal__action-bar,
+.confirmation-modal__action-bar,
+.mute-modal__action-bar
+ {
+ background: var(--darkest);
+ }
+
+ .confirmation-modal__action-bar .confirmation-modal__cancel-button,
+.confirmation-modal__action-bar .confirmation-modal__secondary-button,
+.confirmation-modal__action-bar .mute-modal__cancel-button,
+.mute-modal__action-bar .confirmation-modal__cancel-button,
+.mute-modal__action-bar .confirmation-modal__secondary-button,
+.mute-modal__action-bar .mute-modal__cancel-button
+ {
+ background-color: var(--orangelight);
+ color: var(--lightgrey);
+ }
+
+ .actions-modal,
+.boost-modal,
+.confirmation-modal,
+.mute-modal,
+.report-modal
+ {
+ background-color: var(--darkest);
+ color: var(--lightgrey);
+ border: 1px solid var(--orangelight);
+ }
+
+ .button:active,
+.button:focus,
+.button:hover
+ {
+ background-color: var(--orange);
+ opacity: .8;
+ }
+
+ .media-modal .extended-video-player video,
+.zoomable-image img
+ {
+ border: 2px dashed var(--orangelight);
+ border-radius: 5px;
+ padding: .75em;
+ background-color: var(--darkest);
+ }
+
+ .modal-root__overlay
+ {
+ background: var(--darkest);
+ opacity: .95;
+ }
+
+ .media-modal__nav
+ {
+ background: var(--darkest);
+ }
+
+ .fa-close::before,
+.fa-remove::before,
+.fa-times::before
+ {
+ color: var(--orange);
+ }
+
+ .fa-chevron-right::before
+ {
+ color: var(--orange);
+ }
+
+ .fa-chevron-left::before
+ {
+ color: var(--orange);
+ }
+
+ .fa.fa-chevron-left.column-back-button__icon.fa-fw::before
+ {
+ color: var(--green);
+ }
+
+ .spoiler-button__overlay__label
+ {
+ color: var(--orange);
+ }
+
+ .button.logo-button.button--destructive:active,
+.button.logo-button.button--destructive:focus,
+.button.logo-button.button--destructive:hover
+ {
+ background: var(--orange);
+ color: var(--darkest);
+ }
+
+ .relationship-tag
+ {
+ color: var(--darkest);
+ background-color: var(--orange);
+ font-weight: bold;
+ padding: 5px;
+ border: 1px solid var(--orange);
+ opacity: 1;
+ }
+
+ .relationship-tag:hover
+ {
+ opacity: .75;
+ }
+
+ .account__header__tabs__buttons .icon-button
+ {
+ border: 1px solid var(--orangelight);
+ }
+
+ .fa-ellipsis-v::before
+ {
+ color: var(--orange);
+ }
+
+ .embed-modal,
+.error-modal,
+.onboarding-modal
+ {
+ background: var(--darkgrey);
+ color: var(--lightgrey);
+ padding: .5em;
+ border: 2px dashed var(--orange);
+ }
+
+ .embed-modal .embed-modal__container .embed-modal__html
+ {
+ background: var(--darkest);
+ color: var(--lightgrey);
+ }
+
+ body.embed
+ {
+ background: var(--darkest);
+ }
+
+ .embed-modal h4
+ {
+ font-size: 18px;
+ border-bottom: 1px solid var(--orange);
+ color: var(--orange);
+ }
+
+ .report-modal__statuses .status__content,
+.report-modal__statuses .status__content p
+ {
+ color: var(--lightgrey);
+ }
+
+ .report-modal__statuses .status__content a
+ {
+ color: var(--green);
+ }
+
+ .status-check-box
+ {
+ border-bottom: 1px solid var(--orangelight);
+ }
+
+ .report-modal__comment
+ {
+ border-right: 1px solid var(--orangelight);
+ }
+
+ .report-modal__target
+ {
+ color: var(--orange);
+ }
+
+ .report-modal__container
+ {
+ border-top: 1px solid var(--orangelight);
+ }
+
+ .report-modal__comment .setting-text
+ {
+ color: var(--lightgrey);
+ background: var(--darkgrey);
+ border: 1px solid var(--orange);
+ }
+
+ .button.button-secondary:disabled
+ {
+ opacity: .5;
+ color: var(--lightgrey);
+ }
+
+ .button.button-secondary
+ {
+ color: var(--darkest);
+ border: 1px solid var(--orange);
+ }
+
+ .button.button-secondary:active,
+.button.button-secondary:focus,
+.button.button-secondary:hover
+ {
+ border-color: var(--orange);
+ color: var(--darkest);
+ }
+
+ .button.button-secondary
+ {
+ color: var(--darkest);
+ background: var(--orange);
+ }
+
+/******* ACCUEIL ********/
+ .box-widget,
+.contact-widget,
+.landing-page__information.contact-widget
+ {
+ background: var(--darkest);
+ }
+
+ .directory__tag > a,
+.directory__tag > div
+ {
+ background: var(--darkest);
+ color: var(--lightgrey);
+ }
+
+ .directory__tag > a:active,
+.directory__tag > a:focus,
+.directory__tag > a:hover
+ {
+ background: var(--darkgrey);
+ }
+
+ .directory__tag h4
+ {
+ color: var(--green);
+ }
+
+ .directory__tag h4 .fa
+ {
+ color: var(--orange);
+ }
+
+ .landing .hero-widget__footer
+ {
+ background: var(--darkest);
+ }
+
+ .simple_form .block-button:hover,
+.simple_form .button:hover,
+.simple_form button:hover
+ {
+ background-color: var(--orange);
+ opacity: .8;
+ }
+
+ .simple_form .block-button,
+.simple_form .button,
+.simple_form button
+ {
+ background: var(--orange);
+ color: var(--darkest);
+ opacity: 1;
+ }
+
+ .simple_form .block-button:active,
+.simple_form .block-button:focus,
+.simple_form .button:active,
+.simple_form .button:focus,
+.simple_form button:active,
+.simple_form button:focus
+ {
+ background-color: var(--orangelight);
+ }
+
+ .simple_form input[type="email"],
+.simple_form input[type="number"],
+.simple_form input[type="password"],
+.simple_form input[type="text"],
+.simple_form textarea
+ {
+ color: var(--lightgrey);
+ background: var(--darkgrey) !important;
+ border: 1px solid var(--orange);
+ opacity: 1;
+ }
+
+ .landing .simple_form .user_agreement .label_input > label,
+.landing .simple_form p.lead
+ {
+ color: var(--lightgrey);
+ }
+
+ .simple_form .input.boolean label a
+ {
+ color: var(--green);
+ }
+
+ .simple_form .input.boolean label a:active,
+.simple_form .input.boolean label a:focus,
+.simple_form .input.boolean label a:hover
+ {
+ text-decoration: none;
+ }
+
+ .simple_form .hint a
+ {
+ color: var(--green);
+ }
+
+ .landing .hero-widget__counter span
+ {
+ color: var(--lightgrey);
+ }
+
+ .landing .hero-widget h4
+ {
+ color: var(--green);
+ }
+
+ .simple_form input[type="email"]:active,
+.simple_form input[type="email"]:focus,
+.simple_form input[type="number"]:active,
+.simple_form input[type="number"]:focus,
+.simple_form input[type="password"]:active,
+.simple_form input[type="password"]:focus,
+.simple_form input[type="text"]:active,
+.simple_form input[type="text"]:focus,
+.simple_form textarea:active,
+.simple_form textarea:focus
+ {
+ border-color: var(--orange);
+ background: var(--darkest);
+ }
+
+ body.lighter
+ {
+ background: var(--darkest);
+ }
+
+ .form-footer a
+ {
+ color: var(--green);
+ }
+
+ .simple_form input[type="email"],
+.simple_form input[type="number"],
+.simple_form input[type="password"],
+.simple_form input[type="text"],
+.simple_form textarea
+ {
+ border: 1px solid var(--orange);
+ }
+
+ .simple_form input[type="email"]:hover,
+.simple_form input[type="number"]:hover,
+.simple_form input[type="password"]:hover,
+.simple_form input[type="text"]:hover,
+.simple_form textarea:hover
+ {
+ border-color: var(--orangelight);
+ }
+
+ .brand__tagline
+ {
+ color: var(--lightgrey);
+ }
+
+ .directory__tag h4 small
+ {
+ color: var(--lightgrey);
+ }
+
+ .simple_form .label_input__append
+ {
+ color: var(--orange);
+ }
+
+ .flash-message.alert
+ {
+ background: rgba(223, 64, 90, .5);
+ color: var(--lightgrey);
+ }
+
+ .media-modal__close .fa-times::before
+ {
+ content: "×";
+ font-size: 35px;
+ font-weight: lighter;
+ }
+
+ .media-modal__nav--right .fa-chevron-right::before
+ {
+ font-size: 65px;
+ font-weight: lighter;
+ content: ">";
+ }
+
+ .media-modal__nav--left .fa-chevron-left::before
+ {
+ font-size: 65px;
+ font-weight: lighter;
+ content: "<";
+ }
+
+ .fa-crosshairs::before
+ {
+ color: var(--orange);
+ }
+
+ .page-header
+ {
+ background: var(--darkest);
+ color: var(--lightgrey);
+ }
+
+ .page-header h1
+ {
+ color: var(--green);
+ }
+
+ .reply-indicator__content a.unhandled-link,
+.status__content a.unhandled-link
+ {
+ color: var(--green);
+ }
+
+ .getting-started__trends h4
+ {
+ color: var(--lightgrey);
+ }
+
+ .getting-started__trends .trends__item__current
+ {
+ color: var(--green);
+ }
+
+ .trends__item__sparkline path:first-child
+ {
+ fill: var(--green) !important;
+ opacity: .25;
+ }
+
+ .trends__item__sparkline path:last-child
+ {
+ stroke: var(--green) !important;
+ }
+
+ .compose-form .autosuggest-textarea__textarea::placeholder,
+.compose-form .spoiler-input__input::placeholder,
+.search__input::placeholder
+ {
+ color: var(--lightgrey) !important;
+ }
+
+ .audio-player
+ {
+ background: var(--darkest);
+ }
+
+ .audio-player .video-player__controls
+ {
+ background: var(--darkest);
+ }
+
+ canvas
+ {
+ filter: hue-rotate(195deg) saturate(250%) brightness(130%);
+ }
+
+ .conversation__content__relative-time
+ {
+ color: var(--green);
+ }
+
+ .conversation__content__names
+ {
+ color: var(--lightgrey);
+ }
+
+ .getting-started__trends h4
+ {
+ border-top: 1px solid var(--orangelight);
+ border-bottom: 0;
+ }
+
+ .column,
+.drawer
+ {
+ flex: 0 0 auto;
+ padding: 1px 5px;
+ }
+
+ .compose-form__sensitive-button .checkbox.active
+ {
+ border-color: var(--orange);
+ background: var(--orange);
+ }
+
+ .compose-form__sensitive-button .checkbox
+ {
+ border: 1px solid var(--green);
+ }
+
+ .page-header p
+ {
+ color: var(--lightgrey);
+ }
+
+ .trends-widget h4
+ {
+ color: var(--lightgrey);
+ }
+
+ .button.logo-button svg,
+.public-layout .footer .brand svg
+ {
+ fill: var(--orange);
+ }
+
+ .column-link__badge
+ {
+ font-weight: bold;
+ background: var(--orange);
+ color: var(--darkest);
+ }
+
+ .account--panel
+ {
+ background: var(--darkest);
+ border-top: 0px solid var(--orangelight);
+ border-bottom: 1px solid var(--orangelight);
+ }
+
+ .fa-check::before
+ {
+ color: var(--green);
+ }
+
+ .account__header__content
+ {
+ color: var(--lightgrey);
+ }
+
+ .column-header__icon::before
+ {
+ color: var(--orange);
+ }
+
+ .keyboard-shortcuts kbd
+ {
+ background-color: var(--darkgrey);
+ border: 1px solid var(--darkgrey);
+ border-radius: 3px;
+ }
+
+ .landing-page__call-to-action
+ {
+ background: var(--darkest);
+ }
+
+ .contact-widget h4,
+.rich-formatting
+ {
+ color: var(--lightgrey);
+ }
+
+ .rich-formatting a
+ {
+ color: var(--orange);
+ }
+
+ .contact-widget > a
+ {
+ color: var(--green);
+ }
+
+ .table-of-contents
+ {
+ background: var(--darkest);
+ }
+
+ .link-button
+ {
+ color: var(--green);
+ }
+
+ .report-modal__comment .setting-text-label
+ {
+ color: var(--orange);
+ }
+
+ .character-counter
+ {
+ color: var(--lightgrey);
+ }
+
+ .report-modal__comment .setting-text__wrapper
+ {
+ border: 1px solid var(--orange);
+ }
+
+
+
+/********Single column ********/
+ .column-link--transparent.active
+ {
+ color: var(--orange);
+ }
+
+ .getting-started__footer a
+ {
+ color: var(--orange);
+ }
+
+ .tabs-bar__wrapper
+ {
+ background: var(--darkest);
+ }
+
+ .filter-form
+ {
+ background: var(--darkest);
+ }
+
+ .radio-button__input.checked
+ {
+ border-color: var(--orange);
+ background: var(--orange);
+ }
+
+ .radio-button__input
+ {
+ border: 1px solid var(--orange);
+ }
+
+ .directory__card__bar,
+.directory__card__extra
+ {
+ background: var(--darkgrey);
+ }
+
+ .accounts-table__count small,
+.directory__card__bar .display-name span
+ {
+ color: var(--lightgrey);
+ }
+
+/******** ADMIN ********/
+ .admin-wrapper .sidebar-wrapper__inner
+ {
+ background: var(--darkest);
+ }
+
+ body.admin
+ {
+ background: var(--darkest);
+ }
+
+ .admin-wrapper .sidebar ul a
+ {
+ color: var(--orange);
+ }
+
+ .admin-wrapper .sidebar ul .simple-navigation-active-leaf a
+ {
+ color: var(--darkest);
+ background-color: var(--orange);
+ }
+
+ .admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover
+ {
+ background-color: var(--orange);
+ }
+
+ .admin-wrapper .sidebar ul a:hover
+ {
+ background-color: var(--orangelight);
+ }
+
+ .setting-text
+ {
+ background: var(--notifgrey);
+ }
+
+ .accounts-table__count
+ {
+ color: var(--orange);
+ }
+
+ .batch-table__toolbar
+ {
+ background: var(--darkgrey);
+ }
+
+ .table > thead > tr > th
+ {
+ border-bottom: 2px solid var(--lightgrey);
+ }
+
+ .table td,
+.table th
+ {
+ border-top: 0;
+ background: var(--notifgrey);
+ }
+
+ .admin-wrapper .content h4
+ {
+ color: var(--green);
+ }
+
+ .admin-wrapper .content h2
+ {
+ border-bottom: 0;
+ }
+
+ .batch-table__row
+ {
+ background: var(--darkest);
+ }
+
+ .batch-table__row:hover
+ {
+ background: var(--darkgrey);
+ }
+
+ .batch-table__row:nth-child(2n)
+ {
+ background: var(--notifgrey);
+ }
+
+ .batch-table__row:nth-child(2n):hover
+ {
+ background: var(--darkgrey);
+ }
+
+ a.table-action-link,
+button.table-action-link
+ {
+ color: var(--orange);
+ }
+
+ .filters .filter-subset a.selected
+ {
+ color: var(--orange);
+ border-bottom: 2px solid var(--orange);
+ }
+
+ .filters .filter-subset a:hover
+ {
+ color: var(--orangelight);
+ border-bottom: 2px solid var(--orange);
+ }
+
+ .filters .filter-subset a
+ {
+ color: var(--orangelight);
+ border-bottom: 2px solid var(--orangelight);
+ }
+
+ .simple_form .hint,
+.admin-wrapper .content .muted-hint,
+body .muted-hint
+ {
+ color: var(--lightgrey);
+ }
+
+ .admin-wrapper .content .muted-hint a,
+body .muted-hint a
+ {
+ color: var(--orange);
+ }
+
+ .table > tbody > tr:nth-child(2n + 1) > td,
+.table > tbody > tr:nth-child(2n + 1) > th
+ {
+ background: var(--darkgrey);
+ }
+
+ .table a
+ {
+ color: var(--orange);
+ text-decoration: none;
+ }
+
+ .simple_form select
+ {
+ background: var(--green) url("data:image/svg+xml;utf8,") no-repeat right 8px center/auto 16px;
+ }
+
+ #notifications,
+#appearance,
+#other,
+#featured_tags,
+#import,
+#password,
+#authorized_apps,
+#two_factor_authentication,
+#preferences > .selected,
+#security > .selected,
+#profile > .selected,
+#data > .selected,
+#profile
+ {
+ background-color: var(--notifgrey);
+ }
+
+ #profile .simple-navigation-active-leaf > .selected
+ {
+ background-color: var(--orange);
+ }
+
+ .upload-progress__backdrop
+ {
+ background: var(--notifgrey);
+ }
+
+ .link-button:disabled
+ {
+ color: var(--orangelight);
+ }
diff --git a/app/javascript/styles/mods/instance-ticker.scss b/app/javascript/styles/mods/instance-ticker.scss
new file mode 100644
index 0000000000000..03e8b1cb306c9
--- /dev/null
+++ b/app/javascript/styles/mods/instance-ticker.scss
@@ -0,0 +1,18 @@
+.status a[href^='https://handon.club/'] .display-name::after {
+ display: none !important ;
+}
+.status a[href^='https://dev.handon.club/'] .display-name::after {
+ display: none !important ;
+}
+.notification a[href^='https://handon.club/'].notification__display-name::after {
+ display: none !important ;
+}
+.notification a[href^='https://dev.handon.club/'].notification__display-name::after {
+ display: none !important ;
+}
+.notification a[href^='https://handon.club/'].notification__display-name::before {
+ display: none !important ;
+}
+.notification a[href^='https://dev.handon.club/'].notification__display-name::before {
+ display: none !important ;
+}
diff --git a/app/lib/entity_cache.rb b/app/lib/entity_cache.rb
index 80b0046eeaf9e..212bcf05039f8 100644
--- a/app/lib/entity_cache.rb
+++ b/app/lib/entity_cache.rb
@@ -37,4 +37,6 @@ def emoji(shortcodes, domain)
def to_key(type, *ids)
"#{type}:#{ids.compact.map(&:downcase).join(':')}"
end
+
+ include Friends::ProfileEmoji::EntityCacheExtension
end
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index 510667558e62a..2e777ebc3e819 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -7,7 +7,7 @@ class FeedManager
include Redisable
# Maximum number of items stored in a single feed
- MAX_ITEMS = 400
+ MAX_ITEMS = 1200
# Number of items in the feed since last reblog of status
# before the new reblog will be inserted. Must be <= MAX_ITEMS
@@ -58,6 +58,7 @@ def filter?(timeline_type, status, receiver)
# @param [Boolean] update
# @return [Boolean]
def push_to_home(account, status, update: false)
+ return false if (status.direct_visibility? || status.limited_visibility?) && account.user&.hidden_direct?
return false unless add_to_feed(:home, account.id, status, aggregate_reblogs: account.user&.aggregates_reblogs?)
trim(:home, account.id)
@@ -236,9 +237,11 @@ def clear_from_lists(account, target_account)
def populate_home(account)
limit = FeedManager::MAX_ITEMS / 2
aggregate = account.user&.aggregates_reblogs?
+ need_direct = !(account.user&.hidden_direct?)
timeline_key = key(:home, account.id)
- account.statuses.limit(limit).each do |status|
+ tmp_timeline = need_direct ? account.statuses : account.statuses.where.not(visibility: :direct)
+ tmp_timeline.limit(limit).each do |status|
add_to_feed(:home, account.id, status, aggregate_reblogs: aggregate)
end
diff --git a/app/lib/friends/profile_emoji.rb b/app/lib/friends/profile_emoji.rb
new file mode 100644
index 0000000000000..e78fac7295db8
--- /dev/null
+++ b/app/lib/friends/profile_emoji.rb
@@ -0,0 +1,10 @@
+require 'friends/profile_emoji/emoji'
+require 'friends/profile_emoji/account_extension'
+require 'friends/profile_emoji/status_extension'
+require 'friends/profile_emoji/serializer_extension'
+require 'friends/profile_emoji/entity_cache_extension'
+require 'friends/profile_emoji/announcements_extension'
+
+module Friends
+ module ProfileEmoji ; end
+end
diff --git a/app/lib/friends/profile_emoji/account_extension.rb b/app/lib/friends/profile_emoji/account_extension.rb
new file mode 100644
index 0000000000000..3534c87a69f23
--- /dev/null
+++ b/app/lib/friends/profile_emoji/account_extension.rb
@@ -0,0 +1,21 @@
+module Friends
+ module ProfileEmoji
+ module AccountExtension
+ extend ActiveSupport::Concern
+
+ included do
+ after_commit :clear_avatar_cache
+ end
+
+ def profile_emojis
+ @profile_emojis ||= Friends::ProfileEmoji::Emoji.from_text(emojifiable_text, domain)
+ end
+
+ private
+
+ def clear_avatar_cache
+ EntityCache.instance.clear_avatar(username, domain)
+ end
+ end
+ end
+end
diff --git a/app/lib/friends/profile_emoji/announcements_extension.rb b/app/lib/friends/profile_emoji/announcements_extension.rb
new file mode 100644
index 0000000000000..b59a2949575cf
--- /dev/null
+++ b/app/lib/friends/profile_emoji/announcements_extension.rb
@@ -0,0 +1,13 @@
+module Friends
+ module ProfileEmoji
+ module AnnouncementsExtension
+ extend ActiveSupport::Concern
+
+ def profile_emojis
+ return @profile_emojis if defined?(@profile_emojis)
+
+ @profile_emojis = Friends::ProfileEmoji::Emoji.from_text(text, nil)
+ end
+ end
+ end
+end
diff --git a/app/lib/friends/profile_emoji/emoji.rb b/app/lib/friends/profile_emoji/emoji.rb
new file mode 100644
index 0000000000000..59669af453608
--- /dev/null
+++ b/app/lib/friends/profile_emoji/emoji.rb
@@ -0,0 +1,62 @@
+module Friends
+ module ProfileEmoji
+ class FalsyLoaded
+ def loaded?
+ false
+ end
+ end
+ class Emoji < ActiveModelSerializers::Model
+ SHORTCODE_RE_FRAGMENT = /@(#{Account::USERNAME_RE})(?:@([a-z0-9\.\-]+[a-z0-9]+))?/i
+
+ SCAN_RE = /(:#{SHORTCODE_RE_FRAGMENT}:)/x
+ attributes :account, :shortcode
+
+ Image = Struct.new(:source) do
+ def url(type = :original)
+ type = :original unless source.content_type == 'image/gif'
+ source.url(type)
+ end
+ end
+
+ def serializer_class
+ REST::CustomEmojiSerializer
+ end
+
+ def image
+ @image ||= Image.new(account.avatar)
+ end
+
+ def visible_in_picker
+ false
+ end
+
+ def has_attribute?(attr)
+ true
+ end
+
+ def account_id
+ account.id
+ end
+
+ def association(*_args)
+ FalsyLoaded.new
+ end
+
+ class << self
+ def from_text(text, domain)
+ return [] if text.blank?
+
+ shortcodes = text.scan(SCAN_RE).uniq
+
+ return [] if shortcodes.empty?
+
+ shortcodes.map { |shortcode, username, _, server|
+ server ||= domain
+ server = nil if server == Rails.configuration.x.local_domain
+ [EntityCache.instance.avatar(username, server), shortcode[1..-2]]
+ }.map { |account, shortcode| account ? new(account: account, shortcode: shortcode) : nil }.compact
+ end
+ end
+ end
+ end
+end
diff --git a/app/lib/friends/profile_emoji/entity_cache_extension.rb b/app/lib/friends/profile_emoji/entity_cache_extension.rb
new file mode 100644
index 0000000000000..cc76279209600
--- /dev/null
+++ b/app/lib/friends/profile_emoji/entity_cache_extension.rb
@@ -0,0 +1,15 @@
+module Friends
+ module ProfileEmoji
+ module EntityCacheExtension
+ extend ActiveSupport::Concern
+
+ def avatar(username, domain)
+ Rails.cache.fetch(to_key(:avatar, username, domain), expires_in: EntityCache::MAX_EXPIRATION) { Account.select(:id, :username, :domain, :avatar_file_name, :avatar_storage_schema_version).find_remote(username, domain) }
+ end
+
+ def clear_avatar(username, domain)
+ Rails.cache.delete(to_key(:avatar, username, domain))
+ end
+ end
+ end
+end
diff --git a/app/lib/friends/profile_emoji/poll_extension.rb b/app/lib/friends/profile_emoji/poll_extension.rb
new file mode 100644
index 0000000000000..792c9cf5bd4cc
--- /dev/null
+++ b/app/lib/friends/profile_emoji/poll_extension.rb
@@ -0,0 +1,11 @@
+module Friends
+ module ProfileEmoji
+ module PollExtension
+ extend ActiveSupport::Concern
+
+ def profile_emojis
+ @profile_emojis ||= Friends::ProfileEmoji::Emoji.from_text(options.join(' '), account.domain)
+ end
+ end
+ end
+end
diff --git a/app/lib/friends/profile_emoji/serializer_extension.rb b/app/lib/friends/profile_emoji/serializer_extension.rb
new file mode 100644
index 0000000000000..d958624256d5a
--- /dev/null
+++ b/app/lib/friends/profile_emoji/serializer_extension.rb
@@ -0,0 +1,11 @@
+module Friends
+ module ProfileEmoji
+ module SerializerExtension
+ extend ActiveSupport::Concern
+
+ included do
+ has_many :profile_emojis, serializer: REST::CustomEmojiSerializer
+ end
+ end
+ end
+end
diff --git a/app/lib/friends/profile_emoji/status_extension.rb b/app/lib/friends/profile_emoji/status_extension.rb
new file mode 100644
index 0000000000000..e3e73908242f8
--- /dev/null
+++ b/app/lib/friends/profile_emoji/status_extension.rb
@@ -0,0 +1,16 @@
+module Friends
+ module ProfileEmoji
+ module StatusExtension
+ extend ActiveSupport::Concern
+
+ def profile_emojis
+ return @profile_emojis if defined?(@profile_emojis)
+
+ fields = [spoiler_text, text]
+ fields += preloadable_poll.options unless preloadable_poll.nil?
+
+ @profile_emojis = Friends::ProfileEmoji::Emoji.from_text(fields.join(' '), account.domain)
+ end
+ end
+ end
+end
diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb
index 5fb7655a9b483..5c4338802de96 100644
--- a/app/lib/user_settings_decorator.rb
+++ b/app/lib/user_settings_decorator.rb
@@ -36,6 +36,7 @@ def process_update
user.settings['advanced_layout'] = advanced_layout_preference if change?('setting_advanced_layout')
user.settings['use_blurhash'] = use_blurhash_preference if change?('setting_use_blurhash')
user.settings['use_pending_items'] = use_pending_items_preference if change?('setting_use_pending_items')
+ user.settings['hidden_direct'] = hidden_direct_preference if change?('setting_hidden_direct')
user.settings['trends'] = trends_preference if change?('setting_trends')
user.settings['crop_images'] = crop_images_preference if change?('setting_crop_images')
user.settings['always_send_emails'] = always_send_emails_preference if change?('setting_always_send_emails')
@@ -125,6 +126,10 @@ def use_pending_items_preference
boolean_cast_setting 'setting_use_pending_items'
end
+ def hidden_direct_preference
+ boolean_cast_setting 'setting_hidden_direct'
+ end
+
def trends_preference
boolean_cast_setting 'setting_trends'
end
diff --git a/app/models/account.rb b/app/models/account.rb
index fc7359cfc4b89..f5620c8133548 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -62,7 +62,7 @@ class Account < ApplicationRecord
)
USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i
- MENTION_RE = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[[:word:]\.\-]+[[:word:]]+)?)/i
+ MENTION_RE = /(?<=^|[^\/[:word:]:])@((#{USERNAME_RE})(?:@[[:word:]\.\-]+[[:word:]]+)?)/i
URL_PREFIX_RE = /\Ahttp(s?):\/\/[^\/]+/
USERNAME_ONLY_RE = /\A#{USERNAME_RE}\z/i
@@ -525,7 +525,7 @@ def advanced_search_for_sql_template(following)
end
def emojis
- @emojis ||= CustomEmoji.from_text(emojifiable_text, domain)
+ @emojis ||= CustomEmoji.from_text(emojifiable_text, domain) + profile_emojis
end
before_create :generate_keys
@@ -587,4 +587,6 @@ def destroy_canonical_email_block!
CanonicalEmailBlock.where(reference_account: self).delete_all
end
+
+ include Friends::ProfileEmoji::AccountExtension
end
diff --git a/app/models/announcement.rb b/app/models/announcement.rb
index 4b2cb4c6d06e1..3a4564a26efe2 100644
--- a/app/models/announcement.rb
+++ b/app/models/announcement.rb
@@ -68,7 +68,7 @@ def tags
end
def emojis
- @emojis ||= CustomEmoji.from_text(text)
+ @emojis ||= CustomEmoji.from_text(text) + profile_emojis
end
def reactions(account = nil)
@@ -94,4 +94,6 @@ def set_published
self.published = true
self.published_at = Time.now.utc
end
+
+ include Friends::ProfileEmoji::AnnouncementsExtension
end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index d2bdc55f0f608..26351bb3e418a 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -38,8 +38,8 @@ class MediaAttachment < ApplicationRecord
MAX_DESCRIPTION_LENGTH = 1_500
- IMAGE_LIMIT = 10.megabytes
- VIDEO_LIMIT = 40.megabytes
+ IMAGE_LIMIT = 15.megabytes
+ VIDEO_LIMIT = 65.megabytes
MAX_VIDEO_MATRIX_LIMIT = 2_304_000 # 1920x1200px
MAX_VIDEO_FRAME_RATE = 60
@@ -68,7 +68,7 @@ class MediaAttachment < ApplicationRecord
IMAGE_STYLES = {
original: {
- pixels: 2_073_600, # 1920x1080px
+ pixels: 4_147_200, # 2880x1440px
file_geometry_parser: FastGeometryParser,
}.freeze,
diff --git a/app/models/poll.rb b/app/models/poll.rb
index 1a326e452c6fa..942945731952d 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -66,7 +66,7 @@ def remote?
end
def emojis
- @emojis ||= CustomEmoji.from_text(options.join(' '), account.domain)
+ @emojis ||= CustomEmoji.from_text(options.join(' '), account.domain) + profile_emojis
end
class Option < ActiveModelSerializers::Model
@@ -118,4 +118,6 @@ def time_passed_since_last_fetch?
def show_totals_now?
expired? || !hide_totals?
end
+
+ include Friends::ProfileEmoji::PollExtension
end
diff --git a/app/models/status.rb b/app/models/status.rb
index 8bdb5e8db1467..6fcbd8056aecc 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -254,7 +254,7 @@ def emojis
fields = [spoiler_text, text]
fields += preloadable_poll.options unless preloadable_poll.nil?
- @emojis = CustomEmoji.from_text(fields.join(' '), account.domain)
+ @emojis = CustomEmoji.from_text(fields.join(' '), account.domain) + profile_emojis
end
def ordered_media_attachments
@@ -534,4 +534,6 @@ def unlink_from_conversations
AccountConversation.remove_status(inbox_owner, self)
end
end
+
+ include Friends::ProfileEmoji::StatusExtension
end
diff --git a/app/models/trends/tags.rb b/app/models/trends/tags.rb
index 19ade52ba4da3..817cbbd0eb9b9 100644
--- a/app/models/trends/tags.rb
+++ b/app/models/trends/tags.rb
@@ -4,8 +4,8 @@ class Trends::Tags < Trends::Base
PREFIX = 'trending_tags'
self.default_options = {
- threshold: 5,
- review_threshold: 3,
+ threshold: 3,
+ review_threshold: 2,
max_score_cooldown: 2.days.freeze,
max_score_halflife: 4.hours.freeze,
decay_threshold: 1,
diff --git a/app/models/user.rb b/app/models/user.rb
index 6d566b1c26d25..db9d01f2b2084 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -134,7 +134,7 @@ class User < ApplicationRecord
delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal,
:reduce_motion, :system_font_ui, :noindex, :theme, :display_media,
:expand_spoilers, :default_language, :aggregate_reblogs, :show_application,
- :advanced_layout, :use_blurhash, :use_pending_items, :trends, :crop_images,
+ :advanced_layout, :use_blurhash, :use_pending_items, :hidden_direct, :trends, :crop_images,
:disable_swiping, :always_send_emails,
to: :settings, prefix: :setting, allow_nil: false
@@ -313,6 +313,10 @@ def aggregates_reblogs?
@aggregates_reblogs ||= settings.aggregate_reblogs
end
+ def hidden_direct?
+ settings.hidden_direct
+ end
+
def shows_application?
@shows_application ||= settings.show_application
end
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index 8d3f4f87dfea5..34e57d8949476 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -47,6 +47,7 @@ def meta
store[:advanced_layout] = object.current_account.user.setting_advanced_layout
store[:use_blurhash] = object.current_account.user.setting_use_blurhash
store[:use_pending_items] = object.current_account.user.setting_use_pending_items
+ store[:hidden_direct] = object.current_account.user.setting_hidden_direct
store[:trends] = Setting.trends && object.current_account.user.setting_trends
store[:crop_images] = object.current_account.user.setting_crop_images
else
diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb
index e521dacaaa377..2daec6d4ac348 100644
--- a/app/serializers/rest/account_serializer.rb
+++ b/app/serializers/rest/account_serializer.rb
@@ -113,4 +113,6 @@ def noindex
def moved_and_not_nested?
object.moved? && object.moved_to_account.moved_to_account_id.nil?
end
+
+ include Friends::ProfileEmoji::SerializerExtension
end
diff --git a/app/serializers/rest/announcement_serializer.rb b/app/serializers/rest/announcement_serializer.rb
index 23b2fa514b92b..8f60d2e391fa2 100644
--- a/app/serializers/rest/announcement_serializer.rb
+++ b/app/serializers/rest/announcement_serializer.rb
@@ -61,4 +61,6 @@ def url
ActivityPub::TagManager.instance.url_for(object)
end
end
+
+ include Friends::ProfileEmoji::SerializerExtension
end
diff --git a/app/serializers/rest/poll_serializer.rb b/app/serializers/rest/poll_serializer.rb
index df6ebd0d44676..39cbcfce2d592 100644
--- a/app/serializers/rest/poll_serializer.rb
+++ b/app/serializers/rest/poll_serializer.rb
@@ -33,4 +33,6 @@ def current_user?
class OptionSerializer < ActiveModel::Serializer
attributes :title, :votes_count
end
+
+ include Friends::ProfileEmoji::SerializerExtension
end
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index e0b8f32a68f6b..4932a0875e796 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -181,4 +181,6 @@ def url
tag_url(object)
end
end
+
+ include Friends::ProfileEmoji::SerializerExtension
end
diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb
index 2554756a5d705..15fb9351d8bd6 100644
--- a/app/services/fan_out_on_write_service.rb
+++ b/app/services/fan_out_on_write_service.rb
@@ -36,17 +36,23 @@ def check_race_condition!
end
def fan_out_to_local_recipients!
- deliver_to_self!
notify_mentioned_accounts!
notify_about_update! if update?
case @status.visibility.to_sym
when :public, :unlisted, :private
+ deliver_to_self!
deliver_to_all_followers!
deliver_to_lists!
when :limited
+ deliver_to_self! unless @account.user&.hidden_direct?
deliver_to_mentioned_followers!
+ when :direct
+ deliver_to_self! unless @account.user&.hidden_direct?
+ deliver_to_mentioned_followers!
+ deliver_to_conversation!
else
+ deliver_to_self!
deliver_to_mentioned_followers!
deliver_to_conversation!
end
diff --git a/app/services/search_service.rb b/app/services/search_service.rb
index 1a76cbb388316..d340789602ada 100644
--- a/app/services/search_service.rb
+++ b/app/services/search_service.rb
@@ -35,7 +35,9 @@ def perform_accounts_search!
end
def perform_statuses_search!
- definition = parsed_query.apply(StatusesIndex.filter(term: { searchable_by: @account.id }))
+ definition = StatusesIndex.filter(term: { searchable_by: @account.id })
+ .query(match: { 'text.stemmed': { query: @query, operator: 'and'}})
+ .order(id: { order: 'desc' })
if @options[:account_id].present?
definition = definition.filter(term: { account_id: @options[:account_id] })
diff --git a/app/validators/poll_validator.rb b/app/validators/poll_validator.rb
index a327277963874..20da7dae6717c 100644
--- a/app/validators/poll_validator.rb
+++ b/app/validators/poll_validator.rb
@@ -1,10 +1,10 @@
# frozen_string_literal: true
class PollValidator < ActiveModel::Validator
- MAX_OPTIONS = 4
- MAX_OPTION_CHARS = 50
+ MAX_OPTIONS = 16
+ MAX_OPTION_CHARS = 50
MAX_EXPIRATION = 1.month.freeze
- MIN_EXPIRATION = 5.minutes.freeze
+ MIN_EXPIRATION = 1.minutes.freeze
def validate(poll)
current_time = Time.now.utc
diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml
index 9e3964f2176c4..72295d3925b4a 100644
--- a/app/views/settings/preferences/appearance/show.html.haml
+++ b/app/views/settings/preferences/appearance/show.html.haml
@@ -9,7 +9,7 @@
.fields-group.fields-row__column.fields-row__column-6
= f.input :locale, collection: I18n.available_locales, wrapper: :with_label, include_blank: false, label_method: lambda { |locale| native_locale_name(locale) }, selected: I18n.locale, hint: false
.fields-group.fields-row__column.fields-row__column-6
- = f.input :setting_theme, collection: Themes.instance.names, label_method: lambda { |theme| I18n.t("themes.#{theme}", default: theme) }, wrapper: :with_label, include_blank: false, hint: false
+ = f.input :setting_theme, collection: Themes.instance.names, label_method: lambda { |theme| I18n.t("themes.#{theme}", default: theme) }, wrapper: :with_label, include_blank: false, hint: false, handononly: true
- unless I18n.locale == :en
.flash-message.translation-prompt
diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml
index 44f4af2eba865..7d1d334b8d7df 100644
--- a/app/views/settings/preferences/other/show.html.haml
+++ b/app/views/settings/preferences/other/show.html.haml
@@ -13,6 +13,9 @@
.fields-group
= f.input :setting_aggregate_reblogs, as: :boolean, wrapper: :with_label, recommended: true
+ .fields-group
+ = f.input :setting_hidden_direct, as: :boolean, wrapper: :with_label, recommended: true, handononly: true
+
%h4= t 'preferences.posting_defaults'
.fields-row
diff --git a/config/application.rb b/config/application.rb
index 4d6c7ebf10292..35922f8c4a6ec 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -56,7 +56,7 @@ module Mastodon
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 6.1
- config.add_autoload_paths_to_load_path = false
+ #config.add_autoload_paths_to_load_path = false
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
diff --git a/config/environments/production.rb b/config/environments/production.rb
index dc53195359bcc..8f0d5466a5a97 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -1,4 +1,10 @@
Rails.application.configure do
+ # add by highemerly
+ config.hosts << "web1-da-tk2.handon.club"
+ config.hosts << "web1-pa-tk2.handon.club"
+ config.hosts << "web2-da-tk2.handon.club"
+ config.hosts << "web2-pa-tk2.handon.club"
+
# Settings specified here will take precedence over those in config/application.rb.
# Code is not reloaded between requests.
diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml
index c1da42bd8712d..b9621e49b4c76 100644
--- a/config/i18n-tasks.yml
+++ b/config/i18n-tasks.yml
@@ -50,7 +50,7 @@ ignore_unused:
- 'activerecord.errors.*'
- '{devise,pagination,doorkeeper}.*'
- '{date,datetime,time,number}.*'
- - 'simple_form.{yes,no,recommended,not_recommended}'
+ - 'simple_form.{yes,no,recommended,not_recommended,handononly}'
- 'simple_form.{placeholders,hints,labels}.*'
- 'simple_form.{error_notification,required}.:'
- 'errors.messages.*'
diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb
index 6b62e6f337f24..fed6878877aa7 100644
--- a/config/initializers/content_security_policy.rb
+++ b/config/initializers/content_security_policy.rb
@@ -16,13 +16,18 @@ def host_to_url(str)
media_host ||= host_to_url(ENV['S3_HOSTNAME']) if ENV['S3_ENABLED'] == 'true'
media_host ||= assets_host
+instance_ticker_host = 'https://34.si'
+cloudflare_insights_script_host = 'https://static.cloudflareinsights.com'
+cloudflare_insights_connect_host = 'https://cloudflareinsights.com'
+cloudflare_mirage_script_host = 'https://ajax.cloudflare.com'
+
Rails.application.config.content_security_policy do |p|
p.base_uri :none
p.default_src :none
p.frame_ancestors :none
p.font_src :self, assets_host
- p.img_src :self, :https, :data, :blob, assets_host
- p.style_src :self, assets_host
+ p.img_src :self, :https, :data, :blob, assets_host, instance_ticker_host
+ p.style_src :self, assets_host, instance_ticker_host
p.media_src :self, :https, :data, assets_host
p.frame_src :self, :https
p.manifest_src :self, assets_host
@@ -35,8 +40,8 @@ def host_to_url(str)
p.child_src :self, :blob, assets_host
p.worker_src :self, :blob, assets_host
else
- p.connect_src :self, :data, :blob, assets_host, media_host, Rails.configuration.x.streaming_api_base_url
- p.script_src :self, assets_host, "'wasm-unsafe-eval'"
+ p.connect_src :self, :data, :blob, assets_host, media_host, cloudflare_insights_connect_host, Rails.configuration.x.streaming_api_base_url
+ p.script_src :self, assets_host, cloudflare_insights_script_host, cloudflare_mirage_script_host, "'wasm-unsafe-eval'"
p.child_src :self, :blob, assets_host
p.worker_src :self, :blob, assets_host
end
diff --git a/config/initializers/customize.rb b/config/initializers/customize.rb
new file mode 100644
index 0000000000000..20797586179a1
--- /dev/null
+++ b/config/initializers/customize.rb
@@ -0,0 +1 @@
+require 'friends/profile_emoji'
diff --git a/config/initializers/simple_form.rb b/config/initializers/simple_form.rb
index 92cffc5a2a40f..a44d74af131b1 100644
--- a/config/initializers/simple_form.rb
+++ b/config/initializers/simple_form.rb
@@ -19,8 +19,17 @@ def recommended(_wrapper_options = nil)
end
end
+module HandononlyComponent
+ def handononly(wrapper_options = nil)
+ return unless options[:handononly]
+ options[:label_text] = ->(raw_label_text, _required_label_text, _label_present) { safe_join([raw_label_text, ' ', content_tag(:span, I18n.t('simple_form.handononly'), class: 'handononly')]) }
+ nil
+ end
+end
+
SimpleForm.include_component(AppendComponent)
SimpleForm.include_component(RecommendedComponent)
+SimpleForm.include_component(HandononlyComponent)
SimpleForm.setup do |config|
# Wrappers are used by the form builder to generate a
@@ -78,6 +87,7 @@ def recommended(_wrapper_options = nil)
b.wrapper tag: :div, class: :label_input do |ba|
ba.optional :recommended
+ ba.optional :handononly
ba.use :label
ba.wrapper tag: :div, class: :label_input__wrapper do |bb|
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 679e356b41f57..f582d2d16e83b 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1529,9 +1529,20 @@ en:
tags:
does_not_match_previous_name: does not match the previous name
themes:
- contrast: Mastodon (High contrast)
- default: Mastodon (Dark)
- mastodon-light: Mastodon (Light)
+ vanilla-default: Standard Mastodon (Dark)
+ vanilla-light: Standard Mastodon (Light)
+ vanilla-contrast: Standard Mastodon (High contrast)
+ instance-ticker-type1-default: Handon (Dark) with InstanceTicker Type-1
+ instance-ticker-type1-light: Handon (Light) with InstanceTicker Type-1
+ instance-ticker-type1-contrast: Handon (High contrast) with InstanceTicker Type-1
+ instance-ticker-type1-cantadark: Handon (Canta Dark with 100% screen width) with InstanceTicker Type-1
+ instance-ticker-type1-blacklead: Handon (BlackLead)
+ blacklead: Handon (BlackLead)
+ cantadark: Handon (Canta Dark with 100% screen width)
+ contrast: Handon (High contrast)
+ default: Handon (Dark)
+ mastodon-light: Handon (Light)
+ blue: Handon (Blue by Xerto)
time:
formats:
default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index a60f0298bc8b2..dfbe3c93c9196 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -1496,9 +1496,19 @@ ja:
tags:
does_not_match_previous_name: 以前の名前と一致しません
themes:
- contrast: Mastodon (ハイコントラスト)
- default: Mastodon (ダーク)
- mastodon-light: Mastodon (ライト)
+ vanilla-default: Mastodon標準(ダーク)
+ vanilla-light: Mastodon標準(ライト)
+ vanilla-contrast: Mastodon標準(ハイコントラスト)
+ instance-ticker-type1-default: Handon (ダーク) + InstanceTicker Type1
+ instance-ticker-type1-light: Handon (ライト) + InstanceTicker Type1
+ instance-ticker-type1-contrast: Handon (ハイコントラスト) + InstanceTicker Type1
+ instance-ticker-type1-cantadark: Handon (Canta Dark / 100%幅) + InstanceTicker Type1
+ instance-ticker-type1-blacklead: Handon (BlackLead) + InstanceTicker Type1
+ blacklead: Handon (BlackLead)
+ cantadark: Handon (Canta Dark / 100%幅)
+ contrast: Handon (ハイコントラスト)
+ default: Handon (ダーク)
+ mastodon-light: Handon (ライト)
time:
formats:
default: "%Y年%m月%d日 %H:%M"
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 6edf7b4e9e2d2..3d292b7893b11 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -50,6 +50,7 @@ en:
scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones.
setting_aggregate_reblogs: Do not show new boosts for posts that have been recently boosted (only affects newly-received boosts)
setting_always_send_emails: Normally e-mail notifications won't be sent when you are actively using Mastodon
+ hidden_direct: Do not show direct messages in timeline feed.
setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click
setting_display_media_default: Hide media marked as sensitive
setting_display_media_hide_all: Always hide media
@@ -99,7 +100,7 @@ en:
imports:
data: CSV file exported from another Mastodon server
invite_request:
- text: This will help us review your application
+ text: This will help us review your application. Please include a information of the reason why you know handon.club. If this is null, we will NOT accepet your request
ip_block:
comment: Optional. Remember why you added this rule.
expires_in: IP addresses are a finite resource, they are sometimes shared and often change hands. For this reason, indefinite IP blocks are not recommended.
@@ -190,6 +191,7 @@ en:
setting_advanced_layout: Enable advanced web interface
setting_aggregate_reblogs: Group boosts in timelines
setting_always_send_emails: Always send e-mail notifications
+ setting_hidden_direct: 'Hide DM in home timeline'
setting_auto_play_gif: Auto-play animated GIFs
setting_boost_modal: Show confirmation dialog before boosting
setting_crop_images: Crop images in non-expanded posts to 16x9
@@ -300,6 +302,7 @@ en:
'no': 'No'
not_recommended: Not recommended
recommended: Recommended
+ handononly: Handon
required:
mark: "*"
text: required
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index bd3a752ea9eb1..e889d31232151 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -50,6 +50,7 @@ ja:
scopes: アプリの API に許可するアクセス権を選択してください。最上位のスコープを選択する場合、個々のスコープを選択する必要はありません。
setting_aggregate_reblogs: 最近ブーストされた投稿が新たにブーストされても表示しません (設定後受信したものにのみ影響)
setting_always_send_emails: 通常、Mastodon からメール通知は行われません。
+ setting_hidden_direct: DMを通知でのみ表示し、ホームタイムライン上に表示しません (設定後受信したものにのみ影響)
setting_default_sensitive: 閲覧注意状態のメディアはデフォルトでは内容が伏せられ、クリックして初めて閲覧できるようになります
setting_display_media_default: 閲覧注意としてマークされたメディアは隠す
setting_display_media_hide_all: メディアを常に隠す
@@ -99,7 +100,7 @@ ja:
imports:
data: 他のMastodonサーバーからエクスポートしたCSVファイルを選択して下さい
invite_request:
- text: このサーバーは現在承認制です。申請を承認する際に役立つメッセージを添えてください
+ text: このサーバーは現在承認制です。申請を承認する際に役立つメッセージを添えてください。その際,このサーバをどこで知ったかという情報を含めて頂くと,承認できる可能性が高くなります。この欄が空欄の場合は承認しません
ip_block:
comment: オプションです。このルールを追加した理由の覚え書きにご利用ください。
expires_in: IPアドレスは有限のリソースです。複数人で共有されたり変更されることもあります。そのため無期限にIPアドレスをブロックするのは推奨されません。
@@ -190,6 +191,7 @@ ja:
setting_advanced_layout: 上級者向けUIを有効にする
setting_aggregate_reblogs: ブーストをまとめる
setting_always_send_emails: 常にメール通知を送信する
+ setting_hidden_direct: 'DMをホームTLに表示しない'
setting_auto_play_gif: アニメーションGIFを自動再生する
setting_boost_modal: ブーストする前に確認ダイアログを表示する
setting_crop_images: 投稿の詳細以外では画像を16:9に切り抜く
@@ -300,6 +302,7 @@ ja:
'no': いいえ
not_recommended: 非推奨
recommended: おすすめ
+ handononly: はんドン独自
required:
mark: "*"
text: 必須
diff --git a/config/settings.yml b/config/settings.yml
index ec8fead0f5e55..d3661192ac73c 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -34,6 +34,7 @@ defaults: &defaults
advanced_layout: false
use_blurhash: true
use_pending_items: false
+ hidden_direct: true
trends: true
trendable_by_default: false
crop_images: true
diff --git a/config/themes.yml b/config/themes.yml
index 9c21c9459f3bc..a27a6f1020a24 100644
--- a/config/themes.yml
+++ b/config/themes.yml
@@ -1,3 +1,13 @@
-default: styles/application.scss
-contrast: styles/contrast.scss
-mastodon-light: styles/mastodon-light.scss
+default: styles/handon-default.scss
+contrast: styles/handon-contrast.scss
+mastodon-light: styles/handon-light.scss
+blacklead: styles/handon-blacklead.scss
+cantadark: styles/handon-cantadark.scss
+instance-ticker-type1-default: styles/instance-ticker-type1-default.scss
+instance-ticker-type1-contrast: styles/instance-ticker-type1-contrast.scss
+instance-ticker-type1-light: styles/instance-ticker-type1-light.scss
+instance-ticker-type1-blacklead: styles/instance-ticker-type1-blacklead.scss
+instance-ticker-type1-cantadark: styles/instance-ticker-type1-cantadark.scss
+vanilla-default: styles/default.scss
+vanilla-contrast: styles/contrast.scss
+vanilla-light: styles/mastodon-light.scss
diff --git a/public/announcements.json b/public/announcements.json
new file mode 100644
index 0000000000000..518e8c93c3422
--- /dev/null
+++ b/public/announcements.json
@@ -0,0 +1,6 @@
+{
+ "emergency_20200411": {
+ "body": "⚠ 新型コロナウイルスに関する情報は政府など公的機関のWebページを参照してください。",
+ "href": "https://corona.go.jp/"
+ }
+}
diff --git a/public/handon-header.png b/public/handon-header.png
new file mode 100644
index 0000000000000..1431f81c52f3f
Binary files /dev/null and b/public/handon-header.png differ