Merge pull request #2112 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes
This commit is contained in:
commit
4c68189d2b
104 changed files with 1064 additions and 582 deletions
|
@ -221,5 +221,5 @@ workflows:
|
||||||
pkg-manager: yarn
|
pkg-manager: yarn
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
version: '16.18'
|
version: '16.19'
|
||||||
yarn-run: test:jest
|
yarn-run: test:jest
|
||||||
|
|
|
@ -10,3 +10,4 @@ insert_final_newline = true
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
|
@ -5,6 +5,7 @@ module.exports = {
|
||||||
'eslint:recommended',
|
'eslint:recommended',
|
||||||
'plugin:react/recommended',
|
'plugin:react/recommended',
|
||||||
'plugin:jsx-a11y/recommended',
|
'plugin:jsx-a11y/recommended',
|
||||||
|
'plugin:import/recommended',
|
||||||
],
|
],
|
||||||
|
|
||||||
env: {
|
env: {
|
||||||
|
@ -98,7 +99,6 @@ module.exports = {
|
||||||
ignoreRestSiblings: true,
|
ignoreRestSiblings: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
'no-useless-escape': 'off',
|
|
||||||
'object-curly-spacing': ['error', 'always'],
|
'object-curly-spacing': ['error', 'always'],
|
||||||
'padded-blocks': [
|
'padded-blocks': [
|
||||||
'error',
|
'error',
|
||||||
|
@ -178,6 +178,7 @@ module.exports = {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// See https://github.com/import-js/eslint-plugin-import/blob/main/config/recommended.js
|
||||||
'import/extensions': [
|
'import/extensions': [
|
||||||
'error',
|
'error',
|
||||||
'always',
|
'always',
|
||||||
|
@ -196,7 +197,6 @@ module.exports = {
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
'import/no-unresolved': 'error',
|
|
||||||
'import/no-webpack-loader-syntax': 'error',
|
'import/no-webpack-loader-syntax': 'error',
|
||||||
|
|
||||||
'promise/catch-or-return': [
|
'promise/catch-or-return': [
|
||||||
|
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
||||||
16
|
16.19
|
||||||
|
|
|
@ -71,9 +71,18 @@ docker-compose.override.yml
|
||||||
/app/javascript/mastodon/locales
|
/app/javascript/mastodon/locales
|
||||||
/config/locales
|
/config/locales
|
||||||
|
|
||||||
|
# Ignore vendored CSS reset
|
||||||
|
app/javascript/styles/mastodon/reset.scss
|
||||||
|
|
||||||
|
# Ignore glitch-soc emoji map file
|
||||||
|
/app/javascript/flavours/glitch/features/emoji/emoji_map.json
|
||||||
|
|
||||||
# Ignore glitch-soc locale files
|
# Ignore glitch-soc locale files
|
||||||
/app/javascript/flavours/glitch/locales
|
/app/javascript/flavours/glitch/locales
|
||||||
/config/locales-glitch
|
/config/locales-glitch
|
||||||
|
|
||||||
# Ignore glitch-soc emoji map file
|
# Ignore glitch-soc vendored CSS reset
|
||||||
/app/javascript/flavours/glitch/features/emoji/emoji_map.json
|
app/javascript/flavours/glitch/styles/reset.scss
|
||||||
|
|
||||||
|
# Ignore win95 theme
|
||||||
|
app/javascript/styles/win95.scss
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
3.0.4
|
3.0.5
|
||||||
|
|
10
Dockerfile
10
Dockerfile
|
@ -1,8 +1,8 @@
|
||||||
# syntax=docker/dockerfile:1.4
|
# syntax=docker/dockerfile:1.4
|
||||||
# This needs to be bullseye-slim because the Ruby image is built on bullseye-slim
|
# This needs to be bullseye-slim because the Ruby image is built on bullseye-slim
|
||||||
ARG NODE_VERSION="16.18.1-bullseye-slim"
|
ARG NODE_VERSION="16.19-bullseye-slim"
|
||||||
|
|
||||||
FROM ghcr.io/moritzheiber/ruby-jemalloc:3.0.4-slim as ruby
|
FROM ghcr.io/moritzheiber/ruby-jemalloc:3.0.5-slim as ruby
|
||||||
FROM node:${NODE_VERSION} as build
|
FROM node:${NODE_VERSION} as build
|
||||||
|
|
||||||
COPY --link --from=ruby /opt/ruby /opt/ruby
|
COPY --link --from=ruby /opt/ruby /opt/ruby
|
||||||
|
@ -37,7 +37,8 @@ RUN apt-get update && \
|
||||||
bundle config set --local without 'development test' && \
|
bundle config set --local without 'development test' && \
|
||||||
bundle config set silence_root_warning true && \
|
bundle config set silence_root_warning true && \
|
||||||
bundle install -j"$(nproc)" && \
|
bundle install -j"$(nproc)" && \
|
||||||
yarn install --pure-lockfile --network-timeout 600000
|
yarn install --pure-lockfile --network-timeout 600000 && \
|
||||||
|
yarn cache clean
|
||||||
|
|
||||||
FROM node:${NODE_VERSION}
|
FROM node:${NODE_VERSION}
|
||||||
|
|
||||||
|
@ -91,8 +92,7 @@ USER mastodon
|
||||||
WORKDIR /opt/mastodon
|
WORKDIR /opt/mastodon
|
||||||
|
|
||||||
# Precompile assets
|
# Precompile assets
|
||||||
RUN OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
|
RUN OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile
|
||||||
yarn cache clean
|
|
||||||
|
|
||||||
# Set the work dir and the container entry point
|
# Set the work dir and the container entry point
|
||||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||||
|
|
8
Gemfile
8
Gemfile
|
@ -12,7 +12,7 @@ gem 'sprockets', '~> 3.7.2'
|
||||||
gem 'thor', '~> 1.2'
|
gem 'thor', '~> 1.2'
|
||||||
gem 'rack', '~> 2.2.6'
|
gem 'rack', '~> 2.2.6'
|
||||||
|
|
||||||
gem 'hamlit-rails', '~> 0.2'
|
gem 'haml-rails', '~>2.0'
|
||||||
gem 'pg', '~> 1.4'
|
gem 'pg', '~> 1.4'
|
||||||
gem 'makara', '~> 0.5'
|
gem 'makara', '~> 0.5'
|
||||||
gem 'pghero'
|
gem 'pghero'
|
||||||
|
@ -40,7 +40,7 @@ end
|
||||||
gem 'net-ldap', '~> 0.17'
|
gem 'net-ldap', '~> 0.17'
|
||||||
gem 'omniauth-cas', '~> 2.0'
|
gem 'omniauth-cas', '~> 2.0'
|
||||||
gem 'omniauth-saml', '~> 1.10'
|
gem 'omniauth-saml', '~> 1.10'
|
||||||
gem 'gitlab-omniauth-openid-connect', '~>0.10.1', require: 'omniauth_openid_connect'
|
gem 'omniauth_openid_connect', '~> 0.6.0'
|
||||||
gem 'omniauth', '~> 1.9'
|
gem 'omniauth', '~> 1.9'
|
||||||
gem 'omniauth-rails_csrf_protection', '~> 0.1'
|
gem 'omniauth-rails_csrf_protection', '~> 0.1'
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ gem 'ruby-progressbar', '~> 1.11'
|
||||||
gem 'sanitize', '~> 6.0'
|
gem 'sanitize', '~> 6.0'
|
||||||
gem 'scenic', '~> 1.7'
|
gem 'scenic', '~> 1.7'
|
||||||
gem 'sidekiq', '~> 6.5'
|
gem 'sidekiq', '~> 6.5'
|
||||||
gem 'sidekiq-scheduler', '~> 4.0'
|
gem 'sidekiq-scheduler', '~> 5.0'
|
||||||
gem 'sidekiq-unique-jobs', '~> 7.1'
|
gem 'sidekiq-unique-jobs', '~> 7.1'
|
||||||
gem 'sidekiq-bulk', '~> 0.2.0'
|
gem 'sidekiq-bulk', '~> 0.2.0'
|
||||||
gem 'simple-navigation', '~> 4.4'
|
gem 'simple-navigation', '~> 4.4'
|
||||||
|
@ -160,3 +160,5 @@ gem 'xorcist', '~> 1.1'
|
||||||
|
|
||||||
gem 'hcaptcha', '~> 7.1'
|
gem 'hcaptcha', '~> 7.1'
|
||||||
gem 'cocoon', '~> 1.2'
|
gem 'cocoon', '~> 1.2'
|
||||||
|
|
||||||
|
gem 'net-http', '~> 0.3.2'
|
||||||
|
|
59
Gemfile.lock
59
Gemfile.lock
|
@ -120,8 +120,7 @@ GEM
|
||||||
bindata (2.4.14)
|
bindata (2.4.14)
|
||||||
binding_of_caller (1.0.0)
|
binding_of_caller (1.0.0)
|
||||||
debug_inspector (>= 0.0.1)
|
debug_inspector (>= 0.0.1)
|
||||||
blurhash (0.1.6)
|
blurhash (0.1.7)
|
||||||
ffi (~> 1.14)
|
|
||||||
bootsnap (1.16.0)
|
bootsnap (1.16.0)
|
||||||
msgpack (~> 1.2)
|
msgpack (~> 1.2)
|
||||||
brakeman (5.4.0)
|
brakeman (5.4.0)
|
||||||
|
@ -165,7 +164,7 @@ GEM
|
||||||
activesupport
|
activesupport
|
||||||
cbor (0.5.9.6)
|
cbor (0.5.9.6)
|
||||||
charlock_holmes (0.7.7)
|
charlock_holmes (0.7.7)
|
||||||
chewy (7.2.4)
|
chewy (7.2.7)
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 5.2)
|
||||||
elasticsearch (>= 7.12.0, < 7.14.0)
|
elasticsearch (>= 7.12.0, < 7.14.0)
|
||||||
elasticsearch-dsl
|
elasticsearch-dsl
|
||||||
|
@ -231,7 +230,7 @@ GEM
|
||||||
fabrication (2.30.0)
|
fabrication (2.30.0)
|
||||||
faker (3.1.1)
|
faker (3.1.1)
|
||||||
i18n (>= 1.8.11, < 2)
|
i18n (>= 1.8.11, < 2)
|
||||||
faraday (1.9.3)
|
faraday (1.10.3)
|
||||||
faraday-em_http (~> 1.0)
|
faraday-em_http (~> 1.0)
|
||||||
faraday-em_synchrony (~> 1.0)
|
faraday-em_synchrony (~> 1.0)
|
||||||
faraday-excon (~> 1.1)
|
faraday-excon (~> 1.1)
|
||||||
|
@ -247,8 +246,8 @@ GEM
|
||||||
faraday-em_synchrony (1.0.0)
|
faraday-em_synchrony (1.0.0)
|
||||||
faraday-excon (1.1.0)
|
faraday-excon (1.1.0)
|
||||||
faraday-httpclient (1.0.1)
|
faraday-httpclient (1.0.1)
|
||||||
faraday-multipart (1.0.3)
|
faraday-multipart (1.0.4)
|
||||||
multipart-post (>= 1.2, < 3)
|
multipart-post (~> 2)
|
||||||
faraday-net_http (1.0.1)
|
faraday-net_http (1.0.1)
|
||||||
faraday-net_http_persistent (1.2.0)
|
faraday-net_http_persistent (1.2.0)
|
||||||
faraday-patron (1.0.0)
|
faraday-patron (1.0.0)
|
||||||
|
@ -273,27 +272,23 @@ GEM
|
||||||
fog-json (>= 1.0)
|
fog-json (>= 1.0)
|
||||||
ipaddress (>= 0.8)
|
ipaddress (>= 0.8)
|
||||||
formatador (0.3.0)
|
formatador (0.3.0)
|
||||||
fugit (1.7.1)
|
fugit (1.8.1)
|
||||||
et-orbi (~> 1, >= 1.2.7)
|
et-orbi (~> 1, >= 1.2.7)
|
||||||
raabro (~> 1.4)
|
raabro (~> 1.4)
|
||||||
fuubar (2.5.1)
|
fuubar (2.5.1)
|
||||||
rspec-core (~> 3.0)
|
rspec-core (~> 3.0)
|
||||||
ruby-progressbar (~> 1.4)
|
ruby-progressbar (~> 1.4)
|
||||||
gitlab-omniauth-openid-connect (0.10.1)
|
|
||||||
addressable (~> 2.7)
|
|
||||||
omniauth (>= 1.9, < 3)
|
|
||||||
openid_connect (~> 1.2)
|
|
||||||
globalid (1.1.0)
|
globalid (1.1.0)
|
||||||
activesupport (>= 5.0)
|
activesupport (>= 5.0)
|
||||||
hamlit (2.13.0)
|
haml (6.1.1)
|
||||||
temple (>= 0.8.2)
|
temple (>= 0.8.2)
|
||||||
thor
|
thor
|
||||||
tilt
|
tilt
|
||||||
hamlit-rails (0.2.3)
|
haml-rails (2.1.0)
|
||||||
actionpack (>= 4.0.1)
|
actionpack (>= 5.1)
|
||||||
activesupport (>= 4.0.1)
|
activesupport (>= 5.1)
|
||||||
hamlit (>= 1.2.0)
|
haml (>= 4.0.6)
|
||||||
railties (>= 4.0.1)
|
railties (>= 5.1)
|
||||||
hashdiff (1.0.1)
|
hashdiff (1.0.1)
|
||||||
hashie (5.0.0)
|
hashie (5.0.0)
|
||||||
hcaptcha (7.1.0)
|
hcaptcha (7.1.0)
|
||||||
|
@ -412,7 +407,9 @@ GEM
|
||||||
minitest (5.17.0)
|
minitest (5.17.0)
|
||||||
msgpack (1.6.0)
|
msgpack (1.6.0)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multipart-post (2.1.1)
|
multipart-post (2.3.0)
|
||||||
|
net-http (0.3.2)
|
||||||
|
uri
|
||||||
net-imap (0.3.4)
|
net-imap (0.3.4)
|
||||||
date
|
date
|
||||||
net-protocol
|
net-protocol
|
||||||
|
@ -449,6 +446,9 @@ GEM
|
||||||
omniauth-saml (1.10.3)
|
omniauth-saml (1.10.3)
|
||||||
omniauth (~> 1.3, >= 1.3.2)
|
omniauth (~> 1.3, >= 1.3.2)
|
||||||
ruby-saml (~> 1.9)
|
ruby-saml (~> 1.9)
|
||||||
|
omniauth_openid_connect (0.6.0)
|
||||||
|
omniauth (>= 1.9, < 3)
|
||||||
|
openid_connect (~> 1.1)
|
||||||
openid_connect (1.4.2)
|
openid_connect (1.4.2)
|
||||||
activemodel
|
activemodel
|
||||||
attr_required (>= 1.0.0)
|
attr_required (>= 1.0.0)
|
||||||
|
@ -466,7 +466,7 @@ GEM
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
ox (2.14.14)
|
ox (2.14.14)
|
||||||
parallel (1.22.1)
|
parallel (1.22.1)
|
||||||
parser (3.2.0.0)
|
parser (3.2.1.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
parslet (2.0.0)
|
parslet (2.0.0)
|
||||||
pastel (0.8.0)
|
pastel (0.8.0)
|
||||||
|
@ -562,7 +562,7 @@ GEM
|
||||||
redis (>= 4)
|
redis (>= 4)
|
||||||
redlock (1.3.2)
|
redlock (1.3.2)
|
||||||
redis (>= 3.0.0, < 6.0)
|
redis (>= 3.0.0, < 6.0)
|
||||||
regexp_parser (2.6.2)
|
regexp_parser (2.7.0)
|
||||||
request_store (1.5.1)
|
request_store (1.5.1)
|
||||||
rack (>= 1.4)
|
rack (>= 1.4)
|
||||||
responders (3.0.1)
|
responders (3.0.1)
|
||||||
|
@ -597,7 +597,7 @@ GEM
|
||||||
rspec-support (3.11.1)
|
rspec-support (3.11.1)
|
||||||
rspec_junit_formatter (0.6.0)
|
rspec_junit_formatter (0.6.0)
|
||||||
rspec-core (>= 2, < 4, != 2.12.0)
|
rspec-core (>= 2, < 4, != 2.12.0)
|
||||||
rubocop (1.44.1)
|
rubocop (1.45.1)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.2.0.0)
|
parser (>= 3.2.0.0)
|
||||||
|
@ -643,10 +643,9 @@ GEM
|
||||||
redis (>= 4.5.0, < 5)
|
redis (>= 4.5.0, < 5)
|
||||||
sidekiq-bulk (0.2.0)
|
sidekiq-bulk (0.2.0)
|
||||||
sidekiq
|
sidekiq
|
||||||
sidekiq-scheduler (4.0.3)
|
sidekiq-scheduler (5.0.1)
|
||||||
redis (>= 4.2.0)
|
|
||||||
rufus-scheduler (~> 3.2)
|
rufus-scheduler (~> 3.2)
|
||||||
sidekiq (>= 4, < 7)
|
sidekiq (>= 4, < 8)
|
||||||
tilt (>= 1.4.0)
|
tilt (>= 1.4.0)
|
||||||
sidekiq-unique-jobs (7.1.29)
|
sidekiq-unique-jobs (7.1.29)
|
||||||
brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
|
brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
|
||||||
|
@ -686,7 +685,7 @@ GEM
|
||||||
activesupport (>= 3)
|
activesupport (>= 3)
|
||||||
attr_required (>= 0.0.5)
|
attr_required (>= 0.0.5)
|
||||||
httpclient (>= 2.4)
|
httpclient (>= 2.4)
|
||||||
temple (0.8.2)
|
temple (0.10.0)
|
||||||
terminal-table (3.0.2)
|
terminal-table (3.0.2)
|
||||||
unicode-display_width (>= 1.1.1, < 3)
|
unicode-display_width (>= 1.1.1, < 3)
|
||||||
terrapin (0.6.0)
|
terrapin (0.6.0)
|
||||||
|
@ -720,6 +719,7 @@ GEM
|
||||||
unf_ext (0.0.8.2)
|
unf_ext (0.0.8.2)
|
||||||
unicode-display_width (2.4.2)
|
unicode-display_width (2.4.2)
|
||||||
uniform_notifier (1.16.0)
|
uniform_notifier (1.16.0)
|
||||||
|
uri (0.12.0)
|
||||||
validate_email (0.1.6)
|
validate_email (0.1.6)
|
||||||
activemodel (>= 3.0)
|
activemodel (>= 3.0)
|
||||||
mail (>= 2.2.5)
|
mail (>= 2.2.5)
|
||||||
|
@ -756,7 +756,7 @@ GEM
|
||||||
xorcist (1.1.3)
|
xorcist (1.1.3)
|
||||||
xpath (3.2.0)
|
xpath (3.2.0)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
zeitwerk (2.6.6)
|
zeitwerk (2.6.7)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
@ -801,8 +801,7 @@ DEPENDENCIES
|
||||||
fog-core (<= 2.4.0)
|
fog-core (<= 2.4.0)
|
||||||
fog-openstack (~> 0.3)
|
fog-openstack (~> 0.3)
|
||||||
fuubar (~> 2.5)
|
fuubar (~> 2.5)
|
||||||
gitlab-omniauth-openid-connect (~> 0.10.1)
|
haml-rails (~> 2.0)
|
||||||
hamlit-rails (~> 0.2)
|
|
||||||
hcaptcha (~> 7.1)
|
hcaptcha (~> 7.1)
|
||||||
hiredis (~> 0.6)
|
hiredis (~> 0.6)
|
||||||
htmlentities (~> 4.3)
|
htmlentities (~> 4.3)
|
||||||
|
@ -824,6 +823,7 @@ DEPENDENCIES
|
||||||
mario-redis-lock (~> 1.2)
|
mario-redis-lock (~> 1.2)
|
||||||
memory_profiler
|
memory_profiler
|
||||||
mime-types (~> 3.4.1)
|
mime-types (~> 3.4.1)
|
||||||
|
net-http (~> 0.3.2)
|
||||||
net-ldap (~> 0.17)
|
net-ldap (~> 0.17)
|
||||||
nokogiri (~> 1.14)
|
nokogiri (~> 1.14)
|
||||||
nsa (~> 0.2)
|
nsa (~> 0.2)
|
||||||
|
@ -832,6 +832,7 @@ DEPENDENCIES
|
||||||
omniauth-cas (~> 2.0)
|
omniauth-cas (~> 2.0)
|
||||||
omniauth-rails_csrf_protection (~> 0.1)
|
omniauth-rails_csrf_protection (~> 0.1)
|
||||||
omniauth-saml (~> 1.10)
|
omniauth-saml (~> 1.10)
|
||||||
|
omniauth_openid_connect (~> 0.6.0)
|
||||||
ox (~> 2.14)
|
ox (~> 2.14)
|
||||||
parslet
|
parslet
|
||||||
pg (~> 1.4)
|
pg (~> 1.4)
|
||||||
|
@ -871,7 +872,7 @@ DEPENDENCIES
|
||||||
scenic (~> 1.7)
|
scenic (~> 1.7)
|
||||||
sidekiq (~> 6.5)
|
sidekiq (~> 6.5)
|
||||||
sidekiq-bulk (~> 0.2.0)
|
sidekiq-bulk (~> 0.2.0)
|
||||||
sidekiq-scheduler (~> 4.0)
|
sidekiq-scheduler (~> 5.0)
|
||||||
sidekiq-unique-jobs (~> 7.1)
|
sidekiq-unique-jobs (~> 7.1)
|
||||||
simple-navigation (~> 4.4)
|
simple-navigation (~> 4.4)
|
||||||
simple_form (~> 5.2)
|
simple_form (~> 5.2)
|
||||||
|
|
|
@ -11,7 +11,8 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through
|
||||||
## Supported Versions
|
## Supported Versions
|
||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
| ------- | ----------|
|
| ------- | --------- |
|
||||||
|
| 4.1.x | Yes |
|
||||||
| 4.0.x | Yes |
|
| 4.0.x | Yes |
|
||||||
| 3.5.x | Yes |
|
| 3.5.x | Yes |
|
||||||
| < 3.5 | No |
|
| < 3.5 | No |
|
||||||
|
|
|
@ -64,11 +64,18 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
application: doorkeeper_token.application,
|
application: doorkeeper_token.application,
|
||||||
poll: status_params[:poll],
|
poll: status_params[:poll],
|
||||||
content_type: status_params[:content_type],
|
content_type: status_params[:content_type],
|
||||||
|
allowed_mentions: status_params[:allowed_mentions],
|
||||||
idempotency: request.headers['Idempotency-Key'],
|
idempotency: request.headers['Idempotency-Key'],
|
||||||
with_rate_limit: true
|
with_rate_limit: true
|
||||||
)
|
)
|
||||||
|
|
||||||
render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer
|
render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer
|
||||||
|
rescue PostStatusService::UnexpectedMentionsError => e
|
||||||
|
unexpected_accounts = ActiveModel::Serializer::CollectionSerializer.new(
|
||||||
|
e.accounts,
|
||||||
|
serializer: REST::AccountSerializer
|
||||||
|
)
|
||||||
|
render json: { error: e.message, unexpected_accounts: unexpected_accounts }, status: 422
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
|
@ -131,6 +138,7 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
:language,
|
:language,
|
||||||
:scheduled_at,
|
:scheduled_at,
|
||||||
:content_type,
|
:content_type,
|
||||||
|
allowed_mentions: [],
|
||||||
media_ids: [],
|
media_ids: [],
|
||||||
media_attributes: [
|
media_attributes: [
|
||||||
:id,
|
:id,
|
||||||
|
|
|
@ -6,7 +6,7 @@ import { setBrowserSupport, setSubscription, clearSubscription } from './setter'
|
||||||
const urlBase64ToUint8Array = (base64String) => {
|
const urlBase64ToUint8Array = (base64String) => {
|
||||||
const padding = '='.repeat((4 - base64String.length % 4) % 4);
|
const padding = '='.repeat((4 - base64String.length % 4) % 4);
|
||||||
const base64 = (base64String + padding)
|
const base64 = (base64String + padding)
|
||||||
.replace(/\-/g, '+')
|
.replace(/-/g, '+')
|
||||||
.replace(/_/g, '/');
|
.replace(/_/g, '/');
|
||||||
|
|
||||||
const rawData = window.atob(base64);
|
const rawData = window.atob(base64);
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
|
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
|
||||||
import { formatTime } from 'flavours/glitch/features/video';
|
import { formatTime, getPointerPosition, fileNameFromURL } from 'flavours/glitch/features/video';
|
||||||
import Icon from 'flavours/glitch/components/icon';
|
import Icon from 'flavours/glitch/components/icon';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { throttle } from 'lodash';
|
import { throttle, debounce } from 'lodash';
|
||||||
import { getPointerPosition, fileNameFromURL } from 'flavours/glitch/features/video';
|
|
||||||
import { debounce } from 'lodash';
|
|
||||||
import Visualizer from './visualizer';
|
import Visualizer from './visualizer';
|
||||||
import { displayMedia, useBlurhash } from 'flavours/glitch/initial_state';
|
import { displayMedia, useBlurhash } from 'flavours/glitch/initial_state';
|
||||||
import Blurhash from 'flavours/glitch/components/blurhash';
|
import Blurhash from 'flavours/glitch/components/blurhash';
|
||||||
|
|
|
@ -32,6 +32,11 @@ export default class Upload extends ImmutablePureComponent {
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { media } = this.props;
|
const { media } = this.props;
|
||||||
|
|
||||||
|
if (!media) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
const focusX = media.getIn(['meta', 'focus', 'x']);
|
const focusX = media.getIn(['meta', 'focus', 'x']);
|
||||||
const focusY = media.getIn(['meta', 'focus', 'y']);
|
const focusY = media.getIn(['meta', 'focus', 'y']);
|
||||||
const x = ((focusX / 2) + .5) * 100;
|
const x = ((focusX / 2) + .5) * 100;
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import PollForm from '../components/poll_form';
|
import PollForm from '../components/poll_form';
|
||||||
import { addPollOption, removePollOption, changePollOption, changePollSettings } from 'flavours/glitch/actions/compose';
|
|
||||||
import {
|
import {
|
||||||
|
addPollOption,
|
||||||
|
removePollOption,
|
||||||
|
changePollOption,
|
||||||
|
changePollSettings,
|
||||||
clearComposeSuggestions,
|
clearComposeSuggestions,
|
||||||
fetchComposeSuggestions,
|
fetchComposeSuggestions,
|
||||||
selectComposeSuggestion,
|
selectComposeSuggestion,
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import Upload from '../components/upload';
|
import Upload from '../components/upload';
|
||||||
import { undoUploadCompose, initMediaEditModal } from 'flavours/glitch/actions/compose';
|
import { undoUploadCompose, initMediaEditModal, submitCompose } from 'flavours/glitch/actions/compose';
|
||||||
import { submitCompose } from 'flavours/glitch/actions/compose';
|
|
||||||
|
|
||||||
const mapStateToProps = (state, { id }) => ({
|
const mapStateToProps = (state, { id }) => ({
|
||||||
media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
|
media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
|
||||||
|
|
|
@ -25,7 +25,7 @@ const buildHashtagRE = () => {
|
||||||
'))', 'iu',
|
'))', 'iu',
|
||||||
);
|
);
|
||||||
} catch {
|
} catch {
|
||||||
return /(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i;
|
return /(?:^|[^/)\w])#(\w*[a-zA-Z·]\w*)/i;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import NavigationContainer from './containers/navigation_container';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { mountCompose, unmountCompose } from 'flavours/glitch/actions/compose';
|
import { mountCompose, unmountCompose, cycleElefriendCompose } from 'flavours/glitch/actions/compose';
|
||||||
import { injectIntl, defineMessages } from 'react-intl';
|
import { injectIntl, defineMessages } from 'react-intl';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import SearchContainer from './containers/search_container';
|
import SearchContainer from './containers/search_container';
|
||||||
|
@ -12,7 +12,6 @@ import Motion from '../ui/util/optional_motion';
|
||||||
import spring from 'react-motion/lib/spring';
|
import spring from 'react-motion/lib/spring';
|
||||||
import SearchResultsContainer from './containers/search_results_container';
|
import SearchResultsContainer from './containers/search_results_container';
|
||||||
import { me, mascot } from 'flavours/glitch/initial_state';
|
import { me, mascot } from 'flavours/glitch/initial_state';
|
||||||
import { cycleElefriendCompose } from 'flavours/glitch/actions/compose';
|
|
||||||
import HeaderContainer from './containers/header_container';
|
import HeaderContainer from './containers/header_container';
|
||||||
import Column from 'flavours/glitch/components/column';
|
import Column from 'flavours/glitch/components/column';
|
||||||
import { Helmet } from 'react-helmet';
|
import { Helmet } from 'react-helmet';
|
||||||
|
|
|
@ -5,5 +5,5 @@ const urlPlaceholder = '$2xxxxxxxxxxxxxxxxxxxxxxx';
|
||||||
export function countableText(inputText) {
|
export function countableText(inputText) {
|
||||||
return inputText
|
return inputText
|
||||||
.replace(urlRegex, urlPlaceholder)
|
.replace(urlRegex, urlPlaceholder)
|
||||||
.replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3');
|
.replace(/(^|[^/\w])@(([a-z0-9_]+)@[a-z0-9.-]+[a-z0-9]+)/ig, '$1@$3');
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ const stringFromCodePoint = _String.fromCodePoint || function () {
|
||||||
|
|
||||||
const _JSON = JSON;
|
const _JSON = JSON;
|
||||||
|
|
||||||
const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/;
|
const COLONS_REGEX = /^(?::([^:]+):)(?::skin-tone-(\d):)?$/;
|
||||||
const SKINS = [
|
const SKINS = [
|
||||||
'1F3FA', '1F3FB', '1F3FC',
|
'1F3FA', '1F3FB', '1F3FC',
|
||||||
'1F3FD', '1F3FE', '1F3FF',
|
'1F3FD', '1F3FE', '1F3FF',
|
||||||
|
|
|
@ -27,7 +27,7 @@ const makeMapStateToProps = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const getFirstSentence = str => {
|
const getFirstSentence = str => {
|
||||||
const arr = str.split(/(([\.\?!]+\s)|[.。?!\n•])/);
|
const arr = str.split(/(([.?!]+\s)|[.。?!\n•])/);
|
||||||
|
|
||||||
return arr[0];
|
return arr[0];
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,9 +6,8 @@ import PropTypes from 'prop-types';
|
||||||
import IconButton from 'flavours/glitch/components/icon_button';
|
import IconButton from 'flavours/glitch/components/icon_button';
|
||||||
import Icon from 'flavours/glitch/components/icon';
|
import Icon from 'flavours/glitch/components/icon';
|
||||||
import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
|
import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
|
||||||
import { autoPlayGif, reduceMotion, disableSwiping } from 'flavours/glitch/initial_state';
|
import { autoPlayGif, reduceMotion, disableSwiping, mascot } from 'flavours/glitch/initial_state';
|
||||||
import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
|
import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
|
||||||
import { mascot } from 'flavours/glitch/initial_state';
|
|
||||||
import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
|
import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import EmojiPickerDropdown from 'flavours/glitch/features/compose/containers/emoji_picker_dropdown_container';
|
import EmojiPickerDropdown from 'flavours/glitch/features/compose/containers/emoji_picker_dropdown_container';
|
||||||
|
|
|
@ -2,8 +2,7 @@ import { connect } from 'react-redux';
|
||||||
import { defineMessages, injectIntl } from 'react-intl';
|
import { defineMessages, injectIntl } from 'react-intl';
|
||||||
import ColumnSettings from '../components/column_settings';
|
import ColumnSettings from '../components/column_settings';
|
||||||
import { changeSetting } from 'flavours/glitch/actions/settings';
|
import { changeSetting } from 'flavours/glitch/actions/settings';
|
||||||
import { setFilter } from 'flavours/glitch/actions/notifications';
|
import { setFilter, clearNotifications, requestBrowserPermission } from 'flavours/glitch/actions/notifications';
|
||||||
import { clearNotifications, requestBrowserPermission } from 'flavours/glitch/actions/notifications';
|
|
||||||
import { changeAlerts as changePushNotifications } from 'flavours/glitch/actions/push_notifications';
|
import { changeAlerts as changePushNotifications } from 'flavours/glitch/actions/push_notifications';
|
||||||
import { openModal } from 'flavours/glitch/actions/modal';
|
import { openModal } from 'flavours/glitch/actions/modal';
|
||||||
import { showAlert } from 'flavours/glitch/actions/alerts';
|
import { showAlert } from 'flavours/glitch/actions/alerts';
|
||||||
|
|
|
@ -5,7 +5,17 @@ import PropTypes from 'prop-types';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
import { fetchStatus } from 'flavours/glitch/actions/statuses';
|
import {
|
||||||
|
fetchStatus,
|
||||||
|
muteStatus,
|
||||||
|
unmuteStatus,
|
||||||
|
deleteStatus,
|
||||||
|
editStatus,
|
||||||
|
hideStatus,
|
||||||
|
revealStatus,
|
||||||
|
translateStatus,
|
||||||
|
undoStatusTranslation,
|
||||||
|
} from 'flavours/glitch/actions/statuses';
|
||||||
import MissingIndicator from 'flavours/glitch/components/missing_indicator';
|
import MissingIndicator from 'flavours/glitch/components/missing_indicator';
|
||||||
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
|
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
|
||||||
import DetailedStatus from './components/detailed_status';
|
import DetailedStatus from './components/detailed_status';
|
||||||
|
@ -27,16 +37,6 @@ import {
|
||||||
directCompose,
|
directCompose,
|
||||||
} from 'flavours/glitch/actions/compose';
|
} from 'flavours/glitch/actions/compose';
|
||||||
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
|
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
|
||||||
import {
|
|
||||||
muteStatus,
|
|
||||||
unmuteStatus,
|
|
||||||
deleteStatus,
|
|
||||||
editStatus,
|
|
||||||
hideStatus,
|
|
||||||
revealStatus,
|
|
||||||
translateStatus,
|
|
||||||
undoStatusTranslation,
|
|
||||||
} from 'flavours/glitch/actions/statuses';
|
|
||||||
import { initMuteModal } from 'flavours/glitch/actions/mutes';
|
import { initMuteModal } from 'flavours/glitch/actions/mutes';
|
||||||
import { initBlockModal } from 'flavours/glitch/actions/blocks';
|
import { initBlockModal } from 'flavours/glitch/actions/blocks';
|
||||||
import { initReport } from 'flavours/glitch/actions/reports';
|
import { initReport } from 'flavours/glitch/actions/reports';
|
||||||
|
|
|
@ -5,11 +5,10 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { changeUploadCompose, uploadThumbnail, onChangeMediaDescription, onChangeMediaFocus } from 'flavours/glitch/actions/compose';
|
import { changeUploadCompose, uploadThumbnail, onChangeMediaDescription, onChangeMediaFocus } from 'flavours/glitch/actions/compose';
|
||||||
import { getPointerPosition } from 'flavours/glitch/features/video';
|
import Video, { getPointerPosition } from 'flavours/glitch/features/video';
|
||||||
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
|
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
|
||||||
import IconButton from 'flavours/glitch/components/icon_button';
|
import IconButton from 'flavours/glitch/components/icon_button';
|
||||||
import Button from 'flavours/glitch/components/button';
|
import Button from 'flavours/glitch/components/button';
|
||||||
import Video from 'flavours/glitch/features/video';
|
|
||||||
import Audio from 'flavours/glitch/features/audio';
|
import Audio from 'flavours/glitch/features/audio';
|
||||||
import Textarea from 'react-textarea-autosize';
|
import Textarea from 'react-textarea-autosize';
|
||||||
import UploadProgress from 'flavours/glitch/features/compose/components/upload_progress';
|
import UploadProgress from 'flavours/glitch/features/compose/components/upload_progress';
|
||||||
|
|
|
@ -273,11 +273,12 @@ const ignoreSuggestion = (state, position, token, completion, path) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const sortHashtagsByUse = (state, tags) => {
|
const sortHashtagsByUse = (state, tags) => {
|
||||||
const personalHistory = state.get('tagHistory');
|
const personalHistory = state.get('tagHistory').map(tag => tag.toLowerCase());
|
||||||
|
|
||||||
return tags.sort((a, b) => {
|
const tagsWithLowercase = tags.map(t => ({ ...t, lowerName: t.name.toLowerCase() }));
|
||||||
const usedA = personalHistory.includes(a.name);
|
const sorted = tagsWithLowercase.sort((a, b) => {
|
||||||
const usedB = personalHistory.includes(b.name);
|
const usedA = personalHistory.includes(a.lowerName);
|
||||||
|
const usedB = personalHistory.includes(b.lowerName);
|
||||||
|
|
||||||
if (usedA === usedB) {
|
if (usedA === usedB) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -287,6 +288,8 @@ const sortHashtagsByUse = (state, tags) => {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
sorted.forEach(tag => delete tag.lowerName);
|
||||||
|
return sorted;
|
||||||
};
|
};
|
||||||
|
|
||||||
const insertEmoji = (state, position, emojiData) => {
|
const insertEmoji = (state, position, emojiData) => {
|
||||||
|
@ -421,6 +424,8 @@ export default function compose(state = initialState, action) {
|
||||||
map.set('preselectDate', new Date());
|
map.set('preselectDate', new Date());
|
||||||
map.set('idempotencyKey', uuid());
|
map.set('idempotencyKey', uuid());
|
||||||
|
|
||||||
|
map.update('media_attachments', list => list.filter(media => media.get('unattached')));
|
||||||
|
|
||||||
if (action.status.get('language') && !action.status.has('translation')) {
|
if (action.status.get('language') && !action.status.has('translation')) {
|
||||||
map.set('language', action.status.get('language'));
|
map.set('language', action.status.get('language'));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
background-clip: padding-box;
|
background-clip: padding-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin avatar-size($size:48px) {
|
@mixin avatar-size($size: 48px) {
|
||||||
width: $size;
|
width: $size;
|
||||||
height: $size;
|
height: $size;
|
||||||
background-size: $size $size;
|
background-size: $size $size;
|
||||||
|
@ -22,7 +22,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin limited-single-column($media, $parent: '&') {
|
@mixin limited-single-column($media, $parent: '&') {
|
||||||
.auto-columns #{$parent}, .single-column #{$parent} {
|
.auto-columns #{$parent},
|
||||||
|
.single-column #{$parent} {
|
||||||
@media #{$media} {
|
@media #{$media} {
|
||||||
@content;
|
@content;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange' 'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on' 'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
|
$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange'
|
||||||
|
'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign'
|
||||||
|
'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on'
|
||||||
|
'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
|
||||||
|
|
||||||
%emoji-color-inversion {
|
%emoji-color-inversion {
|
||||||
filter: invert(1);
|
filter: invert(1);
|
||||||
|
@ -19,7 +22,7 @@ $emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange'
|
||||||
|
|
||||||
&.active::after {
|
&.active::after {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
content: "\F00C";
|
content: '\F00C';
|
||||||
font-size: 50%;
|
font-size: 50%;
|
||||||
font-family: FontAwesome;
|
font-family: FontAwesome;
|
||||||
right: -0.55em;
|
right: -0.55em;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@use "sass:math";
|
@use 'sass:math';
|
||||||
|
|
||||||
$no-columns-breakpoint: 600px;
|
$no-columns-breakpoint: 600px;
|
||||||
$sidebar-width: 240px;
|
$sidebar-width: 240px;
|
||||||
|
@ -350,7 +350,7 @@ $content-width: 840px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 0;
|
height: 0;
|
||||||
border: 0;
|
border: 0;
|
||||||
border-bottom: 1px solid rgba($ui-base-lighter-color, .6);
|
border-bottom: 1px solid rgba($ui-base-lighter-color, 0.6);
|
||||||
margin: 20px 0;
|
margin: 20px 0;
|
||||||
|
|
||||||
&.spacer {
|
&.spacer {
|
||||||
|
@ -1147,7 +1147,10 @@ a.name-tag,
|
||||||
|
|
||||||
@for $i from 0 through 10 {
|
@for $i from 0 through 10 {
|
||||||
&--#{10 * $i} {
|
&--#{10 * $i} {
|
||||||
background-color: rgba($ui-highlight-color, 1 * (math.div(max(1, $i), 10)));
|
background-color: rgba(
|
||||||
|
$ui-highlight-color,
|
||||||
|
1 * (math.div(max(1, $i), 10))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1236,7 +1239,12 @@ a.sparkline {
|
||||||
|
|
||||||
.skeleton {
|
.skeleton {
|
||||||
background-color: lighten($ui-base-color, 8%);
|
background-color: lighten($ui-base-color, 8%);
|
||||||
background-image: linear-gradient(90deg, lighten($ui-base-color, 8%), lighten($ui-base-color, 12%), lighten($ui-base-color, 8%));
|
background-image: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
lighten($ui-base-color, 8%),
|
||||||
|
lighten($ui-base-color, 12%),
|
||||||
|
lighten($ui-base-color, 8%)
|
||||||
|
);
|
||||||
background-size: 200px 100%;
|
background-size: 200px 100%;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
@ -1285,7 +1293,10 @@ a.sparkline {
|
||||||
|
|
||||||
@for $i from 0 through 10 {
|
@for $i from 0 through 10 {
|
||||||
&--#{10 * $i} {
|
&--#{10 * $i} {
|
||||||
background-color: rgba($ui-highlight-color, 1 * (math.div(max(1, $i), 10)));
|
background-color: rgba(
|
||||||
|
$ui-highlight-color,
|
||||||
|
1 * (math.div(max(1, $i), 10))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1431,7 +1442,7 @@ a.sparkline {
|
||||||
|
|
||||||
&::after {
|
&::after {
|
||||||
display: block;
|
display: block;
|
||||||
content: "";
|
content: '';
|
||||||
width: 50px;
|
width: 50px;
|
||||||
height: 21px;
|
height: 21px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -1825,7 +1836,7 @@ a.sparkline {
|
||||||
|
|
||||||
&::after {
|
&::after {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
content: "";
|
content: '';
|
||||||
width: 1px;
|
width: 1px;
|
||||||
background: $highlight-text-color;
|
background: $highlight-text-color;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
@if type-of($color) == 'color' {
|
@if type-of($color) == 'color' {
|
||||||
$color: str-slice(ie-hex-str($color), 4);
|
$color: str-slice(ie-hex-str($color), 4);
|
||||||
}
|
}
|
||||||
@return '%23' + unquote($color)
|
@return '%23' + unquote($color);
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
@ -13,9 +13,9 @@ body {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
color: $primary-text-color;
|
color: $primary-text-color;
|
||||||
text-rendering: optimizelegibility;
|
text-rendering: optimizelegibility;
|
||||||
font-feature-settings: "kern";
|
font-feature-settings: 'kern';
|
||||||
text-size-adjust: none;
|
text-size-adjust: none;
|
||||||
-webkit-tap-highlight-color: rgba(0,0,0,0);
|
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||||
-webkit-tap-highlight-color: transparent;
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
|
||||||
&.system-font {
|
&.system-font {
|
||||||
|
@ -30,7 +30,9 @@ body {
|
||||||
// Droid Sans => Older Androids (<4.0)
|
// Droid Sans => Older Androids (<4.0)
|
||||||
// Helvetica Neue => Older macOS <10.11
|
// Helvetica Neue => Older macOS <10.11
|
||||||
// $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)
|
// $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)
|
||||||
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", $font-sans-serif, sans-serif;
|
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
|
||||||
|
'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans',
|
||||||
|
'Helvetica Neue', $font-sans-serif, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.app-body {
|
&.app-body {
|
||||||
|
|
|
@ -30,7 +30,9 @@
|
||||||
border: 0;
|
border: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
||||||
& > .account__avatar-wrapper { margin: 0 8px 0 0 }
|
& > .account__avatar-wrapper {
|
||||||
|
margin: 0 8px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
& > .display-name {
|
& > .display-name {
|
||||||
height: 24px;
|
height: 24px;
|
||||||
|
@ -379,7 +381,7 @@
|
||||||
&::before,
|
&::before,
|
||||||
&::after {
|
&::after {
|
||||||
display: block;
|
display: block;
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
@ -710,22 +712,22 @@
|
||||||
padding: 2px 6px;
|
padding: 2px 6px;
|
||||||
color: $darker-text-color;
|
color: $darker-text-color;
|
||||||
|
|
||||||
&:hover,
|
&:hover,
|
||||||
&:active,
|
&:active,
|
||||||
&:focus {
|
&:focus {
|
||||||
color: lighten($darker-text-color, 7%);
|
color: lighten($darker-text-color, 7%);
|
||||||
background-color: rgba($darker-text-color, 0.15);
|
background-color: rgba($darker-text-color, 0.15);
|
||||||
}
|
}
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
background-color: rgba($darker-text-color, 0.3);
|
background-color: rgba($darker-text-color, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
&[disabled] {
|
&[disabled] {
|
||||||
color: darken($darker-text-color, 13%);
|
color: darken($darker-text-color, 13%);
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.flex-spacer {
|
.flex-spacer {
|
||||||
|
|
|
@ -181,7 +181,11 @@
|
||||||
&.active {
|
&.active {
|
||||||
transition: all 100ms ease-in;
|
transition: all 100ms ease-in;
|
||||||
transition-property: background-color, color;
|
transition-property: background-color, color;
|
||||||
background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);
|
background-color: mix(
|
||||||
|
lighten($ui-base-color, 12%),
|
||||||
|
$ui-highlight-color,
|
||||||
|
80%
|
||||||
|
);
|
||||||
|
|
||||||
.reactions-bar__item__count {
|
.reactions-bar__item__count {
|
||||||
color: lighten($highlight-text-color, 8%);
|
color: lighten($highlight-text-color, 8%);
|
||||||
|
|
|
@ -286,7 +286,7 @@ $ui-header-height: 55px;
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
display: block;
|
display: block;
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: -13px;
|
bottom: -13px;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
@ -296,7 +296,11 @@ $ui-header-height: 55px;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);
|
background: radial-gradient(
|
||||||
|
ellipse,
|
||||||
|
rgba($ui-highlight-color, 0.23) 0%,
|
||||||
|
rgba($ui-highlight-color, 0) 60%
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -435,10 +439,10 @@ $ui-header-height: 55px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.layout-single-column .column-header__notif-cleaning-buttons {
|
.layout-single-column .column-header__notif-cleaning-buttons {
|
||||||
@media screen and (min-width: $no-gap-breakpoint) {
|
@media screen and (min-width: $no-gap-breakpoint) {
|
||||||
b, i {
|
b,
|
||||||
|
i {
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -622,7 +626,8 @@ $ui-header-height: 55px;
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@supports(display: grid) { // hack to fix Chrome <57
|
@supports (display: grid) {
|
||||||
|
// hack to fix Chrome <57
|
||||||
contain: strict;
|
contain: strict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -916,7 +921,7 @@ $ui-header-height: 55px;
|
||||||
|
|
||||||
p {
|
p {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
color: $darker-text-color;
|
color: $darker-text-color;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,12 +32,12 @@
|
||||||
.spoiler-input {
|
.spoiler-input {
|
||||||
height: 0;
|
height: 0;
|
||||||
transform-origin: bottom;
|
transform-origin: bottom;
|
||||||
opacity: 0.0;
|
opacity: 0;
|
||||||
|
|
||||||
&.spoiler-input--visible {
|
&.spoiler-input--visible {
|
||||||
height: 36px;
|
height: 36px;
|
||||||
margin-bottom: 11px;
|
margin-bottom: 11px;
|
||||||
opacity: 1.0;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
|
@ -59,8 +59,12 @@
|
||||||
color: $dark-text-color;
|
color: $dark-text-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:focus { outline: 0 }
|
&:focus {
|
||||||
@include single-column('screen and (max-width: 630px)') { font-size: 16px }
|
outline: 0;
|
||||||
|
}
|
||||||
|
@include single-column('screen and (max-width: 630px)') {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +102,7 @@
|
||||||
color: $highlight-text-color;
|
color: $highlight-text-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=checkbox] {
|
input[type='checkbox'] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +122,9 @@
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
border-color: $highlight-text-color;
|
border-color: $highlight-text-color;
|
||||||
background: $highlight-text-color url("data:image/svg+xml;utf8,<svg width='18' height='18' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M4.5 8.5L8 12l6-6' stroke='white' stroke-width='1.5'/></svg>") center center no-repeat;
|
background: $highlight-text-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg width='18' height='18' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M4.5 8.5L8 12l6-6' stroke='white' stroke-width='1.5'/></svg>")
|
||||||
|
center center no-repeat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,7 +143,9 @@
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
& > .account.small { color: $inverted-text-color; }
|
& > .account.small {
|
||||||
|
color: $inverted-text-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.reply-indicator__cancel {
|
.reply-indicator__cancel {
|
||||||
|
@ -159,7 +167,9 @@
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
p, pre, blockquote {
|
p,
|
||||||
|
pre,
|
||||||
|
blockquote {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
|
|
||||||
|
@ -168,12 +178,17 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5 {
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5 {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2 {
|
h1,
|
||||||
|
h2 {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
|
@ -182,7 +197,9 @@
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h3, h4, h5 {
|
h3,
|
||||||
|
h4,
|
||||||
|
h5 {
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,11 +214,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
b, strong {
|
b,
|
||||||
|
strong {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|
||||||
em, i {
|
em,
|
||||||
|
i {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,7 +234,8 @@
|
||||||
vertical-align: super;
|
vertical-align: super;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul, ol {
|
ul,
|
||||||
|
ol {
|
||||||
margin-left: 1em;
|
margin-left: 1em;
|
||||||
|
|
||||||
p {
|
p {
|
||||||
|
@ -235,13 +255,17 @@
|
||||||
color: $lighter-text-color;
|
color: $lighter-text-color;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
|
||||||
&:hover { text-decoration: underline }
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
&.mention {
|
&.mention {
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
|
||||||
span { text-decoration: underline }
|
span {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -321,7 +345,7 @@
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
opacity: .8;
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,7 +382,9 @@
|
||||||
&:hover,
|
&:hover,
|
||||||
&:focus,
|
&:focus,
|
||||||
&:active,
|
&:active,
|
||||||
&.selected { background: darken($ui-secondary-color, 10%) }
|
&.selected {
|
||||||
|
background: darken($ui-secondary-color, 10%);
|
||||||
|
}
|
||||||
|
|
||||||
> .account,
|
> .account,
|
||||||
> .emoji,
|
> .emoji,
|
||||||
|
@ -396,7 +422,9 @@
|
||||||
|
|
||||||
& > .account.small {
|
& > .account.small {
|
||||||
.display-name {
|
.display-name {
|
||||||
& > span { color: $lighter-text-color }
|
& > span {
|
||||||
|
color: $lighter-text-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -430,7 +458,9 @@
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
& > .close { mix-blend-mode: difference }
|
& > .close {
|
||||||
|
mix-blend-mode: difference;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon-button {
|
.icon-button {
|
||||||
|
@ -455,12 +485,22 @@
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
|
background: linear-gradient(
|
||||||
|
0deg,
|
||||||
|
rgba($base-shadow-color, 0.8) 0,
|
||||||
|
rgba($base-shadow-color, 0.35) 80%,
|
||||||
|
transparent
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose-form__upload__actions {
|
.compose-form__upload__actions {
|
||||||
background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
|
background: linear-gradient(
|
||||||
|
180deg,
|
||||||
|
rgba($base-shadow-color, 0.8) 0,
|
||||||
|
rgba($base-shadow-color, 0.35) 80%,
|
||||||
|
transparent
|
||||||
|
);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
@ -543,7 +583,8 @@
|
||||||
margin: 0 3px;
|
margin: 0 3px;
|
||||||
border-width: 0 0 0 1px;
|
border-width: 0 0 0 1px;
|
||||||
border-style: none none none solid;
|
border-style: none none none solid;
|
||||||
border-color: transparent transparent transparent darken($simple-background-color, 24%);
|
border-color: transparent transparent transparent
|
||||||
|
darken($simple-background-color, 24%);
|
||||||
padding: 0;
|
padding: 0;
|
||||||
width: 0;
|
width: 0;
|
||||||
height: 27px;
|
height: 27px;
|
||||||
|
@ -604,7 +645,9 @@
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
color: $lighter-text-color;
|
color: $lighter-text-color;
|
||||||
|
|
||||||
&:not(:first-child) { margin-left: 10px }
|
&:not(:first-child) {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
strong {
|
strong {
|
||||||
display: block;
|
display: block;
|
||||||
|
@ -621,11 +664,15 @@
|
||||||
.privacy-dropdown__option__content {
|
.privacy-dropdown__option__content {
|
||||||
color: $primary-text-color;
|
color: $primary-text-color;
|
||||||
|
|
||||||
strong { color: $primary-text-color }
|
strong {
|
||||||
|
color: $primary-text-color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.active:hover { background: lighten($ui-highlight-color, 4%) }
|
&.active:hover {
|
||||||
|
background: lighten($ui-highlight-color, 4%);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose-form__publish {
|
.compose-form__publish {
|
||||||
|
|
|
@ -11,7 +11,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.scrollable .account-card__bio::after {
|
.scrollable .account-card__bio::after {
|
||||||
background: linear-gradient(to left, lighten($ui-base-color, 8%), transparent);
|
background: linear-gradient(
|
||||||
|
to left,
|
||||||
|
lighten($ui-base-color, 8%),
|
||||||
|
transparent
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
.filter-form {
|
.filter-form {
|
||||||
|
@ -39,8 +43,8 @@
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
input[type=radio],
|
input[type='radio'],
|
||||||
input[type=checkbox] {
|
input[type='checkbox'] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,8 @@ $doodleBg: #d9e1e8;
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="number"],input[type="text"] {
|
input[type='number'],
|
||||||
|
input[type='text'] {
|
||||||
width: 40px;
|
width: 40px;
|
||||||
}
|
}
|
||||||
span.val {
|
span.val {
|
||||||
|
@ -52,7 +53,7 @@ $doodleBg: #d9e1e8;
|
||||||
.doodle-palette {
|
.doodle-palette {
|
||||||
padding-right: 0 !important;
|
padding-right: 0 !important;
|
||||||
border: 1px solid black;
|
border: 1px solid black;
|
||||||
line-height: .2rem;
|
line-height: 0.2rem;
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
background: white;
|
background: white;
|
||||||
|
|
||||||
|
@ -60,14 +61,15 @@ $doodleBg: #d9e1e8;
|
||||||
appearance: none;
|
appearance: none;
|
||||||
width: 1rem;
|
width: 1rem;
|
||||||
height: 1rem;
|
height: 1rem;
|
||||||
margin: 0; padding: 0;
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: black;
|
color: black;
|
||||||
text-shadow: 0 0 1px white;
|
text-shadow: 0 0 1px white;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
box-shadow: inset 0 0 1px rgba(white, .5);
|
box-shadow: inset 0 0 1px rgba(white, 0.5);
|
||||||
border: 1px solid black;
|
border: 1px solid black;
|
||||||
outline-offset:-1px;
|
outline-offset: -1px;
|
||||||
|
|
||||||
&.foreground {
|
&.foreground {
|
||||||
outline: 1px dashed white;
|
outline: 1px dashed white;
|
||||||
|
|
|
@ -34,7 +34,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@include single-column('screen and (max-width: 630px)') {
|
@include single-column('screen and (max-width: 630px)') {
|
||||||
:root & { // Overrides `.wide` for single-column view
|
:root & {
|
||||||
|
// Overrides `.wide` for single-column view
|
||||||
flex: auto;
|
flex: auto;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
@ -43,7 +44,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.react-swipeable-view-container & { height: 100% }
|
.react-swipeable-view-container & {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.drawer--header {
|
.drawer--header {
|
||||||
|
@ -84,8 +87,14 @@
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
flex: none;
|
flex: none;
|
||||||
|
|
||||||
@include limited-single-column('screen and (max-width: #{$no-gap-breakpoint})') { margin-bottom: 0 }
|
@include limited-single-column(
|
||||||
@include single-column('screen and (max-width: 630px)') { font-size: 16px }
|
'screen and (max-width: #{$no-gap-breakpoint})'
|
||||||
|
) {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
@include single-column('screen and (max-width: 630px)') {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-popout {
|
.search-popout {
|
||||||
|
@ -192,7 +201,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.drawer__inner__mastodon {
|
.drawer__inner__mastodon {
|
||||||
background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
|
background: lighten($ui-base-color, 13%)
|
||||||
|
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
|
||||||
|
no-repeat bottom / 100% auto;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-height: 47px;
|
min-height: 47px;
|
||||||
display: none;
|
display: none;
|
||||||
|
@ -240,13 +251,27 @@
|
||||||
@for $i from 0 through 3 {
|
@for $i from 0 through 3 {
|
||||||
.mbstobon-#{$i} .drawer__inner__mastodon {
|
.mbstobon-#{$i} .drawer__inner__mastodon {
|
||||||
@if $i == 3 {
|
@if $i == 3 {
|
||||||
background: url('~flavours/glitch/images/wave-drawer.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%);
|
background: url('~flavours/glitch/images/wave-drawer.png')
|
||||||
|
no-repeat
|
||||||
|
bottom /
|
||||||
|
100%
|
||||||
|
auto,
|
||||||
|
lighten($ui-base-color, 13%);
|
||||||
} @else {
|
} @else {
|
||||||
background: url('~flavours/glitch/images/wave-drawer-glitched.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%);
|
background: url('~flavours/glitch/images/wave-drawer-glitched.png')
|
||||||
|
no-repeat
|
||||||
|
bottom /
|
||||||
|
100%
|
||||||
|
auto,
|
||||||
|
lighten($ui-base-color, 13%);
|
||||||
}
|
}
|
||||||
|
|
||||||
& > .mastodon {
|
& > .mastodon {
|
||||||
background: url("~flavours/glitch/images/mbstobon-ui-#{$i}.png") no-repeat left bottom / contain;
|
background: url('~flavours/glitch/images/mbstobon-ui-#{$i}.png')
|
||||||
|
no-repeat
|
||||||
|
left
|
||||||
|
bottom /
|
||||||
|
contain;
|
||||||
|
|
||||||
@if $i != 3 {
|
@if $i != 3 {
|
||||||
filter: contrast(50%) brightness(50%);
|
filter: contrast(50%) brightness(50%);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
font-size: inherit;
|
font-size: inherit;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
margin: -.2ex .15em .2ex;
|
margin: -0.2ex 0.15em 0.2ex;
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 12px 4px;
|
padding: 12px 4px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
transition: color .1s ease-out;
|
transition: color 0.1s ease-out;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: 0;
|
border: 0;
|
||||||
|
@ -174,7 +174,7 @@
|
||||||
|
|
||||||
&:hover::before {
|
&:hover::before {
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
@ -246,8 +246,8 @@
|
||||||
padding: 5px 6px;
|
padding: 5px 6px;
|
||||||
padding-top: 70px;
|
padding-top: 70px;
|
||||||
|
|
||||||
.emoji-mart-no-results-label {
|
.emoji-mart-no-results-label {
|
||||||
margin-top: .2em;
|
margin-top: 0.2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.emoji-mart-emoji:hover::before {
|
.emoji-mart-emoji:hover::before {
|
||||||
|
|
|
@ -370,7 +370,7 @@ body > [data-popper-placement] {
|
||||||
|
|
||||||
.ellipsis {
|
.ellipsis {
|
||||||
&::after {
|
&::after {
|
||||||
content: "…";
|
content: '…';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,11 +480,11 @@ body > [data-popper-placement] {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
scrollbar-width: none; /* Firefox */
|
scrollbar-width: none; /* Firefox */
|
||||||
-ms-overflow-style: none; /* IE 10+ */
|
-ms-overflow-style: none; /* IE 10+ */
|
||||||
|
|
||||||
* {
|
* {
|
||||||
scrollbar-width: none; /* Firefox */
|
scrollbar-width: none; /* Firefox */
|
||||||
-ms-overflow-style: none; /* IE 10+ */
|
-ms-overflow-style: none; /* IE 10+ */
|
||||||
}
|
}
|
||||||
|
|
||||||
&::-webkit-scrollbar,
|
&::-webkit-scrollbar,
|
||||||
|
@ -950,7 +950,8 @@ body > [data-popper-placement] {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@supports(display: grid) { // hack to fix Chrome <57
|
@supports (display: grid) {
|
||||||
|
// hack to fix Chrome <57
|
||||||
contain: strict;
|
contain: strict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -971,7 +972,8 @@ body > [data-popper-placement] {
|
||||||
}
|
}
|
||||||
|
|
||||||
.scrollable.fullscreen {
|
.scrollable.fullscreen {
|
||||||
@supports(display: grid) { // hack to fix Chrome <57
|
@supports (display: grid) {
|
||||||
|
// hack to fix Chrome <57
|
||||||
contain: none;
|
contain: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1014,7 +1016,8 @@ body > [data-popper-placement] {
|
||||||
transition: background-color 0.2s ease;
|
transition: background-color 0.2s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.react-toggle:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
|
.react-toggle:is(:hover, :focus-within):not(.react-toggle--disabled)
|
||||||
|
.react-toggle-track {
|
||||||
background-color: darken($ui-base-color, 10%);
|
background-color: darken($ui-base-color, 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1022,7 +1025,8 @@ body > [data-popper-placement] {
|
||||||
background-color: darken($ui-highlight-color, 2%);
|
background-color: darken($ui-highlight-color, 2%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
|
.react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled)
|
||||||
|
.react-toggle-track {
|
||||||
background-color: $ui-highlight-color;
|
background-color: $ui-highlight-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1654,8 +1658,8 @@ button.icon-button.active i.fa-retweet {
|
||||||
.icon-badge {
|
.icon-badge {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
display: block;
|
display: block;
|
||||||
right: -.25em;
|
right: -0.25em;
|
||||||
top: -.25em;
|
top: -0.25em;
|
||||||
background-color: $ui-highlight-color;
|
background-color: $ui-highlight-color;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
font-size: 75%;
|
font-size: 75%;
|
||||||
|
@ -1688,7 +1692,7 @@ button.icon-button.active i.fa-retweet {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
width: 0.625rem;
|
width: 0.625rem;
|
||||||
height: 0.625rem;
|
height: 0.625rem;
|
||||||
margin: -.1ex .15em .1ex;
|
margin: -0.1ex 0.15em 0.1ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__content {
|
&__content {
|
||||||
|
@ -1797,9 +1801,15 @@ noscript {
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes flicker {
|
@keyframes flicker {
|
||||||
0% { opacity: 1; }
|
0% {
|
||||||
30% { opacity: 0.75; }
|
opacity: 1;
|
||||||
100% { opacity: 1; }
|
}
|
||||||
|
30% {
|
||||||
|
opacity: 0.75;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@import 'boost';
|
@import 'boost';
|
||||||
|
|
|
@ -11,12 +11,14 @@
|
||||||
max-height: 450px;
|
max-height: 450px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
label, legend {
|
label,
|
||||||
|
legend {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.boolean label, .radio_buttons label {
|
.boolean label,
|
||||||
|
.radio_buttons label {
|
||||||
position: relative;
|
position: relative;
|
||||||
padding-left: 28px;
|
padding-left: 28px;
|
||||||
padding-top: 3px;
|
padding-top: 3px;
|
||||||
|
@ -58,7 +60,7 @@
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
outline: none;
|
outline: none;
|
||||||
transition: background .3s;
|
transition: background 0.3s;
|
||||||
|
|
||||||
.text-icon-button {
|
.text-icon-button {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
@ -74,7 +76,8 @@
|
||||||
color: $primary-text-color;
|
color: $primary-text-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.close, &.close:hover {
|
&.close,
|
||||||
|
&.close:hover {
|
||||||
background: $error-value-color;
|
background: $error-value-color;
|
||||||
color: $primary-text-color;
|
color: $primary-text-color;
|
||||||
}
|
}
|
||||||
|
|
|
@ -348,7 +348,7 @@
|
||||||
padding: 0;
|
padding: 0;
|
||||||
border: 0;
|
border: 0;
|
||||||
font-size: 0;
|
font-size: 0;
|
||||||
transition: opacity .2s ease-in-out;
|
transition: opacity 0.2s ease-in-out;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
@ -372,7 +372,6 @@
|
||||||
.video-player__volume__handle {
|
.video-player__volume__handle {
|
||||||
bottom: 23px;
|
bottom: 23px;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.audio-player {
|
.audio-player {
|
||||||
|
@ -506,10 +505,15 @@
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);
|
background: linear-gradient(
|
||||||
|
0deg,
|
||||||
|
rgba($base-shadow-color, 0.85) 0,
|
||||||
|
rgba($base-shadow-color, 0.45) 60%,
|
||||||
|
transparent
|
||||||
|
);
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity .1s ease;
|
transition: opacity 0.1s ease;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
@ -655,7 +659,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content: "";
|
content: '';
|
||||||
width: 50px;
|
width: 50px;
|
||||||
background: rgba($white, 0.35);
|
background: rgba($white, 0.35);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
@ -725,7 +729,7 @@
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content: "";
|
content: '';
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: rgba($white, 0.35);
|
background: rgba($white, 0.35);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
@ -762,7 +766,7 @@
|
||||||
box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
|
box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
|
||||||
|
|
||||||
.no-reduce-motion & {
|
.no-reduce-motion & {
|
||||||
transition: opacity .1s ease;
|
transition: opacity 0.1s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
|
|
|
@ -269,7 +269,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.onboarding-modal__page__wrapper-0 {
|
.onboarding-modal__page__wrapper-0 {
|
||||||
background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px;
|
background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom /
|
||||||
|
auto 250px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
@ -989,7 +990,8 @@
|
||||||
|
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|
||||||
label, input {
|
label,
|
||||||
|
input {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1020,7 +1022,9 @@
|
||||||
width: auto;
|
width: auto;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: $simple-background-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
border: 1px solid darken($simple-background-color, 14%);
|
border: 1px solid darken($simple-background-color, 14%);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 6px 10px;
|
padding: 6px 10px;
|
||||||
|
@ -1280,7 +1284,7 @@
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: underline
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,14 +85,14 @@
|
||||||
counter-increment: list-counter;
|
counter-increment: list-counter;
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content: counter(list-counter) ".";
|
content: counter(list-counter) '.';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ul > li::before {
|
ul > li::before {
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: $darker-text-color;
|
background-color: $darker-text-color;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
|
|
|
@ -17,8 +17,10 @@
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
opacity: .9;
|
opacity: 0.9;
|
||||||
transition: opacity .1s ease;
|
transition: opacity 0.1s ease;
|
||||||
|
|
||||||
.media-gallery:hover & { opacity: 1 }
|
.media-gallery:hover & {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@
|
||||||
.scrollable {
|
.scrollable {
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
|
|
||||||
@supports(display: grid) {
|
@supports (display: grid) {
|
||||||
contain: content;
|
contain: content;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,9 @@
|
||||||
margin: -3px 0 0;
|
margin: -3px 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
p, pre, blockquote {
|
p,
|
||||||
|
pre,
|
||||||
|
blockquote {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
unicode-bidi: plaintext;
|
unicode-bidi: plaintext;
|
||||||
|
@ -86,12 +88,17 @@
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5 {
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5 {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2 {
|
h1,
|
||||||
|
h2 {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
}
|
}
|
||||||
|
@ -100,7 +107,9 @@
|
||||||
font-size: 1.1em;
|
font-size: 1.1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
h3, h4, h5 {
|
h3,
|
||||||
|
h4,
|
||||||
|
h5 {
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,11 +124,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
b, strong {
|
b,
|
||||||
|
strong {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|
||||||
em, i {
|
em,
|
||||||
|
i {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,7 +144,8 @@
|
||||||
vertical-align: super;
|
vertical-align: super;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul, ol {
|
ul,
|
||||||
|
ol {
|
||||||
margin-left: 2em;
|
margin-left: 2em;
|
||||||
|
|
||||||
p {
|
p {
|
||||||
|
@ -317,8 +329,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes fade {
|
@keyframes fade {
|
||||||
0% { opacity: 0; }
|
0% {
|
||||||
100% { opacity: 1; }
|
opacity: 0;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
@ -381,9 +397,14 @@
|
||||||
right: 0;
|
right: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
background-image: linear-gradient(to bottom, rgba($base-shadow-color, .75), rgba($base-shadow-color, .65) 24px, rgba($base-shadow-color, .8));
|
background-image: linear-gradient(
|
||||||
|
to bottom,
|
||||||
|
rgba($base-shadow-color, 0.75),
|
||||||
|
rgba($base-shadow-color, 0.65) 24px,
|
||||||
|
rgba($base-shadow-color, 0.8)
|
||||||
|
);
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
content: "";
|
content: '';
|
||||||
}
|
}
|
||||||
|
|
||||||
.display-name:hover .display-name__html {
|
.display-name:hover .display-name__html {
|
||||||
|
@ -397,13 +418,16 @@
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
|
|
||||||
&:after {
|
&:after {
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
background: linear-gradient(rgba($ui-base-color, 0), rgba($ui-base-color, 1));
|
background: linear-gradient(
|
||||||
|
rgba($ui-base-color, 0),
|
||||||
|
rgba($ui-base-color, 1)
|
||||||
|
);
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,10 +436,16 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&:focus > .status__content:after {
|
&:focus > .status__content:after {
|
||||||
background: linear-gradient(rgba(lighten($ui-base-color, 4%), 0), rgba(lighten($ui-base-color, 4%), 1));
|
background: linear-gradient(
|
||||||
|
rgba(lighten($ui-base-color, 4%), 0),
|
||||||
|
rgba(lighten($ui-base-color, 4%), 1)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
&.status-direct > .status__content:after {
|
&.status-direct > .status__content:after {
|
||||||
background: linear-gradient(rgba(lighten($ui-base-color, 8%), 0), rgba(lighten($ui-base-color, 8%), 1));
|
background: linear-gradient(
|
||||||
|
rgba(lighten($ui-base-color, 8%), 0),
|
||||||
|
rgba(lighten($ui-base-color, 8%), 1)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification__message {
|
.notification__message {
|
||||||
|
@ -832,7 +862,8 @@ a.status__display-name,
|
||||||
bottom: -1px;
|
bottom: -1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
a .fa, a:hover .fa {
|
a .fa,
|
||||||
|
a:hover .fa {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -850,9 +881,9 @@ a.status-card {
|
||||||
cursor: zoom-in;
|
cursor: zoom-in;
|
||||||
display: block;
|
display: block;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-card-video {
|
.status-card-video {
|
||||||
|
@ -1063,7 +1094,7 @@ a.status-card.compact:hover {
|
||||||
|
|
||||||
&.unread {
|
&.unread {
|
||||||
&::before {
|
&::before {
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
|
|
@ -18,5 +18,5 @@ $highlight-text-color: lighten($ui-highlight-color, 10%) !default;
|
||||||
$action-button-color: lighten($ui-base-color, 50%);
|
$action-button-color: lighten($ui-base-color, 50%);
|
||||||
|
|
||||||
$inverted-text-color: $black !default;
|
$inverted-text-color: $black !default;
|
||||||
$lighter-text-color: darken($ui-base-color,6%) !default;
|
$lighter-text-color: darken($ui-base-color, 6%) !default;
|
||||||
$light-text-color: darken($ui-primary-color, 40%) !default;
|
$light-text-color: darken($ui-primary-color, 40%) !default;
|
||||||
|
|
|
@ -300,7 +300,7 @@ code {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: url("images/void.png");
|
background: url('images/void.png');
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
@ -385,7 +385,7 @@ code {
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=checkbox] {
|
input[type='checkbox'] {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 5px;
|
top: 5px;
|
||||||
|
@ -401,12 +401,12 @@ code {
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text],
|
input[type='text'],
|
||||||
input[type=number],
|
input[type='number'],
|
||||||
input[type=email],
|
input[type='email'],
|
||||||
input[type=password],
|
input[type='password'],
|
||||||
input[type=url],
|
input[type='url'],
|
||||||
input[type=datetime-local],
|
input[type='datetime-local'],
|
||||||
textarea {
|
textarea {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
@ -444,11 +444,11 @@ code {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text],
|
input[type='text'],
|
||||||
input[type=number],
|
input[type='number'],
|
||||||
input[type=email],
|
input[type='email'],
|
||||||
input[type=password],
|
input[type='password'],
|
||||||
input[type=datetime-local] {
|
input[type='datetime-local'] {
|
||||||
&:focus:invalid:not(:placeholder-shown),
|
&:focus:invalid:not(:placeholder-shown),
|
||||||
&:required:invalid:not(:placeholder-shown) {
|
&:required:invalid:not(:placeholder-shown) {
|
||||||
border-color: lighten($error-red, 12%);
|
border-color: lighten($error-red, 12%);
|
||||||
|
@ -460,11 +460,11 @@ code {
|
||||||
color: lighten($error-red, 12%);
|
color: lighten($error-red, 12%);
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text],
|
input[type='text'],
|
||||||
input[type=number],
|
input[type='number'],
|
||||||
input[type=email],
|
input[type='email'],
|
||||||
input[type=password],
|
input[type='password'],
|
||||||
input[type=datetime-local],
|
input[type='datetime-local'],
|
||||||
textarea,
|
textarea,
|
||||||
select {
|
select {
|
||||||
border-color: lighten($error-red, 12%);
|
border-color: lighten($error-red, 12%);
|
||||||
|
@ -568,7 +568,9 @@ code {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
resize: vertical;
|
resize: vertical;
|
||||||
background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: darken($ui-base-color, 10%)
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
border: 1px solid darken($ui-base-color, 14%);
|
border: 1px solid darken($ui-base-color, 14%);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
|
@ -608,7 +610,11 @@ code {
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 1px;
|
bottom: 1px;
|
||||||
width: 5px;
|
width: 5px;
|
||||||
background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
|
background-image: linear-gradient(
|
||||||
|
to right,
|
||||||
|
rgba(darken($ui-base-color, 10%), 0),
|
||||||
|
darken($ui-base-color, 10%)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -996,7 +1002,7 @@ code {
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text] {
|
input[type='text'] {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: 0;
|
border: 0;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
|
|
|
@ -152,7 +152,7 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose-form__autosuggest-wrapper,
|
.compose-form__autosuggest-wrapper,
|
||||||
.poll__option input[type="text"],
|
.poll__option input[type='text'],
|
||||||
.compose-form .spoiler-input__input,
|
.compose-form .spoiler-input__input,
|
||||||
.compose-form__poll-wrapper select,
|
.compose-form__poll-wrapper select,
|
||||||
.search__input,
|
.search__input,
|
||||||
|
@ -179,7 +179,9 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose-form__poll-wrapper select {
|
.compose-form__poll-wrapper select {
|
||||||
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: $simple-background-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose-form__poll-wrapper,
|
.compose-form__poll-wrapper,
|
||||||
|
@ -205,7 +207,9 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.drawer__inner__mastodon {
|
.drawer__inner__mastodon {
|
||||||
background: $white url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
|
background: $white
|
||||||
|
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
|
||||||
|
no-repeat bottom / 100% auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change the colors used in compose-form
|
// Change the colors used in compose-form
|
||||||
|
@ -332,11 +336,13 @@ html {
|
||||||
color: $white;
|
color: $white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.language-dropdown__dropdown__results__item .language-dropdown__dropdown__results__item__common-name {
|
.language-dropdown__dropdown__results__item
|
||||||
|
.language-dropdown__dropdown__results__item__common-name {
|
||||||
color: lighten($ui-base-color, 8%);
|
color: lighten($ui-base-color, 8%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.language-dropdown__dropdown__results__item.active .language-dropdown__dropdown__results__item__common-name {
|
.language-dropdown__dropdown__results__item.active
|
||||||
|
.language-dropdown__dropdown__results__item__common-name {
|
||||||
color: darken($ui-base-color, 12%);
|
color: darken($ui-base-color, 12%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,7 +496,8 @@ html {
|
||||||
background: darken($ui-secondary-color, 10%);
|
background: darken($ui-secondary-color, 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {
|
.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled)
|
||||||
|
.react-toggle-track {
|
||||||
background: lighten($ui-highlight-color, 10%);
|
background: lighten($ui-highlight-color, 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,10 +529,10 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.simple_form {
|
.simple_form {
|
||||||
input[type="text"],
|
input[type='text'],
|
||||||
input[type="number"],
|
input[type='number'],
|
||||||
input[type="email"],
|
input[type='email'],
|
||||||
input[type="password"],
|
input[type='password'],
|
||||||
textarea {
|
textarea {
|
||||||
&:hover {
|
&:hover {
|
||||||
border-color: lighten($ui-base-color, 12%);
|
border-color: lighten($ui-base-color, 12%);
|
||||||
|
@ -682,7 +689,9 @@ html {
|
||||||
|
|
||||||
.mute-modal select {
|
.mute-modal select {
|
||||||
border: 1px solid lighten($ui-base-color, 8%);
|
border: 1px solid lighten($ui-base-color, 8%);
|
||||||
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: $simple-background-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Glitch-soc-specific changes
|
// Glitch-soc-specific changes
|
||||||
|
@ -729,7 +738,8 @@ html {
|
||||||
color: $white;
|
color: $white;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.close, &.close:hover {
|
&.close,
|
||||||
|
&.close:hover {
|
||||||
background: $error-value-color;
|
background: $error-value-color;
|
||||||
color: $primary-text-color;
|
color: $primary-text-color;
|
||||||
}
|
}
|
||||||
|
@ -746,11 +756,16 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.status.collapsed .status__content:after {
|
.status.collapsed .status__content:after {
|
||||||
background: linear-gradient(rgba(darken($ui-base-color, 13%), 0), rgba(darken($ui-base-color, 13%), 1));
|
background: linear-gradient(
|
||||||
|
rgba(darken($ui-base-color, 13%), 0),
|
||||||
|
rgba(darken($ui-base-color, 13%), 1)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
.drawer__inner__mastodon {
|
.drawer__inner__mastodon {
|
||||||
background: $white url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto !important;
|
background: $white
|
||||||
|
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
|
||||||
|
no-repeat bottom / 100% auto !important;
|
||||||
|
|
||||||
.mastodon {
|
.mastodon {
|
||||||
filter: contrast(75%) brightness(75%) !important;
|
filter: contrast(75%) brightness(75%) !important;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
.modal-layout {
|
.modal-layout {
|
||||||
background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>') repeat-x bottom fixed;
|
background: $ui-base-color
|
||||||
|
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>')
|
||||||
|
repeat-x bottom fixed;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
|
|
|
@ -70,8 +70,8 @@
|
||||||
max-width: calc(100% - 45px - 25px);
|
max-width: calc(100% - 45px - 25px);
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=radio],
|
input[type='radio'],
|
||||||
input[type=checkbox] {
|
input[type='checkbox'] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text] {
|
input[type='text'] {
|
||||||
display: block;
|
display: block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -205,7 +205,7 @@
|
||||||
|
|
||||||
&:active,
|
&:active,
|
||||||
&:focus {
|
&:focus {
|
||||||
background-color: rgba($dark-text-color, .1);
|
background-color: rgba($dark-text-color, 0.1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,7 +273,9 @@
|
||||||
width: auto;
|
width: auto;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: $simple-background-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
border: 1px solid darken($simple-background-color, 14%);
|
border: 1px solid darken($simple-background-color, 14%);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 6px 10px;
|
padding: 6px 10px;
|
||||||
|
|
|
@ -255,8 +255,8 @@ body.rtl {
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.simple_form .check_boxes .checkbox input[type="checkbox"],
|
.simple_form .check_boxes .checkbox input[type='checkbox'],
|
||||||
.simple_form .input.boolean input[type="checkbox"] {
|
.simple_form .input.boolean input[type='checkbox'] {
|
||||||
left: auto;
|
left: auto;
|
||||||
right: 0;
|
right: 0;
|
||||||
}
|
}
|
||||||
|
@ -294,12 +294,18 @@ body.rtl {
|
||||||
&::after {
|
&::after {
|
||||||
right: auto;
|
right: auto;
|
||||||
left: 0;
|
left: 0;
|
||||||
background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
|
background-image: linear-gradient(
|
||||||
|
to left,
|
||||||
|
rgba(darken($ui-base-color, 10%), 0),
|
||||||
|
darken($ui-base-color, 10%)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.simple_form select {
|
.simple_form select {
|
||||||
background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat left 8px center / auto 16px;
|
background: darken($ui-base-color, 10%)
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>")
|
||||||
|
no-repeat left 8px center / auto 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table th,
|
.table th,
|
||||||
|
@ -346,11 +352,11 @@ body.rtl {
|
||||||
}
|
}
|
||||||
|
|
||||||
.fa-chevron-left::before {
|
.fa-chevron-left::before {
|
||||||
content: "\F054";
|
content: '\F054';
|
||||||
}
|
}
|
||||||
|
|
||||||
.fa-chevron-right::before {
|
.fa-chevron-right::before {
|
||||||
content: "\F053";
|
content: '\F053';
|
||||||
}
|
}
|
||||||
|
|
||||||
.column-back-button__icon {
|
.column-back-button__icon {
|
||||||
|
|
|
@ -134,7 +134,7 @@ a.button.logo-button {
|
||||||
}
|
}
|
||||||
|
|
||||||
.embed {
|
.embed {
|
||||||
.status__content[data-spoiler=folded] {
|
.status__content[data-spoiler='folded'] {
|
||||||
.e-content {
|
.e-content {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
// Commonly used web colors
|
// Commonly used web colors
|
||||||
$black: #000000; // Black
|
$black: #000000; // Black
|
||||||
$white: #ffffff; // White
|
$white: #ffffff; // White
|
||||||
$success-green: #79bd9a; // Padua
|
$success-green: #79bd9a; // Padua
|
||||||
$error-red: #df405a; // Cerise
|
$error-red: #df405a; // Cerise
|
||||||
$warning-red: #ff5050; // Sunset Orange
|
$warning-red: #ff5050; // Sunset Orange
|
||||||
$gold-star: #ca8f04; // Dark Goldenrod
|
$gold-star: #ca8f04; // Dark Goldenrod
|
||||||
|
|
||||||
$red-bookmark: $warning-red;
|
$red-bookmark: $warning-red;
|
||||||
|
|
||||||
// Values from the classic Mastodon UI
|
// Values from the classic Mastodon UI
|
||||||
$classic-base-color: #282c37; // Midnight Express
|
$classic-base-color: #282c37; // Midnight Express
|
||||||
$classic-primary-color: #9baec8; // Echo Blue
|
$classic-primary-color: #9baec8; // Echo Blue
|
||||||
$classic-secondary-color: #d9e1e8; // Pattens Blue
|
$classic-secondary-color: #d9e1e8; // Pattens Blue
|
||||||
$classic-highlight-color: #6364ff; // Brand purple
|
$classic-highlight-color: #6364ff; // Brand purple
|
||||||
|
|
||||||
// Variables for defaults in UI
|
// Variables for defaults in UI
|
||||||
$base-shadow-color: $black !default;
|
$base-shadow-color: $black !default;
|
||||||
|
@ -23,10 +23,13 @@ $valid-value-color: $success-green !default;
|
||||||
$error-value-color: $error-red !default;
|
$error-value-color: $error-red !default;
|
||||||
|
|
||||||
// Tell UI to use selected colors
|
// Tell UI to use selected colors
|
||||||
$ui-base-color: $classic-base-color !default; // Darkest
|
$ui-base-color: $classic-base-color !default; // Darkest
|
||||||
$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest
|
$ui-base-lighter-color: lighten(
|
||||||
$ui-primary-color: $classic-primary-color !default; // Lighter
|
$ui-base-color,
|
||||||
$ui-secondary-color: $classic-secondary-color !default; // Lightest
|
26%
|
||||||
|
) !default; // Lighter darkest
|
||||||
|
$ui-primary-color: $classic-primary-color !default; // Lighter
|
||||||
|
$ui-secondary-color: $classic-secondary-color !default; // Lightest
|
||||||
$ui-highlight-color: $classic-highlight-color !default;
|
$ui-highlight-color: $classic-highlight-color !default;
|
||||||
|
|
||||||
// Variables for texts
|
// Variables for texts
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@use "sass:math";
|
@use 'sass:math';
|
||||||
|
|
||||||
.hero-widget {
|
.hero-widget {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
export function recoverHashtags (recognizedTags, text) {
|
export function recoverHashtags (recognizedTags, text) {
|
||||||
return recognizedTags.map(tag => {
|
return recognizedTags.map(tag => {
|
||||||
const re = new RegExp(`(?:^|[^\/)\w])#(${tag.name})`, 'i');
|
const re = new RegExp(`(?:^|[^/)\w])#(${tag.name})`, 'i');
|
||||||
const matched_hashtag = text.match(re);
|
const matched_hashtag = text.match(re);
|
||||||
return matched_hashtag ? matched_hashtag[1] : null;
|
return matched_hashtag ? matched_hashtag[1] : null;
|
||||||
},
|
},
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { me } from '../../initial_state';
|
||||||
const urlBase64ToUint8Array = (base64String) => {
|
const urlBase64ToUint8Array = (base64String) => {
|
||||||
const padding = '='.repeat((4 - base64String.length % 4) % 4);
|
const padding = '='.repeat((4 - base64String.length % 4) % 4);
|
||||||
const base64 = (base64String + padding)
|
const base64 = (base64String + padding)
|
||||||
.replace(/\-/g, '+')
|
.replace(/-/g, '+')
|
||||||
.replace(/_/g, '/');
|
.replace(/_/g, '/');
|
||||||
|
|
||||||
return decodeBase64(base64);
|
return decodeBase64(base64);
|
||||||
|
|
|
@ -511,7 +511,7 @@ class Status extends ImmutablePureComponent {
|
||||||
|
|
||||||
<div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted })} data-id={status.get('id')}>
|
<div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted })} data-id={status.get('id')}>
|
||||||
<div className='status__info'>
|
<div className='status__info'>
|
||||||
<a onClick={this.handleClick} href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
|
<a onClick={this.handleClick} href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
|
||||||
<span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
|
<span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
|
||||||
<RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { hour12: false, year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>}
|
<RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { hour12: false, year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>}
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -130,7 +130,7 @@ export default class MediaItem extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='account-gallery__item' style={{ width, height }}>
|
<div className='account-gallery__item' style={{ width, height }}>
|
||||||
<a className='media-gallery__item-thumbnail' href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>
|
<a className='media-gallery__item-thumbnail' href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>
|
||||||
<Blurhash
|
<Blurhash
|
||||||
hash={attachment.get('blurhash')}
|
hash={attachment.get('blurhash')}
|
||||||
className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })}
|
className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })}
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
|
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
|
||||||
import { formatTime } from 'mastodon/features/video';
|
import { formatTime, getPointerPosition, fileNameFromURL } from 'mastodon/features/video';
|
||||||
import Icon from 'mastodon/components/icon';
|
import Icon from 'mastodon/components/icon';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { throttle } from 'lodash';
|
import { throttle, debounce } from 'lodash';
|
||||||
import { getPointerPosition, fileNameFromURL } from 'mastodon/features/video';
|
|
||||||
import { debounce } from 'lodash';
|
|
||||||
import Visualizer from './visualizer';
|
import Visualizer from './visualizer';
|
||||||
import { displayMedia, useBlurhash } from '../../initial_state';
|
import { displayMedia, useBlurhash } from '../../initial_state';
|
||||||
import Blurhash from '../../components/blurhash';
|
import Blurhash from '../../components/blurhash';
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import PollForm from '../components/poll_form';
|
import PollForm from '../components/poll_form';
|
||||||
import { addPollOption, removePollOption, changePollOption, changePollSettings } from '../../../actions/compose';
|
|
||||||
import {
|
import {
|
||||||
|
addPollOption,
|
||||||
|
removePollOption,
|
||||||
|
changePollOption,
|
||||||
|
changePollSettings,
|
||||||
clearComposeSuggestions,
|
clearComposeSuggestions,
|
||||||
fetchComposeSuggestions,
|
fetchComposeSuggestions,
|
||||||
selectComposeSuggestion,
|
selectComposeSuggestion,
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import Upload from '../components/upload';
|
import Upload from '../components/upload';
|
||||||
import { undoUploadCompose, initMediaEditModal } from '../../../actions/compose';
|
import { undoUploadCompose, initMediaEditModal, submitCompose } from '../../../actions/compose';
|
||||||
import { submitCompose } from '../../../actions/compose';
|
|
||||||
|
|
||||||
const mapStateToProps = (state, { id }) => ({
|
const mapStateToProps = (state, { id }) => ({
|
||||||
media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
|
media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
|
||||||
|
|
|
@ -24,7 +24,7 @@ const buildHashtagRE = () => {
|
||||||
'))', 'iu',
|
'))', 'iu',
|
||||||
);
|
);
|
||||||
} catch {
|
} catch {
|
||||||
return /(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i;
|
return /(?:^|[^/)\w])#(\w*[a-zA-Z·]\w*)/i;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5,5 +5,5 @@ const urlPlaceholder = '$2xxxxxxxxxxxxxxxxxxxxxxx';
|
||||||
export function countableText(inputText) {
|
export function countableText(inputText) {
|
||||||
return inputText
|
return inputText
|
||||||
.replace(urlRegex, urlPlaceholder)
|
.replace(urlRegex, urlPlaceholder)
|
||||||
.replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3');
|
.replace(/(^|[^/\w])@(([a-z0-9_]+)@[a-z0-9.-]+[a-z0-9]+)/ig, '$1@$3');
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ const stringFromCodePoint = _String.fromCodePoint || function () {
|
||||||
|
|
||||||
const _JSON = JSON;
|
const _JSON = JSON;
|
||||||
|
|
||||||
const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/;
|
const COLONS_REGEX = /^(?::([^:]+):)(?::skin-tone-(\d):)?$/;
|
||||||
const SKINS = [
|
const SKINS = [
|
||||||
'1F3FA', '1F3FB', '1F3FC',
|
'1F3FA', '1F3FB', '1F3FC',
|
||||||
'1F3FD', '1F3FE', '1F3FF',
|
'1F3FD', '1F3FE', '1F3FF',
|
||||||
|
|
|
@ -27,7 +27,7 @@ const makeMapStateToProps = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const getFirstSentence = str => {
|
const getFirstSentence = str => {
|
||||||
const arr = str.split(/(([\.\?!]+\s)|[.。?!\n•])/);
|
const arr = str.split(/(([.?!]+\s)|[.。?!\n•])/);
|
||||||
|
|
||||||
return arr[0];
|
return arr[0];
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,9 +6,8 @@ import PropTypes from 'prop-types';
|
||||||
import IconButton from 'mastodon/components/icon_button';
|
import IconButton from 'mastodon/components/icon_button';
|
||||||
import Icon from 'mastodon/components/icon';
|
import Icon from 'mastodon/components/icon';
|
||||||
import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
|
import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
|
||||||
import { autoPlayGif, reduceMotion, disableSwiping } from 'mastodon/initial_state';
|
import { autoPlayGif, reduceMotion, disableSwiping, mascot } from 'mastodon/initial_state';
|
||||||
import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
|
import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
|
||||||
import { mascot } from 'mastodon/initial_state';
|
|
||||||
import unicodeMapping from 'mastodon/features/emoji/emoji_unicode_mapping_light';
|
import unicodeMapping from 'mastodon/features/emoji/emoji_unicode_mapping_light';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import EmojiPickerDropdown from 'mastodon/features/compose/containers/emoji_picker_dropdown_container';
|
import EmojiPickerDropdown from 'mastodon/features/compose/containers/emoji_picker_dropdown_container';
|
||||||
|
|
|
@ -2,8 +2,7 @@ import { connect } from 'react-redux';
|
||||||
import { defineMessages, injectIntl } from 'react-intl';
|
import { defineMessages, injectIntl } from 'react-intl';
|
||||||
import ColumnSettings from '../components/column_settings';
|
import ColumnSettings from '../components/column_settings';
|
||||||
import { changeSetting } from '../../../actions/settings';
|
import { changeSetting } from '../../../actions/settings';
|
||||||
import { setFilter } from '../../../actions/notifications';
|
import { setFilter, clearNotifications, requestBrowserPermission } from '../../../actions/notifications';
|
||||||
import { clearNotifications, requestBrowserPermission } from '../../../actions/notifications';
|
|
||||||
import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';
|
import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';
|
||||||
import { openModal } from '../../../actions/modal';
|
import { openModal } from '../../../actions/modal';
|
||||||
import { showAlert } from '../../../actions/alerts';
|
import { showAlert } from '../../../actions/alerts';
|
||||||
|
|
|
@ -184,7 +184,7 @@ class Footer extends ImmutablePureComponent {
|
||||||
<IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} counter={status.get('replies_count')} obfuscateCount />
|
<IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} counter={status.get('replies_count')} obfuscateCount />
|
||||||
<IconButton className={classNames('status__action-bar-button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} counter={status.get('reblogs_count')} />
|
<IconButton className={classNames('status__action-bar-button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} counter={status.get('reblogs_count')} />
|
||||||
<IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} counter={status.get('favourites_count')} />
|
<IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} counter={status.get('favourites_count')} />
|
||||||
{withOpenButton && <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.open)} icon='external-link' onClick={this.handleOpenClick} href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} />}
|
{withOpenButton && <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.open)} icon='external-link' onClick={this.handleOpenClick} href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} />}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -276,7 +276,7 @@ class DetailedStatus extends ImmutablePureComponent {
|
||||||
{media}
|
{media}
|
||||||
|
|
||||||
<div className='detailed-status__meta'>
|
<div className='detailed-status__meta'>
|
||||||
<a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} target='_blank' rel='noopener noreferrer'>
|
<a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} target='_blank' rel='noopener noreferrer'>
|
||||||
<FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />
|
<FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />
|
||||||
</a>{edited}{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink}
|
</a>{edited}{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -5,7 +5,17 @@ import PropTypes from 'prop-types';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
import { fetchStatus } from '../../actions/statuses';
|
import {
|
||||||
|
fetchStatus,
|
||||||
|
muteStatus,
|
||||||
|
unmuteStatus,
|
||||||
|
deleteStatus,
|
||||||
|
editStatus,
|
||||||
|
hideStatus,
|
||||||
|
revealStatus,
|
||||||
|
translateStatus,
|
||||||
|
undoStatusTranslation,
|
||||||
|
} from '../../actions/statuses';
|
||||||
import MissingIndicator from '../../components/missing_indicator';
|
import MissingIndicator from '../../components/missing_indicator';
|
||||||
import LoadingIndicator from 'mastodon/components/loading_indicator';
|
import LoadingIndicator from 'mastodon/components/loading_indicator';
|
||||||
import DetailedStatus from './components/detailed_status';
|
import DetailedStatus from './components/detailed_status';
|
||||||
|
@ -26,16 +36,6 @@ import {
|
||||||
mentionCompose,
|
mentionCompose,
|
||||||
directCompose,
|
directCompose,
|
||||||
} from '../../actions/compose';
|
} from '../../actions/compose';
|
||||||
import {
|
|
||||||
muteStatus,
|
|
||||||
unmuteStatus,
|
|
||||||
deleteStatus,
|
|
||||||
editStatus,
|
|
||||||
hideStatus,
|
|
||||||
revealStatus,
|
|
||||||
translateStatus,
|
|
||||||
undoStatusTranslation,
|
|
||||||
} from '../../actions/statuses';
|
|
||||||
import {
|
import {
|
||||||
unblockAccount,
|
unblockAccount,
|
||||||
unmuteAccount,
|
unmuteAccount,
|
||||||
|
|
|
@ -98,7 +98,7 @@ class BoostModal extends ImmutablePureComponent {
|
||||||
<div className='boost-modal__container'>
|
<div className='boost-modal__container'>
|
||||||
<div className={classNames('status', `status-${status.get('visibility')}`, 'light')}>
|
<div className={classNames('status', `status-${status.get('visibility')}`, 'light')}>
|
||||||
<div className='status__info'>
|
<div className='status__info'>
|
||||||
<a href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
|
<a href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
|
||||||
<span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
|
<span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
|
||||||
<RelativeTimestamp timestamp={status.get('created_at')} />
|
<RelativeTimestamp timestamp={status.get('created_at')} />
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -186,11 +186,12 @@ const ignoreSuggestion = (state, position, token, completion, path) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const sortHashtagsByUse = (state, tags) => {
|
const sortHashtagsByUse = (state, tags) => {
|
||||||
const personalHistory = state.get('tagHistory');
|
const personalHistory = state.get('tagHistory').map(tag => tag.toLowerCase());
|
||||||
|
|
||||||
return tags.sort((a, b) => {
|
const tagsWithLowercase = tags.map(t => ({ ...t, lowerName: t.name.toLowerCase() }));
|
||||||
const usedA = personalHistory.includes(a.name);
|
const sorted = tagsWithLowercase.sort((a, b) => {
|
||||||
const usedB = personalHistory.includes(b.name);
|
const usedA = personalHistory.includes(a.lowerName);
|
||||||
|
const usedB = personalHistory.includes(b.lowerName);
|
||||||
|
|
||||||
if (usedA === usedB) {
|
if (usedA === usedB) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -200,6 +201,8 @@ const sortHashtagsByUse = (state, tags) => {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
sorted.forEach(tag => delete tag.lowerName);
|
||||||
|
return sorted;
|
||||||
};
|
};
|
||||||
|
|
||||||
const insertEmoji = (state, position, emojiData, needsSpace) => {
|
const insertEmoji = (state, position, emojiData, needsSpace) => {
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: mastodon-font-monospace;
|
font-family: mastodon-font-monospace;
|
||||||
src:
|
src: local('Roboto Mono'),
|
||||||
local('Roboto Mono'),
|
|
||||||
url('~fonts/roboto-mono/robotomono-regular-webfont.woff2') format('woff2'),
|
url('~fonts/roboto-mono/robotomono-regular-webfont.woff2') format('woff2'),
|
||||||
url('~fonts/roboto-mono/robotomono-regular-webfont.woff') format('woff'),
|
url('~fonts/roboto-mono/robotomono-regular-webfont.woff') format('woff'),
|
||||||
url('~fonts/roboto-mono/robotomono-regular-webfont.ttf') format('truetype'),
|
url('~fonts/roboto-mono/robotomono-regular-webfont.ttf')
|
||||||
url('~fonts/roboto-mono/robotomono-regular-webfont.svg#roboto_monoregular') format('svg');
|
format('truetype'),
|
||||||
|
url('~fonts/roboto-mono/robotomono-regular-webfont.svg#roboto_monoregular')
|
||||||
|
format('svg');
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: mastodon-font-sans-serif;
|
font-family: mastodon-font-sans-serif;
|
||||||
src:
|
src: local('Roboto Italic'),
|
||||||
local('Roboto Italic'),
|
|
||||||
url('~fonts/roboto/roboto-italic-webfont.woff2') format('woff2'),
|
url('~fonts/roboto/roboto-italic-webfont.woff2') format('woff2'),
|
||||||
url('~fonts/roboto/roboto-italic-webfont.woff') format('woff'),
|
url('~fonts/roboto/roboto-italic-webfont.woff') format('woff'),
|
||||||
url('~fonts/roboto/roboto-italic-webfont.ttf') format('truetype'),
|
url('~fonts/roboto/roboto-italic-webfont.ttf') format('truetype'),
|
||||||
url('~fonts/roboto/roboto-italic-webfont.svg#roboto-italic-webfont') format('svg');
|
url('~fonts/roboto/roboto-italic-webfont.svg#roboto-italic-webfont')
|
||||||
|
format('svg');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
|
@ -13,12 +13,12 @@
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: mastodon-font-sans-serif;
|
font-family: mastodon-font-sans-serif;
|
||||||
src:
|
src: local('Roboto Bold'),
|
||||||
local('Roboto Bold'),
|
|
||||||
url('~fonts/roboto/roboto-bold-webfont.woff2') format('woff2'),
|
url('~fonts/roboto/roboto-bold-webfont.woff2') format('woff2'),
|
||||||
url('~fonts/roboto/roboto-bold-webfont.woff') format('woff'),
|
url('~fonts/roboto/roboto-bold-webfont.woff') format('woff'),
|
||||||
url('~fonts/roboto/roboto-bold-webfont.ttf') format('truetype'),
|
url('~fonts/roboto/roboto-bold-webfont.ttf') format('truetype'),
|
||||||
url('~fonts/roboto/roboto-bold-webfont.svg#roboto-bold-webfont') format('svg');
|
url('~fonts/roboto/roboto-bold-webfont.svg#roboto-bold-webfont')
|
||||||
|
format('svg');
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
|
@ -26,12 +26,12 @@
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: mastodon-font-sans-serif;
|
font-family: mastodon-font-sans-serif;
|
||||||
src:
|
src: local('Roboto Medium'),
|
||||||
local('Roboto Medium'),
|
|
||||||
url('~fonts/roboto/roboto-medium-webfont.woff2') format('woff2'),
|
url('~fonts/roboto/roboto-medium-webfont.woff2') format('woff2'),
|
||||||
url('~fonts/roboto/roboto-medium-webfont.woff') format('woff'),
|
url('~fonts/roboto/roboto-medium-webfont.woff') format('woff'),
|
||||||
url('~fonts/roboto/roboto-medium-webfont.ttf') format('truetype'),
|
url('~fonts/roboto/roboto-medium-webfont.ttf') format('truetype'),
|
||||||
url('~fonts/roboto/roboto-medium-webfont.svg#roboto-medium-webfont') format('svg');
|
url('~fonts/roboto/roboto-medium-webfont.svg#roboto-medium-webfont')
|
||||||
|
format('svg');
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
|
@ -39,12 +39,12 @@
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: mastodon-font-sans-serif;
|
font-family: mastodon-font-sans-serif;
|
||||||
src:
|
src: local('Roboto'),
|
||||||
local('Roboto'),
|
|
||||||
url('~fonts/roboto/roboto-regular-webfont.woff2') format('woff2'),
|
url('~fonts/roboto/roboto-regular-webfont.woff2') format('woff2'),
|
||||||
url('~fonts/roboto/roboto-regular-webfont.woff') format('woff'),
|
url('~fonts/roboto/roboto-regular-webfont.woff') format('woff'),
|
||||||
url('~fonts/roboto/roboto-regular-webfont.ttf') format('truetype'),
|
url('~fonts/roboto/roboto-regular-webfont.ttf') format('truetype'),
|
||||||
url('~fonts/roboto/roboto-regular-webfont.svg#roboto-regular-webfont') format('svg');
|
url('~fonts/roboto/roboto-regular-webfont.svg#roboto-regular-webfont')
|
||||||
|
format('svg');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
|
|
|
@ -152,7 +152,7 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose-form__autosuggest-wrapper,
|
.compose-form__autosuggest-wrapper,
|
||||||
.poll__option input[type="text"],
|
.poll__option input[type='text'],
|
||||||
.compose-form .spoiler-input__input,
|
.compose-form .spoiler-input__input,
|
||||||
.compose-form__poll-wrapper select,
|
.compose-form__poll-wrapper select,
|
||||||
.search__input,
|
.search__input,
|
||||||
|
@ -179,7 +179,9 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose-form__poll-wrapper select {
|
.compose-form__poll-wrapper select {
|
||||||
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: $simple-background-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose-form__poll-wrapper,
|
.compose-form__poll-wrapper,
|
||||||
|
@ -205,7 +207,9 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.drawer__inner__mastodon {
|
.drawer__inner__mastodon {
|
||||||
background: $white url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
|
background: $white
|
||||||
|
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
|
||||||
|
no-repeat bottom / 100% auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change the colors used in compose-form
|
// Change the colors used in compose-form
|
||||||
|
@ -332,11 +336,13 @@ html {
|
||||||
color: $white;
|
color: $white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.language-dropdown__dropdown__results__item .language-dropdown__dropdown__results__item__common-name {
|
.language-dropdown__dropdown__results__item
|
||||||
|
.language-dropdown__dropdown__results__item__common-name {
|
||||||
color: lighten($ui-base-color, 8%);
|
color: lighten($ui-base-color, 8%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.language-dropdown__dropdown__results__item.active .language-dropdown__dropdown__results__item__common-name {
|
.language-dropdown__dropdown__results__item.active
|
||||||
|
.language-dropdown__dropdown__results__item__common-name {
|
||||||
color: darken($ui-base-color, 12%);
|
color: darken($ui-base-color, 12%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,7 +496,8 @@ html {
|
||||||
background: darken($ui-secondary-color, 10%);
|
background: darken($ui-secondary-color, 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {
|
.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled)
|
||||||
|
.react-toggle-track {
|
||||||
background: lighten($ui-highlight-color, 10%);
|
background: lighten($ui-highlight-color, 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,10 +529,10 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.simple_form {
|
.simple_form {
|
||||||
input[type="text"],
|
input[type='text'],
|
||||||
input[type="number"],
|
input[type='number'],
|
||||||
input[type="email"],
|
input[type='email'],
|
||||||
input[type="password"],
|
input[type='password'],
|
||||||
textarea {
|
textarea {
|
||||||
&:hover {
|
&:hover {
|
||||||
border-color: lighten($ui-base-color, 12%);
|
border-color: lighten($ui-base-color, 12%);
|
||||||
|
@ -682,5 +689,7 @@ html {
|
||||||
|
|
||||||
.mute-modal select {
|
.mute-modal select {
|
||||||
border: 1px solid lighten($ui-base-color, 8%);
|
border: 1px solid lighten($ui-base-color, 8%);
|
||||||
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: $simple-background-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange' 'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on' 'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
|
$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange'
|
||||||
|
'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign'
|
||||||
|
'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on'
|
||||||
|
'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
|
||||||
|
|
||||||
%emoji-color-inversion {
|
%emoji-color-inversion {
|
||||||
filter: invert(1);
|
filter: invert(1);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@use "sass:math";
|
@use 'sass:math';
|
||||||
|
|
||||||
$no-columns-breakpoint: 600px;
|
$no-columns-breakpoint: 600px;
|
||||||
$sidebar-width: 240px;
|
$sidebar-width: 240px;
|
||||||
|
@ -1147,7 +1147,10 @@ a.name-tag,
|
||||||
|
|
||||||
@for $i from 0 through 10 {
|
@for $i from 0 through 10 {
|
||||||
&--#{10 * $i} {
|
&--#{10 * $i} {
|
||||||
background-color: rgba($ui-highlight-color, 1 * (math.div(max(1, $i), 10)));
|
background-color: rgba(
|
||||||
|
$ui-highlight-color,
|
||||||
|
1 * (math.div(max(1, $i), 10))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1236,7 +1239,12 @@ a.sparkline {
|
||||||
|
|
||||||
.skeleton {
|
.skeleton {
|
||||||
background-color: lighten($ui-base-color, 8%);
|
background-color: lighten($ui-base-color, 8%);
|
||||||
background-image: linear-gradient(90deg, lighten($ui-base-color, 8%), lighten($ui-base-color, 12%), lighten($ui-base-color, 8%));
|
background-image: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
lighten($ui-base-color, 8%),
|
||||||
|
lighten($ui-base-color, 12%),
|
||||||
|
lighten($ui-base-color, 8%)
|
||||||
|
);
|
||||||
background-size: 200px 100%;
|
background-size: 200px 100%;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
@ -1285,7 +1293,10 @@ a.sparkline {
|
||||||
|
|
||||||
@for $i from 0 through 10 {
|
@for $i from 0 through 10 {
|
||||||
&--#{10 * $i} {
|
&--#{10 * $i} {
|
||||||
background-color: rgba($ui-highlight-color, 1 * (math.div(max(1, $i), 10)));
|
background-color: rgba(
|
||||||
|
$ui-highlight-color,
|
||||||
|
1 * (math.div(max(1, $i), 10))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1431,7 +1442,7 @@ a.sparkline {
|
||||||
|
|
||||||
&::after {
|
&::after {
|
||||||
display: block;
|
display: block;
|
||||||
content: "";
|
content: '';
|
||||||
width: 50px;
|
width: 50px;
|
||||||
height: 21px;
|
height: 21px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -1825,7 +1836,7 @@ a.sparkline {
|
||||||
|
|
||||||
&::after {
|
&::after {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
content: "";
|
content: '';
|
||||||
width: 1px;
|
width: 1px;
|
||||||
background: $highlight-text-color;
|
background: $highlight-text-color;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
|
|
@ -14,7 +14,7 @@ body {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
color: $primary-text-color;
|
color: $primary-text-color;
|
||||||
text-rendering: optimizelegibility;
|
text-rendering: optimizelegibility;
|
||||||
font-feature-settings: "kern";
|
font-feature-settings: 'kern';
|
||||||
text-size-adjust: none;
|
text-size-adjust: none;
|
||||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0%);
|
-webkit-tap-highlight-color: rgba(0, 0, 0, 0%);
|
||||||
-webkit-tap-highlight-color: transparent;
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
@ -31,7 +31,9 @@ body {
|
||||||
// Droid Sans => Older Androids (<4.0)
|
// Droid Sans => Older Androids (<4.0)
|
||||||
// Helvetica Neue => Older macOS <10.11
|
// Helvetica Neue => Older macOS <10.11
|
||||||
// $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)
|
// $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)
|
||||||
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", $font-sans-serif, sans-serif;
|
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
|
||||||
|
Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
||||||
|
$font-sans-serif, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.app-body {
|
&.app-body {
|
||||||
|
|
|
@ -387,7 +387,7 @@ body > [data-popper-placement] {
|
||||||
|
|
||||||
.ellipsis {
|
.ellipsis {
|
||||||
&::after {
|
&::after {
|
||||||
content: "…";
|
content: '…';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,7 +404,7 @@ body > [data-popper-placement] {
|
||||||
color: $highlight-text-color;
|
color: $highlight-text-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="checkbox"] {
|
input[type='checkbox'] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -423,7 +423,9 @@ body > [data-popper-placement] {
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
border-color: $highlight-text-color;
|
border-color: $highlight-text-color;
|
||||||
background: $highlight-text-color url("data:image/svg+xml;utf8,<svg width='18' height='18' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M4.5 8.5L8 12l6-6' stroke='white' stroke-width='1.5'/></svg>") center center no-repeat;
|
background: $highlight-text-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg width='18' height='18' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M4.5 8.5L8 12l6-6' stroke='white' stroke-width='1.5'/></svg>")
|
||||||
|
center center no-repeat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -647,7 +649,12 @@ body > [data-popper-placement] {
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
|
|
||||||
&__actions {
|
&__actions {
|
||||||
background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
|
background: linear-gradient(
|
||||||
|
180deg,
|
||||||
|
rgba($base-shadow-color, 0.8) 0,
|
||||||
|
rgba($base-shadow-color, 0.35) 80%,
|
||||||
|
transparent
|
||||||
|
);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
@ -675,7 +682,12 @@ body > [data-popper-placement] {
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
|
background: linear-gradient(
|
||||||
|
0deg,
|
||||||
|
rgba($base-shadow-color, 0.8) 0,
|
||||||
|
rgba($base-shadow-color, 0.35) 80%,
|
||||||
|
transparent
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1080,8 +1092,13 @@ body > [data-popper-placement] {
|
||||||
cursor: auto;
|
cursor: auto;
|
||||||
|
|
||||||
@keyframes fade {
|
@keyframes fade {
|
||||||
0% { opacity: 0; }
|
0% {
|
||||||
100% { opacity: 1; }
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
@ -1827,11 +1844,11 @@ a.account__display-name {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
scrollbar-width: none; /* Firefox */
|
scrollbar-width: none; /* Firefox */
|
||||||
-ms-overflow-style: none; /* IE 10+ */
|
-ms-overflow-style: none; /* IE 10+ */
|
||||||
|
|
||||||
* {
|
* {
|
||||||
scrollbar-width: none; /* Firefox */
|
scrollbar-width: none; /* Firefox */
|
||||||
-ms-overflow-style: none; /* IE 10+ */
|
-ms-overflow-style: none; /* IE 10+ */
|
||||||
}
|
}
|
||||||
|
|
||||||
&::-webkit-scrollbar,
|
&::-webkit-scrollbar,
|
||||||
|
@ -2863,7 +2880,9 @@ $ui-header-height: 55px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.drawer__inner__mastodon {
|
.drawer__inner__mastodon {
|
||||||
background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
|
background: lighten($ui-base-color, 13%)
|
||||||
|
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
|
||||||
|
no-repeat bottom / 100% auto;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-height: 47px;
|
min-height: 47px;
|
||||||
display: none;
|
display: none;
|
||||||
|
@ -2918,7 +2937,8 @@ $ui-header-height: 55px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@supports (display: grid) { // hack to fix Chrome <57
|
@supports (display: grid) {
|
||||||
|
// hack to fix Chrome <57
|
||||||
contain: strict;
|
contain: strict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2939,7 +2959,8 @@ $ui-header-height: 55px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.scrollable.fullscreen {
|
.scrollable.fullscreen {
|
||||||
@supports (display: grid) { // hack to fix Chrome <57
|
@supports (display: grid) {
|
||||||
|
// hack to fix Chrome <57
|
||||||
contain: none;
|
contain: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3043,7 +3064,8 @@ $ui-header-height: 55px;
|
||||||
transition: background-color 0.2s ease;
|
transition: background-color 0.2s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.react-toggle:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
|
.react-toggle:is(:hover, :focus-within):not(.react-toggle--disabled)
|
||||||
|
.react-toggle-track {
|
||||||
background-color: darken($ui-base-color, 10%);
|
background-color: darken($ui-base-color, 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3051,7 +3073,8 @@ $ui-header-height: 55px;
|
||||||
background-color: darken($ui-highlight-color, 2%);
|
background-color: darken($ui-highlight-color, 2%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
|
.react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled)
|
||||||
|
.react-toggle-track {
|
||||||
background-color: $ui-highlight-color;
|
background-color: $ui-highlight-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3646,7 +3669,7 @@ a.status-card.compact:hover {
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
display: block;
|
display: block;
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: -13px;
|
bottom: -13px;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
@ -3656,7 +3679,11 @@ a.status-card.compact:hover {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);
|
background: radial-gradient(
|
||||||
|
ellipse,
|
||||||
|
rgba($ui-highlight-color, 0.23) 0%,
|
||||||
|
rgba($ui-highlight-color, 0) 60%
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4241,7 +4268,8 @@ a.status-card.compact:hover {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
@supports (display: grid) { // hack to fix Chrome <57
|
@supports (display: grid) {
|
||||||
|
// hack to fix Chrome <57
|
||||||
contain: strict;
|
contain: strict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5747,7 +5775,9 @@ a.status-card.compact:hover {
|
||||||
width: auto;
|
width: auto;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: $simple-background-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
border: 1px solid darken($simple-background-color, 14%);
|
border: 1px solid darken($simple-background-color, 14%);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 6px 10px;
|
padding: 6px 10px;
|
||||||
|
@ -6154,7 +6184,12 @@ a.status-card.compact:hover {
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);
|
background: linear-gradient(
|
||||||
|
0deg,
|
||||||
|
rgba($base-shadow-color, 0.85) 0,
|
||||||
|
rgba($base-shadow-color, 0.45) 60%,
|
||||||
|
transparent
|
||||||
|
);
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity 0.1s ease;
|
transition: opacity 0.1s ease;
|
||||||
|
@ -6295,7 +6330,7 @@ a.status-card.compact:hover {
|
||||||
}
|
}
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content: "";
|
content: '';
|
||||||
width: 50px;
|
width: 50px;
|
||||||
background: rgba($white, 0.35);
|
background: rgba($white, 0.35);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
@ -6365,7 +6400,7 @@ a.status-card.compact:hover {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content: "";
|
content: '';
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: rgba($white, 0.35);
|
background: rgba($white, 0.35);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
@ -6448,7 +6483,11 @@ a.status-card.compact:hover {
|
||||||
}
|
}
|
||||||
|
|
||||||
.scrollable .account-card__bio::after {
|
.scrollable .account-card__bio::after {
|
||||||
background: linear-gradient(to left, lighten($ui-base-color, 8%), transparent);
|
background: linear-gradient(
|
||||||
|
to left,
|
||||||
|
lighten($ui-base-color, 8%),
|
||||||
|
transparent
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
.account-gallery__container {
|
.account-gallery__container {
|
||||||
|
@ -6509,7 +6548,7 @@ a.status-card.compact:hover {
|
||||||
&::before,
|
&::before,
|
||||||
&::after {
|
&::after {
|
||||||
display: block;
|
display: block;
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
@ -6575,8 +6614,8 @@ a.status-card.compact:hover {
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
input[type="radio"],
|
input[type='radio'],
|
||||||
input[type="checkbox"] {
|
input[type='checkbox'] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6635,9 +6674,17 @@ noscript {
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes flicker {
|
@keyframes flicker {
|
||||||
0% { opacity: 1; }
|
0% {
|
||||||
30% { opacity: 0.75; }
|
opacity: 1;
|
||||||
100% { opacity: 1; }
|
}
|
||||||
|
|
||||||
|
30% {
|
||||||
|
opacity: 0.75;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 630px) and (max-height: 400px) {
|
@media screen and (max-width: 630px) and (max-height: 400px) {
|
||||||
|
@ -6658,7 +6705,9 @@ noscript {
|
||||||
.navigation-bar {
|
.navigation-bar {
|
||||||
& > a:first-child {
|
& > a:first-child {
|
||||||
will-change: margin-top, margin-left, margin-right, width;
|
will-change: margin-top, margin-left, margin-right, width;
|
||||||
transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);
|
transition: margin-top $duration $delay,
|
||||||
|
margin-left $duration ($duration + $delay),
|
||||||
|
margin-right $duration ($duration + $delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
& > .navigation-bar__profile-edit {
|
& > .navigation-bar__profile-edit {
|
||||||
|
@ -6669,15 +6718,12 @@ noscript {
|
||||||
.navigation-bar__actions {
|
.navigation-bar__actions {
|
||||||
& > .icon-button.close {
|
& > .icon-button.close {
|
||||||
will-change: opacity transform;
|
will-change: opacity transform;
|
||||||
transition:
|
transition: opacity $duration * 0.5 $delay, transform $duration $delay;
|
||||||
opacity $duration * 0.5 $delay,
|
|
||||||
transform $duration $delay;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
& > .compose__action-bar .icon-button {
|
& > .compose__action-bar .icon-button {
|
||||||
will-change: opacity transform;
|
will-change: opacity transform;
|
||||||
transition:
|
transition: opacity $duration * 0.5 $delay + $duration * 0.5,
|
||||||
opacity $duration * 0.5 $delay + $duration * 0.5,
|
|
||||||
transform $duration $delay;
|
transform $duration $delay;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7677,7 +7723,11 @@ noscript {
|
||||||
&.active {
|
&.active {
|
||||||
transition: all 100ms ease-in;
|
transition: all 100ms ease-in;
|
||||||
transition-property: background-color, color;
|
transition-property: background-color, color;
|
||||||
background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);
|
background-color: mix(
|
||||||
|
lighten($ui-base-color, 12%),
|
||||||
|
$ui-highlight-color,
|
||||||
|
80%
|
||||||
|
);
|
||||||
|
|
||||||
.reactions-bar__item__count {
|
.reactions-bar__item__count {
|
||||||
color: lighten($highlight-text-color, 8%);
|
color: lighten($highlight-text-color, 8%);
|
||||||
|
@ -7730,7 +7780,7 @@ noscript {
|
||||||
|
|
||||||
&.unread {
|
&.unread {
|
||||||
&::before {
|
&::before {
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
@ -8258,14 +8308,14 @@ noscript {
|
||||||
counter-increment: list-counter;
|
counter-increment: list-counter;
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content: counter(list-counter) ".";
|
content: counter(list-counter) '.';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ul > li::before {
|
ul > li::before {
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: $darker-text-color;
|
background-color: $darker-text-color;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
|
|
|
@ -174,7 +174,7 @@
|
||||||
|
|
||||||
&:hover::before {
|
&:hover::before {
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
content: "";
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
|
|
@ -299,7 +299,7 @@ code {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: url("images/void.png");
|
background: url('images/void.png');
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
@ -384,7 +384,7 @@ code {
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="checkbox"] {
|
input[type='checkbox'] {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 5px;
|
top: 5px;
|
||||||
|
@ -400,12 +400,12 @@ code {
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="text"],
|
input[type='text'],
|
||||||
input[type="number"],
|
input[type='number'],
|
||||||
input[type="email"],
|
input[type='email'],
|
||||||
input[type="password"],
|
input[type='password'],
|
||||||
input[type="url"],
|
input[type='url'],
|
||||||
input[type="datetime-local"],
|
input[type='datetime-local'],
|
||||||
textarea {
|
textarea {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
@ -443,11 +443,11 @@ code {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="text"],
|
input[type='text'],
|
||||||
input[type="number"],
|
input[type='number'],
|
||||||
input[type="email"],
|
input[type='email'],
|
||||||
input[type="password"],
|
input[type='password'],
|
||||||
input[type="datetime-local"] {
|
input[type='datetime-local'] {
|
||||||
&:focus:invalid:not(:placeholder-shown),
|
&:focus:invalid:not(:placeholder-shown),
|
||||||
&:required:invalid:not(:placeholder-shown) {
|
&:required:invalid:not(:placeholder-shown) {
|
||||||
border-color: lighten($error-red, 12%);
|
border-color: lighten($error-red, 12%);
|
||||||
|
@ -459,11 +459,11 @@ code {
|
||||||
color: lighten($error-red, 12%);
|
color: lighten($error-red, 12%);
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="text"],
|
input[type='text'],
|
||||||
input[type="number"],
|
input[type='number'],
|
||||||
input[type="email"],
|
input[type='email'],
|
||||||
input[type="password"],
|
input[type='password'],
|
||||||
input[type="datetime-local"],
|
input[type='datetime-local'],
|
||||||
textarea,
|
textarea,
|
||||||
select {
|
select {
|
||||||
border-color: lighten($error-red, 12%);
|
border-color: lighten($error-red, 12%);
|
||||||
|
@ -567,7 +567,9 @@ code {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
resize: vertical;
|
resize: vertical;
|
||||||
background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: darken($ui-base-color, 10%)
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
border: 1px solid darken($ui-base-color, 14%);
|
border: 1px solid darken($ui-base-color, 14%);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
|
@ -607,7 +609,11 @@ code {
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 1px;
|
bottom: 1px;
|
||||||
width: 5px;
|
width: 5px;
|
||||||
background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
|
background-image: linear-gradient(
|
||||||
|
to right,
|
||||||
|
rgba(darken($ui-base-color, 10%), 0),
|
||||||
|
darken($ui-base-color, 10%)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -995,7 +1001,7 @@ code {
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="text"] {
|
input[type='text'] {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: 0;
|
border: 0;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
.modal-layout {
|
.modal-layout {
|
||||||
background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>') repeat-x bottom fixed;
|
background: $ui-base-color
|
||||||
|
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>')
|
||||||
|
repeat-x bottom fixed;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
|
|
|
@ -64,8 +64,8 @@
|
||||||
max-width: calc(100% - 45px - 25px);
|
max-width: calc(100% - 45px - 25px);
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="radio"],
|
input[type='radio'],
|
||||||
input[type="checkbox"] {
|
input[type='checkbox'] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="text"] {
|
input[type='text'] {
|
||||||
display: block;
|
display: block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -263,7 +263,9 @@
|
||||||
width: auto;
|
width: auto;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>") no-repeat right 8px center / auto 16px;
|
background: $simple-background-color
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>")
|
||||||
|
no-repeat right 8px center / auto 16px;
|
||||||
border: 1px solid darken($simple-background-color, 14%);
|
border: 1px solid darken($simple-background-color, 14%);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 6px 10px;
|
padding: 6px 10px;
|
||||||
|
|
|
@ -229,8 +229,8 @@ body.rtl {
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.simple_form .check_boxes .checkbox input[type="checkbox"],
|
.simple_form .check_boxes .checkbox input[type='checkbox'],
|
||||||
.simple_form .input.boolean input[type="checkbox"] {
|
.simple_form .input.boolean input[type='checkbox'] {
|
||||||
left: auto;
|
left: auto;
|
||||||
right: 0;
|
right: 0;
|
||||||
}
|
}
|
||||||
|
@ -268,12 +268,18 @@ body.rtl {
|
||||||
&::after {
|
&::after {
|
||||||
right: auto;
|
right: auto;
|
||||||
left: 0;
|
left: 0;
|
||||||
background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
|
background-image: linear-gradient(
|
||||||
|
to left,
|
||||||
|
rgba(darken($ui-base-color, 10%), 0),
|
||||||
|
darken($ui-base-color, 10%)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.simple_form select {
|
.simple_form select {
|
||||||
background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat left 8px center / auto 16px;
|
background: darken($ui-base-color, 10%)
|
||||||
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>")
|
||||||
|
no-repeat left 8px center / auto 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table th,
|
.table th,
|
||||||
|
@ -320,11 +326,11 @@ body.rtl {
|
||||||
}
|
}
|
||||||
|
|
||||||
.fa-chevron-left::before {
|
.fa-chevron-left::before {
|
||||||
content: "\F054";
|
content: '\F054';
|
||||||
}
|
}
|
||||||
|
|
||||||
.fa-chevron-right::before {
|
.fa-chevron-right::before {
|
||||||
content: "\F053";
|
content: '\F053';
|
||||||
}
|
}
|
||||||
|
|
||||||
.column-back-button__icon {
|
.column-back-button__icon {
|
||||||
|
|
|
@ -138,7 +138,7 @@ a.button.logo-button {
|
||||||
}
|
}
|
||||||
|
|
||||||
.embed {
|
.embed {
|
||||||
.status__content[data-spoiler="folded"] {
|
.status__content[data-spoiler='folded'] {
|
||||||
.e-content {
|
.e-content {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
// Commonly used web colors
|
// Commonly used web colors
|
||||||
$black: #000000; // Black
|
$black: #000000; // Black
|
||||||
$white: #ffffff; // White
|
$white: #ffffff; // White
|
||||||
$success-green: #79bd9a !default; // Padua
|
$success-green: #79bd9a !default; // Padua
|
||||||
$error-red: #df405a !default; // Cerise
|
$error-red: #df405a !default; // Cerise
|
||||||
$warning-red: #ff5050 !default; // Sunset Orange
|
$warning-red: #ff5050 !default; // Sunset Orange
|
||||||
$gold-star: #ca8f04 !default; // Dark Goldenrod
|
$gold-star: #ca8f04 !default; // Dark Goldenrod
|
||||||
|
|
||||||
$red-bookmark: $warning-red;
|
$red-bookmark: $warning-red;
|
||||||
|
|
||||||
// Values from the classic Mastodon UI
|
// Values from the classic Mastodon UI
|
||||||
$classic-base-color: #282c37; // Midnight Express
|
$classic-base-color: #282c37; // Midnight Express
|
||||||
$classic-primary-color: #9baec8; // Echo Blue
|
$classic-primary-color: #9baec8; // Echo Blue
|
||||||
$classic-secondary-color: #d9e1e8; // Pattens Blue
|
$classic-secondary-color: #d9e1e8; // Pattens Blue
|
||||||
$classic-highlight-color: #6364ff; // Brand purple
|
$classic-highlight-color: #6364ff; // Brand purple
|
||||||
|
|
||||||
// Variables for defaults in UI
|
// Variables for defaults in UI
|
||||||
$base-shadow-color: $black !default;
|
$base-shadow-color: $black !default;
|
||||||
|
@ -23,10 +23,13 @@ $valid-value-color: $success-green !default;
|
||||||
$error-value-color: $error-red !default;
|
$error-value-color: $error-red !default;
|
||||||
|
|
||||||
// Tell UI to use selected colors
|
// Tell UI to use selected colors
|
||||||
$ui-base-color: $classic-base-color !default; // Darkest
|
$ui-base-color: $classic-base-color !default; // Darkest
|
||||||
$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest
|
$ui-base-lighter-color: lighten(
|
||||||
$ui-primary-color: $classic-primary-color !default; // Lighter
|
$ui-base-color,
|
||||||
$ui-secondary-color: $classic-secondary-color !default; // Lightest
|
26%
|
||||||
|
) !default; // Lighter darkest
|
||||||
|
$ui-primary-color: $classic-primary-color !default; // Lighter
|
||||||
|
$ui-secondary-color: $classic-secondary-color !default; // Lightest
|
||||||
$ui-highlight-color: $classic-highlight-color !default;
|
$ui-highlight-color: $classic-highlight-color !default;
|
||||||
|
|
||||||
// Variables for texts
|
// Variables for texts
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@use "sass:math";
|
@use 'sass:math';
|
||||||
|
|
||||||
.hero-widget {
|
.hero-widget {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
|
|
@ -6,6 +6,15 @@ class PostStatusService < BaseService
|
||||||
|
|
||||||
MIN_SCHEDULE_OFFSET = 5.minutes.freeze
|
MIN_SCHEDULE_OFFSET = 5.minutes.freeze
|
||||||
|
|
||||||
|
class UnexpectedMentionsError < StandardError
|
||||||
|
attr_reader :accounts
|
||||||
|
|
||||||
|
def initialize(message, accounts)
|
||||||
|
super(message)
|
||||||
|
@accounts = accounts
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Post a text status update, fetch and notify remote users mentioned
|
# Post a text status update, fetch and notify remote users mentioned
|
||||||
# @param [Account] account Account from which to post
|
# @param [Account] account Account from which to post
|
||||||
# @param [Hash] options
|
# @param [Hash] options
|
||||||
|
@ -21,6 +30,7 @@ class PostStatusService < BaseService
|
||||||
# @option [Doorkeeper::Application] :application
|
# @option [Doorkeeper::Application] :application
|
||||||
# @option [String] :idempotency Optional idempotency key
|
# @option [String] :idempotency Optional idempotency key
|
||||||
# @option [Boolean] :with_rate_limit
|
# @option [Boolean] :with_rate_limit
|
||||||
|
# @option [Enumerable] :allowed_mentions Optional array of expected mentioned account IDs, raises `UnexpectedMentionsError` if unexpected accounts end up in mentions
|
||||||
# @return [Status]
|
# @return [Status]
|
||||||
def call(account, options = {})
|
def call(account, options = {})
|
||||||
@account = account
|
@account = account
|
||||||
|
@ -72,14 +82,27 @@ class PostStatusService < BaseService
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_status!
|
def process_status!
|
||||||
|
@status = @account.statuses.new(status_attributes)
|
||||||
|
process_mentions_service.call(@status, save_records: false)
|
||||||
|
safeguard_mentions!(@status)
|
||||||
|
|
||||||
# The following transaction block is needed to wrap the UPDATEs to
|
# The following transaction block is needed to wrap the UPDATEs to
|
||||||
# the media attachments when the status is created
|
# the media attachments when the status is created
|
||||||
|
|
||||||
ApplicationRecord.transaction do
|
ApplicationRecord.transaction do
|
||||||
@status = @account.statuses.create!(status_attributes)
|
@status.save!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def safeguard_mentions!(status)
|
||||||
|
return if @options[:allowed_mentions].nil?
|
||||||
|
expected_account_ids = @options[:allowed_mentions].map(&:to_i)
|
||||||
|
|
||||||
|
unexpected_accounts = status.mentions.map(&:account).to_a.reject { |mentioned_account| expected_account_ids.include?(mentioned_account.id) }
|
||||||
|
return if unexpected_accounts.empty?
|
||||||
|
|
||||||
|
raise UnexpectedMentionsError.new('Post would be sent to unexpected accounts', unexpected_accounts)
|
||||||
|
end
|
||||||
|
|
||||||
def schedule_status!
|
def schedule_status!
|
||||||
status_for_validation = @account.statuses.build(status_attributes)
|
status_for_validation = @account.statuses.build(status_attributes)
|
||||||
|
|
||||||
|
@ -102,7 +125,6 @@ class PostStatusService < BaseService
|
||||||
|
|
||||||
def postprocess_status!
|
def postprocess_status!
|
||||||
process_hashtags_service.call(@status)
|
process_hashtags_service.call(@status)
|
||||||
process_mentions_service.call(@status)
|
|
||||||
Trends.tags.register(@status)
|
Trends.tags.register(@status)
|
||||||
LinkCrawlWorker.perform_async(@status.id)
|
LinkCrawlWorker.perform_async(@status.id)
|
||||||
DistributionWorker.perform_async(@status.id)
|
DistributionWorker.perform_async(@status.id)
|
||||||
|
|
|
@ -3,12 +3,13 @@
|
||||||
class ProcessMentionsService < BaseService
|
class ProcessMentionsService < BaseService
|
||||||
include Payloadable
|
include Payloadable
|
||||||
|
|
||||||
# Scan status for mentions and fetch remote mentioned users, create
|
# Scan status for mentions and fetch remote mentioned users,
|
||||||
# local mention pointers, send Salmon notifications to mentioned
|
# and create local mention pointers
|
||||||
# remote users
|
|
||||||
# @param [Status] status
|
# @param [Status] status
|
||||||
def call(status)
|
# @param [Boolean] save_records Whether to save records in database
|
||||||
|
def call(status, save_records: true)
|
||||||
@status = status
|
@status = status
|
||||||
|
@save_records = save_records
|
||||||
|
|
||||||
return unless @status.local?
|
return unless @status.local?
|
||||||
|
|
||||||
|
@ -55,14 +56,15 @@ class ProcessMentionsService < BaseService
|
||||||
next match if mention_undeliverable?(mentioned_account) || mentioned_account&.suspended?
|
next match if mention_undeliverable?(mentioned_account) || mentioned_account&.suspended?
|
||||||
|
|
||||||
mention = @previous_mentions.find { |x| x.account_id == mentioned_account.id }
|
mention = @previous_mentions.find { |x| x.account_id == mentioned_account.id }
|
||||||
mention ||= mentioned_account.mentions.new(status: @status)
|
mention ||= @current_mentions.find { |x| x.account_id == mentioned_account.id }
|
||||||
|
mention ||= @status.mentions.new(account: mentioned_account)
|
||||||
|
|
||||||
@current_mentions << mention
|
@current_mentions << mention
|
||||||
|
|
||||||
"@#{mentioned_account.acct}"
|
"@#{mentioned_account.acct}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@status.save!
|
@status.save! if @save_records
|
||||||
end
|
end
|
||||||
|
|
||||||
def assign_mentions!
|
def assign_mentions!
|
||||||
|
@ -73,11 +75,12 @@ class ProcessMentionsService < BaseService
|
||||||
mentioned_account_ids = @current_mentions.map(&:account_id)
|
mentioned_account_ids = @current_mentions.map(&:account_id)
|
||||||
blocked_account_ids = Set.new(@status.account.block_relationships.where(target_account_id: mentioned_account_ids).pluck(:target_account_id))
|
blocked_account_ids = Set.new(@status.account.block_relationships.where(target_account_id: mentioned_account_ids).pluck(:target_account_id))
|
||||||
|
|
||||||
@current_mentions.select! { |mention| !(blocked_account_ids.include?(mention.account_id) || blocked_domains.include?(mention.account.domain)) }
|
dropped_mentions, @current_mentions = @current_mentions.partition { |mention| blocked_account_ids.include?(mention.account_id) || blocked_domains.include?(mention.account.domain) }
|
||||||
|
dropped_mentions.each(&:destroy)
|
||||||
end
|
end
|
||||||
|
|
||||||
@current_mentions.each do |mention|
|
@current_mentions.each do |mention|
|
||||||
mention.save if mention.new_record?
|
mention.save if mention.new_record? && @save_records
|
||||||
end
|
end
|
||||||
|
|
||||||
# If previous mentions are no longer contained in the text, convert them
|
# If previous mentions are no longer contained in the text, convert them
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
.dashboard__counters__num= number_to_human_size @account.media_attachments.sum('file_file_size')
|
.dashboard__counters__num= number_to_human_size @account.media_attachments.sum('file_file_size')
|
||||||
.dashboard__counters__label= t 'admin.accounts.media_attachments'
|
.dashboard__counters__label= t 'admin.accounts.media_attachments'
|
||||||
%div
|
%div
|
||||||
= link_to admin_account_relationships_path(@account.id, location: 'local', relationship: 'followed_by') do
|
= link_to admin_account_relationships_path(@account.id, location: @account.local? ? nil : 'local', relationship: 'followed_by') do
|
||||||
.dashboard__counters__num= number_with_delimiter @account.local_followers_count
|
.dashboard__counters__num= number_with_delimiter @account.local_followers_count
|
||||||
.dashboard__counters__label= t 'admin.accounts.followers'
|
.dashboard__counters__label= t 'admin.accounts.followers'
|
||||||
%div
|
%div
|
||||||
|
|
|
@ -9,52 +9,52 @@
|
||||||
- [scheduler]
|
- [scheduler]
|
||||||
:scheduler:
|
:scheduler:
|
||||||
:listened_queues_only: true
|
:listened_queues_only: true
|
||||||
:schedule:
|
:schedule:
|
||||||
scheduled_statuses_scheduler:
|
scheduled_statuses_scheduler:
|
||||||
every: '5m'
|
every: '5m'
|
||||||
class: Scheduler::ScheduledStatusesScheduler
|
class: Scheduler::ScheduledStatusesScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
trends_refresh_scheduler:
|
trends_refresh_scheduler:
|
||||||
every: '5m'
|
every: '5m'
|
||||||
class: Scheduler::Trends::RefreshScheduler
|
class: Scheduler::Trends::RefreshScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
trends_review_notifications_scheduler:
|
trends_review_notifications_scheduler:
|
||||||
every: '6h'
|
every: '6h'
|
||||||
class: Scheduler::Trends::ReviewNotificationsScheduler
|
class: Scheduler::Trends::ReviewNotificationsScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
indexing_scheduler:
|
indexing_scheduler:
|
||||||
every: '5m'
|
every: '5m'
|
||||||
class: Scheduler::IndexingScheduler
|
class: Scheduler::IndexingScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
vacuum_scheduler:
|
vacuum_scheduler:
|
||||||
cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
|
cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
|
||||||
class: Scheduler::VacuumScheduler
|
class: Scheduler::VacuumScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
follow_recommendations_scheduler:
|
follow_recommendations_scheduler:
|
||||||
cron: '<%= Random.rand(0..59) %> <%= Random.rand(6..9) %> * * *'
|
cron: '<%= Random.rand(0..59) %> <%= Random.rand(6..9) %> * * *'
|
||||||
class: Scheduler::FollowRecommendationsScheduler
|
class: Scheduler::FollowRecommendationsScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
user_cleanup_scheduler:
|
user_cleanup_scheduler:
|
||||||
cron: '<%= Random.rand(0..59) %> <%= Random.rand(4..6) %> * * *'
|
cron: '<%= Random.rand(0..59) %> <%= Random.rand(4..6) %> * * *'
|
||||||
class: Scheduler::UserCleanupScheduler
|
class: Scheduler::UserCleanupScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
ip_cleanup_scheduler:
|
ip_cleanup_scheduler:
|
||||||
cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
|
cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
|
||||||
class: Scheduler::IpCleanupScheduler
|
class: Scheduler::IpCleanupScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
pghero_scheduler:
|
pghero_scheduler:
|
||||||
cron: '0 0 * * *'
|
cron: '0 0 * * *'
|
||||||
class: Scheduler::PgheroScheduler
|
class: Scheduler::PgheroScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
instance_refresh_scheduler:
|
instance_refresh_scheduler:
|
||||||
cron: '0 * * * *'
|
cron: '0 * * * *'
|
||||||
class: Scheduler::InstanceRefreshScheduler
|
class: Scheduler::InstanceRefreshScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
accounts_statuses_cleanup_scheduler:
|
accounts_statuses_cleanup_scheduler:
|
||||||
interval: 1 minute
|
interval: 1 minute
|
||||||
class: Scheduler::AccountsStatusesCleanupScheduler
|
class: Scheduler::AccountsStatusesCleanupScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
suspended_user_cleanup_scheduler:
|
suspended_user_cleanup_scheduler:
|
||||||
interval: 1 minute
|
interval: 1 minute
|
||||||
class: Scheduler::SuspendedUserCleanupScheduler
|
class: Scheduler::SuspendedUserCleanupScheduler
|
||||||
queue: scheduler
|
queue: scheduler
|
||||||
|
|
|
@ -81,7 +81,7 @@ module.exports = {
|
||||||
},
|
},
|
||||||
minChunks: 2,
|
minChunks: 2,
|
||||||
minSize: 0,
|
minSize: 0,
|
||||||
test: /^(?!.*[\\\/]node_modules[\\\/]react-intl[\\\/]).+$/,
|
test: /^(?!.*[\\/]node_modules[\\/]react-intl[\\/]).+$/,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -1 +1,3 @@
|
||||||
use { color: #000 !important; }
|
use {
|
||||||
|
color: #000 !important;
|
||||||
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
"test": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:jest",
|
"test": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:jest",
|
||||||
"test:lint": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:lint:sass",
|
"test:lint": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:lint:sass",
|
||||||
"test:lint:js": "eslint --ext=js . --cache --report-unused-disable-directives",
|
"test:lint:js": "eslint --ext=js . --cache --report-unused-disable-directives",
|
||||||
"test:lint:sass": "stylelint \"**/*.{css,scss}\"",
|
"test:lint:sass": "stylelint \"**/*.{css,scss}\" && prettier --check \"**/*.{css,scss}\"",
|
||||||
"test:jest": "cross-env NODE_ENV=test jest",
|
"test:jest": "cross-env NODE_ENV=test jest",
|
||||||
"format": "prettier --write \"**/*.{json,yml}\"",
|
"format": "prettier --write \"**/*.{json,yml}\"",
|
||||||
"format-check": "prettier --check \"**/*.{json,yml}\""
|
"format-check": "prettier --check \"**/*.{json,yml}\""
|
||||||
|
@ -159,8 +159,8 @@
|
||||||
"raf": "^3.4.1",
|
"raf": "^3.4.1",
|
||||||
"react-intl-translations-manager": "^5.0.3",
|
"react-intl-translations-manager": "^5.0.3",
|
||||||
"react-test-renderer": "^16.14.0",
|
"react-test-renderer": "^16.14.0",
|
||||||
"stylelint": "^14.16.1",
|
"stylelint": "^15.1.0",
|
||||||
"stylelint-config-standard-scss": "^6.1.0",
|
"stylelint-config-standard-scss": "^7.0.0",
|
||||||
"webpack-dev-server": "^3.11.3",
|
"webpack-dev-server": "^3.11.3",
|
||||||
"yargs": "^17.6.2"
|
"yargs": "^17.6.2"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe Api::V1::Accounts::StatusesController do
|
describe Api::V1::Accounts::StatusesController do
|
||||||
|
@ -15,7 +16,12 @@ describe Api::V1::Accounts::StatusesController do
|
||||||
it 'returns http success' do
|
it 'returns http success' do
|
||||||
get :index, params: { account_id: user.account.id, limit: 1 }
|
get :index, params: { account_id: user.account.id, limit: 1 }
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(:ok)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns expected headers' do
|
||||||
|
get :index, params: { account_id: user.account.id, limit: 1 }
|
||||||
|
|
||||||
expect(response.headers['Link'].links.size).to eq(2)
|
expect(response.headers['Link'].links.size).to eq(2)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -23,19 +29,29 @@ describe Api::V1::Accounts::StatusesController do
|
||||||
it 'returns http success' do
|
it 'returns http success' do
|
||||||
get :index, params: { account_id: user.account.id, only_media: true }
|
get :index, params: { account_id: user.account.id, only_media: true }
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(:ok)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with exclude replies' do
|
context 'with exclude replies' do
|
||||||
|
let!(:older_statuses) { user.account.statuses.destroy_all }
|
||||||
|
let!(:status) { Fabricate(:status, account: user.account) }
|
||||||
|
let!(:status_self_reply) { Fabricate(:status, account: user.account, thread: status) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
Fabricate(:status, account: user.account, thread: Fabricate(:status))
|
Fabricate(:status, account: user.account, thread: Fabricate(:status)) # Reply to another user
|
||||||
|
get :index, params: { account_id: user.account.id, exclude_replies: true }
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns http success' do
|
it 'returns http success' do
|
||||||
get :index, params: { account_id: user.account.id, exclude_replies: true }
|
expect(response).to have_http_status(:ok)
|
||||||
|
end
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
it 'returns posts along with self replies' do
|
||||||
|
json = body_as_json
|
||||||
|
post_ids = json.map { |item| item[:id].to_i }.sort
|
||||||
|
|
||||||
|
expect(post_ids).to eq [status.id, status_self_reply.id]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -47,7 +63,7 @@ describe Api::V1::Accounts::StatusesController do
|
||||||
it 'returns http success' do
|
it 'returns http success' do
|
||||||
get :index, params: { account_id: user.account.id, pinned: true }
|
get :index, params: { account_id: user.account.id, pinned: true }
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(:ok)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -55,12 +71,15 @@ describe Api::V1::Accounts::StatusesController do
|
||||||
let(:account) { Fabricate(:account, username: 'bob', domain: 'example.com') }
|
let(:account) { Fabricate(:account, username: 'bob', domain: 'example.com') }
|
||||||
let(:status) { Fabricate(:status, account: account) }
|
let(:status) { Fabricate(:status, account: account) }
|
||||||
let(:private_status) { Fabricate(:status, account: account, visibility: :private) }
|
let(:private_status) { Fabricate(:status, account: account, visibility: :private) }
|
||||||
let!(:pin) { Fabricate(:status_pin, account: account, status: status) }
|
|
||||||
let!(:private_pin) { Fabricate(:status_pin, account: account, status: private_status) }
|
before do
|
||||||
|
Fabricate(:status_pin, account: account, status: status)
|
||||||
|
Fabricate(:status_pin, account: account, status: private_status)
|
||||||
|
end
|
||||||
|
|
||||||
it 'returns http success' do
|
it 'returns http success' do
|
||||||
get :index, params: { account_id: account.id, pinned: true }
|
get :index, params: { account_id: account.id, pinned: true }
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(:ok)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when user does not follow account' do
|
context 'when user does not follow account' do
|
||||||
|
|
|
@ -133,6 +133,23 @@ RSpec.describe Api::V1::StatusesController, type: :controller do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with a safeguard' do
|
||||||
|
let!(:alice) { Fabricate(:account, username: 'alice') }
|
||||||
|
let!(:bob) { Fabricate(:account, username: 'bob') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
post :create, params: { status: '@alice hm, @bob is really annoying lately', allowed_mentions: [alice.id] }
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns http unprocessable entity' do
|
||||||
|
expect(response).to have_http_status(422)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns serialized extra accounts in body' do
|
||||||
|
expect(body_as_json[:unexpected_accounts].map { |a| a.slice(:id, :acct) }).to eq [{ id: bob.id.to_s, acct: bob.acct }]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'with missing parameters' do
|
context 'with missing parameters' do
|
||||||
before do
|
before do
|
||||||
post :create, params: {}
|
post :create, params: {}
|
||||||
|
|
37
spec/serializers/rest/account_serializer_spec.rb
Normal file
37
spec/serializers/rest/account_serializer_spec.rb
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe REST::AccountSerializer do
|
||||||
|
let(:role) { Fabricate(:user_role, name: 'Role', highlighted: true) }
|
||||||
|
let(:user) { Fabricate(:user, role: role) }
|
||||||
|
let(:account) { user.account}
|
||||||
|
|
||||||
|
subject { JSON.parse(ActiveModelSerializers::SerializableResource.new(account, serializer: REST::AccountSerializer).to_json) }
|
||||||
|
|
||||||
|
context 'when the account is suspended' do
|
||||||
|
before do
|
||||||
|
account.suspend!
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns empty roles' do
|
||||||
|
expect(subject['roles']).to eq []
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the account has a highlighted role' do
|
||||||
|
let(:role) { Fabricate(:user_role, name: 'Role', highlighted: true) }
|
||||||
|
|
||||||
|
it 'returns the expected role' do
|
||||||
|
expect(subject['roles'].first).to include({ 'name' => 'Role' })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the account has a non-highlighted role' do
|
||||||
|
let(:role) { Fabricate(:user_role, name: 'Role', highlighted: false) }
|
||||||
|
|
||||||
|
it 'returns empty roles' do
|
||||||
|
expect(subject['roles']).to eq []
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -138,7 +138,26 @@ RSpec.describe PostStatusService, type: :service do
|
||||||
status = subject.call(account, text: "test status update")
|
status = subject.call(account, text: "test status update")
|
||||||
|
|
||||||
expect(ProcessMentionsService).to have_received(:new)
|
expect(ProcessMentionsService).to have_received(:new)
|
||||||
expect(mention_service).to have_received(:call).with(status)
|
expect(mention_service).to have_received(:call).with(status, save_records: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'safeguards mentions' do
|
||||||
|
account = Fabricate(:account)
|
||||||
|
mentioned_account = Fabricate(:account, username: 'alice')
|
||||||
|
unexpected_mentioned_account = Fabricate(:account, username: 'bob')
|
||||||
|
|
||||||
|
expect do
|
||||||
|
subject.call(account, text: '@alice hm, @bob is really annoying lately', allowed_mentions: [mentioned_account.id])
|
||||||
|
end.to raise_error(an_instance_of(PostStatusService::UnexpectedMentionsError).and having_attributes(accounts: [unexpected_mentioned_account]))
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'processes duplicate mentions correctly' do
|
||||||
|
account = Fabricate(:account)
|
||||||
|
mentioned_account = Fabricate(:account, username: 'alice')
|
||||||
|
|
||||||
|
expect do
|
||||||
|
subject.call(account, text: '@alice @alice @alice hey @alice')
|
||||||
|
end.not_to raise_error
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'processes hashtags' do
|
it 'processes hashtags' do
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue