Compare commits
50 Commits
cybrespace
...
fix-backup
Author | SHA1 | Date |
---|---|---|
khr | 3821241c46 | |
dependabot-preview[bot] | 685b0db882 | |
dependabot-preview[bot] | 741a85c064 | |
dependabot-preview[bot] | 0745fa8449 | |
dependabot-preview[bot] | 291106e11c | |
dependabot-preview[bot] | 52c9044ea9 | |
dependabot-preview[bot] | 008d15d2cd | |
dependabot-preview[bot] | e551274897 | |
dependabot-preview[bot] | 0caa707726 | |
dependabot-preview[bot] | 254ddfc08a | |
dependabot-preview[bot] | 4ecfd4308d | |
dependabot-preview[bot] | da67b1fa37 | |
dependabot-preview[bot] | 3565fc1a00 | |
dependabot-preview[bot] | 91b02afe4a | |
dependabot-preview[bot] | 7be994e0a9 | |
Yamagishi Kazutoshi | a4301b5202 | |
Takeshi Umeda | 5b46467474 | |
Yamagishi Kazutoshi | 7512f3a3e0 | |
Eugen Rochko | 4988ebba4e | |
Nima Boscarino | 9b36f62df6 | |
Eugen Rochko | 91945aa78a | |
Faye Duxovni | 48f75b86ae | |
Takeshi Umeda | a6269b2f83 | |
Nima Boscarino | a9530e29a2 | |
ThibG | 15c192ce40 | |
ThibG | bcf694dce7 | |
BenisonSebastian | d3145ced1f | |
umonaca | f4be89e24d | |
Hugo Gameiro | 488dd0ff7a | |
ThibG | 3a929dbedd | |
Hinaloe | 547a5bac9d | |
kodai | 5966d1b5a3 | |
ThibG | aa884e0484 | |
nightpool | 9762fe382c | |
Soft. Dev | 3ebd903535 | |
puckipedia | d2919f7e94 | |
ThibG | bd684e25d9 | |
BSKY | fccf83e1f2 | |
dependabot-preview[bot] | 237293fd8c | |
dependabot-preview[bot] | 6bee7b820d | |
dependabot-preview[bot] | e9e6ca9041 | |
dependabot-preview[bot] | f7f6f0726c | |
dependabot-preview[bot] | 1a7cf80b7f | |
dependabot-preview[bot] | 183fc9d3cb | |
dependabot-preview[bot] | bc9c116e60 | |
dependabot-preview[bot] | 912496de07 | |
dependabot-preview[bot] | 7840844919 | |
dependabot-preview[bot] | 13b6d5d01b | |
dependabot-preview[bot] | 1ecd71c53e | |
dependabot-preview[bot] | ae945cb1f4 |
|
@ -1,2 +1,3 @@
|
||||||
VAGRANT=true
|
VAGRANT=true
|
||||||
LOCAL_DOMAIN=mastodon.local
|
LOCAL_DOMAIN=mastodon.local
|
||||||
|
BIND=0.0.0.0
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
daysUntilStale: 120
|
||||||
|
daysUntilClose: 7
|
||||||
|
exemptLabels:
|
||||||
|
- security
|
||||||
|
staleLabel: wontfix
|
||||||
|
markComment: >
|
||||||
|
This issue has been automatically marked as stale because it has not had
|
||||||
|
recent activity. It will be closed if no further activity occurs. Thank you
|
||||||
|
for your contributions.
|
||||||
|
only: pulls
|
16
Gemfile
|
@ -3,7 +3,7 @@
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
ruby '>= 2.4.0', '< 2.7.0'
|
ruby '>= 2.4.0', '< 2.7.0'
|
||||||
|
|
||||||
gem 'pkg-config', '~> 1.3'
|
gem 'pkg-config', '~> 1.4'
|
||||||
|
|
||||||
gem 'puma', '~> 4.2'
|
gem 'puma', '~> 4.2'
|
||||||
gem 'rails', '~> 5.2.3'
|
gem 'rails', '~> 5.2.3'
|
||||||
|
@ -15,7 +15,7 @@ gem 'makara', '~> 0.4'
|
||||||
gem 'pghero', '~> 2.3'
|
gem 'pghero', '~> 2.3'
|
||||||
gem 'dotenv-rails', '~> 2.7'
|
gem 'dotenv-rails', '~> 2.7'
|
||||||
|
|
||||||
gem 'aws-sdk-s3', '~> 1.48', require: false
|
gem 'aws-sdk-s3', '~> 1.52', require: false
|
||||||
gem 'fog-core', '<= 2.1.0'
|
gem 'fog-core', '<= 2.1.0'
|
||||||
gem 'fog-openstack', '~> 0.3', require: false
|
gem 'fog-openstack', '~> 0.3', require: false
|
||||||
gem 'paperclip', '~> 6.0'
|
gem 'paperclip', '~> 6.0'
|
||||||
|
@ -85,7 +85,7 @@ gem 'sidekiq-scheduler', '~> 3.0'
|
||||||
gem 'sidekiq-unique-jobs', '~> 6.0'
|
gem 'sidekiq-unique-jobs', '~> 6.0'
|
||||||
gem 'sidekiq-bulk', '~>0.2.0'
|
gem 'sidekiq-bulk', '~>0.2.0'
|
||||||
gem 'simple-navigation', '~> 4.1'
|
gem 'simple-navigation', '~> 4.1'
|
||||||
gem 'simple_form', '~> 4.1'
|
gem 'simple_form', '~> 5.0'
|
||||||
gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
|
gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
|
||||||
gem 'stoplight', '~> 2.1.3'
|
gem 'stoplight', '~> 2.1.3'
|
||||||
gem 'strong_migrations', '~> 0.4'
|
gem 'strong_migrations', '~> 0.4'
|
||||||
|
@ -106,7 +106,7 @@ group :development, :test do
|
||||||
gem 'i18n-tasks', '~> 0.9', require: false
|
gem 'i18n-tasks', '~> 0.9', require: false
|
||||||
gem 'pry-byebug', '~> 3.7'
|
gem 'pry-byebug', '~> 3.7'
|
||||||
gem 'pry-rails', '~> 0.3'
|
gem 'pry-rails', '~> 0.3'
|
||||||
gem 'rspec-rails', '~> 3.8'
|
gem 'rspec-rails', '~> 3.9'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :production, :test do
|
group :production, :test do
|
||||||
|
@ -116,7 +116,7 @@ end
|
||||||
group :test do
|
group :test do
|
||||||
gem 'capybara', '~> 3.29'
|
gem 'capybara', '~> 3.29'
|
||||||
gem 'climate_control', '~> 0.2'
|
gem 'climate_control', '~> 0.2'
|
||||||
gem 'faker', '~> 2.5'
|
gem 'faker', '~> 2.6'
|
||||||
gem 'microformats', '~> 4.1'
|
gem 'microformats', '~> 4.1'
|
||||||
gem 'rails-controller-testing', '~> 1.0'
|
gem 'rails-controller-testing', '~> 1.0'
|
||||||
gem 'rspec-sidekiq', '~> 3.0'
|
gem 'rspec-sidekiq', '~> 3.0'
|
||||||
|
@ -126,15 +126,15 @@ group :test do
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'active_record_query_trace', '~> 1.6'
|
gem 'active_record_query_trace', '~> 1.7'
|
||||||
gem 'annotate', '~> 2.7'
|
gem 'annotate', '~> 3.0'
|
||||||
gem 'better_errors', '~> 2.5'
|
gem 'better_errors', '~> 2.5'
|
||||||
gem 'binding_of_caller', '~> 0.7'
|
gem 'binding_of_caller', '~> 0.7'
|
||||||
gem 'bullet', '~> 6.0'
|
gem 'bullet', '~> 6.0'
|
||||||
gem 'letter_opener', '~> 1.7'
|
gem 'letter_opener', '~> 1.7'
|
||||||
gem 'letter_opener_web', '~> 1.3'
|
gem 'letter_opener_web', '~> 1.3'
|
||||||
gem 'memory_profiler'
|
gem 'memory_profiler'
|
||||||
gem 'rubocop', '~> 0.74', require: false
|
gem 'rubocop', '~> 0.75', require: false
|
||||||
gem 'rubocop-rails', '~> 2.3', require: false
|
gem 'rubocop-rails', '~> 2.3', require: false
|
||||||
gem 'brakeman', '~> 4.6', require: false
|
gem 'brakeman', '~> 4.6', require: false
|
||||||
gem 'bundler-audit', '~> 0.6', require: false
|
gem 'bundler-audit', '~> 0.6', require: false
|
||||||
|
|
98
Gemfile.lock
|
@ -72,7 +72,7 @@ GEM
|
||||||
activemodel (>= 4.1, < 6.1)
|
activemodel (>= 4.1, < 6.1)
|
||||||
case_transform (>= 0.2)
|
case_transform (>= 0.2)
|
||||||
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
||||||
active_record_query_trace (1.6.2)
|
active_record_query_trace (1.7)
|
||||||
activejob (5.2.3)
|
activejob (5.2.3)
|
||||||
activesupport (= 5.2.3)
|
activesupport (= 5.2.3)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
|
@ -95,7 +95,7 @@ GEM
|
||||||
public_suffix (>= 2.0.2, < 5.0)
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
airbrussh (1.3.4)
|
airbrussh (1.3.4)
|
||||||
sshkit (>= 1.6.1, != 1.7.0)
|
sshkit (>= 1.6.1, != 1.7.0)
|
||||||
annotate (2.7.5)
|
annotate (3.0.2)
|
||||||
activerecord (>= 3.2, < 7.0)
|
activerecord (>= 3.2, < 7.0)
|
||||||
rake (>= 10.4, < 13.0)
|
rake (>= 10.4, < 13.0)
|
||||||
arel (9.0.0)
|
arel (9.0.0)
|
||||||
|
@ -105,17 +105,17 @@ GEM
|
||||||
av (0.9.0)
|
av (0.9.0)
|
||||||
cocaine (~> 0.5.3)
|
cocaine (~> 0.5.3)
|
||||||
aws-eventstream (1.0.3)
|
aws-eventstream (1.0.3)
|
||||||
aws-partitions (1.207.0)
|
aws-partitions (1.230.0)
|
||||||
aws-sdk-core (3.65.1)
|
aws-sdk-core (3.72.0)
|
||||||
aws-eventstream (~> 1.0, >= 1.0.2)
|
aws-eventstream (~> 1.0, >= 1.0.2)
|
||||||
aws-partitions (~> 1.0)
|
aws-partitions (~> 1, >= 1.228.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
jmespath (~> 1.0)
|
jmespath (~> 1.0)
|
||||||
aws-sdk-kms (1.24.0)
|
aws-sdk-kms (1.25.0)
|
||||||
aws-sdk-core (~> 3, >= 3.61.1)
|
aws-sdk-core (~> 3, >= 3.71.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.48.0)
|
aws-sdk-s3 (1.52.0)
|
||||||
aws-sdk-core (~> 3, >= 3.61.1)
|
aws-sdk-core (~> 3, >= 3.71.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sigv4 (1.1.0)
|
aws-sigv4 (1.1.0)
|
||||||
|
@ -184,17 +184,17 @@ GEM
|
||||||
connection_pool (2.2.2)
|
connection_pool (2.2.2)
|
||||||
crack (0.4.3)
|
crack (0.4.3)
|
||||||
safe_yaml (~> 1.0.0)
|
safe_yaml (~> 1.0.0)
|
||||||
crass (1.0.4)
|
crass (1.0.5)
|
||||||
css_parser (1.7.0)
|
css_parser (1.7.0)
|
||||||
addressable
|
addressable
|
||||||
debug_inspector (0.0.3)
|
debug_inspector (0.0.3)
|
||||||
derailed_benchmarks (1.4.0)
|
derailed_benchmarks (1.4.1)
|
||||||
benchmark-ips (~> 2)
|
benchmark-ips (~> 2)
|
||||||
get_process_mem (~> 0)
|
get_process_mem (~> 0)
|
||||||
heapy (~> 0)
|
heapy (~> 0)
|
||||||
memory_profiler (~> 0)
|
memory_profiler (~> 0)
|
||||||
rack (>= 1)
|
rack (>= 1)
|
||||||
rake (> 10, < 13)
|
rake (> 10, < 14)
|
||||||
ruby-statistics (>= 2.1)
|
ruby-statistics (>= 2.1)
|
||||||
thor (~> 0.19)
|
thor (~> 0.19)
|
||||||
devise (4.7.1)
|
devise (4.7.1)
|
||||||
|
@ -235,13 +235,13 @@ GEM
|
||||||
multi_json
|
multi_json
|
||||||
encryptor (3.0.0)
|
encryptor (3.0.0)
|
||||||
equatable (0.6.1)
|
equatable (0.6.1)
|
||||||
erubi (1.8.0)
|
erubi (1.9.0)
|
||||||
et-orbi (1.1.6)
|
et-orbi (1.1.6)
|
||||||
tzinfo
|
tzinfo
|
||||||
excon (0.62.0)
|
excon (0.62.0)
|
||||||
fabrication (2.20.2)
|
fabrication (2.20.2)
|
||||||
faker (2.5.0)
|
faker (2.6.0)
|
||||||
i18n (~> 1.6.0)
|
i18n (>= 1.6, < 1.8)
|
||||||
faraday (0.15.4)
|
faraday (0.15.4)
|
||||||
multipart-post (>= 1.2, < 3)
|
multipart-post (>= 1.2, < 3)
|
||||||
fast_blank (1.0.0)
|
fast_blank (1.0.0)
|
||||||
|
@ -305,7 +305,7 @@ GEM
|
||||||
httplog (1.3.2)
|
httplog (1.3.2)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
rainbow (>= 2.0.0)
|
rainbow (>= 2.0.0)
|
||||||
i18n (1.6.0)
|
i18n (1.7.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
i18n-tasks (0.9.29)
|
i18n-tasks (0.9.29)
|
||||||
activesupport (>= 4.0.2)
|
activesupport (>= 4.0.2)
|
||||||
|
@ -356,7 +356,7 @@ GEM
|
||||||
activesupport (>= 4)
|
activesupport (>= 4)
|
||||||
railties (>= 4)
|
railties (>= 4)
|
||||||
request_store (~> 1.0)
|
request_store (~> 1.0)
|
||||||
loofah (2.2.3)
|
loofah (2.3.1)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
mail (2.7.1)
|
mail (2.7.1)
|
||||||
|
@ -378,7 +378,7 @@ GEM
|
||||||
mimemagic (0.3.3)
|
mimemagic (0.3.3)
|
||||||
mini_mime (1.0.2)
|
mini_mime (1.0.2)
|
||||||
mini_portile2 (2.4.0)
|
mini_portile2 (2.4.0)
|
||||||
minitest (5.12.0)
|
minitest (5.12.2)
|
||||||
msgpack (1.3.1)
|
msgpack (1.3.1)
|
||||||
multi_json (1.13.1)
|
multi_json (1.13.1)
|
||||||
multipart-post (2.1.1)
|
multipart-post (2.1.1)
|
||||||
|
@ -397,7 +397,7 @@ GEM
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
sidekiq (>= 3.5)
|
sidekiq (>= 3.5)
|
||||||
statsd-ruby (~> 1.4, >= 1.4.0)
|
statsd-ruby (~> 1.4, >= 1.4.0)
|
||||||
oj (3.9.1)
|
oj (3.9.2)
|
||||||
omniauth (1.9.0)
|
omniauth (1.9.0)
|
||||||
hashie (>= 3.4.6, < 3.7.0)
|
hashie (>= 3.4.6, < 3.7.0)
|
||||||
rack (>= 1.6.2, < 3)
|
rack (>= 1.6.2, < 3)
|
||||||
|
@ -426,7 +426,7 @@ GEM
|
||||||
parallel (1.17.0)
|
parallel (1.17.0)
|
||||||
parallel_tests (2.29.2)
|
parallel_tests (2.29.2)
|
||||||
parallel
|
parallel
|
||||||
parser (2.6.4.0)
|
parser (2.6.5.0)
|
||||||
ast (~> 2.4.0)
|
ast (~> 2.4.0)
|
||||||
parslet (1.8.2)
|
parslet (1.8.2)
|
||||||
pastel (0.7.3)
|
pastel (0.7.3)
|
||||||
|
@ -435,7 +435,7 @@ GEM
|
||||||
pg (1.1.4)
|
pg (1.1.4)
|
||||||
pghero (2.3.0)
|
pghero (2.3.0)
|
||||||
activerecord (>= 5)
|
activerecord (>= 5)
|
||||||
pkg-config (1.3.9)
|
pkg-config (1.4.0)
|
||||||
premailer (1.11.1)
|
premailer (1.11.1)
|
||||||
addressable
|
addressable
|
||||||
css_parser (>= 1.6.0)
|
css_parser (>= 1.6.0)
|
||||||
|
@ -462,7 +462,7 @@ GEM
|
||||||
rack-attack (6.1.0)
|
rack-attack (6.1.0)
|
||||||
rack (>= 1.0, < 3)
|
rack (>= 1.0, < 3)
|
||||||
rack-cors (1.0.3)
|
rack-cors (1.0.3)
|
||||||
rack-protection (2.0.5)
|
rack-protection (2.0.7)
|
||||||
rack
|
rack
|
||||||
rack-proxy (0.6.5)
|
rack-proxy (0.6.5)
|
||||||
rack
|
rack
|
||||||
|
@ -488,8 +488,8 @@ GEM
|
||||||
rails-dom-testing (2.0.3)
|
rails-dom-testing (2.0.3)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.2.0)
|
rails-html-sanitizer (1.3.0)
|
||||||
loofah (~> 2.2, >= 2.2.2)
|
loofah (~> 2.3)
|
||||||
rails-i18n (5.1.3)
|
rails-i18n (5.1.3)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
railties (>= 5.0, < 6)
|
railties (>= 5.0, < 6)
|
||||||
|
@ -537,27 +537,27 @@ GEM
|
||||||
rpam2 (4.0.2)
|
rpam2 (4.0.2)
|
||||||
rqrcode (0.10.1)
|
rqrcode (0.10.1)
|
||||||
chunky_png (~> 1.0)
|
chunky_png (~> 1.0)
|
||||||
rspec-core (3.8.0)
|
rspec-core (3.9.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.9.0)
|
||||||
rspec-expectations (3.8.2)
|
rspec-expectations (3.9.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.9.0)
|
||||||
rspec-mocks (3.8.0)
|
rspec-mocks (3.9.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.9.0)
|
||||||
rspec-rails (3.8.2)
|
rspec-rails (3.9.0)
|
||||||
actionpack (>= 3.0)
|
actionpack (>= 3.0)
|
||||||
activesupport (>= 3.0)
|
activesupport (>= 3.0)
|
||||||
railties (>= 3.0)
|
railties (>= 3.0)
|
||||||
rspec-core (~> 3.8.0)
|
rspec-core (~> 3.9.0)
|
||||||
rspec-expectations (~> 3.8.0)
|
rspec-expectations (~> 3.9.0)
|
||||||
rspec-mocks (~> 3.8.0)
|
rspec-mocks (~> 3.9.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.9.0)
|
||||||
rspec-sidekiq (3.0.3)
|
rspec-sidekiq (3.0.3)
|
||||||
rspec-core (~> 3.0, >= 3.0.0)
|
rspec-core (~> 3.0, >= 3.0.0)
|
||||||
sidekiq (>= 2.4.0)
|
sidekiq (>= 2.4.0)
|
||||||
rspec-support (3.8.0)
|
rspec-support (3.9.0)
|
||||||
rubocop (0.74.0)
|
rubocop (0.75.1)
|
||||||
jaro_winkler (~> 1.5.1)
|
jaro_winkler (~> 1.5.1)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 2.6)
|
parser (>= 2.6)
|
||||||
|
@ -590,13 +590,13 @@ GEM
|
||||||
rufus-scheduler (~> 3.2)
|
rufus-scheduler (~> 3.2)
|
||||||
sidekiq (>= 3)
|
sidekiq (>= 3)
|
||||||
tilt (>= 1.4.0)
|
tilt (>= 1.4.0)
|
||||||
sidekiq-unique-jobs (6.0.13)
|
sidekiq-unique-jobs (6.0.15)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.5)
|
concurrent-ruby (~> 1.0, >= 1.0.5)
|
||||||
sidekiq (>= 4.0, < 7.0)
|
sidekiq (>= 4.0, < 7.0)
|
||||||
thor (~> 0)
|
thor (~> 0)
|
||||||
simple-navigation (4.1.0)
|
simple-navigation (4.1.0)
|
||||||
activesupport (>= 2.3.2)
|
activesupport (>= 2.3.2)
|
||||||
simple_form (4.1.0)
|
simple_form (5.0.1)
|
||||||
actionpack (>= 5.0)
|
actionpack (>= 5.0)
|
||||||
activemodel (>= 5.0)
|
activemodel (>= 5.0)
|
||||||
simplecov (0.17.1)
|
simplecov (0.17.1)
|
||||||
|
@ -614,12 +614,12 @@ GEM
|
||||||
sshkit (1.20.0)
|
sshkit (1.20.0)
|
||||||
net-scp (>= 1.1.2)
|
net-scp (>= 1.1.2)
|
||||||
net-ssh (>= 2.8.0)
|
net-ssh (>= 2.8.0)
|
||||||
stackprof (0.2.12)
|
stackprof (0.2.13)
|
||||||
statsd-ruby (1.4.0)
|
statsd-ruby (1.4.0)
|
||||||
stoplight (2.1.3)
|
stoplight (2.1.3)
|
||||||
streamio-ffmpeg (3.0.2)
|
streamio-ffmpeg (3.0.2)
|
||||||
multi_json (~> 1.8)
|
multi_json (~> 1.8)
|
||||||
strong_migrations (0.4.1)
|
strong_migrations (0.4.2)
|
||||||
activerecord (>= 5)
|
activerecord (>= 5)
|
||||||
temple (0.8.1)
|
temple (0.8.1)
|
||||||
terminal-table (1.8.0)
|
terminal-table (1.8.0)
|
||||||
|
@ -678,10 +678,10 @@ PLATFORMS
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
active_model_serializers (~> 0.10)
|
active_model_serializers (~> 0.10)
|
||||||
active_record_query_trace (~> 1.6)
|
active_record_query_trace (~> 1.7)
|
||||||
addressable (~> 2.7)
|
addressable (~> 2.7)
|
||||||
annotate (~> 2.7)
|
annotate (~> 3.0)
|
||||||
aws-sdk-s3 (~> 1.48)
|
aws-sdk-s3 (~> 1.52)
|
||||||
better_errors (~> 2.5)
|
better_errors (~> 2.5)
|
||||||
binding_of_caller (~> 0.7)
|
binding_of_caller (~> 0.7)
|
||||||
blurhash (~> 0.1)
|
blurhash (~> 0.1)
|
||||||
|
@ -709,7 +709,7 @@ DEPENDENCIES
|
||||||
doorkeeper (~> 5.2)
|
doorkeeper (~> 5.2)
|
||||||
dotenv-rails (~> 2.7)
|
dotenv-rails (~> 2.7)
|
||||||
fabrication (~> 2.20)
|
fabrication (~> 2.20)
|
||||||
faker (~> 2.5)
|
faker (~> 2.6)
|
||||||
fast_blank (~> 1.0)
|
fast_blank (~> 1.0)
|
||||||
fastimage
|
fastimage
|
||||||
fog-core (<= 2.1.0)
|
fog-core (<= 2.1.0)
|
||||||
|
@ -756,7 +756,7 @@ DEPENDENCIES
|
||||||
parslet
|
parslet
|
||||||
pg (~> 1.1)
|
pg (~> 1.1)
|
||||||
pghero (~> 2.3)
|
pghero (~> 2.3)
|
||||||
pkg-config (~> 1.3)
|
pkg-config (~> 1.4)
|
||||||
posix-spawn!
|
posix-spawn!
|
||||||
premailer-rails
|
premailer-rails
|
||||||
private_address_check (~> 0.5)
|
private_address_check (~> 0.5)
|
||||||
|
@ -775,9 +775,9 @@ DEPENDENCIES
|
||||||
redis-namespace (~> 1.5)
|
redis-namespace (~> 1.5)
|
||||||
redis-rails (~> 5.0)
|
redis-rails (~> 5.0)
|
||||||
rqrcode (~> 0.10)
|
rqrcode (~> 0.10)
|
||||||
rspec-rails (~> 3.8)
|
rspec-rails (~> 3.9)
|
||||||
rspec-sidekiq (~> 3.0)
|
rspec-sidekiq (~> 3.0)
|
||||||
rubocop (~> 0.74)
|
rubocop (~> 0.75)
|
||||||
rubocop-rails (~> 2.3)
|
rubocop-rails (~> 2.3)
|
||||||
ruby-progressbar (~> 1.10)
|
ruby-progressbar (~> 1.10)
|
||||||
sanitize (~> 5.1)
|
sanitize (~> 5.1)
|
||||||
|
@ -786,7 +786,7 @@ DEPENDENCIES
|
||||||
sidekiq-scheduler (~> 3.0)
|
sidekiq-scheduler (~> 3.0)
|
||||||
sidekiq-unique-jobs (~> 6.0)
|
sidekiq-unique-jobs (~> 6.0)
|
||||||
simple-navigation (~> 4.1)
|
simple-navigation (~> 4.1)
|
||||||
simple_form (~> 4.1)
|
simple_form (~> 5.0)
|
||||||
simplecov (~> 0.17)
|
simplecov (~> 0.17)
|
||||||
sprockets-rails (~> 3.2)
|
sprockets-rails (~> 3.2)
|
||||||
stackprof
|
stackprof
|
||||||
|
|
|
@ -78,7 +78,7 @@ A **Vagrant** configuration is included for development purposes.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Mastodon is **free, open source software** licensed under **AGPLv3**.
|
Mastodon is **free, open-source software** licensed under **AGPLv3**.
|
||||||
|
|
||||||
You can open issues for bugs you've found or features you think are missing. You can also submit pull requests to this repository, or submit translations using Weblate. To get started, take a look at [CONTRIBUTING.md](CONTRIBUTING.md). If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon).
|
You can open issues for bugs you've found or features you think are missing. You can also submit pull requests to this repository, or submit translations using Weblate. To get started, take a look at [CONTRIBUTING.md](CONTRIBUTING.md). If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon).
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
|
||||||
|
|
||||||
before_action :skip_unknown_actor_delete
|
before_action :skip_unknown_actor_delete
|
||||||
before_action :require_signature!
|
before_action :require_signature!
|
||||||
|
skip_before_action :authenticate_user!
|
||||||
|
|
||||||
def create
|
def create
|
||||||
upgrade_account
|
upgrade_account
|
||||||
|
|
|
@ -23,12 +23,7 @@ module Localized
|
||||||
if ENV['DEFAULT_LOCALE'].present?
|
if ENV['DEFAULT_LOCALE'].present?
|
||||||
I18n.default_locale
|
I18n.default_locale
|
||||||
else
|
else
|
||||||
case request_locale
|
request_locale || I18n.default_locale
|
||||||
when /en\b/, nil
|
|
||||||
I18n.default_locale
|
|
||||||
else
|
|
||||||
request_locale
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,7 @@ class Settings::PreferencesController < Settings::BaseController
|
||||||
:setting_use_blurhash,
|
:setting_use_blurhash,
|
||||||
:setting_use_pending_items,
|
:setting_use_pending_items,
|
||||||
:setting_trends,
|
:setting_trends,
|
||||||
|
:setting_crop_images,
|
||||||
notification_emails: %i(follow follow_request reblog favourite mention digest report pending_account trending_tag),
|
notification_emails: %i(follow follow_request reblog favourite mention digest report pending_account trending_tag),
|
||||||
interactions: %i(must_be_follower must_be_following must_be_following_dm)
|
interactions: %i(must_be_follower must_be_following must_be_following_dm)
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module AccountsHelper
|
||||||
|
def display_name(account, **options)
|
||||||
|
if options[:custom_emojify]
|
||||||
|
Formatter.instance.format_display_name(account, options)
|
||||||
|
else
|
||||||
|
account.display_name.presence || account.username
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def acct(account)
|
||||||
|
if account.local?
|
||||||
|
"@#{account.acct}@#{Rails.configuration.x.local_domain}"
|
||||||
|
else
|
||||||
|
"@#{account.acct}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_action_button(account)
|
||||||
|
if user_signed_in?
|
||||||
|
if account.id == current_user.account_id
|
||||||
|
link_to settings_profile_url, class: 'button logo-button' do
|
||||||
|
safe_join([svg_logo, t('settings.edit_profile')])
|
||||||
|
end
|
||||||
|
elsif current_account.following?(account) || current_account.requested?(account)
|
||||||
|
link_to account_unfollow_path(account), class: 'button logo-button button--destructive', data: { method: :post } do
|
||||||
|
safe_join([svg_logo, t('accounts.unfollow')])
|
||||||
|
end
|
||||||
|
elsif !(account.memorial? || account.moved?)
|
||||||
|
link_to account_follow_path(account), class: "button logo-button#{account.blocking?(current_account) ? ' disabled' : ''}", data: { method: :post } do
|
||||||
|
safe_join([svg_logo, t('accounts.follow')])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elsif !(account.memorial? || account.moved?)
|
||||||
|
link_to account_remote_follow_path(account), class: 'button logo-button modal-button', target: '_new' do
|
||||||
|
safe_join([svg_logo, t('accounts.follow')])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def minimal_account_action_button(account)
|
||||||
|
if user_signed_in?
|
||||||
|
return if account.id == current_user.account_id
|
||||||
|
|
||||||
|
if current_account.following?(account) || current_account.requested?(account)
|
||||||
|
link_to account_unfollow_path(account), class: 'icon-button active', data: { method: :post }, title: t('accounts.unfollow') do
|
||||||
|
fa_icon('user-times fw')
|
||||||
|
end
|
||||||
|
elsif !(account.memorial? || account.moved?)
|
||||||
|
link_to account_follow_path(account), class: "icon-button#{account.blocking?(current_account) ? ' disabled' : ''}", data: { method: :post }, title: t('accounts.follow') do
|
||||||
|
fa_icon('user-plus fw')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elsif !(account.memorial? || account.moved?)
|
||||||
|
link_to account_remote_follow_path(account), class: 'icon-button modal-button', target: '_new', title: t('accounts.follow') do
|
||||||
|
fa_icon('user-plus fw')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_badge(account, all: false)
|
||||||
|
if account.bot?
|
||||||
|
content_tag(:div, content_tag(:div, t('accounts.roles.bot'), class: 'account-role bot'), class: 'roles')
|
||||||
|
elsif (Setting.show_staff_badge && account.user_staff?) || all
|
||||||
|
content_tag(:div, class: 'roles') do
|
||||||
|
if all && !account.user_staff?
|
||||||
|
content_tag(:div, t('admin.accounts.roles.user'), class: 'account-role')
|
||||||
|
elsif account.user_admin?
|
||||||
|
content_tag(:div, t('accounts.roles.admin'), class: 'account-role admin')
|
||||||
|
elsif account.user_moderator?
|
||||||
|
content_tag(:div, t('accounts.roles.moderator'), class: 'account-role moderator')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_description(account)
|
||||||
|
prepend_str = [
|
||||||
|
[
|
||||||
|
number_to_human(account.statuses_count, strip_insignificant_zeros: true),
|
||||||
|
I18n.t('accounts.posts', count: account.statuses_count),
|
||||||
|
].join(' '),
|
||||||
|
|
||||||
|
[
|
||||||
|
number_to_human(account.following_count, strip_insignificant_zeros: true),
|
||||||
|
I18n.t('accounts.following', count: account.following_count),
|
||||||
|
].join(' '),
|
||||||
|
|
||||||
|
[
|
||||||
|
number_to_human(account.followers_count, strip_insignificant_zeros: true),
|
||||||
|
I18n.t('accounts.followers', count: account.followers_count),
|
||||||
|
].join(' '),
|
||||||
|
].join(', ')
|
||||||
|
|
||||||
|
[prepend_str, account.note].join(' · ')
|
||||||
|
end
|
||||||
|
|
||||||
|
def svg_logo
|
||||||
|
content_tag(:svg, tag(:use, 'xlink:href' => '#mastodon-svg-logo'), 'viewBox' => '0 0 216.4144 232.00976')
|
||||||
|
end
|
||||||
|
|
||||||
|
def svg_logo_full
|
||||||
|
content_tag(:svg, tag(:use, 'xlink:href' => '#mastodon-svg-logo-full'), 'viewBox' => '0 0 713.35878 175.8678')
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
module SettingsHelper
|
module SettingsHelper
|
||||||
HUMAN_LOCALES = {
|
HUMAN_LOCALES = {
|
||||||
en: 'English',
|
|
||||||
'en-CY': 'English (Cybre)',
|
|
||||||
ar: 'العربية',
|
ar: 'العربية',
|
||||||
ast: 'Asturianu',
|
ast: 'Asturianu',
|
||||||
bg: 'Български',
|
bg: 'Български',
|
||||||
|
|
|
@ -4,80 +4,6 @@ module StatusesHelper
|
||||||
EMBEDDED_CONTROLLER = 'statuses'
|
EMBEDDED_CONTROLLER = 'statuses'
|
||||||
EMBEDDED_ACTION = 'embed'
|
EMBEDDED_ACTION = 'embed'
|
||||||
|
|
||||||
def display_name(account, **options)
|
|
||||||
if options[:custom_emojify]
|
|
||||||
Formatter.instance.format_display_name(account, options)
|
|
||||||
else
|
|
||||||
account.display_name.presence || account.username
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def account_action_button(account)
|
|
||||||
if user_signed_in?
|
|
||||||
if account.id == current_user.account_id
|
|
||||||
link_to settings_profile_url, class: 'button logo-button' do
|
|
||||||
safe_join([svg_logo, t('settings.edit_profile')])
|
|
||||||
end
|
|
||||||
elsif current_account.following?(account) || current_account.requested?(account)
|
|
||||||
link_to account_unfollow_path(account), class: 'button logo-button button--destructive', data: { method: :post } do
|
|
||||||
safe_join([svg_logo, t('accounts.unfollow')])
|
|
||||||
end
|
|
||||||
elsif !(account.memorial? || account.moved?)
|
|
||||||
link_to account_follow_path(account), class: "button logo-button#{account.blocking?(current_account) ? ' disabled' : ''}", data: { method: :post } do
|
|
||||||
safe_join([svg_logo, t('accounts.follow')])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
elsif !(account.memorial? || account.moved?)
|
|
||||||
link_to account_remote_follow_path(account), class: 'button logo-button modal-button', target: '_new' do
|
|
||||||
safe_join([svg_logo, t('accounts.follow')])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def minimal_account_action_button(account)
|
|
||||||
if user_signed_in?
|
|
||||||
return if account.id == current_user.account_id
|
|
||||||
|
|
||||||
if current_account.following?(account) || current_account.requested?(account)
|
|
||||||
link_to account_unfollow_path(account), class: 'icon-button active', data: { method: :post }, title: t('accounts.unfollow') do
|
|
||||||
fa_icon('user-times fw')
|
|
||||||
end
|
|
||||||
elsif !(account.memorial? || account.moved?)
|
|
||||||
link_to account_follow_path(account), class: "icon-button#{account.blocking?(current_account) ? ' disabled' : ''}", data: { method: :post }, title: t('accounts.follow') do
|
|
||||||
fa_icon('user-plus fw')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
elsif !(account.memorial? || account.moved?)
|
|
||||||
link_to account_remote_follow_path(account), class: 'icon-button modal-button', target: '_new', title: t('accounts.follow') do
|
|
||||||
fa_icon('user-plus fw')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def svg_logo
|
|
||||||
content_tag(:svg, tag(:use, 'xlink:href' => '#mastodon-svg-logo'), 'viewBox' => '0 0 216.4144 232.00976')
|
|
||||||
end
|
|
||||||
|
|
||||||
def svg_logo_full
|
|
||||||
content_tag(:svg, tag(:use, 'xlink:href' => '#mastodon-svg-logo-full'), 'viewBox' => '0 0 713.35878 175.8678')
|
|
||||||
end
|
|
||||||
|
|
||||||
def account_badge(account, all: false)
|
|
||||||
if account.bot?
|
|
||||||
content_tag(:div, content_tag(:div, t('accounts.roles.bot'), class: 'account-role bot'), class: 'roles')
|
|
||||||
elsif (Setting.show_staff_badge && account.user_staff?) || all
|
|
||||||
content_tag(:div, class: 'roles') do
|
|
||||||
if all && !account.user_staff?
|
|
||||||
content_tag(:div, t('admin.accounts.roles.user'), class: 'account-role')
|
|
||||||
elsif account.user_admin?
|
|
||||||
content_tag(:div, t('accounts.roles.admin'), class: 'account-role admin')
|
|
||||||
elsif account.user_moderator?
|
|
||||||
content_tag(:div, t('accounts.roles.moderator'), class: 'account-role moderator')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def link_to_more(url)
|
def link_to_more(url)
|
||||||
link_to t('statuses.show_more'), url, class: 'load-more load-gap'
|
link_to t('statuses.show_more'), url, class: 'load-more load-gap'
|
||||||
end
|
end
|
||||||
|
@ -88,27 +14,6 @@ module StatusesHelper
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def account_description(account)
|
|
||||||
prepend_str = [
|
|
||||||
[
|
|
||||||
number_to_human(account.statuses_count, strip_insignificant_zeros: true),
|
|
||||||
I18n.t('accounts.posts', count: account.statuses_count),
|
|
||||||
].join(' '),
|
|
||||||
|
|
||||||
[
|
|
||||||
number_to_human(account.following_count, strip_insignificant_zeros: true),
|
|
||||||
I18n.t('accounts.following', count: account.following_count),
|
|
||||||
].join(' '),
|
|
||||||
|
|
||||||
[
|
|
||||||
number_to_human(account.followers_count, strip_insignificant_zeros: true),
|
|
||||||
I18n.t('accounts.followers', count: account.followers_count),
|
|
||||||
].join(' '),
|
|
||||||
].join(', ')
|
|
||||||
|
|
||||||
[prepend_str, account.note].join(' · ')
|
|
||||||
end
|
|
||||||
|
|
||||||
def media_summary(status)
|
def media_summary(status)
|
||||||
attachments = { image: 0, video: 0 }
|
attachments = { image: 0, video: 0 }
|
||||||
|
|
||||||
|
@ -154,14 +59,6 @@ module StatusesHelper
|
||||||
embedded_view? ? '_blank' : nil
|
embedded_view? ? '_blank' : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def acct(account)
|
|
||||||
if account.local?
|
|
||||||
"@#{account.acct}@#{Rails.configuration.x.local_domain}"
|
|
||||||
else
|
|
||||||
"@#{account.acct}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def style_classes(status, is_predecessor, is_successor, include_threads)
|
def style_classes(status, is_predecessor, is_successor, include_threads)
|
||||||
classes = ['entry']
|
classes = ['entry']
|
||||||
classes << 'entry-predecessor' if is_predecessor
|
classes << 'entry-predecessor' if is_predecessor
|
||||||
|
|
Before Width: | Height: | Size: 622 B |
Before Width: | Height: | Size: 223 KiB |
Before Width: | Height: | Size: 232 KiB |
Before Width: | Height: | Size: 378 B |
Before Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 34 KiB |
|
@ -1,64 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="384" version="1.1" height="384">
|
|
||||||
<g transform="translate(-282.71845,-76)" id="RenderLayer_LineSet">
|
|
||||||
<g id="strokes">
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path2" d="m 405.991,306.829 v 10 10 10 10 10 10 10 10 6.581 5.978 9.656 3.057" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path4" d="m 405.991,409.044 v 0 -9.656 -5.978 -10 -10 -10 -10 -10 -10 -10 -10 -6.581" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path6" d="m 370.692,127.899 v 1.329 10 1.4 10 0.947 4.955 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path8" d="m 439.906,283.073 v 0 h -10 -10 -10.303 -3.612 -10 -10 -10 -2.337 l -2.962,-2.901 v 0" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path10" d="m 373.654,283.073 -2.962,-2.901 v -10 -10 -10 -10 -10 -10 -1.283 -10 -10 -10 -10 -10 -9.658" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path12" d="m 370.692,127.899 h -7.383 -10 -2.899 -5.311 v 0 l -0.45,0.28 -0.37,0.387 -0.268,0.47 v 0.192 10 1.4 10 0.947 4.955 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283 2.901 10 4.487 5.906 3.363 10 10 10 10 10 10 10 10 6.581 l 6.235,6.039 7.183,6.957 2.643,2.56 3.237,3.135 v 0 h 7.383 2.962 10 10 10 2.337 v 0 0 -3.057" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path14" d="m 584.095,303.466 3.074,3.363 v 10 10 10 10 10 10 10 10 6.581 6.183 9.988 10e-4 0.001 2.518 h 6.497 10 2.976 7.534 v 0 0" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path16" d="m 615.989,393.41 v -10 -10 -10 -10 -10 -10 -10 -10 -6.581 -3.363 -5.906 -10 -4.487 -2.901 -10 -10 -10 -10 -10 -10 -1.283 -10 -10 -10 -10 -10 -9.658 -2.701 -4.955 -10 -0.947 -10 -1.4 -0.061 l -0.299,-0.524 -0.394,-0.413 -0.019,-0.019 v 0" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path18" d="m 584.093,129.228 h -10 -10 -10 -10 l -10,-0.001 h -10 -5.476 -10 -10 -10 -10 -10 -10 l -10,-0.001 h -8.828 -10 -10 -10 -0.326 -3.615 l -10,0.001 h -10 l -10,0.001 h -2.205 -2.951 v 0" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path20" d="m 615.277,128.211 v 0 l -0.501,-0.312 v 0 0 h -8.134 -10 -2.976 -6.497 v 1.329" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path22" d="m 615.69,128.643 0.299,0.524 v 0.061 10 1.4 10 0.947 4.955 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283 2.901 10 4.487 5.906 3.363 10 10 10 10 10 10 10 10 6.581 6.183 9.987 0.626 l -0.447,0.784 -0.617,0.644 -0.749,0.467" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path24" d="m 587.169,156.53 v 0 0 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283 l -3.074,2.901 h -10 -10 -10 -10 -10 -10 -5.424" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path26" d="m 370.692,129.228 v -1.329 0 0" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path28" d="m 584.093,129.228 h 3.076" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path30" d="m 350.41,140.628 h 10 2.899 v 10 0.947 h -3.555 -9.344 v 0" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path32" d="m 587.169,129.228 v 10 1.4 10 0.947 4.955" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path34" d="m 350.41,151.575 v -10 -0.947" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path36" d="m 593.666,151.575 v -10 -0.947 0 h 10 2.976" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path38" d="m 606.642,140.628 v 10 0.947 h -10 -2.976 v 0 -10 -0.947" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path40" d="m 615.69,128.643 -0.394,-0.413 -0.019,-0.019 v 0 l -0.501,-0.312" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path42" d="m 615.989,393.41 v 6.183 9.987 0.626 l -0.447,0.783 -0.576,0.603 -0.041,0.042 v 0" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path44" d="m 614.925,411.634 v 0 l -0.749,0.467" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path46" d="m 615.69,128.643 -0.009,-0.01 -0.404,-0.422 -0.501,-0.312" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path48" d="m 614.176,412.101 0.749,-0.467 v 0 l 0.041,-0.042 0.576,-0.603 0.447,-0.783 v -0.626 -9.987 -6.183" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path50" d="m 406.223,306.613 -0.232,0.216 v 0 l 0.232,-0.216 3.38,-3.147 h 10 10 10.303 10 10 10 10 10 10 10 8.765 10 10 1.007" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path52" d="m 518.671,283.073 v 0 h -10 -2.247" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path54" d="m 615.277,128.211 0.404,0.422" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path56" d="m 383.445,273.927 h 10 10 10 10 10 6.461" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path58" d="m 576.555,273.927 2.03,-0.051 1.978,-0.302 1.707,-0.727" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path60" d="m 582.27,272.847 1.099,-1.131 0.456,-1.309 0.077,-1.342" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path62" d="m 583.902,269.065 v -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -9.834 0 -10 -7.959" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path64" d="m 583.902,141.272 -0.077,-1.344 -0.457,-1.309 -1.098,-1.13" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path66" d="m 582.27,137.489 -1.709,-0.727 -1.977,-0.301 -2.029,-0.051" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path68" d="m 576.555,136.41 h -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -3.11 l -2.03,0.051 -1.978,0.302 -1.707,0.726" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path70" d="m 377.73,137.489 -1.099,1.131 -0.456,1.309 -0.077,1.343" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path72" d="m 376.098,269.065 0.077,1.343 0.457,1.309 1.098,1.13" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path74" d="m 377.73,272.847 1.709,0.727 1.977,0.302 2.029,0.051" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path76" d="m 457.882,318.176 v 10 10 10 10 10 10 10 8.996 l -0.375,1.491 -0.542,1.03" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path78" d="m 456.965,399.693 h -10 -10 -8.726 l -0.542,-1.03 -0.375,-1.491" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path80" d="m 539.678,303.466 -0.064,-0.035 h -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10.198 l -1.889,1.029 -1.304,1.491" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path82" d="m 543.74,411.917 v -2.465 -0.024 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -2.742 l -1.686,-1.925 -2.376,-1.295" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path84" d="m 427.612,316.452 0.42,-0.797 h 10 10 8.933 l 0.542,1.03 0.375,1.491" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path86" d="m 427.322,317.607 0.29,-1.155" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path88" d="m 350.41,151.575 v -10 -0.947" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path90" d="m 370.692,127.899 v 0" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path92" d="m 376.098,141.272 v 10 7.954 0.005 10 10 10 10 10 10 10 10 10 10 9.834" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path94" d="m 405.991,409.044 v 3.057" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path96" d="m 406.223,305.951 v 0.662 0 0 0 10 10 10 10 10 10 10 10 10 10 2.333 0.098 2.873" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path98" d="m 427.322,397.172 v -10 -10 -10 -10 -10 -10 -10 -9.565" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path100" d="m 405.991,409.044 h 0.232" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path102" d="m 506.424,283.073 h -3.436 -10 -10 -10 -10 -6.548 -3.543 -10e-4 -10 -2.99" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path104" d="m 406.223,411.917 h 10 10 10 10 10 10 10 10 10 10 10 10 10 7.517" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path106" d="m 518.671,273.927 h 10 10 10 10 10 7.884" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path108" d="m 439.906,273.927 h 6.803 v 0 h 2.704 10 10 10 10 10 10.551 2.65 10e-4 6.056" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path110" d="m 539.678,303.466 h 10 10 10 10 4.417" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path112" d="m 587.169,156.53 v 0" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path114" d="m 543.74,409.452 10,0.029 10,0.03 10,0.03 9.999,0.029 3.43,0.01" />
|
|
||||||
<path style="fill:none;stroke:#87B97D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path116" d="m 615.989,393.41 v -10 -10 -10 -10 -10 -10 -10 -10 -6.581" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 12 KiB |
|
@ -1,64 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="384" version="1.1" height="384">
|
|
||||||
<g transform="translate(-282.71845,-76)" id="RenderLayer_LineSet">
|
|
||||||
<g id="strokes">
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path2" d="m 405.991,306.829 v 10 10 10 10 10 10 10 10 6.581 5.978 9.656 3.057" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path4" d="m 405.991,409.044 v 0 -9.656 -5.978 -10 -10 -10 -10 -10 -10 -10 -10 -6.581" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path6" d="m 370.692,127.899 v 1.329 10 1.4 10 0.947 4.955 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path8" d="m 439.906,283.073 v 0 h -10 -10 -10.303 -3.612 -10 -10 -10 -2.337 l -2.962,-2.901 v 0" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path10" d="m 373.654,283.073 -2.962,-2.901 v -10 -10 -10 -10 -10 -10 -1.283 -10 -10 -10 -10 -10 -9.658" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path12" d="m 370.692,127.899 h -7.383 -10 -2.899 -5.311 v 0 l -0.45,0.28 -0.37,0.387 -0.268,0.47 v 0.192 10 1.4 10 0.947 4.955 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283 2.901 10 4.487 5.906 3.363 10 10 10 10 10 10 10 10 6.581 l 6.235,6.039 7.183,6.957 2.643,2.56 3.237,3.135 v 0 h 7.383 2.962 10 10 10 2.337 v 0 0 -3.057" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path14" d="m 584.095,303.466 3.074,3.363 v 10 10 10 10 10 10 10 10 6.581 6.183 9.988 10e-4 0.001 2.518 h 6.497 10 2.976 7.534 v 0 0" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path16" d="m 615.989,393.41 v -10 -10 -10 -10 -10 -10 -10 -10 -6.581 -3.363 -5.906 -10 -4.487 -2.901 -10 -10 -10 -10 -10 -10 -1.283 -10 -10 -10 -10 -10 -9.658 -2.701 -4.955 -10 -0.947 -10 -1.4 -0.061 l -0.299,-0.524 -0.394,-0.413 -0.019,-0.019 v 0" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path18" d="m 584.093,129.228 h -10 -10 -10 -10 l -10,-0.001 h -10 -5.476 -10 -10 -10 -10 -10 -10 l -10,-0.001 h -8.828 -10 -10 -10 -0.326 -3.615 l -10,0.001 h -10 l -10,0.001 h -2.205 -2.951 v 0" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path20" d="m 615.277,128.211 v 0 l -0.501,-0.312 v 0 0 h -8.134 -10 -2.976 -6.497 v 1.329" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path22" d="m 615.69,128.643 0.299,0.524 v 0.061 10 1.4 10 0.947 4.955 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283 2.901 10 4.487 5.906 3.363 10 10 10 10 10 10 10 10 6.581 6.183 9.987 0.626 l -0.447,0.784 -0.617,0.644 -0.749,0.467" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path24" d="m 587.169,156.53 v 0 0 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283 l -3.074,2.901 h -10 -10 -10 -10 -10 -10 -5.424" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path26" d="m 370.692,129.228 v -1.329 0 0" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path28" d="m 584.093,129.228 h 3.076" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path30" d="m 350.41,140.628 h 10 2.899 v 10 0.947 h -3.555 -9.344 v 0" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path32" d="m 587.169,129.228 v 10 1.4 10 0.947 4.955" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path34" d="m 350.41,151.575 v -10 -0.947" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path36" d="m 593.666,151.575 v -10 -0.947 0 h 10 2.976" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path38" d="m 606.642,140.628 v 10 0.947 h -10 -2.976 v 0 -10 -0.947" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path40" d="m 615.69,128.643 -0.394,-0.413 -0.019,-0.019 v 0 l -0.501,-0.312" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path42" d="m 615.989,393.41 v 6.183 9.987 0.626 l -0.447,0.783 -0.576,0.603 -0.041,0.042 v 0" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path44" d="m 614.925,411.634 v 0 l -0.749,0.467" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path46" d="m 615.69,128.643 -0.009,-0.01 -0.404,-0.422 -0.501,-0.312" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path48" d="m 614.176,412.101 0.749,-0.467 v 0 l 0.041,-0.042 0.576,-0.603 0.447,-0.783 v -0.626 -9.987 -6.183" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path50" d="m 406.223,306.613 -0.232,0.216 v 0 l 0.232,-0.216 3.38,-3.147 h 10 10 10.303 10 10 10 10 10 10 10 8.765 10 10 1.007" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path52" d="m 518.671,283.073 v 0 h -10 -2.247" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path54" d="m 615.277,128.211 0.404,0.422" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path56" d="m 383.445,273.927 h 10 10 10 10 10 6.461" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path58" d="m 576.555,273.927 2.03,-0.051 1.978,-0.302 1.707,-0.727" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path60" d="m 582.27,272.847 1.099,-1.131 0.456,-1.309 0.077,-1.342" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path62" d="m 583.902,269.065 v -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -9.834 0 -10 -7.959" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path64" d="m 583.902,141.272 -0.077,-1.344 -0.457,-1.309 -1.098,-1.13" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path66" d="m 582.27,137.489 -1.709,-0.727 -1.977,-0.301 -2.029,-0.051" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path68" d="m 576.555,136.41 h -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -3.11 l -2.03,0.051 -1.978,0.302 -1.707,0.726" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path70" d="m 377.73,137.489 -1.099,1.131 -0.456,1.309 -0.077,1.343" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path72" d="m 376.098,269.065 0.077,1.343 0.457,1.309 1.098,1.13" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path74" d="m 377.73,272.847 1.709,0.727 1.977,0.302 2.029,0.051" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path76" d="m 457.882,318.176 v 10 10 10 10 10 10 10 8.996 l -0.375,1.491 -0.542,1.03" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path78" d="m 456.965,399.693 h -10 -10 -8.726 l -0.542,-1.03 -0.375,-1.491" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path80" d="m 539.678,303.466 -0.064,-0.035 h -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10.198 l -1.889,1.029 -1.304,1.491" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path82" d="m 543.74,411.917 v -2.465 -0.024 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -2.742 l -1.686,-1.925 -2.376,-1.295" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path84" d="m 427.612,316.452 0.42,-0.797 h 10 10 8.933 l 0.542,1.03 0.375,1.491" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path86" d="m 427.322,317.607 0.29,-1.155" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path88" d="m 350.41,151.575 v -10 -0.947" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path90" d="m 370.692,127.899 v 0" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path92" d="m 376.098,141.272 v 10 7.954 0.005 10 10 10 10 10 10 10 10 10 10 9.834" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path94" d="m 405.991,409.044 v 3.057" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path96" d="m 406.223,305.951 v 0.662 0 0 0 10 10 10 10 10 10 10 10 10 10 2.333 0.098 2.873" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path98" d="m 427.322,397.172 v -10 -10 -10 -10 -10 -10 -10 -9.565" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path100" d="m 405.991,409.044 h 0.232" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path102" d="m 506.424,283.073 h -3.436 -10 -10 -10 -10 -6.548 -3.543 -10e-4 -10 -2.99" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path104" d="m 406.223,411.917 h 10 10 10 10 10 10 10 10 10 10 10 10 10 7.517" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path106" d="m 518.671,273.927 h 10 10 10 10 10 7.884" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path108" d="m 439.906,273.927 h 6.803 v 0 h 2.704 10 10 10 10 10 10.551 2.65 10e-4 6.056" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path110" d="m 539.678,303.466 h 10 10 10 10 4.417" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path112" d="m 587.169,156.53 v 0" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path114" d="m 543.74,409.452 10,0.029 10,0.03 10,0.03 9.999,0.029 3.43,0.01" />
|
|
||||||
<path style="fill:none;stroke:#A9713D;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path116" d="m 615.989,393.41 v -10 -10 -10 -10 -10 -10 -10 -10 -6.581" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 12 KiB |
|
@ -1,64 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="384" version="1.1" height="384">
|
|
||||||
<g transform="translate(-282.71845,-76)" id="RenderLayer_LineSet">
|
|
||||||
<g id="strokes">
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path2" d="m 405.991,306.829 v 10 10 10 10 10 10 10 10 6.581 5.978 9.656 3.057" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path4" d="m 405.991,409.044 v 0 -9.656 -5.978 -10 -10 -10 -10 -10 -10 -10 -10 -6.581" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path6" d="m 370.692,127.899 v 1.329 10 1.4 10 0.947 4.955 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path8" d="m 439.906,283.073 v 0 h -10 -10 -10.303 -3.612 -10 -10 -10 -2.337 l -2.962,-2.901 v 0" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path10" d="m 373.654,283.073 -2.962,-2.901 v -10 -10 -10 -10 -10 -10 -1.283 -10 -10 -10 -10 -10 -9.658" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path12" d="m 370.692,127.899 h -7.383 -10 -2.899 -5.311 v 0 l -0.45,0.28 -0.37,0.387 -0.268,0.47 v 0.192 10 1.4 10 0.947 4.955 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283 2.901 10 4.487 5.906 3.363 10 10 10 10 10 10 10 10 6.581 l 6.235,6.039 7.183,6.957 2.643,2.56 3.237,3.135 v 0 h 7.383 2.962 10 10 10 2.337 v 0 0 -3.057" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path14" d="m 584.095,303.466 3.074,3.363 v 10 10 10 10 10 10 10 10 6.581 6.183 9.988 10e-4 0.001 2.518 h 6.497 10 2.976 7.534 v 0 0" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path16" d="m 615.989,393.41 v -10 -10 -10 -10 -10 -10 -10 -10 -6.581 -3.363 -5.906 -10 -4.487 -2.901 -10 -10 -10 -10 -10 -10 -1.283 -10 -10 -10 -10 -10 -9.658 -2.701 -4.955 -10 -0.947 -10 -1.4 -0.061 l -0.299,-0.524 -0.394,-0.413 -0.019,-0.019 v 0" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path18" d="m 584.093,129.228 h -10 -10 -10 -10 l -10,-0.001 h -10 -5.476 -10 -10 -10 -10 -10 -10 l -10,-0.001 h -8.828 -10 -10 -10 -0.326 -3.615 l -10,0.001 h -10 l -10,0.001 h -2.205 -2.951 v 0" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path20" d="m 615.277,128.211 v 0 l -0.501,-0.312 v 0 0 h -8.134 -10 -2.976 -6.497 v 1.329" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path22" d="m 615.69,128.643 0.299,0.524 v 0.061 10 1.4 10 0.947 4.955 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283 2.901 10 4.487 5.906 3.363 10 10 10 10 10 10 10 10 6.581 6.183 9.987 0.626 l -0.447,0.784 -0.617,0.644 -0.749,0.467" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path24" d="m 587.169,156.53 v 0 0 2.701 10 10 10 10 10 9.658 10 10 10 10 10 10 1.283 l -3.074,2.901 h -10 -10 -10 -10 -10 -10 -5.424" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path26" d="m 370.692,129.228 v -1.329 0 0" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path28" d="m 584.093,129.228 h 3.076" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path30" d="m 350.41,140.628 h 10 2.899 v 10 0.947 h -3.555 -9.344 v 0" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path32" d="m 587.169,129.228 v 10 1.4 10 0.947 4.955" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path34" d="m 350.41,151.575 v -10 -0.947" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path36" d="m 593.666,151.575 v -10 -0.947 0 h 10 2.976" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path38" d="m 606.642,140.628 v 10 0.947 h -10 -2.976 v 0 -10 -0.947" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path40" d="m 615.69,128.643 -0.394,-0.413 -0.019,-0.019 v 0 l -0.501,-0.312" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path42" d="m 615.989,393.41 v 6.183 9.987 0.626 l -0.447,0.783 -0.576,0.603 -0.041,0.042 v 0" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path44" d="m 614.925,411.634 v 0 l -0.749,0.467" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path46" d="m 615.69,128.643 -0.009,-0.01 -0.404,-0.422 -0.501,-0.312" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path48" d="m 614.176,412.101 0.749,-0.467 v 0 l 0.041,-0.042 0.576,-0.603 0.447,-0.783 v -0.626 -9.987 -6.183" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path50" d="m 406.223,306.613 -0.232,0.216 v 0 l 0.232,-0.216 3.38,-3.147 h 10 10 10.303 10 10 10 10 10 10 10 8.765 10 10 1.007" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path52" d="m 518.671,283.073 v 0 h -10 -2.247" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path54" d="m 615.277,128.211 0.404,0.422" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path56" d="m 383.445,273.927 h 10 10 10 10 10 6.461" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path58" d="m 576.555,273.927 2.03,-0.051 1.978,-0.302 1.707,-0.727" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path60" d="m 582.27,272.847 1.099,-1.131 0.456,-1.309 0.077,-1.342" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path62" d="m 583.902,269.065 v -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -9.834 0 -10 -7.959" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path64" d="m 583.902,141.272 -0.077,-1.344 -0.457,-1.309 -1.098,-1.13" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path66" d="m 582.27,137.489 -1.709,-0.727 -1.977,-0.301 -2.029,-0.051" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path68" d="m 576.555,136.41 h -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -3.11 l -2.03,0.051 -1.978,0.302 -1.707,0.726" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path70" d="m 377.73,137.489 -1.099,1.131 -0.456,1.309 -0.077,1.343" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path72" d="m 376.098,269.065 0.077,1.343 0.457,1.309 1.098,1.13" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path74" d="m 377.73,272.847 1.709,0.727 1.977,0.302 2.029,0.051" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path76" d="m 457.882,318.176 v 10 10 10 10 10 10 10 8.996 l -0.375,1.491 -0.542,1.03" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path78" d="m 456.965,399.693 h -10 -10 -8.726 l -0.542,-1.03 -0.375,-1.491" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path80" d="m 539.678,303.466 -0.064,-0.035 h -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10.198 l -1.889,1.029 -1.304,1.491" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path82" d="m 543.74,411.917 v -2.465 -0.024 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -2.742 l -1.686,-1.925 -2.376,-1.295" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path84" d="m 427.612,316.452 0.42,-0.797 h 10 10 8.933 l 0.542,1.03 0.375,1.491" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path86" d="m 427.322,317.607 0.29,-1.155" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path88" d="m 350.41,151.575 v -10 -0.947" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path90" d="m 370.692,127.899 v 0" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path92" d="m 376.098,141.272 v 10 7.954 0.005 10 10 10 10 10 10 10 10 10 10 9.834" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path94" d="m 405.991,409.044 v 3.057" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path96" d="m 406.223,305.951 v 0.662 0 0 0 10 10 10 10 10 10 10 10 10 10 2.333 0.098 2.873" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path98" d="m 427.322,397.172 v -10 -10 -10 -10 -10 -10 -10 -9.565" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path100" d="m 405.991,409.044 h 0.232" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path102" d="m 506.424,283.073 h -3.436 -10 -10 -10 -10 -6.548 -3.543 -10e-4 -10 -2.99" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path104" d="m 406.223,411.917 h 10 10 10 10 10 10 10 10 10 10 10 10 10 7.517" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path106" d="m 518.671,273.927 h 10 10 10 10 10 7.884" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path108" d="m 439.906,273.927 h 6.803 v 0 h 2.704 10 10 10 10 10 10.551 2.65 10e-4 6.056" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path110" d="m 539.678,303.466 h 10 10 10 10 4.417" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path112" d="m 587.169,156.53 v 0" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path114" d="m 543.74,409.452 10,0.029 10,0.03 10,0.03 9.999,0.029 3.43,0.01" />
|
|
||||||
<path style="fill:none;stroke:#CB7590;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" id="path116" d="m 615.989,393.41 v -10 -10 -10 -10 -10 -10 -10 -10 -6.581" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 786 KiB |
Before Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 398 KiB |
Before Width: | Height: | Size: 497 B |
Before Width: | Height: | Size: 356 B |
Before Width: | Height: | Size: 390 B |
Before Width: | Height: | Size: 452 B |
Before Width: | Height: | Size: 589 B |
Before Width: | Height: | Size: 561 B |
Before Width: | Height: | Size: 328 B |
Before Width: | Height: | Size: 457 B |
Before Width: | Height: | Size: 384 B |
Before Width: | Height: | Size: 326 B |
Before Width: | Height: | Size: 437 B |
Before Width: | Height: | Size: 599 B |
Before Width: | Height: | Size: 383 B |
Before Width: | Height: | Size: 411 B |
Before Width: | Height: | Size: 282 B |
Before Width: | Height: | Size: 337 B |
Before Width: | Height: | Size: 688 B |
Before Width: | Height: | Size: 639 B |
Before Width: | Height: | Size: 498 B |
Before Width: | Height: | Size: 149 KiB |
Before Width: | Height: | Size: 184 KiB |
Before Width: | Height: | Size: 263 B |
|
@ -25,7 +25,7 @@ export default class AttachmentList extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li key={attachment.get('id')}>
|
<li key={attachment.get('id')}>
|
||||||
<a href={displayUrl} target='_blank' rel='noopener'><Icon id='link' /> {filename(displayUrl)}</a>
|
<a href={displayUrl} target='_blank' rel='noopener noreferrer'><Icon id='link' /> {filename(displayUrl)}</a>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
@ -46,7 +46,7 @@ export default class AttachmentList extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li key={attachment.get('id')}>
|
<li key={attachment.get('id')}>
|
||||||
<a href={displayUrl} target='_blank' rel='noopener'>{filename(displayUrl)}</a>
|
<a href={displayUrl} target='_blank' rel='noopener noreferrer'>{filename(displayUrl)}</a>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|
|
@ -143,7 +143,7 @@ class DropdownMenu extends React.PureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li className='dropdown-menu__item' key={`${text}-${i}`}>
|
<li className='dropdown-menu__item' key={`${text}-${i}`}>
|
||||||
<a href={href} target={target} data-method={method} rel='noopener' role='button' tabIndex='0' ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyPress={this.handleItemKeyPress} data-index={i}>
|
<a href={href} target={target} data-method={method} rel='noopener noreferrer' role='button' tabIndex='0' ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyPress={this.handleItemKeyPress} data-index={i}>
|
||||||
{text}
|
{text}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -58,7 +58,7 @@ export default class ErrorBoundary extends React.PureComponent {
|
||||||
<div>
|
<div>
|
||||||
<p className='error-boundary__error'><FormattedMessage id='error.unexpected_crash.explanation' defaultMessage='Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.' /></p>
|
<p className='error-boundary__error'><FormattedMessage id='error.unexpected_crash.explanation' defaultMessage='Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.' /></p>
|
||||||
<p><FormattedMessage id='error.unexpected_crash.next_steps' defaultMessage='Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.' /></p>
|
<p><FormattedMessage id='error.unexpected_crash.next_steps' defaultMessage='Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.' /></p>
|
||||||
<p className='error-boundary__footer'>Mastodon v{version} · <a href={source_url} rel='noopener' target='_blank'><FormattedMessage id='errors.unexpected_crash.report_issue' defaultMessage='Report issue' /></a> · <button onClick={this.handleCopyStackTrace} className={copied && 'copied'}><FormattedMessage id='errors.unexpected_crash.copy_stacktrace' defaultMessage='Copy stacktrace to clipboard' /></button></p>
|
<p className='error-boundary__footer'>Mastodon v{version} · <a href={source_url} rel='noopener noreferrer' target='_blank'><FormattedMessage id='errors.unexpected_crash.report_issue' defaultMessage='Report issue' /></a> · <button onClick={this.handleCopyStackTrace} className={copied && 'copied'}><FormattedMessage id='errors.unexpected_crash.copy_stacktrace' defaultMessage='Copy stacktrace to clipboard' /></button></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Motion from '../features/ui/util/optional_motion';
|
|
||||||
import spring from 'react-motion/lib/spring';
|
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import Icon from 'mastodon/components/icon';
|
import Icon from 'mastodon/components/icon';
|
||||||
|
@ -37,6 +35,21 @@ export default class IconButton extends React.PureComponent {
|
||||||
tabIndex: '0',
|
tabIndex: '0',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
state = {
|
||||||
|
activate: false,
|
||||||
|
deactivate: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillReceiveProps (nextProps) {
|
||||||
|
if (!nextProps.animate) return;
|
||||||
|
|
||||||
|
if (this.props.active && !nextProps.active) {
|
||||||
|
this.setState({ activate: false, deactivate: true });
|
||||||
|
} else if (!this.props.active && nextProps.active) {
|
||||||
|
this.setState({ activate: true, deactivate: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
handleClick = (e) => {
|
handleClick = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
|
@ -75,7 +88,6 @@ export default class IconButton extends React.PureComponent {
|
||||||
|
|
||||||
const {
|
const {
|
||||||
active,
|
active,
|
||||||
animate,
|
|
||||||
className,
|
className,
|
||||||
disabled,
|
disabled,
|
||||||
expanded,
|
expanded,
|
||||||
|
@ -87,57 +99,37 @@ export default class IconButton extends React.PureComponent {
|
||||||
title,
|
title,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
activate,
|
||||||
|
deactivate,
|
||||||
|
} = this.state;
|
||||||
|
|
||||||
const classes = classNames(className, 'icon-button', {
|
const classes = classNames(className, 'icon-button', {
|
||||||
active,
|
active,
|
||||||
disabled,
|
disabled,
|
||||||
inverted,
|
inverted,
|
||||||
|
activate,
|
||||||
|
deactivate,
|
||||||
overlayed: overlay,
|
overlayed: overlay,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!animate) {
|
|
||||||
// Perf optimization: avoid unnecessary <Motion> components unless
|
|
||||||
// we actually need to animate.
|
|
||||||
return (
|
|
||||||
<button
|
|
||||||
aria-label={title}
|
|
||||||
aria-pressed={pressed}
|
|
||||||
aria-expanded={expanded}
|
|
||||||
title={title}
|
|
||||||
className={classes}
|
|
||||||
onClick={this.handleClick}
|
|
||||||
onMouseDown={this.handleMouseDown}
|
|
||||||
onKeyDown={this.handleKeyDown}
|
|
||||||
onKeyPress={this.handleKeyPress}
|
|
||||||
style={style}
|
|
||||||
tabIndex={tabIndex}
|
|
||||||
disabled={disabled}
|
|
||||||
>
|
|
||||||
<Icon id={icon} fixedWidth aria-hidden='true' />
|
|
||||||
</button>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Motion defaultStyle={{ rotate: active ? -360 : 0 }} style={{ rotate: animate ? spring(active ? -360 : 0, { stiffness: 120, damping: 7 }) : 0 }}>
|
<button
|
||||||
{({ rotate }) => (
|
aria-label={title}
|
||||||
<button
|
aria-pressed={pressed}
|
||||||
aria-label={title}
|
aria-expanded={expanded}
|
||||||
aria-pressed={pressed}
|
title={title}
|
||||||
aria-expanded={expanded}
|
className={classes}
|
||||||
title={title}
|
onClick={this.handleClick}
|
||||||
className={classes}
|
onMouseDown={this.handleMouseDown}
|
||||||
onClick={this.handleClick}
|
onKeyDown={this.handleKeyDown}
|
||||||
onMouseDown={this.handleMouseDown}
|
onKeyPress={this.handleKeyPress}
|
||||||
onKeyDown={this.handleKeyDown}
|
style={style}
|
||||||
onKeyPress={this.handleKeyPress}
|
tabIndex={tabIndex}
|
||||||
style={style}
|
disabled={disabled}
|
||||||
tabIndex={tabIndex}
|
>
|
||||||
disabled={disabled}
|
<Icon id={icon} fixedWidth aria-hidden='true' />
|
||||||
>
|
</button>
|
||||||
<Icon id={icon} style={{ transform: `rotate(${rotate}deg)` }} fixedWidth aria-hidden='true' />
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
</Motion>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import IconButton from './icon_button';
|
||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||||
import { isIOS } from '../is_mobile';
|
import { isIOS } from '../is_mobile';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { autoPlayGif, displayMedia, useBlurhash } from '../initial_state';
|
import { autoPlayGif, cropImages, displayMedia, useBlurhash } from '../initial_state';
|
||||||
import { decode } from 'blurhash';
|
import { decode } from 'blurhash';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
|
@ -159,7 +159,7 @@ class Item extends React.PureComponent {
|
||||||
if (attachment.get('type') === 'unknown') {
|
if (attachment.get('type') === 'unknown') {
|
||||||
return (
|
return (
|
||||||
<div className={classNames('media-gallery__item', { standalone })} key={attachment.get('id')} style={{ left: left, top: top, right: right, bottom: bottom, width: `${width}%`, height: `${height}%` }}>
|
<div className={classNames('media-gallery__item', { standalone })} key={attachment.get('id')} style={{ left: left, top: top, right: right, bottom: bottom, width: `${width}%`, height: `${height}%` }}>
|
||||||
<a className='media-gallery__item-thumbnail' href={attachment.get('remote_url') || attachment.get('url')} target='_blank' style={{ cursor: 'pointer' }} title={attachment.get('description')}>
|
<a className='media-gallery__item-thumbnail' href={attachment.get('remote_url') || attachment.get('url')} style={{ cursor: 'pointer' }} title={attachment.get('description')} target='_blank' rel='noopener noreferrer'>
|
||||||
<canvas width={32} height={32} ref={this.setCanvasRef} className='media-gallery__preview' />
|
<canvas width={32} height={32} ref={this.setCanvasRef} className='media-gallery__preview' />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -187,6 +187,7 @@ class Item extends React.PureComponent {
|
||||||
href={attachment.get('remote_url') || originalUrl}
|
href={attachment.get('remote_url') || originalUrl}
|
||||||
onClick={this.handleClick}
|
onClick={this.handleClick}
|
||||||
target='_blank'
|
target='_blank'
|
||||||
|
rel='noopener noreferrer'
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
src={previewUrl}
|
src={previewUrl}
|
||||||
|
@ -280,7 +281,7 @@ class MediaGallery extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleRef = (node) => {
|
handleRef = (node) => {
|
||||||
if (node /*&& this.isStandaloneEligible()*/) {
|
if (node) {
|
||||||
// offsetWidth triggers a layout, so only calculate when we need to
|
// offsetWidth triggers a layout, so only calculate when we need to
|
||||||
if (this.props.cacheWidth) this.props.cacheWidth(node.offsetWidth);
|
if (this.props.cacheWidth) this.props.cacheWidth(node.offsetWidth);
|
||||||
|
|
||||||
|
@ -290,13 +291,13 @@ class MediaGallery extends React.PureComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isStandaloneEligible() {
|
isFullSizeEligible() {
|
||||||
const { media, standalone } = this.props;
|
const { media } = this.props;
|
||||||
return standalone && media.size === 1 && media.getIn([0, 'meta', 'small', 'aspect']);
|
return media.size === 1 && media.getIn([0, 'meta', 'small', 'aspect']);
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { media, intl, sensitive, height, defaultWidth } = this.props;
|
const { media, intl, sensitive, height, defaultWidth, standalone } = this.props;
|
||||||
const { visible } = this.state;
|
const { visible } = this.state;
|
||||||
|
|
||||||
const width = this.state.width || defaultWidth;
|
const width = this.state.width || defaultWidth;
|
||||||
|
@ -305,7 +306,7 @@ class MediaGallery extends React.PureComponent {
|
||||||
|
|
||||||
const style = {};
|
const style = {};
|
||||||
|
|
||||||
if (this.isStandaloneEligible()) {
|
if (this.isFullSizeEligible() && (standalone || !cropImages)) {
|
||||||
if (width) {
|
if (width) {
|
||||||
style.height = width / this.props.media.getIn([0, 'meta', 'small', 'aspect']);
|
style.height = width / this.props.media.getIn([0, 'meta', 'small', 'aspect']);
|
||||||
}
|
}
|
||||||
|
@ -318,7 +319,7 @@ class MediaGallery extends React.PureComponent {
|
||||||
const size = media.take(4).size;
|
const size = media.take(4).size;
|
||||||
const uncached = media.every(attachment => attachment.get('type') === 'unknown');
|
const uncached = media.every(attachment => attachment.get('type') === 'unknown');
|
||||||
|
|
||||||
if (this.isStandaloneEligible()) {
|
if (standalone && this.isFullSizeEligible()) {
|
||||||
children = <Item standalone onClick={this.handleClick} attachment={media.get(0)} displayWidth={width} visible={visible} />;
|
children = <Item standalone onClick={this.handleClick} attachment={media.get(0)} displayWidth={width} visible={visible} />;
|
||||||
} else {
|
} else {
|
||||||
children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} onClick={this.handleClick} attachment={attachment} index={i} size={size} displayWidth={width} visible={visible || uncached} />);
|
children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} onClick={this.handleClick} attachment={attachment} index={i} size={size} displayWidth={width} visible={visible || uncached} />);
|
||||||
|
|
|
@ -39,7 +39,8 @@ class Poll extends ImmutablePureComponent {
|
||||||
|
|
||||||
static getDerivedStateFromProps (props, state) {
|
static getDerivedStateFromProps (props, state) {
|
||||||
const { poll, intl } = props;
|
const { poll, intl } = props;
|
||||||
const expired = poll.get('expired') || (new Date(poll.get('expires_at'))).getTime() < intl.now();
|
const expires_at = poll.get('expires_at');
|
||||||
|
const expired = poll.get('expired') || expires_at !== null && (new Date(expires_at)).getTime() < intl.now();
|
||||||
return (expired === state.expired) ? null : { expired };
|
return (expired === state.expired) ? null : { expired };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,8 +65,6 @@ const getUnitDelay = units => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const fallbackFormat = new Intl.DateTimeFormat('en', shortDateFormatOptions);
|
|
||||||
|
|
||||||
export const timeAgoString = (intl, date, now, year) => {
|
export const timeAgoString = (intl, date, now, year) => {
|
||||||
const delta = now - date.getTime();
|
const delta = now - date.getTime();
|
||||||
|
|
||||||
|
|
|
@ -437,9 +437,9 @@ class Status extends ImmutablePureComponent {
|
||||||
<div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted, read: unread === false })} 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, read: unread === false })} data-id={status.get('id')}>
|
||||||
<div className='status__expand' onClick={this.handleExpandClick} role='presentation' />
|
<div className='status__expand' onClick={this.handleExpandClick} role='presentation' />
|
||||||
<div className='status__info'>
|
<div className='status__info'>
|
||||||
<a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
|
<a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
|
||||||
|
|
||||||
<a onClick={this.handleAccountClick} target='_blank' data-id={status.getIn(['account', 'id'])} href={status.getIn(['account', 'url'])} title={status.getIn(['account', 'acct'])} className='status__display-name'>
|
<a onClick={this.handleAccountClick} data-id={status.getIn(['account', 'id'])} href={status.getIn(['account', 'url'])} title={status.getIn(['account', 'acct'])} className='status__display-name' target='_blank' rel='noopener noreferrer'>
|
||||||
<div className='status__avatar'>
|
<div className='status__avatar'>
|
||||||
{statusAvatar}
|
{statusAvatar}
|
||||||
</div>
|
</div>
|
||||||
|
@ -450,15 +450,14 @@ class Status extends ImmutablePureComponent {
|
||||||
|
|
||||||
<StatusContent status={status} onClick={this.handleClick} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} collapsable />
|
<StatusContent status={status} onClick={this.handleClick} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} collapsable />
|
||||||
|
|
||||||
|
{media}
|
||||||
|
|
||||||
{showThread && status.get('in_reply_to_id') && status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) && (
|
{showThread && status.get('in_reply_to_id') && status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) && (
|
||||||
<button className='status__content__read-more-button' onClick={this.handleClick}>
|
<button className='status__content__read-more-button' onClick={this.handleClick}>
|
||||||
<i className='fa fa-fw fa-sort-amount-desc status__prepend-icon' />
|
|
||||||
<FormattedMessage id='status.show_thread' defaultMessage='Show thread' />
|
<FormattedMessage id='status.show_thread' defaultMessage='Show thread' />
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{media}
|
|
||||||
|
|
||||||
<StatusActionBar status={status} account={account} {...other} />
|
<StatusActionBar status={status} account={account} {...other} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -249,9 +249,9 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='status__action-bar'>
|
<div className='status__action-bar'>
|
||||||
<div className='status__action-bar__counter'><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} /></div>
|
<div className='status__action-bar__counter'><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} /><span className='status__action-bar__counter__label' >{obfuscatedCount(status.get('replies_count'))}</span></div>
|
||||||
<IconButton className='status__action-bar-button' disabled={!publicStatus} active={status.get('reblogged')} pressed={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} />
|
<IconButton className='status__action-bar-button' disabled={!publicStatus} active={status.get('reblogged')} pressed={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} />
|
||||||
<IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='floppy-o' onClick={this.handleFavouriteClick} />
|
<IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
|
||||||
{shareButton}
|
{shareButton}
|
||||||
|
|
||||||
<div className='status__action-bar-dropdown'>
|
<div className='status__action-bar-dropdown'>
|
||||||
|
|
|
@ -59,7 +59,7 @@ export default class StatusContent extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
link.setAttribute('target', '_blank');
|
link.setAttribute('target', '_blank');
|
||||||
link.setAttribute('rel', 'noopener');
|
link.setAttribute('rel', 'noopener noreferrer');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
|
|
@ -7,7 +7,6 @@ import { hydrateStore } from '../actions/store';
|
||||||
import { IntlProvider, addLocaleData } from 'react-intl';
|
import { IntlProvider, addLocaleData } from 'react-intl';
|
||||||
import { getLocale } from '../locales';
|
import { getLocale } from '../locales';
|
||||||
import PublicTimeline from '../features/standalone/public_timeline';
|
import PublicTimeline from '../features/standalone/public_timeline';
|
||||||
import CommunityTimeline from '../features/standalone/community_timeline';
|
|
||||||
import HashtagTimeline from '../features/standalone/hashtag_timeline';
|
import HashtagTimeline from '../features/standalone/hashtag_timeline';
|
||||||
import ModalContainer from '../features/ui/containers/modal_container';
|
import ModalContainer from '../features/ui/containers/modal_container';
|
||||||
import initialState from '../initial_state';
|
import initialState from '../initial_state';
|
||||||
|
@ -26,24 +25,22 @@ export default class TimelineContainer extends React.PureComponent {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
locale: PropTypes.string.isRequired,
|
locale: PropTypes.string.isRequired,
|
||||||
hashtag: PropTypes.string,
|
hashtag: PropTypes.string,
|
||||||
showPublicTimeline: PropTypes.bool.isRequired,
|
local: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
showPublicTimeline: initialState.settings.known_fediverse,
|
local: !initialState.settings.known_fediverse,
|
||||||
};
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { locale, hashtag, showPublicTimeline } = this.props;
|
const { locale, hashtag, local } = this.props;
|
||||||
|
|
||||||
let timeline;
|
let timeline;
|
||||||
|
|
||||||
if (hashtag) {
|
if (hashtag) {
|
||||||
timeline = <HashtagTimeline hashtag={hashtag} />;
|
timeline = <HashtagTimeline hashtag={hashtag} />;
|
||||||
} else if (showPublicTimeline) {
|
|
||||||
timeline = <PublicTimeline />;
|
|
||||||
} else {
|
} else {
|
||||||
timeline = <CommunityTimeline />;
|
timeline = <PublicTimeline local={local} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -51,6 +48,7 @@ export default class TimelineContainer extends React.PureComponent {
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<Fragment>
|
<Fragment>
|
||||||
{timeline}
|
{timeline}
|
||||||
|
|
||||||
{ReactDOM.createPortal(
|
{ReactDOM.createPortal(
|
||||||
<ModalContainer />,
|
<ModalContainer />,
|
||||||
document.getElementById('modal-container'),
|
document.getElementById('modal-container'),
|
||||||
|
|
|
@ -253,7 +253,7 @@ class Header extends ImmutablePureComponent {
|
||||||
|
|
||||||
<div className='account__header__bar'>
|
<div className='account__header__bar'>
|
||||||
<div className='account__header__tabs'>
|
<div className='account__header__tabs'>
|
||||||
<a className='avatar' href={account.get('url')} rel='noopener' target='_blank'>
|
<a className='avatar' href={account.get('url')} rel='noopener noreferrer' target='_blank'>
|
||||||
<Avatar account={account} size={90} />
|
<Avatar account={account} size={90} />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
@ -282,10 +282,10 @@ class Header extends ImmutablePureComponent {
|
||||||
<dt dangerouslySetInnerHTML={{ __html: proof.get('provider') }} />
|
<dt dangerouslySetInnerHTML={{ __html: proof.get('provider') }} />
|
||||||
|
|
||||||
<dd className='verified'>
|
<dd className='verified'>
|
||||||
<a href={proof.get('proof_url')} target='_blank' rel='noopener'><span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(proof.get('updated_at'), dateFormatOptions) })}>
|
<a href={proof.get('proof_url')} target='_blank' rel='noopener noreferrer'><span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(proof.get('updated_at'), dateFormatOptions) })}>
|
||||||
<Icon id='check' className='verified__mark' />
|
<Icon id='check' className='verified__mark' />
|
||||||
</span></a>
|
</span></a>
|
||||||
<a href={proof.get('profile_url')} target='_blank' rel='noopener'><span dangerouslySetInnerHTML={{ __html: ' '+proof.get('provider_username') }} /></a>
|
<a href={proof.get('profile_url')} target='_blank' rel='noopener noreferrer'><span dangerouslySetInnerHTML={{ __html: ' '+proof.get('provider_username') }} /></a>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
))}
|
))}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import React from 'react';
|
import { decode } from 'blurhash';
|
||||||
import PropTypes from 'prop-types';
|
import classNames from 'classnames';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
|
||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
|
||||||
import Icon from 'mastodon/components/icon';
|
import Icon from 'mastodon/components/icon';
|
||||||
import { autoPlayGif, displayMedia } from 'mastodon/initial_state';
|
import { autoPlayGif, displayMedia } from 'mastodon/initial_state';
|
||||||
import classNames from 'classnames';
|
|
||||||
import { decode } from 'blurhash';
|
|
||||||
import { isIOS } from 'mastodon/is_mobile';
|
import { isIOS } from 'mastodon/is_mobile';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React from 'react';
|
||||||
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
|
|
||||||
export default class MediaItem extends ImmutablePureComponent {
|
export default class MediaItem extends ImmutablePureComponent {
|
||||||
|
|
||||||
|
@ -151,7 +151,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.get('url')} target='_blank' onClick={this.handleClick} title={title}>
|
<a className='media-gallery__item-thumbnail' href={status.get('url')} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>
|
||||||
<canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} />
|
<canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} />
|
||||||
{visible && thumbnail}
|
{visible && thumbnail}
|
||||||
{!visible && icon}
|
{!visible && icon}
|
||||||
|
|
|
@ -12,6 +12,7 @@ const messages = defineMessages({
|
||||||
pause: { id: 'video.pause', defaultMessage: 'Pause' },
|
pause: { id: 'video.pause', defaultMessage: 'Pause' },
|
||||||
mute: { id: 'video.mute', defaultMessage: 'Mute sound' },
|
mute: { id: 'video.mute', defaultMessage: 'Mute sound' },
|
||||||
unmute: { id: 'video.unmute', defaultMessage: 'Unmute sound' },
|
unmute: { id: 'video.unmute', defaultMessage: 'Unmute sound' },
|
||||||
|
download: { id: 'video.download', defaultMessage: 'Download file' },
|
||||||
});
|
});
|
||||||
|
|
||||||
export default @injectIntl
|
export default @injectIntl
|
||||||
|
@ -202,6 +203,7 @@ class Audio extends React.PureComponent {
|
||||||
<button type='button' aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
|
<button type='button' aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
|
||||||
|
|
||||||
<div className='video-player__volume' onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
|
<div className='video-player__volume' onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
|
||||||
|
|
||||||
<div className='video-player__volume__current' style={{ width: `${volumeWidth}px` }} />
|
<div className='video-player__volume__current' style={{ width: `${volumeWidth}px` }} />
|
||||||
|
|
||||||
<span
|
<span
|
||||||
|
@ -217,6 +219,14 @@ class Audio extends React.PureComponent {
|
||||||
<span className='video-player__time-total'>{formatTime(this.state.duration || Math.floor(this.props.duration))}</span>
|
<span className='video-player__time-total'>{formatTime(this.state.duration || Math.floor(this.props.duration))}</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className='video-player__buttons right'>
|
||||||
|
<button type='button' aria-label={intl.formatMessage(messages.download)}>
|
||||||
|
<a className='video-player__download__icon' href={this.props.src} download>
|
||||||
|
<Icon id={'download'} fixedWidth />
|
||||||
|
</a>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -88,7 +88,7 @@ class ComposeForm extends ImmutablePureComponent {
|
||||||
const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props;
|
const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props;
|
||||||
const fulltext = [this.props.spoilerText, countableText(this.props.text)].join('');
|
const fulltext = [this.props.spoilerText, countableText(this.props.text)].join('');
|
||||||
|
|
||||||
if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > 512 || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) {
|
if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > 500 || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +181,7 @@ class ComposeForm extends ImmutablePureComponent {
|
||||||
const { intl, onPaste, showSearch, anyMedia } = this.props;
|
const { intl, onPaste, showSearch, anyMedia } = this.props;
|
||||||
const disabled = this.props.isSubmitting;
|
const disabled = this.props.isSubmitting;
|
||||||
const text = [this.props.spoilerText, countableText(this.props.text)].join('');
|
const text = [this.props.spoilerText, countableText(this.props.text)].join('');
|
||||||
const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > 512 || (text.length !== 0 && text.trim().length === 0 && !anyMedia);
|
const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > 500 || (text.length !== 0 && text.trim().length === 0 && !anyMedia);
|
||||||
let publishText = '';
|
let publishText = '';
|
||||||
|
|
||||||
if (this.props.privacy === 'private' || this.props.privacy === 'direct') {
|
if (this.props.privacy === 'private' || this.props.privacy === 'direct') {
|
||||||
|
@ -243,7 +243,7 @@ class ComposeForm extends ImmutablePureComponent {
|
||||||
<PrivacyDropdownContainer />
|
<PrivacyDropdownContainer />
|
||||||
<SpoilerButtonContainer />
|
<SpoilerButtonContainer />
|
||||||
</div>
|
</div>
|
||||||
<div className='character-counter__wrapper'><CharacterCounter max={512} text={text} /></div>
|
<div className='character-counter__wrapper'><CharacterCounter max={500} text={text} /></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='compose-form__publish'>
|
<div className='compose-form__publish'>
|
||||||
|
|
|
@ -359,8 +359,8 @@ class EmojiPickerDropdown extends React.PureComponent {
|
||||||
<div ref={this.setTargetRef} className='emoji-button' title={title} aria-label={title} aria-expanded={active} role='button' onClick={this.onToggle} onKeyDown={this.onToggle} tabIndex={0}>
|
<div ref={this.setTargetRef} className='emoji-button' title={title} aria-label={title} aria-expanded={active} role='button' onClick={this.onToggle} onKeyDown={this.onToggle} tabIndex={0}>
|
||||||
<img
|
<img
|
||||||
className={classNames('emojione', { 'pulse-loading': active && loading })}
|
className={classNames('emojione', { 'pulse-loading': active && loading })}
|
||||||
alt='🤔'
|
alt='🙂'
|
||||||
src={`${assetHost}/emoji/1f914.svg`}
|
src={`${assetHost}/emoji/1f602.svg`}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -12,13 +12,13 @@ const DEFAULTS = [
|
||||||
'+1',
|
'+1',
|
||||||
'grinning',
|
'grinning',
|
||||||
'kissing_heart',
|
'kissing_heart',
|
||||||
'vhs',
|
'heart_eyes',
|
||||||
'laughing',
|
'laughing',
|
||||||
'floppy_disk',
|
'stuck_out_tongue_winking_eye',
|
||||||
'sweat_smile',
|
'sweat_smile',
|
||||||
'joy',
|
'joy',
|
||||||
'yum',
|
'yum',
|
||||||
'computer',
|
'disappointed',
|
||||||
'thinking_face',
|
'thinking_face',
|
||||||
'weary',
|
'weary',
|
||||||
'sob',
|
'sob',
|
||||||
|
|
|
@ -16,20 +16,20 @@ import LinkFooter from 'mastodon/features/ui/components/link_footer';
|
||||||
import TrendsContainer from './containers/trends_container';
|
import TrendsContainer from './containers/trends_container';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
home_timeline: { id: 'tabs_bar.home', defaultMessage: '/timelines/home' },
|
home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' },
|
||||||
notifications: { id: 'tabs_bar.notifications', defaultMessage: '~/.notifications' },
|
notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' },
|
||||||
public_timeline: { id: 'navigation_bar.public_timeline', defaultMessage: '/timelines/federated' },
|
public_timeline: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },
|
||||||
settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' },
|
settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' },
|
||||||
community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: '/timelines/local' },
|
community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },
|
||||||
direct: { id: 'navigation_bar.direct', defaultMessage: '~/.dms' },
|
direct: { id: 'navigation_bar.direct', defaultMessage: 'Direct messages' },
|
||||||
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'edit ~/.config' },
|
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
|
||||||
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: '~/.follow-requests' },
|
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
|
||||||
favourites: { id: 'navigation_bar.favourites', defaultMessage: '~/.florps' },
|
favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },
|
||||||
blocks: { id: 'navigation_bar.blocks', defaultMessage: '~/.blocked' },
|
blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
|
||||||
domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: '~/.muted/domains' },
|
domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' },
|
||||||
mutes: { id: 'navigation_bar.mutes', defaultMessage: '~/.muted' },
|
mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },
|
||||||
pins: { id: 'navigation_bar.pins', defaultMessage: '~/.pinned' },
|
pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' },
|
||||||
lists: { id: 'navigation_bar.lists', defaultMessage: '~/.lists' },
|
lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
|
||||||
discover: { id: 'navigation_bar.discover', defaultMessage: 'Discover' },
|
discover: { id: 'navigation_bar.discover', defaultMessage: 'Discover' },
|
||||||
personal: { id: 'navigation_bar.personal', defaultMessage: 'Personal' },
|
personal: { id: 'navigation_bar.personal', defaultMessage: 'Personal' },
|
||||||
security: { id: 'navigation_bar.security', defaultMessage: 'Security' },
|
security: { id: 'navigation_bar.security', defaultMessage: 'Security' },
|
||||||
|
|
|
@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||||
import Toggle from 'react-toggle';
|
import Toggle from 'react-toggle';
|
||||||
import AsyncSelect from 'react-select/lib/Async';
|
import AsyncSelect from 'react-select/async';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' },
|
placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' },
|
||||||
|
|
|
@ -1,13 +1,22 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import StatusContainer from '../../../containers/status_container';
|
import { injectIntl, FormattedMessage, defineMessages } from 'react-intl';
|
||||||
import AccountContainer from '../../../containers/account_container';
|
|
||||||
import { injectIntl, FormattedMessage } from 'react-intl';
|
|
||||||
import Permalink from '../../../components/permalink';
|
|
||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
|
||||||
import { HotKeys } from 'react-hotkeys';
|
import { HotKeys } from 'react-hotkeys';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
|
import { me } from 'mastodon/initial_state';
|
||||||
|
import StatusContainer from 'mastodon/containers/status_container';
|
||||||
|
import AccountContainer from 'mastodon/containers/account_container';
|
||||||
import Icon from 'mastodon/components/icon';
|
import Icon from 'mastodon/components/icon';
|
||||||
|
import Permalink from 'mastodon/components/permalink';
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
favourite: { id: 'notification.favourite', defaultMessage: '{name} favourited your status' },
|
||||||
|
follow: { id: 'notification.follow', defaultMessage: '{name} followed you' },
|
||||||
|
ownPoll: { id: 'notification.own_poll', defaultMessage: 'Your poll has ended' },
|
||||||
|
poll: { id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' },
|
||||||
|
reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' },
|
||||||
|
});
|
||||||
|
|
||||||
const notificationForScreenReader = (intl, message, timestamp) => {
|
const notificationForScreenReader = (intl, message, timestamp) => {
|
||||||
const output = [message];
|
const output = [message];
|
||||||
|
@ -107,7 +116,7 @@ class Notification extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
<div className='notification notification-follow focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow', defaultMessage: '{name} followed you' }, { name: account.get('acct') }), notification.get('created_at'))}>
|
<div className='notification notification-follow focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.follow, { name: account.get('acct') }), notification.get('created_at'))}>
|
||||||
<div className='notification__message'>
|
<div className='notification__message'>
|
||||||
<div className='notification__favourite-icon-wrapper'>
|
<div className='notification__favourite-icon-wrapper'>
|
||||||
<Icon id='user-plus' fixedWidth />
|
<Icon id='user-plus' fixedWidth />
|
||||||
|
@ -146,10 +155,10 @@ class Notification extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
<div className='notification notification-favourite focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.favourite', defaultMessage: '{name} favourited your status' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
<div className='notification notification-favourite focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.favourite, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
||||||
<div className='notification__message'>
|
<div className='notification__message'>
|
||||||
<div className='notification__favourite-icon-wrapper'>
|
<div className='notification__favourite-icon-wrapper'>
|
||||||
<Icon id='floppy-o' className='star-icon' fixedWidth />
|
<Icon id='star' className='star-icon' fixedWidth />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span title={notification.get('created_at')}>
|
<span title={notification.get('created_at')}>
|
||||||
|
@ -178,7 +187,7 @@ class Notification extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
<div className='notification notification-reblog focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.reblog', defaultMessage: '{name} boosted your status' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
<div className='notification notification-reblog focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.reblog, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
||||||
<div className='notification__message'>
|
<div className='notification__message'>
|
||||||
<div className='notification__favourite-icon-wrapper'>
|
<div className='notification__favourite-icon-wrapper'>
|
||||||
<Icon id='retweet' fixedWidth />
|
<Icon id='retweet' fixedWidth />
|
||||||
|
@ -205,25 +214,31 @@ class Notification extends ImmutablePureComponent {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderPoll (notification) {
|
renderPoll (notification, account) {
|
||||||
const { intl } = this.props;
|
const { intl } = this.props;
|
||||||
|
const ownPoll = me === account.get('id');
|
||||||
|
const message = ownPoll ? intl.formatMessage(messages.ownPoll) : intl.formatMessage(messages.poll);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
<div className='notification notification-poll focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' }), notification.get('created_at'))}>
|
<div className='notification notification-poll focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, message, notification.get('created_at'))}>
|
||||||
<div className='notification__message'>
|
<div className='notification__message'>
|
||||||
<div className='notification__favourite-icon-wrapper'>
|
<div className='notification__favourite-icon-wrapper'>
|
||||||
<Icon id='tasks' fixedWidth />
|
<Icon id='tasks' fixedWidth />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span title={notification.get('created_at')}>
|
<span title={notification.get('created_at')}>
|
||||||
<FormattedMessage id='notification.poll' defaultMessage='A poll you have voted in has ended' />
|
{ownPoll ? (
|
||||||
|
<FormattedMessage id='notification.ownPoll' defaultMessage='Your poll has ended' />
|
||||||
|
) : (
|
||||||
|
<FormattedMessage id='notification.poll' defaultMessage='A poll you have voted in has ended' />
|
||||||
|
)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<StatusContainer
|
<StatusContainer
|
||||||
id={notification.get('status')}
|
id={notification.get('status')}
|
||||||
account={notification.get('account')}
|
account={account}
|
||||||
muted
|
muted
|
||||||
withDismiss
|
withDismiss
|
||||||
hidden={this.props.hidden}
|
hidden={this.props.hidden}
|
||||||
|
@ -253,7 +268,7 @@ class Notification extends ImmutablePureComponent {
|
||||||
case 'reblog':
|
case 'reblog':
|
||||||
return this.renderReblog(notification, link);
|
return this.renderReblog(notification, link);
|
||||||
case 'poll':
|
case 'poll':
|
||||||
return this.renderPoll(notification);
|
return this.renderPoll(notification, account);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -1,71 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import StatusListContainer from '../../ui/containers/status_list_container';
|
|
||||||
import { expandCommunityTimeline } from '../../../actions/timelines';
|
|
||||||
import Column from '../../../components/column';
|
|
||||||
import ColumnHeader from '../../../components/column_header';
|
|
||||||
import { defineMessages, injectIntl } from 'react-intl';
|
|
||||||
import { connectCommunityStream } from '../../../actions/streaming';
|
|
||||||
|
|
||||||
const messages = defineMessages({
|
|
||||||
title: { id: 'standalone.public_title', defaultMessage: 'A look inside...' },
|
|
||||||
});
|
|
||||||
|
|
||||||
export default @connect()
|
|
||||||
@injectIntl
|
|
||||||
class CommunityTimeline extends React.PureComponent {
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
dispatch: PropTypes.func.isRequired,
|
|
||||||
intl: PropTypes.object.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
handleHeaderClick = () => {
|
|
||||||
this.column.scrollTop();
|
|
||||||
}
|
|
||||||
|
|
||||||
setRef = c => {
|
|
||||||
this.column = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount () {
|
|
||||||
const { dispatch } = this.props;
|
|
||||||
|
|
||||||
dispatch(expandCommunityTimeline());
|
|
||||||
this.disconnect = dispatch(connectCommunityStream());
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillUnmount () {
|
|
||||||
if (this.disconnect) {
|
|
||||||
this.disconnect();
|
|
||||||
this.disconnect = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleLoadMore = maxId => {
|
|
||||||
this.props.dispatch(expandCommunityTimeline({ maxId }));
|
|
||||||
}
|
|
||||||
|
|
||||||
render () {
|
|
||||||
const { intl } = this.props;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Column ref={this.setRef} label={intl.formatMessage(messages.title)}>
|
|
||||||
<ColumnHeader
|
|
||||||
icon='users'
|
|
||||||
title={intl.formatMessage(messages.title)}
|
|
||||||
onClick={this.handleHeaderClick}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<StatusListContainer
|
|
||||||
timelineId='community'
|
|
||||||
onLoadMore={this.handleLoadMore}
|
|
||||||
scrollKey='standalone_public_timeline'
|
|
||||||
trackScroll={false}
|
|
||||||
/>
|
|
||||||
</Column>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -196,7 +196,7 @@ class ActionBar extends React.PureComponent {
|
||||||
<div className='detailed-status__action-bar'>
|
<div className='detailed-status__action-bar'>
|
||||||
<div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /></div>
|
<div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /></div>
|
||||||
<div className='detailed-status__button'><IconButton disabled={reblog_disabled} active={status.get('reblogged')} title={reblog_disabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>
|
<div className='detailed-status__button'><IconButton disabled={reblog_disabled} active={status.get('reblogged')} title={reblog_disabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>
|
||||||
<div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='floppy-o' onClick={this.handleFavouriteClick} /></div>
|
<div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div>
|
||||||
{shareButton}
|
{shareButton}
|
||||||
|
|
||||||
<div className='detailed-status__action-bar-dropdown'>
|
<div className='detailed-status__action-bar-dropdown'>
|
||||||
|
|
|
@ -148,7 +148,7 @@ export default class Card extends React.PureComponent {
|
||||||
const horizontal = (!compact && card.get('width') > card.get('height') && (card.get('width') + 100 >= width)) || card.get('type') !== 'link' || embedded;
|
const horizontal = (!compact && card.get('width') > card.get('height') && (card.get('width') + 100 >= width)) || card.get('type') !== 'link' || embedded;
|
||||||
const interactive = card.get('type') !== 'link';
|
const interactive = card.get('type') !== 'link';
|
||||||
const className = classnames('status-card', { horizontal, compact, interactive });
|
const className = classnames('status-card', { horizontal, compact, interactive });
|
||||||
const title = interactive ? <a className='status-card__title' href={card.get('url')} title={card.get('title')} rel='noopener' target='_blank'><strong>{card.get('title')}</strong></a> : <strong className='status-card__title' title={card.get('title')}>{card.get('title')}</strong>;
|
const title = interactive ? <a className='status-card__title' href={card.get('url')} title={card.get('title')} rel='noopener noreferrer' target='_blank'><strong>{card.get('title')}</strong></a> : <strong className='status-card__title' title={card.get('title')}>{card.get('title')}</strong>;
|
||||||
const ratio = card.get('width') / card.get('height');
|
const ratio = card.get('width') / card.get('height');
|
||||||
const height = (compact && !embedded) ? (width / (16 / 9)) : (width / ratio);
|
const height = (compact && !embedded) ? (width / (16 / 9)) : (width / ratio);
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ export default class Card extends React.PureComponent {
|
||||||
<div className='status-card__actions'>
|
<div className='status-card__actions'>
|
||||||
<div>
|
<div>
|
||||||
<button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
|
<button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
|
||||||
{horizontal && <a href={card.get('url')} target='_blank' rel='noopener'><Icon id='external-link' /></a>}
|
{horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -208,7 +208,7 @@ export default class Card extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<a href={card.get('url')} className={className} target='_blank' rel='noopener' ref={this.setRef}>
|
<a href={card.get('url')} className={className} target='_blank' rel='noopener noreferrer' ref={this.setRef}>
|
||||||
{embed}
|
{embed}
|
||||||
{description}
|
{description}
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -156,7 +156,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status.get('application')) {
|
if (status.get('application')) {
|
||||||
applicationLink = <span> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener'>{status.getIn(['application', 'name'])}</a></span>;
|
applicationLink = <span> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></span>;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status.get('visibility') === 'direct') {
|
if (status.get('visibility') === 'direct') {
|
||||||
|
@ -190,7 +190,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||||
if (this.context.router) {
|
if (this.context.router) {
|
||||||
favouriteLink = (
|
favouriteLink = (
|
||||||
<Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'>
|
<Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'>
|
||||||
<Icon id='floppy-o' />
|
<Icon id='star' />
|
||||||
<span className='detailed-status__favorites'>
|
<span className='detailed-status__favorites'>
|
||||||
<FormattedNumber value={status.get('favourites_count')} />
|
<FormattedNumber value={status.get('favourites_count')} />
|
||||||
</span>
|
</span>
|
||||||
|
@ -199,7 +199,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||||
} else {
|
} else {
|
||||||
favouriteLink = (
|
favouriteLink = (
|
||||||
<a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>
|
<a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>
|
||||||
<Icon id='floppy-o' />
|
<Icon id='star' />
|
||||||
<span className='detailed-status__favorites'>
|
<span className='detailed-status__favorites'>
|
||||||
<FormattedNumber value={status.get('favourites_count')} />
|
<FormattedNumber value={status.get('favourites_count')} />
|
||||||
</span>
|
</span>
|
||||||
|
@ -220,7 +220,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||||
{media}
|
{media}
|
||||||
|
|
||||||
<div className='detailed-status__meta'>
|
<div className='detailed-status__meta'>
|
||||||
<a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener'>
|
<a className='detailed-status__datetime' href={status.get('url')} 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>{applicationLink} · {reblogLink} · {favouriteLink}
|
</a>{applicationLink} · {reblogLink} · {favouriteLink}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -26,7 +26,7 @@ export default class ActionsModal extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li key={`${text}-${i}`}>
|
<li key={`${text}-${i}`}>
|
||||||
<a href={href} target='_blank' rel='noopener' onClick={this.props.onClick} data-index={i} className={classNames({ active })}>
|
<a href={href} target='_blank' rel='noopener noreferrer' onClick={this.props.onClick} data-index={i} className={classNames({ active })}>
|
||||||
{icon && <IconButton title={text} icon={icon} role='presentation' tabIndex='-1' inverted />}
|
{icon && <IconButton title={text} icon={icon} role='presentation' tabIndex='-1' inverted />}
|
||||||
<div>
|
<div>
|
||||||
<div className={classNames({ 'actions-modal__item-label': !!meta })}>{text}</div>
|
<div className={classNames({ 'actions-modal__item-label': !!meta })}>{text}</div>
|
||||||
|
@ -42,7 +42,7 @@ export default class ActionsModal extends ImmutablePureComponent {
|
||||||
<div className='status light'>
|
<div className='status light'>
|
||||||
<div className='boost-modal__status-header'>
|
<div className='boost-modal__status-header'>
|
||||||
<div className='boost-modal__status-time'>
|
<div className='boost-modal__status-time'>
|
||||||
<a href={this.props.status.get('url')} className='status__relative-time' target='_blank' rel='noopener'>
|
<a href={this.props.status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
|
||||||
<RelativeTimestamp timestamp={this.props.status.get('created_at')} />
|
<RelativeTimestamp timestamp={this.props.status.get('created_at')} />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -61,7 +61,7 @@ class BoostModal extends ImmutablePureComponent {
|
||||||
<div className='status light'>
|
<div className='status light'>
|
||||||
<div className='boost-modal__status-header'>
|
<div className='boost-modal__status-header'>
|
||||||
<div className='boost-modal__status-time'>
|
<div className='boost-modal__status-time'>
|
||||||
<a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
|
<a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a onClick={this.handleAccountClick} href={status.getIn(['account', 'url'])} className='status__display-name'>
|
<a onClick={this.handleAccountClick} href={status.getIn(['account', 'url'])} className='status__display-name'>
|
||||||
|
|
|
@ -182,7 +182,7 @@ class ColumnsArea extends ImmutablePureComponent {
|
||||||
const floatingActionButton = shouldHideFAB(this.context.router.history.location.pathname) ? null : <Link key='floating-action-button' to='/statuses/new' className='floating-action-button' aria-label={intl.formatMessage(messages.publish)}><Icon id='pencil' /></Link>;
|
const floatingActionButton = shouldHideFAB(this.context.router.history.location.pathname) ? null : <Link key='floating-action-button' to='/statuses/new' className='floating-action-button' aria-label={intl.formatMessage(messages.publish)}><Icon id='pencil' /></Link>;
|
||||||
|
|
||||||
const content = columnIndex !== -1 ? (
|
const content = columnIndex !== -1 ? (
|
||||||
<ReactSwipeableViews key='content' index={columnIndex} onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleAnimationEnd} animateTransitions={shouldAnimate} springConfig={{ duration: '400ms', delay: '0s', easeFunction: 'ease' }} style={{ height: '100%' }}>
|
<ReactSwipeableViews key='content' hysteresis={0.2} threshold={15} index={columnIndex} onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleAnimationEnd} animateTransitions={shouldAnimate} springConfig={{ duration: '400ms', delay: '0s', easeFunction: 'ease' }} style={{ height: '100%' }}>
|
||||||
{links.map(this.renderView)}
|
{links.map(this.renderView)}
|
||||||
</ReactSwipeableViews>
|
</ReactSwipeableViews>
|
||||||
) : (
|
) : (
|
||||||
|
|
|
@ -23,7 +23,15 @@ class DocumentTitle extends PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
_sideEffects () {
|
_sideEffects () {
|
||||||
document.title = title;
|
const { unread } = this.props;
|
||||||
|
|
||||||
|
if (unread > 99) {
|
||||||
|
document.title = `(*) ${title}`;
|
||||||
|
} else if (unread > 0) {
|
||||||
|
document.title = `(${unread}) ${title}`;
|
||||||
|
} else {
|
||||||
|
document.title = title;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
|
|
|
@ -62,7 +62,7 @@ class LinkFooter extends React.PureComponent {
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id='getting_started.open_source_notice'
|
id='getting_started.open_source_notice'
|
||||||
defaultMessage='Mastodon is open source software. You can contribute or report issues on GitHub at {github}.'
|
defaultMessage='Mastodon is open source software. You can contribute or report issues on GitHub at {github}.'
|
||||||
values={{ github: <span><a href={source_url} rel='noopener' target='_blank'>{repository}</a> (v{version})</span> }}
|
values={{ github: <span><a href={source_url} rel='noopener noreferrer' target='_blank'>{repository}</a> (v{version})</span> }}
|
||||||
/>
|
/>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -19,6 +19,7 @@ const messages = defineMessages({
|
||||||
close: { id: 'video.close', defaultMessage: 'Close video' },
|
close: { id: 'video.close', defaultMessage: 'Close video' },
|
||||||
fullscreen: { id: 'video.fullscreen', defaultMessage: 'Full screen' },
|
fullscreen: { id: 'video.fullscreen', defaultMessage: 'Full screen' },
|
||||||
exit_fullscreen: { id: 'video.exit_fullscreen', defaultMessage: 'Exit full screen' },
|
exit_fullscreen: { id: 'video.exit_fullscreen', defaultMessage: 'Exit full screen' },
|
||||||
|
download: { id: 'video.download', defaultMessage: 'Download file' },
|
||||||
});
|
});
|
||||||
|
|
||||||
export const formatTime = secondsNum => {
|
export const formatTime = secondsNum => {
|
||||||
|
@ -470,6 +471,7 @@ class Video extends React.PureComponent {
|
||||||
<button type='button' aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
|
<button type='button' aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
|
||||||
|
|
||||||
<div className='video-player__volume' onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
|
<div className='video-player__volume' onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
|
||||||
|
|
||||||
<div className='video-player__volume__current' style={{ width: `${volumeWidth}px` }} />
|
<div className='video-player__volume__current' style={{ width: `${volumeWidth}px` }} />
|
||||||
<span
|
<span
|
||||||
className={classNames('video-player__volume__handle')}
|
className={classNames('video-player__volume__handle')}
|
||||||
|
@ -493,7 +495,13 @@ class Video extends React.PureComponent {
|
||||||
{(!onCloseVideo && !editable) && <button type='button' aria-label={intl.formatMessage(messages.hide)} onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>}
|
{(!onCloseVideo && !editable) && <button type='button' aria-label={intl.formatMessage(messages.hide)} onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>}
|
||||||
{(!fullscreen && onOpenVideo) && <button type='button' aria-label={intl.formatMessage(messages.expand)} onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>}
|
{(!fullscreen && onOpenVideo) && <button type='button' aria-label={intl.formatMessage(messages.expand)} onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>}
|
||||||
{onCloseVideo && <button type='button' aria-label={intl.formatMessage(messages.close)} onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>}
|
{onCloseVideo && <button type='button' aria-label={intl.formatMessage(messages.close)} onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>}
|
||||||
|
<button type='button' aria-label={intl.formatMessage(messages.download)}>
|
||||||
|
<a className='video-player__download__icon' href={this.props.src} download>
|
||||||
|
<Icon id={'download'} fixedWidth />
|
||||||
|
</a>
|
||||||
|
</button>
|
||||||
<button type='button' aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button>
|
<button type='button' aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -24,5 +24,6 @@ export const useBlurhash = getMeta('use_blurhash');
|
||||||
export const usePendingItems = getMeta('use_pending_items');
|
export const usePendingItems = getMeta('use_pending_items');
|
||||||
export const showTrends = getMeta('trends');
|
export const showTrends = getMeta('trends');
|
||||||
export const title = getMeta('title');
|
export const title = getMeta('title');
|
||||||
|
export const cropImages = getMeta('crop_images');
|
||||||
|
|
||||||
export default initialState;
|
export default initialState;
|
||||||
|
|
|
@ -776,6 +776,10 @@
|
||||||
{
|
{
|
||||||
"defaultMessage": "Unmute sound",
|
"defaultMessage": "Unmute sound",
|
||||||
"id": "video.unmute"
|
"id": "video.unmute"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defaultMessage": "Download file",
|
||||||
|
"id": "video.download"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"path": "app/javascript/mastodon/features/audio/index.json"
|
"path": "app/javascript/mastodon/features/audio/index.json"
|
||||||
|
|
|
@ -1,293 +0,0 @@
|
||||||
{
|
|
||||||
"account.block": "Block @{name}",
|
|
||||||
"account.block_domain": "Hide everything from {domain}",
|
|
||||||
"account.blocked": "Blocked",
|
|
||||||
"account.disclaimer_full": "THESE NUMBERS ARE THE STUFF WHAT YOUR SERVER KNOWS ABOUT AND THERE MIGHT BE MORE THAT IT DONT KNOW ABOUT.",
|
|
||||||
"account.domain_blocked": "Domain hidden",
|
|
||||||
"account.edit_profile": "edit ~/.profile",
|
|
||||||
"account.follow": "Follow",
|
|
||||||
"account.followers": "Followers",
|
|
||||||
"account.follows": "Follows",
|
|
||||||
"account.follows_you": "Follows you",
|
|
||||||
"account.hide_reblogs": "Hide boosts from @{name}",
|
|
||||||
"account.media": "Media",
|
|
||||||
"account.mention": "Mention @{name}",
|
|
||||||
"account.moved_to": "{name} has moved to:",
|
|
||||||
"account.mute": "Mute @{name}",
|
|
||||||
"account.mute_notifications": "Mute notifications from @{name}",
|
|
||||||
"account.muted": "Muted",
|
|
||||||
"account.posts": "Pings",
|
|
||||||
"account.posts_with_replies": "Pings with replies",
|
|
||||||
"account.report": "Report @{name}",
|
|
||||||
"account.requested": "Awaiting approval. Click to cancel follow request",
|
|
||||||
"account.share": "Share @{name}'s profile",
|
|
||||||
"account.show_reblogs": "Show boosts from @{name}",
|
|
||||||
"account.unblock": "Unblock @{name}",
|
|
||||||
"account.unblock_domain": "Unhide {domain}",
|
|
||||||
"account.unfollow": "Unfollow",
|
|
||||||
"account.unmute": "Unmute @{name}",
|
|
||||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
|
||||||
"account.view_full_profile": "View full profile",
|
|
||||||
"boost_modal.combo": "You can press {combo} to skip this next time",
|
|
||||||
"bundle_column_error.body": "Something went wrong while loading this component.",
|
|
||||||
"bundle_column_error.retry": "Try again",
|
|
||||||
"bundle_column_error.title": "Network error",
|
|
||||||
"bundle_modal_error.close": "Close",
|
|
||||||
"bundle_modal_error.message": "Something went wrong while loading this component.",
|
|
||||||
"bundle_modal_error.retry": "Try again",
|
|
||||||
"column.blocks": "~/.blocked",
|
|
||||||
"column.community": "/timelines/local",
|
|
||||||
"column.direct": "~/.dms",
|
|
||||||
"column.favourites": "~/.florps",
|
|
||||||
"column.follow_requests": "~/.follow-requests",
|
|
||||||
"column.home": "/timelines/home",
|
|
||||||
"column.lists": "Lists",
|
|
||||||
"column.mutes": "~/.muted",
|
|
||||||
"column.notifications": "~/.notifications",
|
|
||||||
"column.pins": "~/.pinned",
|
|
||||||
"column.public": "/timelines/federated",
|
|
||||||
"column_back_button.label": "Back",
|
|
||||||
"column_header.hide_settings": "Hide settings",
|
|
||||||
"column_header.moveLeft_settings": "Move column to the left",
|
|
||||||
"column_header.moveRight_settings": "Move column to the right",
|
|
||||||
"column_header.pin": "Pin",
|
|
||||||
"column_header.show_settings": "Show settings",
|
|
||||||
"column_header.unpin": "Unpin",
|
|
||||||
"column_subheading.navigation": "Navigation",
|
|
||||||
"column_subheading.settings": "Settings",
|
|
||||||
"compose.attach": "Attach...",
|
|
||||||
"compose.attach.doodle": "Draw something",
|
|
||||||
"compose.attach.upload": "Upload a file",
|
|
||||||
"compose_form.hashtag_warning": "This ping won't be listed under any hashtag as it is unlisted. Only public pings can be searched by hashtag.",
|
|
||||||
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
|
|
||||||
"compose_form.lock_disclaimer.lock": "locked",
|
|
||||||
"compose_form.placeholder": "What is in your databanks?",
|
|
||||||
"compose_form.publish": "Ping",
|
|
||||||
"compose_form.publish_loud": "{publish}!",
|
|
||||||
"compose_form.sensitive.marked": "Media is marked as sensitive",
|
|
||||||
"compose_form.sensitive.unmarked": "Media is not marked as sensitive",
|
|
||||||
"compose_form.spoiler.marked": "Text is hidden behind warning",
|
|
||||||
"compose_form.spoiler.unmarked": "Text is not hidden",
|
|
||||||
"compose_form.spoiler_placeholder": "Write your warning here",
|
|
||||||
"confirmation_modal.cancel": "Cancel",
|
|
||||||
"confirmations.block.confirm": "Block",
|
|
||||||
"confirmations.block.message": "Are you sure you want to block {name}?",
|
|
||||||
"confirmations.delete.confirm": "Delete",
|
|
||||||
"confirmations.delete.message": "Are you sure you want to delete this status?",
|
|
||||||
"confirmations.delete_list.confirm": "Delete",
|
|
||||||
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
|
|
||||||
"confirmations.domain_block.confirm": "Hide entire domain",
|
|
||||||
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
|
|
||||||
"confirmations.mute.confirm": "Mute",
|
|
||||||
"confirmations.mute.message": "Are you sure you want to mute {name}?",
|
|
||||||
"confirmations.unfollow.confirm": "Unfollow",
|
|
||||||
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
|
|
||||||
"doodle_button.label": "Add a drawing",
|
|
||||||
"embed.instructions": "Embed this status on your website by copying the code below.",
|
|
||||||
"embed.preview": "Here is what it will look like:",
|
|
||||||
"emoji_button.activity": "Activity",
|
|
||||||
"emoji_button.custom": "Custom",
|
|
||||||
"emoji_button.flags": "Flags",
|
|
||||||
"emoji_button.food": "Food & Drink",
|
|
||||||
"emoji_button.label": "Insert emoji",
|
|
||||||
"emoji_button.nature": "Nature",
|
|
||||||
"emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
|
|
||||||
"emoji_button.objects": "Objects",
|
|
||||||
"emoji_button.people": "People",
|
|
||||||
"emoji_button.recent": "Frequently used",
|
|
||||||
"emoji_button.search": "Search...",
|
|
||||||
"emoji_button.search_results": "Search results",
|
|
||||||
"emoji_button.symbols": "Symbols",
|
|
||||||
"emoji_button.travel": "Travel & Places",
|
|
||||||
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
|
|
||||||
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
|
|
||||||
"empty_column.hashtag": "There is nothing in this hashtag yet.",
|
|
||||||
"empty_column.home": "Your home timeline is empty! Visit {public} or use query to get started and meet other users.",
|
|
||||||
"empty_column.home.public_timeline": "the public timeline",
|
|
||||||
"empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
|
|
||||||
"empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
|
|
||||||
"empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
|
|
||||||
"follow_request.authorize": "Authorize",
|
|
||||||
"follow_request.reject": "Reject",
|
|
||||||
"getting_started.appsshort": "Apps",
|
|
||||||
"getting_started.faq": "FAQ",
|
|
||||||
"getting_started.heading": "Getting started",
|
|
||||||
"getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
|
|
||||||
"getting_started.userguide": "User Guide",
|
|
||||||
"home.column_settings.advanced": "Advanced",
|
|
||||||
"home.column_settings.basic": "Basic",
|
|
||||||
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
|
||||||
"home.column_settings.show_reblogs": "Show relays",
|
|
||||||
"home.column_settings.show_replies": "Show replies",
|
|
||||||
"home.settings": "Column settings",
|
|
||||||
"keyboard_shortcuts.back": "to navigate back",
|
|
||||||
"keyboard_shortcuts.boost": "to boost",
|
|
||||||
"keyboard_shortcuts.column": "to focus a status in one of the columns",
|
|
||||||
"keyboard_shortcuts.compose": "to focus the compose textarea",
|
|
||||||
"keyboard_shortcuts.description": "Description",
|
|
||||||
"keyboard_shortcuts.down": "to move down in the list",
|
|
||||||
"keyboard_shortcuts.enter": "to open status",
|
|
||||||
"keyboard_shortcuts.favourite": "to favourite",
|
|
||||||
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
|
|
||||||
"keyboard_shortcuts.hotkey": "Hotkey",
|
|
||||||
"keyboard_shortcuts.legend": "to display this legend",
|
|
||||||
"keyboard_shortcuts.mention": "to mention author",
|
|
||||||
"keyboard_shortcuts.reply": "to reply",
|
|
||||||
"keyboard_shortcuts.search": "to focus search",
|
|
||||||
"keyboard_shortcuts.toot": "to start a brand new ping",
|
|
||||||
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
|
||||||
"keyboard_shortcuts.up": "to move up in the list",
|
|
||||||
"lightbox.close": "Close",
|
|
||||||
"lightbox.next": "Next",
|
|
||||||
"lightbox.previous": "Previous",
|
|
||||||
"lists.account.add": "Add to list",
|
|
||||||
"lists.account.remove": "Remove from list",
|
|
||||||
"lists.delete": "Delete list",
|
|
||||||
"lists.edit": "Edit list",
|
|
||||||
"lists.new.create": "Add list",
|
|
||||||
"lists.new.title_placeholder": "New list title",
|
|
||||||
"lists.search": "Search among people you follow",
|
|
||||||
"lists.subheading": "Your lists",
|
|
||||||
"loading_indicator.label": "Loading...",
|
|
||||||
"media_gallery.toggle_visible": "Toggle visibility",
|
|
||||||
"missing_indicator.label": "Not found",
|
|
||||||
"missing_indicator.sublabel": "This resource could not be found",
|
|
||||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
|
||||||
"navigation_bar.blocks": "~/.blocks",
|
|
||||||
"navigation_bar.community_timeline": "/timelines/local",
|
|
||||||
"navigation_bar.direct": "~/.dms",
|
|
||||||
"navigation_bar.edit_profile": "edit ~/.profile",
|
|
||||||
"navigation_bar.favourites": "~/.florps",
|
|
||||||
"navigation_bar.follow_requests": "~/.follow-requests",
|
|
||||||
"navigation_bar.info": "/about/more",
|
|
||||||
"navigation_bar.keyboard_shortcuts": "~/.kbd/shortcuts.conf",
|
|
||||||
"navigation_bar.lists": "~/.lists",
|
|
||||||
"navigation_bar.logout": "Jack out",
|
|
||||||
"navigation_bar.mutes": "~/.muted",
|
|
||||||
"navigation_bar.pins": "~/.pinned",
|
|
||||||
"navigation_bar.preferences": "edit ~/.config",
|
|
||||||
"navigation_bar.public_timeline": "/timelines/federated",
|
|
||||||
"notification.favourite": "{name} florped your ping",
|
|
||||||
"notification.follow": "{name} followed you",
|
|
||||||
"notification.mention": "{name} mentioned you",
|
|
||||||
"notification.reblog": "{name} relayed your ping",
|
|
||||||
"notifications.clear": "Clear notifications",
|
|
||||||
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
|
|
||||||
"notifications.column_settings.alert": "Desktop notifications",
|
|
||||||
"notifications.column_settings.favourite": "Favourites:",
|
|
||||||
"notifications.column_settings.follow": "New followers:",
|
|
||||||
"notifications.column_settings.mention": "Mentions:",
|
|
||||||
"notifications.column_settings.push": "Push notifications",
|
|
||||||
"notifications.column_settings.push_meta": "This device",
|
|
||||||
"notifications.column_settings.reblog": "Boosts:",
|
|
||||||
"notifications.column_settings.show": "Show in column",
|
|
||||||
"notifications.column_settings.sound": "Play sound",
|
|
||||||
"onboarding.done": "Done",
|
|
||||||
"onboarding.next": "Next",
|
|
||||||
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
|
||||||
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
|
||||||
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
|
||||||
"onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
|
||||||
"onboarding.page_one.full_handle": "Your full handle",
|
|
||||||
"onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.",
|
|
||||||
"onboarding.page_one.welcome": "Welcome to Mastodon!",
|
|
||||||
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
|
||||||
"onboarding.page_six.almost_done": "Almost done...",
|
|
||||||
"onboarding.page_six.appetoot": "Hang ten on the cybrewaves!",
|
|
||||||
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
|
||||||
"onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
|
||||||
"onboarding.page_six.guidelines": "community guidelines",
|
|
||||||
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
|
||||||
"onboarding.page_six.various_app": "mobile apps",
|
|
||||||
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
|
||||||
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
|
||||||
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
|
||||||
"onboarding.skip": "Skip",
|
|
||||||
"privacy.change": "Adjust status privacy",
|
|
||||||
"privacy.direct.long": "Post to mentioned users only",
|
|
||||||
"privacy.direct.short": "Direct",
|
|
||||||
"privacy.private.long": "Post to followers only",
|
|
||||||
"privacy.private.short": "Followers-only",
|
|
||||||
"privacy.public.long": "Post to public timelines",
|
|
||||||
"privacy.public.short": "Public",
|
|
||||||
"privacy.unlisted.long": "Do not post to public timelines",
|
|
||||||
"privacy.unlisted.short": "Unlisted",
|
|
||||||
"regeneration_indicator.label": "Loading…",
|
|
||||||
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
|
|
||||||
"relative_time.days": "{number}d",
|
|
||||||
"relative_time.hours": "{number}h",
|
|
||||||
"relative_time.just_now": "now",
|
|
||||||
"relative_time.minutes": "{number}m",
|
|
||||||
"relative_time.seconds": "{number}s",
|
|
||||||
"reply_indicator.cancel": "Cancel",
|
|
||||||
"report.forward": "Forward to {target}",
|
|
||||||
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
|
|
||||||
"report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
|
|
||||||
"report.placeholder": "Additional comments",
|
|
||||||
"report.submit": "Submit",
|
|
||||||
"report.target": "Reporting {target}",
|
|
||||||
"search.placeholder": "Query...",
|
|
||||||
"search_popout.search_format": "Advanced search format",
|
|
||||||
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
|
||||||
"search_popout.tips.hashtag": "hashtag",
|
|
||||||
"search_popout.tips.status": "status",
|
|
||||||
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
|
||||||
"search_popout.tips.user": "user",
|
|
||||||
"search_results.accounts": "People",
|
|
||||||
"search_results.hashtags": "Hashtags",
|
|
||||||
"search_results.statuses": "Pings",
|
|
||||||
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
|
|
||||||
"standalone.public_title": "Peer into the data grid...",
|
|
||||||
"status.block": "Block @{name}",
|
|
||||||
"status.cannot_reblog": "This ping cannot be relayed",
|
|
||||||
"status.delete": "Delete",
|
|
||||||
"status.embed": "Embed",
|
|
||||||
"status.favourite": "Florp",
|
|
||||||
"status.load_more": "Load more",
|
|
||||||
"status.media_hidden": "Media hidden",
|
|
||||||
"status.mention": "Mention @{name}",
|
|
||||||
"status.more": "More",
|
|
||||||
"status.mute": "Mute @{name}",
|
|
||||||
"status.mute_conversation": "Mute conversation",
|
|
||||||
"status.open": "Expand this status",
|
|
||||||
"status.pin": "Pin on profile",
|
|
||||||
"status.pinned": "Pinned ping",
|
|
||||||
"status.reblog": "Relay",
|
|
||||||
"status.reblogged_by": "{name} relayed",
|
|
||||||
"status.reply": "Reply",
|
|
||||||
"status.replyAll": "Reply to thread",
|
|
||||||
"status.report": "Report @{name}",
|
|
||||||
"status.sensitive_toggle": "Click to view",
|
|
||||||
"status.sensitive_warning": "Sensitive content",
|
|
||||||
"status.share": "Share",
|
|
||||||
"status.show_less": "Show less",
|
|
||||||
"status.show_less_all": "Show less for all",
|
|
||||||
"status.show_more": "Show more",
|
|
||||||
"status.show_more_all": "Show more for all",
|
|
||||||
"status.unmute_conversation": "Unmute conversation",
|
|
||||||
"status.unpin": "Unpin from profile",
|
|
||||||
"tabs_bar.federated_timeline": "/timelines/federated",
|
|
||||||
"tabs_bar.home": "/timelines/home",
|
|
||||||
"tabs_bar.local_timeline": "/timelines/local",
|
|
||||||
"tabs_bar.notifications": "~/.notifications",
|
|
||||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
|
||||||
"upload_area.title": "Drag & drop to upload",
|
|
||||||
"upload_button.label": "Add media",
|
|
||||||
"upload_form.description": "Describe for the visually impaired",
|
|
||||||
"upload_form.focus": "Crop",
|
|
||||||
"upload_form.undo": "Undo",
|
|
||||||
"upload_progress.label": "Uploading...",
|
|
||||||
"video.close": "Close video",
|
|
||||||
"video.exit_fullscreen": "Exit full screen",
|
|
||||||
"video.expand": "Expand video",
|
|
||||||
"video.fullscreen": "Full screen",
|
|
||||||
"video.hide": "Hide video",
|
|
||||||
"video.mute": "Mute sound",
|
|
||||||
"video.pause": "Pause",
|
|
||||||
"video.play": "Play",
|
|
||||||
"video.unmute": "Unmute sound",
|
|
||||||
"video_player.expand": "Expand video",
|
|
||||||
"video_player.toggle_sound": "Toggle sound",
|
|
||||||
"video_player.toggle_visible": "Toggle visibility",
|
|
||||||
"video_player.video_error": "Video could not be played"
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
[
|
|
||||||
]
|
|
|
@ -3,6 +3,7 @@ import {
|
||||||
REBLOG_FAIL,
|
REBLOG_FAIL,
|
||||||
FAVOURITE_REQUEST,
|
FAVOURITE_REQUEST,
|
||||||
FAVOURITE_FAIL,
|
FAVOURITE_FAIL,
|
||||||
|
UNFAVOURITE_SUCCESS,
|
||||||
} from '../actions/interactions';
|
} from '../actions/interactions';
|
||||||
import {
|
import {
|
||||||
STATUS_MUTE_SUCCESS,
|
STATUS_MUTE_SUCCESS,
|
||||||
|
@ -37,6 +38,9 @@ export default function statuses(state = initialState, action) {
|
||||||
return importStatuses(state, action.statuses);
|
return importStatuses(state, action.statuses);
|
||||||
case FAVOURITE_REQUEST:
|
case FAVOURITE_REQUEST:
|
||||||
return state.setIn([action.status.get('id'), 'favourited'], true);
|
return state.setIn([action.status.get('id'), 'favourited'], true);
|
||||||
|
case UNFAVOURITE_SUCCESS:
|
||||||
|
const favouritesCount = action.status.get('favourites_count');
|
||||||
|
return state.setIn([action.status.get('id'), 'favourites_count'], favouritesCount - 1);
|
||||||
case FAVOURITE_FAIL:
|
case FAVOURITE_FAIL:
|
||||||
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'favourited'], false);
|
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'favourited'], false);
|
||||||
case REBLOG_REQUEST:
|
case REBLOG_REQUEST:
|
||||||
|
|
|
@ -8,5 +8,3 @@ loadPolyfills().then(() => {
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
});
|
});
|
||||||
|
|
||||||
require('what-input');
|
|
||||||
|
|
|
@ -18,12 +18,6 @@ window.addEventListener('message', e => {
|
||||||
id: data.id,
|
id: data.id,
|
||||||
height: document.getElementsByTagName('html')[0].scrollHeight,
|
height: document.getElementsByTagName('html')[0].scrollHeight,
|
||||||
}, '*');
|
}, '*');
|
||||||
|
|
||||||
if (document.fonts && document.fonts.ready) {
|
|
||||||
document.fonts.ready.then(sizeBioText);
|
|
||||||
} else {
|
|
||||||
sizeBioText();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -123,25 +117,6 @@ function main() {
|
||||||
|
|
||||||
delegate(document, '.custom-emoji', 'mouseover', getEmojiAnimationHandler('data-original'));
|
delegate(document, '.custom-emoji', 'mouseover', getEmojiAnimationHandler('data-original'));
|
||||||
delegate(document, '.custom-emoji', 'mouseout', getEmojiAnimationHandler('data-static'));
|
delegate(document, '.custom-emoji', 'mouseout', getEmojiAnimationHandler('data-static'));
|
||||||
|
|
||||||
if (document.body.classList.contains('with-modals')) {
|
|
||||||
const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
|
|
||||||
const scrollbarWidthStyle = document.createElement('style');
|
|
||||||
scrollbarWidthStyle.id = 'scrollbar-width';
|
|
||||||
document.head.appendChild(scrollbarWidthStyle);
|
|
||||||
scrollbarWidthStyle.sheet.insertRule(`body.with-modals--active { margin-right: ${scrollbarWidth}px; }`, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
[].forEach.call(document.querySelectorAll('[data-component="Card"]'), (content) => {
|
|
||||||
const props = JSON.parse(content.getAttribute('data-props'));
|
|
||||||
ReactDOM.render(<CardContainer locale={locale} {...props} />, content);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (document.fonts && document.fonts.ready) {
|
|
||||||
document.fonts.ready.then(sizeBioText);
|
|
||||||
} else {
|
|
||||||
sizeBioText();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
delegate(document, '.webapp-btn', 'click', ({ target, button }) => {
|
delegate(document, '.webapp-btn', 'click', ({ target, button }) => {
|
||||||
|
@ -282,22 +257,6 @@ function main() {
|
||||||
target.style.display = 'block';
|
target.style.display = 'block';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
delegate(document, '#account_note', 'input', sizeBioText);
|
|
||||||
|
|
||||||
function sizeBioText() {
|
|
||||||
const noteCounter = document.querySelector('.note-counter');
|
|
||||||
const bioTextArea = document.querySelector('#account_note');
|
|
||||||
|
|
||||||
if (noteCounter) {
|
|
||||||
noteCounter.textContent = 413 - length(bioTextArea.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bioTextArea) {
|
|
||||||
bioTextArea.style.height = 'auto';
|
|
||||||
bioTextArea.style.height = (bioTextArea.scrollHeight+3) + 'px';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
loadPolyfills().then(main).catch(error => {
|
loadPolyfills().then(main).catch(error => {
|
||||||
|
|
|
@ -1,86 +0,0 @@
|
||||||
|
|
||||||
@import 'application';
|
|
||||||
|
|
||||||
/* Wider compose area */
|
|
||||||
@media screen and (min-width: 1300px) {
|
|
||||||
.drawer {
|
|
||||||
width: 17%; /* Not part of the flex fun */
|
|
||||||
max-width: 400px;
|
|
||||||
min-width: 330px;
|
|
||||||
}
|
|
||||||
.layout-multiple-columns .column {
|
|
||||||
flex-grow: 1 !important;
|
|
||||||
max-width: 400px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Don't show outline around statuses if we're in
|
|
||||||
* mouse or touch mode (rather than keyboard) */
|
|
||||||
[data-whatinput="mouse"], [data-whatinput="touch"] {
|
|
||||||
.status__content:focus, .status:focus,
|
|
||||||
.status__wrapper:focus, .status__content__text:focus {
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Less emphatic show more */
|
|
||||||
.status__content__read-more-button {
|
|
||||||
font-size: 14px;
|
|
||||||
color: $dark-text-color;
|
|
||||||
|
|
||||||
.status__prepend-icon {
|
|
||||||
padding-right: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Show a little arrowey thing after the time in a
|
|
||||||
* status to signal that you can click it to see
|
|
||||||
* a detailed view */
|
|
||||||
.status time:after,
|
|
||||||
.detailed-status__datetime span:after {
|
|
||||||
font: normal normal normal 14px/1 FontAwesome;
|
|
||||||
content: "\00a0\00a0\f08e";
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Don't display the elephant mascot (we have our
|
|
||||||
* own, thanks) */
|
|
||||||
.drawer__inner__mastodon {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Let the compose area/drawer be short, but
|
|
||||||
* expand if necessary */
|
|
||||||
.drawer .drawer__inner {
|
|
||||||
overflow: visible;
|
|
||||||
height:inherit;
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
.drawer__pager {
|
|
||||||
overflow-y:auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Put a reasonable background on the single-column compose form */
|
|
||||||
.layout-single-column .compose-panel {
|
|
||||||
background-color: $ui-base-color;
|
|
||||||
height: auto;
|
|
||||||
overflow-y: visible;
|
|
||||||
margin-top: 65px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Better distinguish the search bar */
|
|
||||||
.layout-single-column .compose-panel .search {
|
|
||||||
position:relative;
|
|
||||||
top: -55px;
|
|
||||||
margin-bottom: -55px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Use display: none instead of visibility:hidden
|
|
||||||
* to hide the suggested follows list on non-mobile */
|
|
||||||
@media screen and (min-width: 630px) {
|
|
||||||
.search-results .trends {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@import 'fullwidth-media';
|
|
||||||
|
|
|
@ -1,955 +0,0 @@
|
||||||
$success-green: #B64579; // Padua
|
|
||||||
|
|
||||||
$ui-base-color: #f7e8ed; // "darkest"
|
|
||||||
$ui-base-alt: #f9f2f5;
|
|
||||||
$ui-base-lighter-color: darken($ui-base-color, 40%); // Lighter darkest
|
|
||||||
$ui-secondary-color: #ead0d6; // "lightest"
|
|
||||||
$ui-primary-color: #bf5677; // "lighter"
|
|
||||||
$ui-highlight-color: #bf5677; // "vibrant"
|
|
||||||
$primary-text-color: #382b32;
|
|
||||||
$dark-text-color: #ca748f;
|
|
||||||
$secondary-text-color: #382b32;
|
|
||||||
|
|
||||||
$header-color: $ui-primary-color;
|
|
||||||
$header-text-color: #fff;
|
|
||||||
$icon-button-inactive-color: lighten(desaturate($ui-base-lighter-color, 20%), 20%);
|
|
||||||
$action-button-color: $icon-button-inactive-color;
|
|
||||||
|
|
||||||
$about-page-text: $primary-text-color;
|
|
||||||
|
|
||||||
@import 'cybre-base';
|
|
||||||
|
|
||||||
$gold-star: #dd9d08;
|
|
||||||
|
|
||||||
/* cybre-specific additions */
|
|
||||||
|
|
||||||
.column .static-content.getting-started {
|
|
||||||
background-image: url('../images/logo-cybre-light.png');
|
|
||||||
background-size:auto 50%;
|
|
||||||
background-position: 50% 75%;
|
|
||||||
background-repeat:no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ui, body {
|
|
||||||
background: $ui-base-color url('../images/background-cybre-light.png');
|
|
||||||
background-attachment: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
.drawer__inner__mastodon {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page .header-wrapper {
|
|
||||||
background-image:url('../images/header-cybre-alt.jpg');
|
|
||||||
background-size:cover;
|
|
||||||
background-position:50% 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .header {
|
|
||||||
background-image:url('../images/header-cybre-colour.jpg');
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
background-size:contain;
|
|
||||||
height:45vh;
|
|
||||||
width: 100%;
|
|
||||||
position:absolute;
|
|
||||||
z-index: 1;
|
|
||||||
text-align:center;
|
|
||||||
|
|
||||||
display: unset!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .header img {
|
|
||||||
margin: auto;
|
|
||||||
max-height:45vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.landing-page.alternative .grid {
|
|
||||||
position: relative;
|
|
||||||
z-index:2;
|
|
||||||
margin-top:15vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .landing-page__hero img {
|
|
||||||
visibility: hidden;
|
|
||||||
max-height:170px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .landing-page__forms {
|
|
||||||
height:auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .column-1 {
|
|
||||||
display:flex;
|
|
||||||
align-items:flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .column {
|
|
||||||
max-height:initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .row__mascot {
|
|
||||||
.floats {
|
|
||||||
position:absolute;
|
|
||||||
img {
|
|
||||||
width:100%;
|
|
||||||
height:100%;
|
|
||||||
}
|
|
||||||
transition: all 0.1s linear;
|
|
||||||
animation-name: floating;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
animation-direction: alternate;
|
|
||||||
animation-timing-function: ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.float-1 {
|
|
||||||
width:50px;
|
|
||||||
height:50px;
|
|
||||||
bottom:60px;
|
|
||||||
left:110px;
|
|
||||||
animation-duration: 3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.float-2 {
|
|
||||||
width:130px;
|
|
||||||
height:130px;
|
|
||||||
left:85px;
|
|
||||||
bottom: -60px;
|
|
||||||
animation-duration: 3.5s;
|
|
||||||
animation-delay: 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.float-3 {
|
|
||||||
width:100px;
|
|
||||||
height:100px;
|
|
||||||
right: 50;
|
|
||||||
top: -10px;
|
|
||||||
animation-duration: 4s;
|
|
||||||
animation-delay: 0.5s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* about.scss */
|
|
||||||
|
|
||||||
.landing-page {
|
|
||||||
h1 {
|
|
||||||
color: $about-page-text;
|
|
||||||
small {
|
|
||||||
color: lighten($about-page-text, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p, li {
|
|
||||||
color: $about-page-text;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-wrapper {
|
|
||||||
padding-top:0px;
|
|
||||||
|
|
||||||
background-size:cover;
|
|
||||||
background-position:50% 55%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-wrapper {
|
|
||||||
.mascot {
|
|
||||||
width:500px;
|
|
||||||
bottom:-52px;
|
|
||||||
left:-120px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.container.links {
|
|
||||||
background-color: $ui-base-color;
|
|
||||||
border-top: 5px solid $ui-primary-color;
|
|
||||||
width:100%;
|
|
||||||
max-width:100%;
|
|
||||||
padding:0px calc(50% - 400px);
|
|
||||||
|
|
||||||
a {
|
|
||||||
&:hover {
|
|
||||||
color: lighten($ui-primary-color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.container.hero {
|
|
||||||
.floats {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.closed-registrations-message, form {
|
|
||||||
border-top: 50px solid #5f4770;
|
|
||||||
-webkit-box-shadow: 0 0 6px rgba(0,0,0,.1);
|
|
||||||
box-shadow: 0 0 6px rgba(0,0,0,.1);
|
|
||||||
|
|
||||||
&:before {
|
|
||||||
font-size: 16px;
|
|
||||||
font-family:inherit;
|
|
||||||
line-height:inherit;
|
|
||||||
font-weight:normal;
|
|
||||||
color:white;
|
|
||||||
position:absolute;
|
|
||||||
top:-35px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.closed-registrations-message:before {
|
|
||||||
content: "Registrations closed";
|
|
||||||
}
|
|
||||||
|
|
||||||
form:before {
|
|
||||||
content: "Register now";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#mastodon-timeline {
|
|
||||||
.column-header {
|
|
||||||
color:white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.features-list__row {
|
|
||||||
.text {
|
|
||||||
color: $about-page-text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.information-board {
|
|
||||||
.panel {
|
|
||||||
.panel-header {
|
|
||||||
color: $primary-text-color;
|
|
||||||
border-bottom: 1px solid lighten($ui-secondary-color, 4%);
|
|
||||||
|
|
||||||
a,
|
|
||||||
span {
|
|
||||||
font-weight: 400;
|
|
||||||
color: lighten($ui-primary-color, 4%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* components.scss */
|
|
||||||
|
|
||||||
.onboarding-modal__page {
|
|
||||||
p {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.column-header {
|
|
||||||
background: $header-color;
|
|
||||||
color: $header-text-color;
|
|
||||||
border-top-left-radius: 3px;
|
|
||||||
border-top-right-radius: 3px;
|
|
||||||
box-shadow: 0px 0px 3px rgba(0,0,0,0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.column-header__button {
|
|
||||||
background: $header-color;
|
|
||||||
color: $header-text-color;
|
|
||||||
border-top-right-radius: 3px;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: darken($ui-base-color, 10%);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
color: $primary-text-color;
|
|
||||||
background: darken($ui-base-color, 5%);
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: darken($ui-base-color, 5%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-card, .status-card.compact {
|
|
||||||
border-color: $ui-highlight-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// selectivity -- needs to override .column-header > button
|
|
||||||
.column-header .column-header__back-button {
|
|
||||||
background: $header-color;
|
|
||||||
color:$header-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.column-back-button {
|
|
||||||
background: $header-color;
|
|
||||||
color:$header-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.column-header__collapsible-inner {
|
|
||||||
background: darken($ui-base-alt, 2%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-column-indicator,
|
|
||||||
.error-column {
|
|
||||||
color: darken($ui-base-lighter-color, 15%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.column > .scrollable {
|
|
||||||
background: $ui-base-alt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.compose-form {
|
|
||||||
.autosuggest-textarea__textarea,
|
|
||||||
.spoiler-input__input {
|
|
||||||
color: $primary-text-color;
|
|
||||||
border: 1px solid $ui-primary-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.autosuggest-textarea__textarea {
|
|
||||||
border-bottom-width:0px;
|
|
||||||
}
|
|
||||||
.compose-form__modifiers {
|
|
||||||
border: 1px solid $ui-primary-color;
|
|
||||||
border-top-width:0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.compose-form__buttons button.active:last-child {
|
|
||||||
border-radius:3px;
|
|
||||||
background: $ui-base-color;
|
|
||||||
color: $ui-primary-color;
|
|
||||||
}
|
|
||||||
.compose-form__buttons-wrapper {
|
|
||||||
background-color:$ui-primary-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.compose-form__warning a {
|
|
||||||
color:white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button.inverted {
|
|
||||||
color:white;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color:$ui-secondary-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
button.icon-button {
|
|
||||||
&.disabled {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button {
|
|
||||||
&.inverted {
|
|
||||||
color: darken($ui-base-lighter-color, 10%);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.overlayed {
|
|
||||||
background: rgba($base-overlay-background, 0.2);
|
|
||||||
color: rgba($white, 0.7);
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: rgba($base-overlay-background, 0.4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled {
|
|
||||||
color: desaturate($icon-button-inactive-color, 5%);
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:active,
|
|
||||||
&:focus {
|
|
||||||
color: desaturate($icon-button-inactive-color, 5%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
color: $icon-button-inactive-color;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:active,
|
|
||||||
&:focus {
|
|
||||||
color: darken($icon-button-inactive-color, 5%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button.star-icon,
|
|
||||||
.icon-button.star-icon:active {
|
|
||||||
background:transparent;
|
|
||||||
border:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button.star-icon.active {
|
|
||||||
color: $gold-star;
|
|
||||||
&:active, &:hover, &:focus {
|
|
||||||
color: $gold-star;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-icon-button {
|
|
||||||
color: $white;
|
|
||||||
&.active {
|
|
||||||
background: $ui-base-color;
|
|
||||||
color: $ui-primary-color;
|
|
||||||
}
|
|
||||||
&:focus, &:hover {
|
|
||||||
color: darken($ui-base-color, 3%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.status.status-direct {
|
|
||||||
background: darken($ui-base-alt, 5%);
|
|
||||||
.icon-button.disabled {
|
|
||||||
color: lighten($ui-base-lighter-color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.account__header, .account-card {
|
|
||||||
& > div {
|
|
||||||
background: rgba(lighten($ui-base-color, 4%), 0.6);
|
|
||||||
}
|
|
||||||
|
|
||||||
.account__header__content {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailed-status__display-name .display-name strong {
|
|
||||||
color: $ui-highlight-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button {
|
|
||||||
&, &:hover {
|
|
||||||
color:desaturate($ui-base-lighter-color, 20%);
|
|
||||||
}
|
|
||||||
&.active {
|
|
||||||
&, &:hover {
|
|
||||||
color:$ui-base-lighter-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.account__section-headline a {
|
|
||||||
&.active {
|
|
||||||
color: $primary-text-color;
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
border-bottom-color: $ui-base-alt;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
border-bottom-color: $ui-base-alt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.privacy-dropdown.active .privacy-dropdown__value.active .icon-button {
|
|
||||||
color: $ui-primary-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.privacy-dropdown__option {
|
|
||||||
color: $primary-text-color;
|
|
||||||
|
|
||||||
strong {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&.active {
|
|
||||||
color: $white;
|
|
||||||
|
|
||||||
.privacy-dropdown__option__content {
|
|
||||||
color: $white;
|
|
||||||
|
|
||||||
strong {
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.emoji-picker-dropdown__menu {
|
|
||||||
.emoji-search-wrapper {
|
|
||||||
border-color: darken($ui-base-color, 10%);
|
|
||||||
}
|
|
||||||
.emoji-search {
|
|
||||||
background: darken($ui-base-color, 5%);
|
|
||||||
border-color: darken($ui-base-color, 10%);
|
|
||||||
}
|
|
||||||
.emoji-mart {
|
|
||||||
color: $ui-primary-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-popout {
|
|
||||||
background: $ui-base-color;
|
|
||||||
color: $ui-primary-color;
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
color: $ui-primary-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
em {
|
|
||||||
color: $ui-highlight-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.search__icon .fa.active {
|
|
||||||
opacity:1.0;
|
|
||||||
}
|
|
||||||
.search-results__hashtag {
|
|
||||||
color: darken($ui-primary-color, 10%);
|
|
||||||
&:hover {
|
|
||||||
color: lighten($ui-primary-color, 5%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.static-content {
|
|
||||||
/*color: $primary-text-color;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#Getting-started {
|
|
||||||
background: $ui-primary-color;
|
|
||||||
border-bottom:0px;
|
|
||||||
color:white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.getting-started {
|
|
||||||
p {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: darken($ui-base-lighter-color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.getting-started__wrapper {
|
|
||||||
flex: 0 0.5 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.getting-started {
|
|
||||||
.column-link {
|
|
||||||
background: lighten($ui-primary-color, 5%);
|
|
||||||
color:$white;
|
|
||||||
&:hover {
|
|
||||||
background: lighten($ui-primary-color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.column-link__badge {
|
|
||||||
background: saturate(darken($ui-primary-color, 5%), 5%);
|
|
||||||
}
|
|
||||||
.column-subheading {
|
|
||||||
background: darken($ui-primary-color, 5%);
|
|
||||||
color:$white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-spoiler,
|
|
||||||
.video-player__spoiler.active {
|
|
||||||
color: $white;
|
|
||||||
&:hover {
|
|
||||||
color: darken($white, 5%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.status {
|
|
||||||
border-bottom: 1px solid $ui-secondary-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__relative-time, .status__display-name {
|
|
||||||
color: darken($ui-base-color, 40%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__content {
|
|
||||||
.status__content__spoiler-link {
|
|
||||||
background: $ui-base-lighter-color;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: lighten($ui-base-lighter-color, 5%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.muted .status__content p {
|
|
||||||
color: $icon-button-inactive-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-menu__item {
|
|
||||||
& > a {
|
|
||||||
color: $primary-text-color;
|
|
||||||
&:hover, &:active, &:focus {
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown--active .dropdown__content {
|
|
||||||
& > ul {
|
|
||||||
background: $ui-base-color;
|
|
||||||
box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);
|
|
||||||
& > li > a {
|
|
||||||
background: $ui-base-color;
|
|
||||||
color: $primary-text-color;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: $ui-highlight-color;
|
|
||||||
color: $ui-base-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.boost-modal,
|
|
||||||
.confirmation-modal,
|
|
||||||
.report-modal,
|
|
||||||
.actions-modal,
|
|
||||||
.mute-modal
|
|
||||||
{
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
.boost-modal__action-bar,
|
|
||||||
.confirmation-modal__action-bar,
|
|
||||||
.mute-modal__action-bar,
|
|
||||||
.report-modal__action-bar,
|
|
||||||
.mute-modal__action-bar {
|
|
||||||
& > div {
|
|
||||||
color: $ui-primary-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.actions-modal
|
|
||||||
{
|
|
||||||
ul {
|
|
||||||
li:not(:empty) {
|
|
||||||
a {
|
|
||||||
color: $primary-text-color;
|
|
||||||
button {
|
|
||||||
|
|
||||||
}
|
|
||||||
&.active, &:hover, &:active, &:focus {
|
|
||||||
color: $white;
|
|
||||||
button {
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.react-toggle-track {
|
|
||||||
background-color: $icon-button-inactive-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.report-modal__comment .setting-text {
|
|
||||||
color: $primary-text-color;
|
|
||||||
border-bottom-color: lighten($ui-primary-color, 10%);
|
|
||||||
&:focus, &:active {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.status.light {
|
|
||||||
.status__content {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
.display-name strong {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.reply-indicator__content a {
|
|
||||||
color: lighten($ui-highlight-color, 30%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__content
|
|
||||||
{
|
|
||||||
a {
|
|
||||||
color: $ui-highlight-color;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
.fa {
|
|
||||||
color: darken($ui-base-color, 40%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailed-status__display-name {
|
|
||||||
color: $ui-base-lighter-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.drawer .drawer__inner {
|
|
||||||
overflow: visible;
|
|
||||||
height:inherit;
|
|
||||||
background:$ui-base-alt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search__icon .fa {
|
|
||||||
color: $ui-highlight-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.drawer__pager {
|
|
||||||
overflow-y:auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.drawer .drawer__header {
|
|
||||||
background: $ui-base-color;
|
|
||||||
border-radius:3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.onboarding-modal__page h1 {
|
|
||||||
background-color: darken($ui-primary-color, 5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll__text input[type="text"],
|
|
||||||
.compose-form__poll-wrapper select {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.compose-form__poll-wrapper .button.button-secondary {
|
|
||||||
color: $ui-highlight-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* forms.scss */
|
|
||||||
.block-button, .button, button {
|
|
||||||
background-color: $ui-primary-color;
|
|
||||||
color: $white;
|
|
||||||
|
|
||||||
&.button-alternative {
|
|
||||||
color: $ui-base-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.logo-button {
|
|
||||||
color: $white;
|
|
||||||
svg path:first-child {
|
|
||||||
fill: $white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.simple_form {
|
|
||||||
p.hint {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.block-button, .button, button {
|
|
||||||
background-color: $ui-primary-color;
|
|
||||||
color: $white;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: lighten($ui-primary-color, 5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active,
|
|
||||||
&:focus {
|
|
||||||
background-color: darken($ui-primary-color, 5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* admin.scss */
|
|
||||||
|
|
||||||
.table > thead > tr > th {
|
|
||||||
border-bottom-color: $ui-secondary-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.simple_form h4 {
|
|
||||||
border-bottom: 1px solid $ui-highlight-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admin-wrapper {
|
|
||||||
.content {
|
|
||||||
h2, p.hint, h4, h6 {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.muted-hint {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar {
|
|
||||||
.logo {
|
|
||||||
-webkit-filter: invert(100%);
|
|
||||||
filter: invert(100%);
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
|
||||||
ul {
|
|
||||||
a {
|
|
||||||
&.selected {
|
|
||||||
background-color: $ui-primary-color;
|
|
||||||
color: $white;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: lighten($ui-primary-color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
&.selected {
|
|
||||||
background-color: $ui-primary-color;
|
|
||||||
color: $white;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: lighten($ui-primary-color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination .current {
|
|
||||||
color: $ui-primary-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.report-accounts__item > strong {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admin-wrapper .content {
|
|
||||||
& > p {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
border-color: $ui-highlight-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* accounts.scss */
|
|
||||||
.card {
|
|
||||||
.name {
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.counter {
|
|
||||||
.counter-number {
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* stream_entries.scss */
|
|
||||||
.activity-stream {
|
|
||||||
.entry {
|
|
||||||
}
|
|
||||||
.status.light {
|
|
||||||
.display-name {
|
|
||||||
strong {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.status__content {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.detailed-status.light {
|
|
||||||
.detailed-status__display-name {
|
|
||||||
.display-name {
|
|
||||||
strong {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.status__content {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
.status-card,
|
|
||||||
.status-card__title,
|
|
||||||
.status-card__description {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* accounts.scss */
|
|
||||||
.card {
|
|
||||||
.name {
|
|
||||||
color: darken($ui-primary-color, 15%);
|
|
||||||
}
|
|
||||||
.counter {
|
|
||||||
.counter-number {
|
|
||||||
color: darken($ui-primary-color, 15%);
|
|
||||||
}
|
|
||||||
border-color: $ui-primary-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.activity-stream-tabs {
|
|
||||||
a {
|
|
||||||
color: lighten($ui-primary-color, 10%);
|
|
||||||
&.active {
|
|
||||||
color: darken($ui-primary-color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* uncategorized */
|
|
||||||
|
|
||||||
.empty-column-indicator, .error-column {
|
|
||||||
background-color: $ui-base-alt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.actions .button.button-alternative {
|
|
||||||
background: $ui-highlight-color;
|
|
||||||
color: $white;
|
|
||||||
|
|
||||||
&:active,
|
|
||||||
&:focus,
|
|
||||||
&:hover {
|
|
||||||
background-color: lighten($ui-highlight-color, 4%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.public-layout .header {
|
|
||||||
background: $ui-highlight-color;
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.public-layout .public-account-header__tabs__name h1 {
|
|
||||||
color: $white;
|
|
||||||
small {
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.public-layout .header .brand:hover,
|
|
||||||
.public-layout .header .brand:focus,
|
|
||||||
.public-layout .header .brand:active {
|
|
||||||
background: lighten($ui-highlight-color, 5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.public-layout .container:last-child {
|
|
||||||
background:$ui-highlight-color;
|
|
||||||
padding-left: 100px;
|
|
||||||
padding-right: 100px;
|
|
||||||
border-radius: 4px;
|
|
||||||
h4 {
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-layout, .modal-layout__mastodon > * {
|
|
||||||
background: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard__widgets a:not(.name-tag) {
|
|
||||||
color: $primary-text-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabs-bar__wrapper {
|
|
||||||
background: $ui-base-color url('../images/background-cybre-light.png');
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-single-column .navigation-panel {
|
|
||||||
background-color: $ui-highlight-color;
|
|
||||||
height: auto;
|
|
||||||
.column-link {
|
|
||||||
background: lighten($ui-primary-color, 5%);
|
|
||||||
color:$white;
|
|
||||||
&:hover {
|
|
||||||
background: lighten($ui-primary-color, 10%);
|
|
||||||
}
|
|
||||||
&.active {
|
|
||||||
background: darken($ui-primary-color, 5%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,278 +0,0 @@
|
||||||
$ui-base-color: #1b1b1b; // darkest
|
|
||||||
$ui-highlight-color: #1ea21e; // vibrant
|
|
||||||
$ui-secondary-color: #E4F2E4; // lightest
|
|
||||||
$ui-primary-color: #E4F2E4; // lighter
|
|
||||||
$ui-primary-color-alt: #a0b49c; // darker, for external pages
|
|
||||||
|
|
||||||
$about-page-text: lighten($ui-base-color, 50%);
|
|
||||||
|
|
||||||
@import 'cybre-base';
|
|
||||||
|
|
||||||
@keyframes floating {
|
|
||||||
from {
|
|
||||||
transform: translate(0, 0);
|
|
||||||
}
|
|
||||||
65% {
|
|
||||||
transform: translate(0, 4px);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
transform: translate(0, -0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
body, body.about-body {
|
|
||||||
background: $ui-base-color url('../images/background-cybre.png');
|
|
||||||
background-attachment: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.about-body {
|
|
||||||
// basics.scss &.about-body
|
|
||||||
background: darken($ui-base-color, 8%) url('../images/background-cybre.png');
|
|
||||||
|
|
||||||
background-position-y: 200px;
|
|
||||||
background-position-x: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-body .mascot {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.muted {
|
|
||||||
.status__content p, .status__content a {
|
|
||||||
color: lighten($ui-base-color, 35%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__display-name strong {
|
|
||||||
color: lighten($ui-base-color, 35%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.compose-form__buttons button.active:last-child {
|
|
||||||
color:$ui-secondary-color;
|
|
||||||
background-color: $ui-highlight-color;
|
|
||||||
border-radius:3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.screenshot-with-signup {
|
|
||||||
min-height:300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container.hero .closed-registrations-message .clock {
|
|
||||||
font-size: 150%;
|
|
||||||
margin: 1em auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.column .static-content.getting-started {
|
|
||||||
background-image: url('../images/logo-cybre.png'), url('../images/background-cybre.png');
|
|
||||||
background-size:auto 50%, cover;
|
|
||||||
background-position: 50% 75%, center center;
|
|
||||||
background-repeat:no-repeat, no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
.columns-area {
|
|
||||||
background: $ui-base-color url('../images/background-cybre.png');
|
|
||||||
}
|
|
||||||
|
|
||||||
.actions .button.button-alternative {
|
|
||||||
background: $ui-highlight-color;
|
|
||||||
color: $ui-primary-color;
|
|
||||||
|
|
||||||
&:active,
|
|
||||||
&:focus,
|
|
||||||
&:hover {
|
|
||||||
background-color: lighten($ui-highlight-color, 4%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1280px) {
|
|
||||||
.landing-page .container.links {
|
|
||||||
top: -15px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .header {
|
|
||||||
background-image:url('../images/header-cybre-colour.jpg');
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
background-size:contain;
|
|
||||||
height:45vh;
|
|
||||||
width: 100%;
|
|
||||||
position:absolute;
|
|
||||||
z-index: 1;
|
|
||||||
text-align:center;
|
|
||||||
|
|
||||||
display: unset!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .header img {
|
|
||||||
margin: auto;
|
|
||||||
max-height:45vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.landing-page.alternative .grid {
|
|
||||||
position: relative;
|
|
||||||
z-index:2;
|
|
||||||
margin-top:15vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .landing-page__hero img {
|
|
||||||
visibility: hidden;
|
|
||||||
max-height:170px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .landing-page__forms {
|
|
||||||
height:auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .column-1 {
|
|
||||||
display:flex;
|
|
||||||
align-items:flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .column {
|
|
||||||
max-height:initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
.landing-page.alternative .row__mascot {
|
|
||||||
.floats {
|
|
||||||
position:absolute;
|
|
||||||
img {
|
|
||||||
width:100%;
|
|
||||||
height:100%;
|
|
||||||
}
|
|
||||||
transition: all 0.1s linear;
|
|
||||||
animation-name: floating;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
animation-direction: alternate;
|
|
||||||
animation-timing-function: ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.float-1 {
|
|
||||||
width:50px;
|
|
||||||
height:50px;
|
|
||||||
bottom:60px;
|
|
||||||
left:110px;
|
|
||||||
animation-duration: 3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.float-2 {
|
|
||||||
width:130px;
|
|
||||||
height:130px;
|
|
||||||
left:85px;
|
|
||||||
bottom: -60px;
|
|
||||||
animation-duration: 3.5s;
|
|
||||||
animation-delay: 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.float-3 {
|
|
||||||
width:100px;
|
|
||||||
height:100px;
|
|
||||||
right: 50;
|
|
||||||
top: -10px;
|
|
||||||
animation-duration: 4s;
|
|
||||||
animation-delay: 0.5s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.activity-stream {
|
|
||||||
.status.light {
|
|
||||||
.status__header .status__meta .status__relative-time {
|
|
||||||
color: $ui-primary-color-alt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.display-name span {
|
|
||||||
color: $ui-primary-color-alt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__content {
|
|
||||||
a.status__content__spoiler-link {
|
|
||||||
background: $ui-primary-color-alt;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: lighten($ui-primary-color-alt, 8%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailed-status.light {
|
|
||||||
.detailed-status__display-name .display-name span {
|
|
||||||
color: $ui-primary-color-alt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__content a.status__content__spoiler-link {
|
|
||||||
background: $ui-primary-color-alt;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: lighten($ui-primary-color-alt, 8%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailed-status__meta {
|
|
||||||
color: $ui-primary-color-alt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.media-spoiler {
|
|
||||||
background: $ui-primary-color-alt;
|
|
||||||
&:hover {
|
|
||||||
background: darken($ui-primary-color-alt, 5%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.pre-header {
|
|
||||||
color: $ui-primary-color-alt;
|
|
||||||
.status__display-name.muted strong {
|
|
||||||
color: $ui-primary-color-alt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.embed .activity-stream .entry .detailed-status.light .button.button-secondary.logo-button {
|
|
||||||
color: $ui-primary-color-alt;
|
|
||||||
svg {
|
|
||||||
path:first-child {
|
|
||||||
fill: $ui-primary-color-alt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:active,
|
|
||||||
&:focus,
|
|
||||||
&:hover {
|
|
||||||
svg path:first-child {
|
|
||||||
fill: lighten($ui-primary-color-alt, 4%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.emoji-mart-search {
|
|
||||||
background: $simple-background-color;
|
|
||||||
input {
|
|
||||||
color: $ui-primary-color-alt;
|
|
||||||
border: 1px solid $ui-primary-color-alt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.emoji-mart-anchor {
|
|
||||||
color: $ui-primary-color-alt;
|
|
||||||
&:hover {
|
|
||||||
color: darken($ui-primary-color-alt, 8%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-popout {
|
|
||||||
background: $ui-base-color;
|
|
||||||
color: $ui-primary-color;
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
color: $ui-primary-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
em {
|
|
||||||
color: $ui-highlight-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__content a,
|
|
||||||
.status__content a.unhandled-link {
|
|
||||||
color: mix($ui-highlight-color, $ui-secondary-color, 10%);
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
|
|
||||||
.detailed-status > .media-spoiler,
|
|
||||||
.status > .media-spoiler,
|
|
||||||
.status .video-player,
|
|
||||||
.media-gallery,
|
|
||||||
.status .status-card.interactive {
|
|
||||||
margin-top: 20px;
|
|
||||||
margin-left: -68px;
|
|
||||||
width: calc(100% + 80px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailed-status > .media-spoiler,
|
|
||||||
.status > .media-spoiler,
|
|
||||||
.video-player {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If there's no status text, add an extra margin on top */
|
|
||||||
.status .status__info + .media-gallery,
|
|
||||||
.status .status__info + .media-spoiler,
|
|
||||||
.status .status__info + .video-player,
|
|
||||||
.status .status__info + .status-card {
|
|
||||||
margin-top: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status__video-player-video {
|
|
||||||
transform: unset;
|
|
||||||
top: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailed-status .media-gallery {
|
|
||||||
margin-left: -10px;
|
|
||||||
width: calc(100% + 22px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.public-layout .status {
|
|
||||||
.status__content {
|
|
||||||
min-height: 15px;
|
|
||||||
}
|
|
||||||
& > .media-spoiler,
|
|
||||||
.video-player,
|
|
||||||
.media-gallery,
|
|
||||||
.status-card {
|
|
||||||
margin-top: 20px;
|
|
||||||
width: calc(100% + 94px);
|
|
||||||
margin-left: -78px;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1591,6 +1591,20 @@ a.account__display-name {
|
||||||
color: $gold-star;
|
color: $gold-star;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.no-reduce-motion .icon-button.star-icon {
|
||||||
|
&.activate {
|
||||||
|
& > .fa-star {
|
||||||
|
animation: spring-rotate-in 1s linear;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.deactivate {
|
||||||
|
& > .fa-star {
|
||||||
|
animation: spring-rotate-out 1s linear;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.notification__display-name {
|
.notification__display-name {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
@ -3049,6 +3063,10 @@ a.status-card {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.status-card__image-image {
|
||||||
|
border-radius: 4px 4px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
.status-card__title {
|
.status-card__title {
|
||||||
white-space: inherit;
|
white-space: inherit;
|
||||||
}
|
}
|
||||||
|
@ -3080,6 +3098,7 @@ a.status-card.compact:hover {
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-card__image-image {
|
.status-card__image-image {
|
||||||
|
border-radius: 4px 0 0 4px;
|
||||||
display: block;
|
display: block;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -3368,6 +3387,50 @@ a.status-card.compact:hover {
|
||||||
animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);
|
animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.61, 0.355, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes spring-rotate-in {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
30% {
|
||||||
|
transform: rotate(-484.8deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
60% {
|
||||||
|
transform: rotate(-316.7deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
90% {
|
||||||
|
transform: rotate(-375deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: rotate(-360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spring-rotate-out {
|
||||||
|
0% {
|
||||||
|
transform: rotate(-360deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
30% {
|
||||||
|
transform: rotate(124.8deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
60% {
|
||||||
|
transform: rotate(-43.27deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
90% {
|
||||||
|
transform: rotate(15deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes loader-figure {
|
@keyframes loader-figure {
|
||||||
0% {
|
0% {
|
||||||
width: 0;
|
width: 0;
|
||||||
|
@ -5189,6 +5252,7 @@ a.status-card.compact:hover {
|
||||||
max-height: 100% !important;
|
max-height: 100% !important;
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
height: 100% !important;
|
height: 100% !important;
|
||||||
|
outline: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5266,6 +5330,10 @@ a.status-card.compact:hover {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
|
|
||||||
|
.video-player__download__icon {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__buttons {
|
&__buttons {
|
||||||
|
|
|
@ -263,6 +263,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
|
max-width: 960px;
|
||||||
|
|
||||||
@media screen and (max-width: $no-gap-breakpoint) {
|
@media screen and (max-width: $no-gap-breakpoint) {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
@ -296,12 +298,6 @@
|
||||||
min-height: 1px;
|
min-height: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: 1rem;
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-left {
|
.nav-left {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
|
|
|
@ -149,10 +149,6 @@ a.table-action-link {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: $no-gap-breakpoint) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&__actions,
|
&__actions,
|
||||||
|
@ -174,10 +170,6 @@ a.table-action-link {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
padding-right: 16px - 5px;
|
padding-right: 16px - 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: $no-gap-breakpoint) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&__form {
|
&__form {
|
||||||
|
@ -198,7 +190,7 @@ a.table-action-link {
|
||||||
background: darken($ui-base-color, 4%);
|
background: darken($ui-base-color, 4%);
|
||||||
|
|
||||||
@media screen and (max-width: $no-gap-breakpoint) {
|
@media screen and (max-width: $no-gap-breakpoint) {
|
||||||
&:first-child {
|
.optional &:first-child {
|
||||||
border-top: 1px solid darken($ui-base-color, 8%);
|
border-top: 1px solid darken($ui-base-color, 8%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -264,6 +256,13 @@ a.table-action-link {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.optional .batch-table__toolbar,
|
||||||
|
&.optional .batch-table__row__select {
|
||||||
|
@media screen and (max-width: $no-gap-breakpoint) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.status__content {
|
.status__content {
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ class ActivityPub::Activity
|
||||||
crawl_links(status)
|
crawl_links(status)
|
||||||
|
|
||||||
notify_about_reblog(status) if reblog_of_local_account?(status)
|
notify_about_reblog(status) if reblog_of_local_account?(status)
|
||||||
notify_about_mentions(status) unless spammy_mentions?(status)
|
notify_about_mentions(status)
|
||||||
|
|
||||||
# Only continue if the status is supposed to have arrived in real-time.
|
# Only continue if the status is supposed to have arrived in real-time.
|
||||||
# Note that if @options[:override_timestamps] isn't set, the status
|
# Note that if @options[:override_timestamps] isn't set, the status
|
||||||
|
@ -105,11 +105,6 @@ class ActivityPub::Activity
|
||||||
status.reblog? && status.reblog.account.local?
|
status.reblog? && status.reblog.account.local?
|
||||||
end
|
end
|
||||||
|
|
||||||
def spammy_mentions?(status)
|
|
||||||
status.has_non_mention_links? &&
|
|
||||||
@account.followers.local.count == 0
|
|
||||||
end
|
|
||||||
|
|
||||||
def notify_about_reblog(status)
|
def notify_about_reblog(status)
|
||||||
NotifyService.new.call(status.reblog.account, status)
|
NotifyService.new.call(status.reblog.account, status)
|
||||||
end
|
end
|
||||||
|
@ -158,6 +153,14 @@ class ActivityPub::Activity
|
||||||
fetch_remote_original_status
|
fetch_remote_original_status
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def follow_request_from_object
|
||||||
|
@follow_request ||= FollowRequest.find_by(target_account: @account, uri: object_uri) unless object_uri.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
def follow_from_object
|
||||||
|
@follow ||= Follow.find_by(target_account: @account, uri: object_uri) unless object_uri.nil?
|
||||||
|
end
|
||||||
|
|
||||||
def fetch_remote_original_status
|
def fetch_remote_original_status
|
||||||
if object_uri.start_with?('http')
|
if object_uri.start_with?('http')
|
||||||
return if ActivityPub::TagManager.instance.local_uri?(object_uri)
|
return if ActivityPub::TagManager.instance.local_uri?(object_uri)
|
||||||
|
|
|
@ -2,17 +2,18 @@
|
||||||
|
|
||||||
class ActivityPub::Activity::Accept < ActivityPub::Activity
|
class ActivityPub::Activity::Accept < ActivityPub::Activity
|
||||||
def perform
|
def perform
|
||||||
|
return accept_follow_for_relay if relay_follow?
|
||||||
|
return follow_request_from_object.authorize! unless follow_request_from_object.nil?
|
||||||
|
|
||||||
case @object['type']
|
case @object['type']
|
||||||
when 'Follow'
|
when 'Follow'
|
||||||
accept_follow
|
accept_embedded_follow
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def accept_follow
|
def accept_embedded_follow
|
||||||
return accept_follow_for_relay if relay_follow?
|
|
||||||
|
|
||||||
target_account = account_from_uri(target_uri)
|
target_account = account_from_uri(target_uri)
|
||||||
|
|
||||||
return if target_account.nil? || !target_account.local?
|
return if target_account.nil? || !target_account.local?
|
||||||
|
|
|
@ -2,17 +2,19 @@
|
||||||
|
|
||||||
class ActivityPub::Activity::Reject < ActivityPub::Activity
|
class ActivityPub::Activity::Reject < ActivityPub::Activity
|
||||||
def perform
|
def perform
|
||||||
|
return reject_follow_for_relay if relay_follow?
|
||||||
|
return follow_request_from_object.reject! unless follow_request_from_object.nil?
|
||||||
|
return UnfollowService.new.call(follow_from_object.target_account, @account) unless follow_from_object.nil?
|
||||||
|
|
||||||
case @object['type']
|
case @object['type']
|
||||||
when 'Follow'
|
when 'Follow'
|
||||||
reject_follow
|
reject_embedded_follow
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def reject_follow
|
def reject_embedded_follow
|
||||||
return reject_follow_for_relay if relay_follow?
|
|
||||||
|
|
||||||
target_account = account_from_uri(target_uri)
|
target_account = account_from_uri(target_uri)
|
||||||
|
|
||||||
return if target_account.nil? || !target_account.local?
|
return if target_account.nil? || !target_account.local?
|
||||||
|
|
|
@ -251,7 +251,7 @@ class Formatter
|
||||||
|
|
||||||
def link_to_url(entity, options = {})
|
def link_to_url(entity, options = {})
|
||||||
url = Addressable::URI.parse(entity[:url])
|
url = Addressable::URI.parse(entity[:url])
|
||||||
html_attrs = { target: '_blank', rel: 'nofollow noopener' }
|
html_attrs = { target: '_blank', rel: 'nofollow noopener noreferrer' }
|
||||||
|
|
||||||
html_attrs[:rel] = "me #{html_attrs[:rel]}" if options[:me]
|
html_attrs[:rel] = "me #{html_attrs[:rel]}" if options[:me]
|
||||||
|
|
||||||
|
@ -262,9 +262,8 @@ class Formatter
|
||||||
|
|
||||||
def link_to_mention(entity, linkable_accounts)
|
def link_to_mention(entity, linkable_accounts)
|
||||||
acct = entity[:screen_name]
|
acct = entity[:screen_name]
|
||||||
username, domain = acct.split('@')
|
|
||||||
|
|
||||||
return link_to_account(acct) unless linkable_accounts and domain != "twitter.com"
|
return link_to_account(acct) unless linkable_accounts
|
||||||
|
|
||||||
account = linkable_accounts.find { |item| TagManager.instance.same_acct?(item.acct, acct) }
|
account = linkable_accounts.find { |item| TagManager.instance.same_acct?(item.acct, acct) }
|
||||||
account ? mention_html(account) : "@#{encode(acct)}"
|
account ? mention_html(account) : "@#{encode(acct)}"
|
||||||
|
@ -273,10 +272,6 @@ class Formatter
|
||||||
def link_to_account(acct)
|
def link_to_account(acct)
|
||||||
username, domain = acct.split('@')
|
username, domain = acct.split('@')
|
||||||
|
|
||||||
if domain == "twitter.com"
|
|
||||||
return mention_twitter_html(username)
|
|
||||||
end
|
|
||||||
|
|
||||||
domain = nil if TagManager.instance.local_domain?(domain)
|
domain = nil if TagManager.instance.local_domain?(domain)
|
||||||
account = EntityCache.instance.mention(username, domain)
|
account = EntityCache.instance.mention(username, domain)
|
||||||
|
|
||||||
|
@ -304,8 +299,4 @@ class Formatter
|
||||||
def mention_html(account)
|
def mention_html(account)
|
||||||
"<span class=\"h-card\"><a href=\"#{encode(ActivityPub::TagManager.instance.url_for(account))}\" class=\"u-url mention\">@<span>#{encode(account.username)}</span></a></span>"
|
"<span class=\"h-card\"><a href=\"#{encode(ActivityPub::TagManager.instance.url_for(account))}\" class=\"u-url mention\">@<span>#{encode(account.username)}</span></a></span>"
|
||||||
end
|
end
|
||||||
|
|
||||||
def mention_twitter_html(username)
|
|
||||||
"<span class=\"h-card\"><a href=\"https://twitter.com/#{username}\" class=\"u-url mention\">@<span>#{username}@twitter.com</span></a></span>"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -45,7 +45,7 @@ class Sanitize
|
||||||
|
|
||||||
add_attributes: {
|
add_attributes: {
|
||||||
'a' => {
|
'a' => {
|
||||||
'rel' => 'nofollow noopener',
|
'rel' => 'nofollow noopener noreferrer',
|
||||||
'target' => '_blank',
|
'target' => '_blank',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -37,6 +37,7 @@ class UserSettingsDecorator
|
||||||
user.settings['use_blurhash'] = use_blurhash_preference if change?('setting_use_blurhash')
|
user.settings['use_blurhash'] = use_blurhash_preference if change?('setting_use_blurhash')
|
||||||
user.settings['use_pending_items'] = use_pending_items_preference if change?('setting_use_pending_items')
|
user.settings['use_pending_items'] = use_pending_items_preference if change?('setting_use_pending_items')
|
||||||
user.settings['trends'] = trends_preference if change?('setting_trends')
|
user.settings['trends'] = trends_preference if change?('setting_trends')
|
||||||
|
user.settings['crop_images'] = crop_images_preference if change?('setting_crop_images')
|
||||||
end
|
end
|
||||||
|
|
||||||
def merged_notification_emails
|
def merged_notification_emails
|
||||||
|
@ -127,6 +128,10 @@ class UserSettingsDecorator
|
||||||
boolean_cast_setting 'setting_trends'
|
boolean_cast_setting 'setting_trends'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def crop_images_preference
|
||||||
|
boolean_cast_setting 'setting_crop_images'
|
||||||
|
end
|
||||||
|
|
||||||
def boolean_cast_setting(key)
|
def boolean_cast_setting(key)
|
||||||
ActiveModel::Type::Boolean.new.cast(settings[key])
|
ActiveModel::Type::Boolean.new.cast(settings[key])
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
class AdminMailer < ApplicationMailer
|
class AdminMailer < ApplicationMailer
|
||||||
layout 'plain_mailer'
|
layout 'plain_mailer'
|
||||||
|
|
||||||
helper :statuses
|
helper :accounts
|
||||||
|
|
||||||
def new_report(recipient, report)
|
def new_report(recipient, report)
|
||||||
@report = report
|
@report = report
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class NotificationMailer < ApplicationMailer
|
class NotificationMailer < ApplicationMailer
|
||||||
|
helper :accounts
|
||||||
helper :statuses
|
helper :statuses
|
||||||
|
|
||||||
add_template_helper RoutingHelper
|
add_template_helper RoutingHelper
|
||||||
|
|
|
@ -3,9 +3,9 @@
|
||||||
class UserMailer < Devise::Mailer
|
class UserMailer < Devise::Mailer
|
||||||
layout 'mailer'
|
layout 'mailer'
|
||||||
|
|
||||||
|
helper :accounts
|
||||||
helper :application
|
helper :application
|
||||||
helper :instance
|
helper :instance
|
||||||
helper :statuses
|
|
||||||
|
|
||||||
add_template_helper RoutingHelper
|
add_template_helper RoutingHelper
|
||||||
|
|
||||||
|
|