From 10924fc5801082042ed6ba11e195887b807aec94 Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Tue, 23 Apr 2019 13:37:40 +0200 Subject: [PATCH 001/129] Accept richer text from remote statuses Support abbr, del, pre, blockquote, code, strong, b, em, i, ul, ol, li and h1 to h5 tags in remote statuses. --- .../styles/mastodon/components.scss | 55 +++++++++++++++++-- app/lib/sanitize_config.rb | 11 ++-- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 4a0d64ad3..e87793104 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -705,10 +705,6 @@ &.status__content--with-spoiler { white-space: normal; - - .status__content__text { - white-space: pre-wrap; - } } .emojione { @@ -717,7 +713,9 @@ margin: -3px 0 0; } - p { + p, + pre, + blockquote { margin-bottom: 20px; white-space: pre-wrap; @@ -726,6 +724,53 @@ } } + h1, + h2, + h3, + h4, + h5 { + margin-top: 20px; + margin-bottom: 20px; + } + + h1, + h2 { + font-weight: 500; + font-size: 18px; + } + + h2 { + font-size: 16px; + } + + blockquote { + margin-left: 20px; + color: $dark-text-color; + } + + b, + strong { + font-weight: 500; + } + + em, + i { + font-style: italic; + } + + ul, + ol { + margin-left: 1em; + } + + ul { + list-style-type: disc; + } + + ol { + list-style-type: decimal; + } + a { color: $secondary-text-color; text-decoration: none; diff --git a/app/lib/sanitize_config.rb b/app/lib/sanitize_config.rb index e82a2a33a..fa2d0784b 100644 --- a/app/lib/sanitize_config.rb +++ b/app/lib/sanitize_config.rb @@ -34,11 +34,13 @@ class Sanitize end MASTODON_STRICT ||= freeze_config( - elements: %w(p br span a), + elements: %w(p br span a abbr del pre blockquote code b strong i em h1 h2 h3 h4 h5 ul ol li), attributes: { - 'a' => %w(href rel class), - 'span' => %w(class), + 'a' => %w(href rel class title), + 'span' => %w(class), + 'abbr' => %w(title), + 'blockquote' => %w(cite), }, add_attributes: { @@ -49,7 +51,8 @@ class Sanitize }, protocols: { - 'a' => { 'href' => HTTP_PROTOCOLS }, + 'a' => { 'href' => HTTP_PROTOCOLS }, + 'blockquote' => { 'cite' => HTTP_PROTOCOLS }, }, transformers: [ From 615bfe8c16deee3d3f5fca597fde9a1b08c582b0 Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Wed, 24 Apr 2019 20:55:01 +0200 Subject: [PATCH 002/129] Improve styling of rich text - Increase font weight of headers and bold text - Increase blockquote's contrast - Avoid some extra margins --- .../styles/mastodon/components.scss | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index e87793104..ed3bbb0d4 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -735,7 +735,7 @@ h1, h2 { - font-weight: 500; + font-weight: 700; font-size: 18px; } @@ -743,14 +743,26 @@ font-size: 16px; } + h3, + h4, + h5 { + font-weight: 500; + } + blockquote { - margin-left: 20px; - color: $dark-text-color; + padding-left: 10px; + border-left: 3px solid $darker-text-color; + color: $darker-text-color; + white-space: normal; + + p:last-child { + margin-bottom: 0; + } } b, strong { - font-weight: 500; + font-weight: 700; } em, @@ -761,6 +773,10 @@ ul, ol { margin-left: 1em; + + p { + margin: 0; + } } ul { From b3e65978b4a60bede5d5c9dc68daa1e5b5888a7a Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Tue, 30 Apr 2019 15:29:28 -0700 Subject: [PATCH 003/129] Support locally cached inline images in Articles --- app/lib/activitypub/activity.rb | 4 +- app/lib/activitypub/activity/create.rb | 53 ++++++++++++++++++++++++++ app/lib/formatter.rb | 5 +++ app/lib/sanitize_config.rb | 3 +- 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 66b5763a9..9b4a88382 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -4,8 +4,8 @@ class ActivityPub::Activity include JsonLdHelper include Redisable - SUPPORTED_TYPES = %w(Note Question).freeze - CONVERTED_TYPES = %w(Image Video Article Page).freeze + SUPPORTED_TYPES = %w(Note Question Article).freeze + CONVERTED_TYPES = %w(Image Video Page).freeze def initialize(json, account, **options) @json = json diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 00f0dd42d..1e47de2d9 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -30,6 +30,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity @mentions = [] @params = {} + process_inline_images if @object['content'].present? && @object['type'] == 'Article' process_status_params process_tags process_audience @@ -73,6 +74,56 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end end + class Handler < ::Ox::Sax + attr_reader :srcs + attr_reader :alts + def initialize(block) + @stack = [] + @srcs = [] + @alts = {} + end + + def start_element(element_name) + @stack << [element_name, {}] + end + + def end_element(element_name) + self_name, self_attributes = @stack[-1] + if self_name == :img && !self_attributes[:src].nil? + @srcs << self_attributes[:src] + @alts[self_attributes[:src]] = self_attributes[:alt] + end + @stack.pop + end + + def attr(attribute_name, attribute_value) + _name, attributes = @stack.last + attributes[attribute_name] = attribute_value + end + end + + def process_inline_images + proc = Proc.new { |name| puts name } + handler = Handler.new(proc) + Ox.sax_parse(handler, @object['content']) + handler.srcs.each do |src| + if skip_download? + @object['content'].gsub!(src, '') + next + end + + media_attachment = MediaAttachment.create(account: @account, remote_url: src, description: handler.alts[src], focus: nil) + media_attachment.file_remote_url = src + media_attachment.save + if unsupported_media_type?(media_attachment.file.content_type) + @object['content'].gsub!(src, '') + media_attachment.delete + else + @object['content'].gsub!(src, media_attachment.file.url(:small)) + end + end + end + def process_audience (as_array(@object['to']) + as_array(@object['cc'])).uniq.each do |audience| next if audience == ActivityPub::TagManager::COLLECTIONS[:public] @@ -310,6 +361,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def text_from_content return Formatter.instance.linkify([[text_from_name, text_from_summary.presence].compact.join("\n\n"), object_url || @object['id']].join(' ')) if converted_object_type? + return Formatter.instance.format_article(@object['content']) if @object['content'].present? && @object['type'] == 'Article' + if @object['content'].present? @object['content'] elsif content_language_map? diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 8a1aad41a..9c2c0cd29 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -90,6 +90,11 @@ class Formatter html.html_safe # rubocop:disable Rails/OutputSafety end + def format_article(text) + text = text.gsub(/>\n+<") + text.html_safe # rubocop:disable Rails/OutputSafety + end + def linkify(text) html = encode_and_link_urls(text) html = simple_format(html, {}, sanitize: false) diff --git a/app/lib/sanitize_config.rb b/app/lib/sanitize_config.rb index fa2d0784b..c157fc16a 100644 --- a/app/lib/sanitize_config.rb +++ b/app/lib/sanitize_config.rb @@ -34,13 +34,14 @@ class Sanitize end MASTODON_STRICT ||= freeze_config( - elements: %w(p br span a abbr del pre blockquote code b strong i em h1 h2 h3 h4 h5 ul ol li), + elements: %w(p br span a abbr del pre blockquote code b strong i em h1 h2 h3 h4 h5 ul ol li img), attributes: { 'a' => %w(href rel class title), 'span' => %w(class), 'abbr' => %w(title), 'blockquote' => %w(cite), + 'img' => %w(src alt), }, add_attributes: { From 0436aa99842e9b17e92c58a81fab1162f037c952 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sun, 5 May 2019 16:59:04 -0700 Subject: [PATCH 004/129] Adding full Article support This creates a new column in the `statuses` table which keeps track of activity_pub_type, so in the case of a Note it will be blank (the default) and it will be a string "Article" if the received remote object is an AP Article. There is now a bunch of special case code in the formatters and sanitizers to handle Articles differently, as well as on the clientside. --- app/javascript/mastodon/components/status.js | 2 +- .../mastodon/components/status_content.js | 21 ++++++++++++++----- .../status/components/detailed_status.js | 2 +- .../styles/mastodon/components.scss | 5 +++++ app/lib/activitypub/activity/create.rb | 3 ++- app/lib/formatter.rb | 1 + app/lib/sanitize_config.rb | 3 +++ app/serializers/rest/status_serializer.rb | 6 +++++- 8 files changed, 34 insertions(+), 9 deletions(-) diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 9b1035649..9797fe459 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -409,7 +409,7 @@ class Status extends ImmutablePureComponent { return ( -
+
{prepend}
diff --git a/app/javascript/mastodon/components/status_content.js b/app/javascript/mastodon/components/status_content.js index 06f5b4aad..a57cb3abd 100644 --- a/app/javascript/mastodon/components/status_content.js +++ b/app/javascript/mastodon/components/status_content.js @@ -170,6 +170,12 @@ export default class StatusContent extends React.PureComponent { ); + const readArticleButton = ( + + ); + if (status.get('spoiler_text').length > 0) { let mentionsPlaceholder = ''; @@ -185,21 +191,26 @@ export default class StatusContent extends React.PureComponent { mentionsPlaceholder =
{mentionLinks}
; } - return ( + const output = [
}

{mentionsPlaceholder}
- {!hidden && !!status.get('poll') && } -
- ); +
, + ]; + + if (status.get('activity_pub_type') === 'Article' && !this.props.expanded) { + output.push(readArticleButton); + } + + return output; } else if (this.props.onClick) { const output = [
- + {media} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index ed3bbb0d4..7f3291cac 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -773,6 +773,7 @@ ul, ol { margin-left: 1em; + margin-bottom: 1em; p { margin: 0; @@ -840,6 +841,10 @@ display: block; } } + + .article-type img { + max-width: 95%; + } } .status__content.status__content--collapsed { diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 1e47de2d9..b1c170af0 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -60,7 +60,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity account: @account, text: text_from_content || '', language: detected_language, - spoiler_text: converted_object_type? ? '' : (text_from_summary || ''), + spoiler_text: converted_object_type? ? '' : (text_from_summary || (@object['type'] == 'Article' && text_from_name) || ''), created_at: @object['published'], override_timestamps: @options[:override_timestamps], reply: @object['inReplyTo'].present?, @@ -70,6 +70,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity conversation: conversation_from_uri(@object['conversation']), media_attachment_ids: process_attachments.take(4).map(&:id), poll: process_poll, + activity_pub_type: @object['type'] } end end diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 9c2c0cd29..1c2066655 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -92,6 +92,7 @@ class Formatter def format_article(text) text = text.gsub(/>\n+<") + text = "#{text}" text.html_safe # rubocop:disable Rails/OutputSafety end diff --git a/app/lib/sanitize_config.rb b/app/lib/sanitize_config.rb index c157fc16a..f50d5f0fa 100644 --- a/app/lib/sanitize_config.rb +++ b/app/lib/sanitize_config.rb @@ -49,6 +49,9 @@ class Sanitize 'rel' => 'nofollow noopener', 'target' => '_blank', }, + 'span' => { + 'class' => 'article-type', + }, }, protocols: { diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index 7d2dc4e82..f96c32ae0 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -4,7 +4,7 @@ class REST::StatusSerializer < ActiveModel::Serializer attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id, :sensitive, :spoiler_text, :visibility, :language, :uri, :url, :replies_count, :reblogs_count, - :favourites_count, :local_only + :favourites_count, :local_only, :activity_pub_type attribute :favourited, if: :current_user? attribute :reblogged, if: :current_user? @@ -61,6 +61,10 @@ class REST::StatusSerializer < ActiveModel::Serializer OStatus::TagManager.instance.uri_for(object) end + def activity_pub_type + object.activity_pub_type.to_s + end + def content Formatter.instance.format(object) end From f82b572102c0adab989990df1a1c916910b3b0ab Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sun, 30 Jun 2019 15:23:53 -0700 Subject: [PATCH 005/129] Underlining hyperlinks by default --- app/javascript/styles/mastodon/components.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 7f3291cac..651a45aea 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -790,7 +790,7 @@ a { color: $secondary-text-color; - text-decoration: none; + text-decoration: underline; &:hover { text-decoration: underline; From 1b87a79ec728dee219f6fe2986ec5f05e77262f1 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sun, 30 Jun 2019 15:52:42 -0700 Subject: [PATCH 006/129] Updating README --- README.md | 103 ++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 2d18a4ee2..b9ec3b08c 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,87 @@ -![Mastodon](https://i.imgur.com/NhZc40l.png) -======== +# Hometown: a Mastodon fork -[![GitHub release](https://img.shields.io/github/release/tootsuite/mastodon.svg)][releases] -[![Build Status](https://img.shields.io/circleci/project/github/tootsuite/mastodon.svg)][circleci] -[![Code Climate](https://img.shields.io/codeclimate/maintainability/tootsuite/mastodon.svg)][code_climate] -[![Crowdin](https://d322cqt584bo4o.cloudfront.net/mastodon/localized.svg)][crowdin] -[![Docker Pulls](https://img.shields.io/docker/pulls/tootsuite/mastodon.svg)][docker] +photo of a village of stone huts nestled in a lush green valley -[releases]: https://github.com/tootsuite/mastodon/releases -[circleci]: https://circleci.com/gh/tootsuite/mastodon -[code_climate]: https://codeclimate.com/github/tootsuite/mastodon -[crowdin]: https://crowdin.com/project/mastodon -[docker]: https://hub.docker.com/r/tootsuite/mastodon/ +Photo by [Joana Mujollari](https://www.flickr.com/photos/141654969@N04/26777339042/), CC0 / Public Domain. -Mastodon is a **free, open-source social network server** based on ActivityPub. Follow friends and discover new ones. Publish anything you want: links, pictures, text, video. All servers of Mastodon are interoperable as a federated network, i.e. users on one server can seamlessly communicate with users from another one. This includes non-Mastodon software that also implements ActivityPub! +Mastodon is a **free, open-source social network server** based on ActivityPub. This is *not* the official version of Mastodon; this is a separate version (i.e. a fork) maintained by [Darius Kazemi](https://friend.camp/@darius). For more information on Mastodon, you can see the [official website](https://joinmastodon.org) and the [upstream repo](https://github.com/tootsuite/mastodon). -Click below to **learn more** in a video: +Hometown is a light weight fork of Mastodon. This fork is based on the principle of: minimum code change for maximum user experience change. -[![Screenshot](https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/ezgif-2-60f1b00403.gif)][youtube_demo] +Hometown is launching with a few key differences from Mastodon. -[youtube_demo]: https://www.youtube.com/watch?v=IPSbNdBmWKE +* Local only posting (aka posts that never federate) +* Accepting more content types "natively", like in-line reading of full articles (behind a cut for length) +* Better list management +* Some accessibility features set to default -## Navigation +Those are the only changes! They are pretty minor in terms of the source code involved, but they drastically change the experience of being on Mastodon. I'll explain each of these in more detail now. -- [Project homepage 🐘](https://joinmastodon.org) -- [Support the development via Patreon][patreon] -- [View sponsors](https://joinmastodon.org/sponsors) -- [Blog](https://blog.joinmastodon.org) -- [Documentation](https://docs.joinmastodon.org) -- [Browse Mastodon servers](https://joinmastodon.org/#getting-started) -- [Browse Mastodon apps](https://joinmastodon.org/apps) +## Local only posting -[patreon]: https://www.patreon.com/mastodon +Mastodon right now is designed to get your messages out to the entire fediverse. This is great, but there is a huge need for more private communities. And in a federated network I think it makes the most sense for your home server to be that community (hence "Hometown"). -## Features +**In the context of Hometown, local only posting is a per-post security option that lets you set whether that post can federate out to other servers or not.** - +I've been running Friend Camp, a Mastodon fork with local only posting, for about a year. Being able to have conversations with people on your server that don't federate is a hugely liberating thing. It allows inside jokes to develop. It allows people the freedom to complain about things that they wouldn't necessarily feel comfortable leaving a trusted server (cops, employers, etc). It also lets us do things like have a server-wide movie night where we flood the local timeline with posts about the movie, and it doesn't pollute the rest of the Fediverse. -**No vendor lock-in: Fully interoperable with any conforming platform** +This feature is based on [the work of Renato Lond](https://github.com/tootsuite/mastodon/pull/8427), which is itself based on a feature in the [Mastodon Glitch Edition](https://glitch-soc.github.io/docs/) fork. -It doesn't have to be Mastodon, whatever implements ActivityPub is part of the social network! [Learn more](https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/) +## Reading more content types -**Real-time, chronological timeline updates** +Mastodon is microblogging software, meant for Twitter-style shortform posting. -See the updates of people you're following appear in real-time in the UI via WebSockets. There's a firehose view as well! +Hometown is microblogging for _writing_, but its goal is to accept many content types for _reading_. So while I don't plan to let Hometown users publish massive blog posts, I would like your Hometown instance to be your one-stop shop for viewing all sorts of things on the Fediverse. -**Media attachments like images and short videos** +For Hometown this means if you subscribe to a service that sends out `Article` objects over ActivityPub (such as a blog on [Write As](https://write.as)), then those full articles render in your home timeline, behind a cut for length. Also, Hometown will render a variety of rich text like _italic_ and **bold**. -Upload and view images and WebM/MP4 videos attached to the updates. Videos with no audio track are treated like GIFs; normal videos are looped - like vines! +Click on this GIF for a brief video demo: -**Safety and moderation tools** +Video demo of someone clicking 'read article' on an incoming article post, which then renders a full article. -Private posts, locked accounts, phrase filtering, muting, blocking and all sorts of other features, along with a reporting and moderation system. [Learn more](https://blog.joinmastodon.org/2018/07/cage-the-mastodon/) +This is based on rich text work by [Thibaut Girka](https://sitedethib.com), and my own work on `Article` support. -**OAuth2 and a straightforward REST API** +### It's more than just reading more stuff -Mastodon acts as an OAuth2 provider so 3rd party apps can use the REST and Streaming APIs, resulting in a rich app ecosystem with a lot of choice! +Reading more content types also helps make the fediverse better. ActivityPub supports all kinds of content, but most ActivityPub servers shoehorn all their content into `Note` because that's the type that Mastodon treats as first-class. This has important implications for the fediverse and also on your day to do user experience. -## Deployment +Take the "quote tweet" debate for example. -**Tech stack:** +Twitter has a feature called "quote tweeting" that lets you embed what someone else tweets, with your own comment right next to it. It's really useful for provide commentary in context, like this, where I point people to a sale and they can read both my comment on the sale and the original tweet about the sale in one post: -- **Ruby on Rails** powers the REST API and other web pages -- **React.js** and Redux are used for the dynamic parts of the interface -- **Node.js** powers the streaming API +An example of a quote tweet from Twitter. -**Requirements:** +But it's also open to abuse with people quote-tweeting things they disagree with to encourage a pile-on from their followers. There's been a lot of debate among Mastodon users as to whether the good of this feature outweighs the bad. So far, Mastodon has avoided implementing quoting. -- **PostgreSQL** 9.5+ -- **Redis** -- **Ruby** 2.4+ -- **Node.js** 8+ +What does this have to do with content types? Well, if we support an `Article` content type and a `Note` content type, we can support quoting for an `Article` but not for a `Note`. In practice this means that you can quote blog posts and news articles, but you can't quote a quick personal microblog note. -The repository includes deployment configurations for **Docker and docker-compose**, but also a few specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**stand-alone** installation guide](https://docs.joinmastodon.org/administration/installation/) is available in the documentation. +## Better list management -A **Vagrant** configuration is included for development purposes. +If Hometown is going to be a universal reader, you're going to need better control over organizing your feeds than mainline Mastodon provides. -## Contributing +### Exclusive lists -Mastodon is **free, open source software** licensed under **AGPLv3**. +My first plan is to introduce a new kind of _exclusive list_. Right now if you add an account to your "friends I like" list in Mastodon, posts from people on that list appear on that list. But they also appear on your home timeline, and maybe you don't want that! You'd rather treat your "friends I like" list as your "real" home timeline, and then check your home timeline when you're bored. -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). +Or another case: I might have all the blogs I read in one list, but I only check it on Saturdays when I have time to read things. In that case I don't want updates from those blogs clogging up my home timeline. -**IRC channel**: #mastodon on irc.freenode.net +## Better accessibility defaults + +Look, right now this pretty much just means that we underline hyperlinks by default. I'm of course open to implementing other obviously beneficial accessibilty defaults that Mastodon itself doesn't implement. + +## Hometown is still 99.999% Mastodon + +I don't intend to stray very far from mainline Mastodon with this fork. If you want something that provides a ton of new features and widgets and stuff, the [Mastodon Glitch Edition](https://glitch-soc.github.io/docs/) fork is a wondrous kitchen sink of major and minor tweaks. + +Part of why I don't want to stray far from mainline Mastodon is that this project is going to be just me for the foreseeable future, and I'd like to keep it up to date with new Mastodon versions as easily as possible. The less code I change from Mastodon, the easier that is. Hence the principle of "minimum code change for maximum user experience change." + +## Versioning + +Hometown follows Mastodon versioning, so Hometown v2.9.2 is up to date with Mastodon v2.9.2. ## License -Copyright (C) 2016-2019 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md)) +Copyright (C) 2016-2019 Eugen Rochko and other Mastodon contributors; see [AUTHORS.md](AUTHORS.md). This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. From 42e62896f7461d75bfe252431c084f104e45495f Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 1 Jul 2019 14:07:59 -0700 Subject: [PATCH 007/129] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b9ec3b08c..e2f206068 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,8 @@ But it's also open to abuse with people quote-tweeting things they disagree with What does this have to do with content types? Well, if we support an `Article` content type and a `Note` content type, we can support quoting for an `Article` but not for a `Note`. In practice this means that you can quote blog posts and news articles, but you can't quote a quick personal microblog note. +> Hometown doesn't support quoting articles yet... but it will. + ## Better list management If Hometown is going to be a universal reader, you're going to need better control over organizing your feeds than mainline Mastodon provides. From 704e2cdd6a05c58391f0ab777e4faab44e5b1212 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 1 Jul 2019 14:10:25 -0700 Subject: [PATCH 008/129] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e2f206068..9c3b0dd2e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Hometown is launching with a few key differences from Mastodon. * Local only posting (aka posts that never federate) * Accepting more content types "natively", like in-line reading of full articles (behind a cut for length) -* Better list management +* Better list management (not implemented yet but will come in the first release) * Some accessibility features set to default Those are the only changes! They are pretty minor in terms of the source code involved, but they drastically change the experience of being on Mastodon. I'll explain each of these in more detail now. @@ -67,6 +67,8 @@ My first plan is to introduce a new kind of _exclusive list_. Right now if you a Or another case: I might have all the blogs I read in one list, but I only check it on Saturdays when I have time to read things. In that case I don't want updates from those blogs clogging up my home timeline. +> This is not yet implemented but will be available in the first release. + ## Better accessibility defaults Look, right now this pretty much just means that we underline hyperlinks by default. I'm of course open to implementing other obviously beneficial accessibilty defaults that Mastodon itself doesn't implement. From 927a79e31598bddda4588ed0b28e03559e42f57b Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Wed, 10 Jul 2019 21:10:47 -0700 Subject: [PATCH 009/129] Update README --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b9ec3b08c..7f17ef357 100644 --- a/README.md +++ b/README.md @@ -6,17 +6,20 @@ Photo by [Joana Mujollari](https://www.flickr.com/photos/141654969@N04/267773390 Mastodon is a **free, open-source social network server** based on ActivityPub. This is *not* the official version of Mastodon; this is a separate version (i.e. a fork) maintained by [Darius Kazemi](https://friend.camp/@darius). For more information on Mastodon, you can see the [official website](https://joinmastodon.org) and the [upstream repo](https://github.com/tootsuite/mastodon). -Hometown is a light weight fork of Mastodon. This fork is based on the principle of: minimum code change for maximum user experience change. +__Hometown__ is a light weight fork of Mastodon. This fork is based on the principle of: minimum code change for maximum user experience change. Hometown is launching with a few key differences from Mastodon. * Local only posting (aka posts that never federate) * Accepting more content types "natively", like in-line reading of full articles (behind a cut for length) -* Better list management * Some accessibility features set to default Those are the only changes! They are pretty minor in terms of the source code involved, but they drastically change the experience of being on Mastodon. I'll explain each of these in more detail now. +Some changes are to come in the future: + +* Better list management + ## Local only posting Mastodon right now is designed to get your messages out to the entire fediverse. This is great, but there is a huge need for more private communities. And in a federated network I think it makes the most sense for your home server to be that community (hence "Hometown"). From 5585c244dabf2e7cf60386c546e607b2656fcb3c Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Wed, 10 Jul 2019 21:10:58 -0700 Subject: [PATCH 010/129] Add link to Hometown source in footer --- app/javascript/mastodon/features/ui/components/link_footer.js | 4 ++++ app/javascript/mastodon/locales/en.json | 1 + 2 files changed, 5 insertions(+) diff --git a/app/javascript/mastodon/features/ui/components/link_footer.js b/app/javascript/mastodon/features/ui/components/link_footer.js index b481983dc..9689e9da4 100644 --- a/app/javascript/mastodon/features/ui/components/link_footer.js +++ b/app/javascript/mastodon/features/ui/components/link_footer.js @@ -23,6 +23,10 @@ const LinkFooter = ({ withHotkeys }) => ( id='getting_started.open_source_notice' defaultMessage='Mastodon is open source software. You can contribute or report issues on GitHub at {github}.' values={{ github: {repository} (v{version}) }} + /> friendcamp/mastodon }} />

diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index acb739326..77ae2809a 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -145,6 +145,7 @@ "getting_started.directory": "Profile directory", "getting_started.documentation": "Documentation", "getting_started.heading": "Getting started", + "getting_started.hometown_open_source_notice": "Hometown is also open source, at {hometown}.", "getting_started.invite": "Invite people", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Security", From 0b8267927ba52d09db419501a7ac3aa9f9583d26 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Wed, 10 Jul 2019 21:51:01 -0700 Subject: [PATCH 011/129] Update readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index c7ae8d382..541bff0b4 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ Some changes are to come in the future: * Better list management +## Migrating from Mastodon to Hometown + +Please see [this article in the wiki](https://github.com/hometown-fork/hometown/wiki/Initial-migration) for directions on migration from Mastodon to Hometown. + ## Local only posting Mastodon right now is designed to get your messages out to the entire fediverse. This is great, but there is a huge need for more private communities. And in a federated network I think it makes the most sense for your home server to be that community (hence "Hometown"). From dc15521b3a21cc4a2125edf16f0cd2b9dd93b718 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Fri, 12 Jul 2019 16:53:03 -0700 Subject: [PATCH 012/129] Appropriate DB migrations now in place --- .../20190712233435_add_activitypub_type_to_statuses.rb | 5 +++++ db/schema.rb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20190712233435_add_activitypub_type_to_statuses.rb diff --git a/db/migrate/20190712233435_add_activitypub_type_to_statuses.rb b/db/migrate/20190712233435_add_activitypub_type_to_statuses.rb new file mode 100644 index 000000000..8929ae061 --- /dev/null +++ b/db/migrate/20190712233435_add_activitypub_type_to_statuses.rb @@ -0,0 +1,5 @@ +class AddActivityPubTypeToStatuses < ActiveRecord::Migration[5.2] + def change + add_column :statuses, :activity_pub_type, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index f5a044811..02d729c18 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_05_29_143559) do +ActiveRecord::Schema.define(version: 2019_07_12_233435) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -626,6 +626,7 @@ ActiveRecord::Schema.define(version: 2019_05_29_143559) do t.bigint "in_reply_to_account_id" t.bigint "poll_id" t.boolean "local_only" + t.string "activity_pub_type" t.index ["account_id", "id", "visibility", "updated_at"], name: "index_statuses_20180106", order: { id: :desc } t.index ["in_reply_to_account_id"], name: "index_statuses_on_in_reply_to_account_id" t.index ["in_reply_to_id"], name: "index_statuses_on_in_reply_to_id" From bfc0fbab2c94dc134715f555edf793991da172a2 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Fri, 26 Jul 2019 01:51:20 -0700 Subject: [PATCH 013/129] Adding exclusive lists feature Major new feature, currently testing in a branch right now. Fixes #1 --- app/controllers/api/v1/lists_controller.rb | 2 +- app/javascript/mastodon/actions/lists.js | 23 ++++++++++++------- .../list_editor/components/edit_list_form.js | 18 ++++++++++++--- .../mastodon/features/list_editor/index.js | 3 ++- .../mastodon/features/list_timeline/index.js | 2 +- .../mastodon/reducers/list_editor.js | 6 +++++ .../styles/mastodon/components.scss | 9 ++++++++ app/lib/feed_manager.rb | 11 ++++++++- app/models/list.rb | 11 +++++---- app/models/status.rb | 1 + app/serializers/rest/list_serializer.rb | 2 +- app/workers/feed_insert_worker.rb | 2 +- ...0190726034905_add_is_exclusive_to_lists.rb | 6 +++++ db/schema.rb | 3 ++- 14 files changed, 76 insertions(+), 23 deletions(-) create mode 100644 db/migrate/20190726034905_add_is_exclusive_to_lists.rb diff --git a/app/controllers/api/v1/lists_controller.rb b/app/controllers/api/v1/lists_controller.rb index 054172bee..953e0c452 100644 --- a/app/controllers/api/v1/lists_controller.rb +++ b/app/controllers/api/v1/lists_controller.rb @@ -38,6 +38,6 @@ class Api::V1::ListsController < Api::BaseController end def list_params - params.permit(:title) + params.permit(:title, :is_exclusive) end end diff --git a/app/javascript/mastodon/actions/lists.js b/app/javascript/mastodon/actions/lists.js index d736bacef..fdade8e08 100644 --- a/app/javascript/mastodon/actions/lists.js +++ b/app/javascript/mastodon/actions/lists.js @@ -10,9 +10,10 @@ export const LISTS_FETCH_REQUEST = 'LISTS_FETCH_REQUEST'; export const LISTS_FETCH_SUCCESS = 'LISTS_FETCH_SUCCESS'; export const LISTS_FETCH_FAIL = 'LISTS_FETCH_FAIL'; -export const LIST_EDITOR_TITLE_CHANGE = 'LIST_EDITOR_TITLE_CHANGE'; -export const LIST_EDITOR_RESET = 'LIST_EDITOR_RESET'; -export const LIST_EDITOR_SETUP = 'LIST_EDITOR_SETUP'; +export const LIST_EDITOR_TITLE_CHANGE = 'LIST_EDITOR_TITLE_CHANGE'; +export const LIST_EDITOR_IS_EXCLUSIVE_CHANGE = 'LIST_EDITOR_IS_EXCLUSIVE_CHANGE'; +export const LIST_EDITOR_RESET = 'LIST_EDITOR_RESET'; +export const LIST_EDITOR_SETUP = 'LIST_EDITOR_SETUP'; export const LIST_CREATE_REQUEST = 'LIST_CREATE_REQUEST'; export const LIST_CREATE_SUCCESS = 'LIST_CREATE_SUCCESS'; @@ -100,13 +101,14 @@ export const fetchListsFail = error => ({ }); export const submitListEditor = shouldReset => (dispatch, getState) => { - const listId = getState().getIn(['listEditor', 'listId']); - const title = getState().getIn(['listEditor', 'title']); + const listId = getState().getIn(['listEditor', 'listId']); + const title = getState().getIn(['listEditor', 'title']); + const isExclusive = getState().getIn(['listEditor', 'isExclusive']); if (listId === null) { dispatch(createList(title, shouldReset)); } else { - dispatch(updateList(listId, title, shouldReset)); + dispatch(updateList(listId, title, shouldReset, isExclusive)); } }; @@ -124,6 +126,11 @@ export const changeListEditorTitle = value => ({ value, }); +export const changeListEditorIsExclusive = value => ({ + type: LIST_EDITOR_IS_EXCLUSIVE_CHANGE, + value, +}); + export const createList = (title, shouldReset) => (dispatch, getState) => { dispatch(createListRequest()); @@ -150,10 +157,10 @@ export const createListFail = error => ({ error, }); -export const updateList = (id, title, shouldReset) => (dispatch, getState) => { +export const updateList = (id, title, shouldReset, isExclusive) => (dispatch, getState) => { dispatch(updateListRequest(id)); - api(getState).put(`/api/v1/lists/${id}`, { title }).then(({ data }) => { + api(getState).put(`/api/v1/lists/${id}`, { title, is_exclusive: !!isExclusive }).then(({ data }) => { dispatch(updateListSuccess(data)); if (shouldReset) { diff --git a/app/javascript/mastodon/features/list_editor/components/edit_list_form.js b/app/javascript/mastodon/features/list_editor/components/edit_list_form.js index 3dc59c12e..4f6378005 100644 --- a/app/javascript/mastodon/features/list_editor/components/edit_list_form.js +++ b/app/javascript/mastodon/features/list_editor/components/edit_list_form.js @@ -1,9 +1,10 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import { changeListEditorTitle, submitListEditor } from '../../../actions/lists'; +import { changeListEditorTitle, changeListEditorIsExclusive, submitListEditor } from '../../../actions/lists'; import IconButton from '../../../components/icon_button'; -import { defineMessages, injectIntl } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import Toggle from 'react-toggle'; const messages = defineMessages({ title: { id: 'lists.edit.submit', defaultMessage: 'Change title' }, @@ -17,6 +18,7 @@ const mapStateToProps = state => ({ const mapDispatchToProps = dispatch => ({ onChange: value => dispatch(changeListEditorTitle(value)), onSubmit: () => dispatch(submitListEditor(false)), + onToggle: value => dispatch(changeListEditorIsExclusive(value)), }); export default @connect(mapStateToProps, mapDispatchToProps) @@ -26,6 +28,7 @@ class ListForm extends React.PureComponent { static propTypes = { value: PropTypes.string.isRequired, disabled: PropTypes.bool, + isExclusive: PropTypes.bool, intl: PropTypes.object.isRequired, onChange: PropTypes.func.isRequired, onSubmit: PropTypes.func.isRequired, @@ -44,8 +47,12 @@ class ListForm extends React.PureComponent { this.props.onSubmit(); } + handleToggle = e => { + this.props.onToggle(e.target.checked); + } + render () { - const { value, disabled, intl } = this.props; + const { value, disabled, intl, isExclusive, hello } = this.props; const title = intl.formatMessage(messages.title); @@ -57,6 +64,11 @@ class ListForm extends React.PureComponent { onChange={this.handleChange} /> + + - + diff --git a/app/javascript/mastodon/features/list_timeline/index.js b/app/javascript/mastodon/features/list_timeline/index.js index 0db6d2228..60c1be177 100644 --- a/app/javascript/mastodon/features/list_timeline/index.js +++ b/app/javascript/mastodon/features/list_timeline/index.js @@ -109,7 +109,7 @@ class ListTimeline extends React.PureComponent { } handleEditClick = () => { - this.props.dispatch(openModal('LIST_EDITOR', { listId: this.props.params.id })); + this.props.dispatch(openModal('LIST_EDITOR', { listId: this.props.params.id, isExclusive: this.props.list.get('is_exclusive') })); } handleDeleteClick = () => { diff --git a/app/javascript/mastodon/reducers/list_editor.js b/app/javascript/mastodon/reducers/list_editor.js index 91e524dd5..d21c376d8 100644 --- a/app/javascript/mastodon/reducers/list_editor.js +++ b/app/javascript/mastodon/reducers/list_editor.js @@ -9,6 +9,7 @@ import { LIST_EDITOR_RESET, LIST_EDITOR_SETUP, LIST_EDITOR_TITLE_CHANGE, + LIST_EDITOR_IS_EXCLUSIVE_CHANGE, LIST_ACCOUNTS_FETCH_REQUEST, LIST_ACCOUNTS_FETCH_SUCCESS, LIST_ACCOUNTS_FETCH_FAIL, @@ -52,6 +53,11 @@ export default function listEditorReducer(state = initialState, action) { map.set('title', action.value); map.set('isChanged', true); }); + case LIST_EDITOR_IS_EXCLUSIVE_CHANGE: + return state.withMutations(map => { + map.set('isExclusive', action.value); + map.set('isChanged', true); + }); case LIST_CREATE_REQUEST: case LIST_UPDATE_REQUEST: return state.withMutations(map => { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 651a45aea..c9e6af602 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2591,6 +2591,15 @@ a.account__display-name { border-color: $ui-highlight-color; } +label[for="is-exclusive-checkbox"] { + margin-left: 20px; +} + +.is-exclusive-checkbox { + transform: scale(0.7); + transform-origin: bottom; +} + .column-link { background: lighten($ui-base-color, 8%); color: $primary-text-color; diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index d77cdb3a3..f53d0e60f 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -22,6 +22,8 @@ class FeedManager filter_from_home?(status, receiver_id) elsif timeline_type == :mentions filter_from_mentions?(status, receiver_id) + elsif timeline_type == :list + filter_from_home?(status, receiver_id, :list) else false end @@ -152,10 +154,17 @@ class FeedManager (context == :home ? Mute.where(account_id: receiver_id, target_account_id: account_ids).any? : Mute.where(account_id: receiver_id, target_account_id: account_ids, hide_notifications: true).any?) end - def filter_from_home?(status, receiver_id) + def filter_from_home?(status, receiver_id, timeline_type=:home) return false if receiver_id == status.account_id return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?) return true if phrase_filtered?(status, receiver_id, :home) + # hometown: exclusive list rules + unless timeline_type == :list + # find all exclusive lists + @list = List.where(account: Account.find(receiver_id), is_exclusive: true) + # is there a list the receiver owns with this account on it? if so, return true + return true if ListAccount.where(list: @list, account_id: status.account_id).exists? + end check_for_blocks = status.active_mentions.pluck(:account_id) check_for_blocks.concat([status.account_id]) diff --git a/app/models/list.rb b/app/models/list.rb index c9c94fca1..75f0a876a 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -3,11 +3,12 @@ # # Table name: lists # -# id :bigint(8) not null, primary key -# account_id :bigint(8) not null -# title :string default(""), not null -# created_at :datetime not null -# updated_at :datetime not null +# id :bigint(8) not null, primary key +# account_id :bigint(8) not null +# title :string default(""), not null +# created_at :datetime not null +# updated_at :datetime not null +# is_exclusive :boolean default(FALSE) # class List < ApplicationRecord diff --git a/app/models/status.rb b/app/models/status.rb index 673de911f..f3efa514e 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -23,6 +23,7 @@ # in_reply_to_account_id :bigint(8) # poll_id :bigint(8) # local_only :boolean +# activity_pub_type :string # class Status < ApplicationRecord diff --git a/app/serializers/rest/list_serializer.rb b/app/serializers/rest/list_serializer.rb index 977da7439..6cd6d8e13 100644 --- a/app/serializers/rest/list_serializer.rb +++ b/app/serializers/rest/list_serializer.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class REST::ListSerializer < ActiveModel::Serializer - attributes :id, :title + attributes :id, :title, :is_exclusive def id object.id.to_s diff --git a/app/workers/feed_insert_worker.rb b/app/workers/feed_insert_worker.rb index 1ae3c877b..4d416716c 100644 --- a/app/workers/feed_insert_worker.rb +++ b/app/workers/feed_insert_worker.rb @@ -29,7 +29,7 @@ class FeedInsertWorker def feed_filtered? # Note: Lists are a variation of home, so the filtering rules # of home apply to both - FeedManager.instance.filter?(:home, @status, @follower.id) + FeedManager.instance.filter?(@type, @status, @follower.id) end def perform_push diff --git a/db/migrate/20190726034905_add_is_exclusive_to_lists.rb b/db/migrate/20190726034905_add_is_exclusive_to_lists.rb new file mode 100644 index 000000000..937b236e0 --- /dev/null +++ b/db/migrate/20190726034905_add_is_exclusive_to_lists.rb @@ -0,0 +1,6 @@ +class AddIsExclusiveToLists < ActiveRecord::Migration[5.2] + def change + add_column :lists, :is_exclusive, :boolean + change_column_default :lists, :is_exclusive, false + end +end diff --git a/db/schema.rb b/db/schema.rb index 02d729c18..0f77203e9 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_07_12_233435) do +ActiveRecord::Schema.define(version: 2019_07_26_034905) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -344,6 +344,7 @@ ActiveRecord::Schema.define(version: 2019_07_12_233435) do t.string "title", default: "", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.boolean "is_exclusive", default: false t.index ["account_id"], name: "index_lists_on_account_id" end From 29bdcf3bee334935ab202b30a78c7fa783f89e17 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 19 Aug 2019 20:26:23 +0100 Subject: [PATCH 014/129] Add macaron theme Add macaron, a pastel light theme for hometown --- app/javascript/styles/macaron.scss | 3 + app/javascript/styles/macaron/diff.scss | 1002 ++++++++++++++++++ app/javascript/styles/macaron/variables.scss | 48 + config/themes.yml | 1 + 4 files changed, 1054 insertions(+) create mode 100644 app/javascript/styles/macaron.scss create mode 100644 app/javascript/styles/macaron/diff.scss create mode 100644 app/javascript/styles/macaron/variables.scss diff --git a/app/javascript/styles/macaron.scss b/app/javascript/styles/macaron.scss new file mode 100644 index 000000000..a366a2361 --- /dev/null +++ b/app/javascript/styles/macaron.scss @@ -0,0 +1,3 @@ +@import 'macaron/variables'; +@import 'application'; +@import 'macaron/diff' diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss new file mode 100644 index 000000000..5a1eee7d0 --- /dev/null +++ b/app/javascript/styles/macaron/diff.scss @@ -0,0 +1,1002 @@ +// Notes! +// Sass color functions, "darken" and "lighten" are automatically replaced. + +html { + scrollbar-color: $pink rgba($pink, 0.25); +} + +.loading-bar + { + background-color: $green; + } + +.status__content a, .reply-indicator__content a { + &:hover, &:active, &:focus { + color: $bilberry; + } +} + +::-webkit-scrollbar-thumb { + background: $pink; + border: 0; +} + +::-webkit-scrollbar-thumb { + background: $pink; + border: 0; +} + +::-webkit-scrollbar-thumb:hover { + background: $pink; + border: 0; +} + +::-webkit-scrollbar-track:hover { + background: $green; +} + +.ui { + background: $cream; +} + +// Change the colors of button texts +.button { + color: $white; + + &.button-alternative-2 { + color: $white; + } +} + +// Change default background colors of columns +.column > .scrollable, +.getting-started, +.column-inline-form { + background: $white; + border: 1px solid lighten(#eeeeee, 4%); + border-top: 0; +} + +.getting-started { + background: $green; + border: 1px solid lighten($green, 8%); +} + +.column-back-button, +.column-header { + background: #c8c4dd; + border: 1px solid lighten($purple, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } + + &--slim-button { + border: 0; + top: -49px; + right: 1px; + } +} + + + +.column-header__back-button, +.column-header__button, +.column-header__button.active, +.account__header__bar { + background: $purple; +} + +.column-header__button.active { + color: $ui-highlight-color; + + &:hover, + &:active, + &:focus { + color: $ui-highlight-color; + background: lighten($purple, 4%); + } +} + +.account__header__bar .avatar .account__avatar { + border-color: $white; +} + +.getting-started__footer a { + color: $ui-secondary-color; + text-decoration: underline; +} + +.column-subheading { + background: $green; + border-bottom: 1px solid lighten($green, 8%); +} + +.getting-started, +.scrollable { + .column-link { + background: $blue; + border-bottom: 1px solid lighten($blue, 8%); + + &:hover, + &:active, + &:focus { + background: lighten($blue, 8%); + } + } +} + +.getting-started .navigation-bar { + border-top: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid lighten($ui-base-color, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } +} + +.compose-form__autosuggest-wrapper, +.poll__text input[type="text"], +.compose-form .spoiler-input__input, +.compose-form__poll-wrapper select, +.search__input, +.setting-text, +.box-widget input[type="text"], +.box-widget input[type="email"], +.box-widget input[type="password"], +.box-widget textarea, +.statuses-grid .detailed-status { + border: 1px solid lighten(#eeeeee, 4%); +} + +.poll__chart { + background: darken($purple, 4%) +} + +.poll__chart.leading { + background: $pink; +} + +.status { + border-bottom: 1px solid lighten(#eeeeee, 4%); +} + +.detailed-status__action-bar { + border-top: 1px solid lighten($purple, 4%); + border-bottom: 1px solid lighten($purple, 4%); +} + +.search__input { + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + border-bottom: 0; + } + + background: $green; + border: 1px solid lighten($green, 8%); +} + +.search__input { + &:focus{ + background: $purple; + border: 1px solid lighten($purple, 8%); + } +} + +.list-editor .search .search__input { + border-top: 0; + border-bottom: 0; +} + +.compose-form__poll-wrapper select { + background: $simple-background-color url("data:image/svg+xml;utf8,") no-repeat right 8px center / auto 16px; +} + +.compose-form__poll-wrapper, +.compose-form__poll-wrapper .poll__footer { + border-top-color: lighten($ui-base-color, 8%); +} + +.notification__filter-bar, .account__section-headline { + background: $green; + border: 1px solid lighten($green, 8%); + border-top: 0; +} + +.notification__filter-bar button { + background: $green; +} + +.compose-form .compose-form__buttons-wrapper { + background: $ui-base-color; + border: 1px solid lighten($ui-base-color, 8%); + border-top: 0; +} + +.drawer__inner { + background: $pink; + border: 1px solid lighten($pink, 8%); +} + +.drawer__header { + background: $blue; + border: 1px solid lighten($blue, 8%); +} + +.drawer__header a { + &:active, + &:focus, + &:hover { + background: lighten($blue, 4%); + } +} + +.drawer__inner__mastodon { + background: $pink url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; +} + +// Change the colors used in compose-form +.compose-form { + .compose-form__modifiers { + .compose-form__upload__actions .icon-button { + color: lighten($white, 7%); + + &:active, + &:focus, + &:hover { + color: $white; + } + } + + .compose-form__upload-description input { + color: lighten($white, 7%); + + &::placeholder { + color: lighten($white, 7%); + } + } + } + + .compose-form__buttons-wrapper { + background: darken($ui-base-color, 6%); + } + + .autosuggest-textarea__suggestions { + background: darken($ui-base-color, 6%); + } + + .autosuggest-textarea__suggestions__item { + &:hover, + &:focus, + &:active, + &.selected { + background: lighten($ui-base-color, 4%); + } + } +} + +.account__header__tabs__buttons .icon-button { + border-color: lighten($purple, 8%); +} + +.emoji-mart-bar { + border-color: lighten($ui-base-color, 4%); + + &:first-child { + background: darken($ui-base-color, 6%); + } +} + +.emoji-mart-search input { + background: rgba($ui-base-color, 0.3); + border-color: $ui-base-color; +} + +// Change the background colors of statuses +.focusable:focus { + background: darken($green, 2%); +} + +.status.status-direct { + background: darken($ui-base-color, 2%); +} + +.focusable:focus .status.status-direct { + background: $ui-base-color; +} + +.status.status-direct:not(.read) { + background: $ui-base-color; + border-bottom-color: lighten($ui-base-color, 4%); +} + +.detailed-status, +.detailed-status__action-bar { + background: darken($purple, 10%); +} + +.reply-indicator { + background: darken($purple, 8%); +} + +// Change the background colors of status__content__spoiler-link +.reply-indicator__content .status__content__spoiler-link, +.status__content .status__content__spoiler-link { + background: $pink; + + &:hover { + background: lighten($pink, 4%); + } +} + +// Change the background colors of media and video spoilers +.media-spoiler, +.video-player__spoiler { + background: $ui-base-color; +} + +.privacy-dropdown.active .privacy-dropdown__value.active .icon-button { + color: $white; +} + +.account-gallery__item a { + background-color: $ui-base-color; +} + +// Change the colors used in the dropdown menu +.dropdown-menu { + background: $white; + + &__arrow { + &.left { + border-left-color: $white; + } + + &.top { + border-top-color: $white; + } + + &.bottom { + border-bottom-color: $white; + } + + &.right { + border-right-color: $white; + } + } + + &__item { + a { + background: $white; + color: $darker-text-color; + } + } +} + +body.admin { + background: $cream; +} + +.card>a:hover { + .card__bar { + background: $blue; + } +} + +.batch-table__toolbar { + background: $green; +} + +.batch-table__row { + border-top: 0; + border: 1px solid #fffdef; + background: $blue; +} + +.batch-table__row:nth-child(2n) { + background: $green; +} + +.filters .filter-subset a { + border-bottom: 2px solid $green; +} + +.filters .filter-subset a:hover, +.filters .filter-subset a:focus { + border-bottom: 2px solid lighten($green, 8%); +} + +.filters .filter-subset a.selected:hover, +.filters .filter-subset a.selected:focus { + border-bottom: 2px solid lighten($blueberry, 8%); +} + +.table>tbody>tr:nth-child(odd)>td, .table>tbody>tr:nth-child(odd)>th { + background: $green; +} + +.table td, .table th { + padding: 8px; + line-height: 18px; + vertical-align: top; + border-top: 1px solid $green; + text-align: left; + background: $blue; +} + +.card__bar { + background: $purple; +} + +.admin-wrapper .sidebar { + background: $green; +} + +.admin-wrapper .content h2, .admin-wrapper .content h4 { + border-bottom: 1px solid #eeeeee; +} + +.admin-wrapper .sidebar ul a.selected { + background: $purple; +} + +.admin-wrapper .sidebar ul a:hover { + background: lighten($blue, 8%); +} + +.selected ul li a { + background: $blue; +} + +.admin-wrapper .sidebar ul .simple-navigation-active-leaf a { + background: $blueberry; +} + +.dashboard__counters > div > div, +.dashboard__counters > div > a { + background: $pink; +} + +.dashboard__counters > div > a:hover, +.dashboard__counters > div > a:focus { + background: lighten($pink, 4%); +} + +// Change the text colors on inverted background +.privacy-dropdown__option.active, +.privacy-dropdown__option:hover, +.privacy-dropdown__option.active .privacy-dropdown__option__content, +.privacy-dropdown__option.active .privacy-dropdown__option__content strong, +.privacy-dropdown__option:hover .privacy-dropdown__option__content, +.privacy-dropdown__option:hover .privacy-dropdown__option__content strong, +.dropdown-menu__item a:active, +.dropdown-menu__item a:focus, +.dropdown-menu__item a:hover, +.actions-modal ul li:not(:empty) a.active, +.actions-modal ul li:not(:empty) a.active button, +.actions-modal ul li:not(:empty) a:active, +.actions-modal ul li:not(:empty) a:active button, +.actions-modal ul li:not(:empty) a:focus, +.actions-modal ul li:not(:empty) a:focus button, +.actions-modal ul li:not(:empty) a:hover, +.actions-modal ul li:not(:empty) a:hover button, +.admin-wrapper .sidebar ul .simple-navigation-active-leaf a, +.simple_form .block-button, +.simple_form .button, +.simple_form button { + color: $white; +} + +.dropdown-menu__separator { + border-bottom-color: lighten($ui-base-color, 4%); +} + +// Change the background colors of modals +.actions-modal, +.boost-modal, +.confirmation-modal, +.mute-modal, +.report-modal, +.embed-modal, +.error-modal, +.onboarding-modal { + background: $ui-base-color; +} + +.column-header__collapsible-inner { + background: darken($blue, 4%); + border: 1px solid lighten($blue, 8%); + border-top: 0; +} + +.boost-modal__action-bar, +.confirmation-modal__action-bar, +.mute-modal__action-bar, +.onboarding-modal__paginator, +.error-modal__footer { + background: darken($ui-base-color, 6%); + + .onboarding-modal__nav, + .error-modal__nav { + &:hover, + &:focus, + &:active { + background-color: darken($ui-base-color, 12%); + } + } +} + +.display-case__case { + background: $white; +} + +.embed-modal .embed-modal__container .embed-modal__html { + background: $white; + + &:focus { + background: darken($ui-base-color, 6%); + } +} + +.react-toggle-track { + background: $ui-secondary-color; +} + +.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { + background: darken($ui-secondary-color, 10%); +} + +.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track { + background: lighten($ui-highlight-color, 10%); +} + +// Change the default color used for the text in an empty column or on the error column +.empty-column-indicator, +.error-column { + color: $primary-text-color; + background: $white; +} + +.tabs-bar { + background: $blue; + border: 1px solid lighten($blue, 8%); + border-bottom: 0; + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } + + &__link { + padding-bottom: 14px; + border-bottom-width: 1px; + border-bottom-color: lighten($blue, 8%); + + &:hover, + &:active, + &:focus { + background: lighten($blue,4%); + } + + &.active { + &:hover, + &:active, + &:focus { + background: transparent; + border-bottom-color: $ui-highlight-color; + } + } + } +} + +// Change the default colors used on some parts of the profile pages +.activity-stream-tabs { + background: $account-background-color; + border-bottom-color: lighten($ui-base-color, 8%); +} + +.getting-started__wrapper, .getting-started, .flex-spacer { + background: $purple; +} + +.box-widget, +.nothing-here, +.page-header, +.directory__tag > a, +.directory__tag > div, +.landing-page__call-to-action, +.contact-widget, +.landing .hero-widget__text, +.landing-page__information.contact-widget { + background: $white; + border: 1px solid lighten(#eeeeee, 4%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-left: 0; + border-right: 0; + border-top: 0; + } +} + +.directory__tag a:hover, .directory__tag a:focus { + background: $blue; + border: 1px solid lighten($blue, 4%); +} + +.page-header { + background: $purple; + border: 1px solid lighten($purple, 4%); +} + +.directory, .nothing-here, .directory__tag a { + background: $green; + border: 1px solid lighten($green, 4%); +} + +.box-widget { + background: $blue; + border: 1px solid lighten($blue, 4%); +} + +.landing__grid__column-login .box-widget { + background: $pink; + border: 1px solid lighten($pink, 4%); +} + +.landing .hero-widget__text { + border-top: 0; + border-bottom: 0; +} + +.simple_form { + input[type=text], + input[type=number], + input[type=email], + input[type=password], + select, + textarea { + border-color: $blueberry; + &:hover { + border-color: $bilberry; + } + } +} + +.landing .hero-widget__footer { + background: $purple; + border: 1px solid lighten($purple, 8%); + border-top: 0; + + @media screen and (max-width: $no-gap-breakpoint) { + border: 0; + } +} + +.brand__tagline { + color: $ui-secondary-color; +} + +.landing-page__call-to-action { + background: $purple; +} + +.landing-page__information.contact-widget { + background: $green; +} + +.directory__tag > a { + &:hover, + &:active, + &:focus { + background: $ui-base-color; + } + + @media screen and (max-width: $no-gap-breakpoint) { + border: 0; + } +} + +.directory__tag.active > a, +.directory__tag.active > div { + border-color: $ui-highlight-color; + + &, + h4, + h4 small, + .fa, + .trends__item__current { + color: $white; + } + + &:hover, + &:active, + &:focus { + background: $ui-highlight-color; + } +} + + +.batch-table { + &__toolbar, + &__row, + .nothing-here { + border-color: lighten($ui-base-color, 8%); + } +} + +.activity-stream { + border: 1px solid lighten($ui-base-color, 8%); + + &--under-tabs { + border-top: 0; + } + + .entry { + background: $account-background-color; + + .detailed-status.light, + .more.light, + .status.light { + border-bottom-color: lighten($ui-base-color, 8%); + } + } + + .status.light { + .status__content { + color: $primary-text-color; + } + + .display-name { + strong { + color: $primary-text-color; + } + } + } +} + +.accounts-grid { + .account-grid-card { + .controls { + .icon-button { + color: $darker-text-color; + } + } + + .name { + a { + color: $primary-text-color; + } + } + + .username { + color: $darker-text-color; + } + + .account__header__content { + color: $primary-text-color; + } + } +} + +.simple_form, +.table-form { + .warning { + box-shadow: none; + background: rgba($error-red, 0.5); + text-shadow: none; + } + + .recommended { + border-color: $ui-highlight-color; + color: $ui-highlight-color; + background-color: $blue; + } +} + +.compose-form .compose-form__warning { + border-color: $ui-highlight-color; + background-color: darken($blue, 6%); + + &, + a { + color: $ui-highlight-color; + } +} + +.status__content, +.reply-indicator__content { + a { + color: $highlight-text-color; + } +} + +.status.status-direct { + background: darken($green, 6%); +} + +.button.logo-button { + color: $white; + + svg { + fill: $white; + } +} + +.public-layout { + .activity-stream { + border-color: lighten(#eeeeee, 4%); + } + + .account__section-headline { + background: $green; + border: 1px solid lighten($green, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } + } + + .header, + .public-account-header, + .public-account-bio { + box-shadow: none; + } + + .hero-widget__text { + background: darken($blue, 4%); + border: 1px solid lighten($blue, 4%); + } + + .public-account-bio { + background: $blue; + border: 1px solid lighten($blue, 4%); + } + + .header { + background: $ui-base-color; + border: 1px solid lighten($ui-base-color, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border: 0; + } + + .brand { + &:hover, + &:focus, + &:active { + background: darken($pink, 4%); + } + } + } + + .public-account-header { + &__image { + background: lighten($ui-base-color, 12%); + + &::after { + box-shadow: none; + } + } + + &__bar { + &::before { + background: $account-background-color; + border: 1px solid lighten($ui-base-color, 8%); + border-top: 0; + } + + .avatar img { + border-color: $account-background-color; + } + + @media screen and (max-width: $no-columns-breakpoint) { + background: $account-background-color; + border: 1px solid lighten($ui-base-color, 8%); + border-top: 0; + } + } + + &__tabs { + &__name { + h1, + h1 small { + color: $white; + + @media screen and (max-width: $no-columns-breakpoint) { + color: $primary-text-color; + } + } + } + } + + &__extra { + .public-account-bio { + border: 0; + } + + .public-account-bio .account__header__fields { + border-color: lighten($ui-base-color, 8%); + } + } + } +} + +.notification__filter-bar button.active::after, +.account__section-headline a.active::after { + border-color: transparent transparent $white; +} + +.hero-widget, +.box-widget, +.contact-widget, +.landing-page__information.contact-widget, +.moved-account-widget, +.memoriam-widget, +.activity-stream, +.nothing-here, +.directory__tag > a, +.directory__tag > div, +.card > a, +.page-header, +.compose-form .compose-form__warning { + box-shadow: none; +} + +body { + background: $cream; +} + +.public-layout .header, .public-layout .public-account-header__image { + background: $pink; + border: 1px solid lighten($pink, 8%); +} + +.public-layout .header .nav-button { + background: darken($pink, 4%); + + &:hover, &:focus { + background: darken($pink, 6%); + } +} + +.public-layout .public-account-header__bar .avatar img { + border: 4px solid $purple; +} + +.public-layout .public-account-header__bar:before { + background: $purple; +} + +.public-layout .public-account-header__tabs__tabs .counter { + border-right: 1px solid lighten($purple, 8%); +} + +.public-layout .public-account-header__tabs__tabs .counter::after { + border-bottom: 4px solid lighten($purple, 8%); +} + +.public-layout .public-account-header__image { + background: $pink; +} + +.notification__filter-bar button.active::before, .notification__filter-bar button.active::after, .notification__filter-bar a.active::before, .notification__filter-bar a.active::after, .account__section-headline button.active::before, .account__section-headline button.active::after, .account__section-headline a.active::before, .account__section-headline a.active::after { + border-color: transparent transparent $white; +} + +.public-layout .footer .grid .column-2 h4 a, +.public-layout .footer, +.public-layout .footer h4, +.public-layout .footer ul a { + color: $blueberry; +} + +.public-layout .footer .brand svg { + fill: $blueberry; +} + +.account__header__image { + background: $pink; +} + +.detailed-status__wrapper { + background: $purple; +} diff --git a/app/javascript/styles/macaron/variables.scss b/app/javascript/styles/macaron/variables.scss new file mode 100644 index 000000000..c4983cc9a --- /dev/null +++ b/app/javascript/styles/macaron/variables.scss @@ -0,0 +1,48 @@ +// Dependent colors +$black: #000000; +$white: #ffffff; +$purple: #c8c4dd; +$blue: #c8dbee; +$green: #dff6eb; +$pink: #ffcbcb; +$blueberry: #5971ad; +$cream: #fffdef; +$bilberry: #ad599c; + +$classic-base-color: #282c37; +$classic-primary-color: #9baec8; +$classic-secondary-color: $green; +$classic-highlight-color: #2b90d9; + +// Differences +$success-green: #3c754d; + +$base-overlay-background: $white !default; +$valid-value-color: $success-green !default; + +$ui-base-color: $classic-secondary-color !default; +$ui-base-lighter-color: $cream; +$ui-primary-color: #9bcbed; +$ui-secondary-color: $classic-base-color !default; +$ui-highlight-color: $blueberry; + +$primary-text-color: $black !default; +$darker-text-color: $classic-base-color !default; +$dark-text-color: #444b5d; +$action-button-color: #606984; + +$inverted-text-color: $black !default; +$lighter-text-color: $classic-base-color !default; +$light-text-color: #444b5d; + +//Newly added colors +$account-background-color: $white !default; + +//Invert darkened and lightened colors +@function darken($color, $amount) { + @return hsl(hue($color), saturation($color), lightness($color) + $amount); +} + +@function lighten($color, $amount) { + @return hsl(hue($color), saturation($color), lightness($color) - $amount); +} diff --git a/config/themes.yml b/config/themes.yml index 9c21c9459..79aabe4a6 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,3 +1,4 @@ default: styles/application.scss contrast: styles/contrast.scss mastodon-light: styles/mastodon-light.scss +macaron: styles/macaron.scss From f66e192c2e26942af84af4e20bb565e4c40d78ce Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 19 Aug 2019 13:48:37 -0700 Subject: [PATCH 015/129] Adding name for Macaron theme --- config/locales/en.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/en.yml b/config/locales/en.yml index eadbde443..7c8b51fc8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1015,6 +1015,7 @@ en: contrast: Mastodon (High contrast) default: Mastodon (Dark) mastodon-light: Mastodon (Light) + macaron: Macaron (Pastel light) time: formats: default: "%b %d, %Y, %H:%M" From bc7b3eaba8a338e6758f8146b7408a4d62922eb9 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 19 Aug 2019 14:36:08 -0700 Subject: [PATCH 016/129] Fix incorrect footer link --- app/javascript/mastodon/features/ui/components/link_footer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/components/link_footer.js b/app/javascript/mastodon/features/ui/components/link_footer.js index 9689e9da4..ecb0a23a8 100644 --- a/app/javascript/mastodon/features/ui/components/link_footer.js +++ b/app/javascript/mastodon/features/ui/components/link_footer.js @@ -26,7 +26,7 @@ const LinkFooter = ({ withHotkeys }) => ( /> friendcamp/mastodon }} + values={{ hometown: hometown-fork/hometown }} />

From b508af3e2c4d36e02ac8228c491b0671435b3b39 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 19 Aug 2019 15:08:20 -0700 Subject: [PATCH 017/129] Update readme --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 541bff0b4..2f3383ca4 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,12 @@ Some changes are to come in the future: * Better list management +## Support this project + +Please consider [supporting Hometown by pledging to my Patreon](https://www.patreon.com/tinysubversions), which supports all my open source projects including this one! + +Of course this project couldn't exist without Mastodon so maybe [support the Mastodon project Patreon](https://www.patreon.com/mastodon) too. + ## Migrating from Mastodon to Hometown Please see [this article in the wiki](https://github.com/hometown-fork/hometown/wiki/Initial-migration) for directions on migration from Mastodon to Hometown. From 926d05eb590d3de6703ae304810f5a89739f6df6 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 20 Aug 2019 15:14:49 +0100 Subject: [PATCH 018/129] Add Fairy Floss theme for hometown --- app/javascript/styles/fairy-floss.scss | 3 + app/javascript/styles/fairy-floss/diff.scss | 515 ++++++++++++++++++ .../styles/fairy-floss/variables.scss | 70 +++ config/locales/en.yml | 1 + config/themes.yml | 1 + 5 files changed, 590 insertions(+) create mode 100644 app/javascript/styles/fairy-floss.scss create mode 100644 app/javascript/styles/fairy-floss/diff.scss create mode 100644 app/javascript/styles/fairy-floss/variables.scss diff --git a/app/javascript/styles/fairy-floss.scss b/app/javascript/styles/fairy-floss.scss new file mode 100644 index 000000000..6b26aeed5 --- /dev/null +++ b/app/javascript/styles/fairy-floss.scss @@ -0,0 +1,3 @@ +@import 'fairy-floss/variables'; +@import 'application'; +@import 'fairy-floss/diff' diff --git a/app/javascript/styles/fairy-floss/diff.scss b/app/javascript/styles/fairy-floss/diff.scss new file mode 100644 index 000000000..7463796e2 --- /dev/null +++ b/app/javascript/styles/fairy-floss/diff.scss @@ -0,0 +1,515 @@ +// components.scss +.compose-form { + .compose-form__modifiers { + .compose-form__upload { + &-description { + input { + &::placeholder { + opacity: 1; + } + } + } + } + } +} + +.rich-formatting a, +.rich-formatting p a, +.rich-formatting li a, +.landing-page__short-description p a, +.status__content a, +.reply-indicator__content a { + color: lighten($ui-highlight-color, 12%); + text-decoration: underline; + + &.mention { + text-decoration: none; + } + + &.mention span { + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + } + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + + &.status__content__spoiler-link { + color: $secondary-text-color; + text-decoration: none; + } +} + +.status__content__read-more-button { + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } +} + +.getting-started__footer a { + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } +} + +.nothing-here { + color: $darker-text-color; +} + +.public-layout .public-account-header__tabs__tabs .counter.active::after { + border-bottom: 4px solid $ui-highlight-color; +} + + +// FAIRY FLOSS CHANGES + +html { + scrollbar-color: $purple3 rgba($purple3, 0.25); +} + +::-webkit-scrollbar-thumb { + background: $purplescrollbar; + border: 0 #f8f8f2; + border-radius: 50px; +} + +::-webkit-scrollbar-thumb:hover { + background: $purplescrollbar; + border: 0; +} + +::-webkit-scrollbar-track:hover { + background: darken($purple2, 6%); +} + +.loading-bar + { + background-color: $mint; + } + +// text +.status__display-name, .column-header, .column-link, .navigation-bar strong { + color: $purple4; +} + +.ui, +.notification__filter-bar button, .account__section-headline button, body, body.admin { + background: $purple1; +} + +.drawer__header { + background: $purple3; + + a { + &:hover, &:focus { + background: darken($purple3, 8%); + } + } +} + +.search__input { + &:hover, &:focus { + background: $purple2; + color: $purple4; + } + background: $purple2; + color: $purple4; +} + +::placeholder { + color: $purple4; +} + +.search-popout, .search-popout h4 { + color: $purple1; + background-color: $purple4; +} + +.drawer__inner, .drawer__inner__mastodon { + background: $purple3; +} + +.compose-form .compose-form__buttons-wrapper { + background: lighten($purple4, 8%); +} + +.text-icon-button.active { + color: darken($pink, 12%); +} + + +.column-header, .column-header__button, .column-header__back-button { + background: $purple5; +} + +.notification__filter-bar button.active::after, .notification__filter-bar a.active::after, .account__section-headline button.active::after, .account__section-headline a.active::after { + border-color: transparent transparent $purple2; +} + +.column>.scrollable { + background: $purple2; +} + +.load-more:hover { + background: darken($purple2, 4%); +} + +.empty-column-indicator, .error-column { + background: $purple2; +} + +.column-link__badge, .column-subheading { + background: $purple2; +} + +.column-link { + background: $purple3; +} + +// link previews + +.status-card.compact { + border-color: darken($purple5, 8%); + background: $purple5; +} + +.status-card__image { + background: $purple3; +} + +.status-card__content { + background: $purple5; + + &:hover, &:focus { + background: darken($purple5, 4%); + } +} + +.notification__filter-bar button.active, .notification__filter-bar a.active, .account__section-headline button.active, .account__section-headline a.active, .column-header>.column-header__back-button { + color: $mint; +} + +.react-toggle--checked .react-toggle-track, .react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track { + background: $pink; +} + +.react-toggle-track, .react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { + background: $purple2; +} + +.column-header__collapsible-inner, .column-header__button.active, .column-header__button.active:hover, .column-header__button.active:focus { + background: $purple3; + color: $purpleicon; +} + +.column-inline-form, .column-back-button { + background: $purplescrollbar; +} + +.flex-spacer, .getting-started, .getting-started__wrapper { + background: $purple2; +} + +.status { + border-bottom: 1px solid lighten($purple2, 8%); +} + +.detailed-status, .detailed-status__action-bar { + background: $purplescrollbar; +} + +.detailed-status__action-bar { + border-top: 1px solid lighten($purple3, 8%); + border-bottom: 1px solid lighten($purple3, 8%); +} + +.focusable:focus { + background: $purplescrollbar; +} + +.focusable { + &:focus { + outline: 0; + background: $purplescrollbar; + + .detailed-status, + .detailed-status__action-bar { + background: lighten($purplescrollbar, 2%); + } + } +} + +.icon-button.active { + color: $pink; +} + +button.icon-button i.fa-retweet { + background-image: url("data:image/svg+xml;utf8,"); +} +button.icon-button i.fa-retweet:hover { + background-image: url("data:image/svg+xml;utf8,"); +} + +.notification__favourite-icon-wrapper .star-icon, .star-icon.active, a.mention.hashtag { + color: $lemon; +} + +.reply-indicator__content a, .status__content a { + color: $mint; +} + +a.mention, .notification__message .fa { + color: $pink; +} + +.poll__link { + color: $purple4; +} + +.poll__chart { + color: lighten($coral, 4%); +} + +.poll__chart.leading { + color: $coral; +} + +.emoji-mart-bar:first-child { + background: $purple4; +} + +.emoji-mart-anchor-selected { + color: $purple2; + &:hover, &:focus { + color: $purple1; + } +} + +.emoji-mart-anchor-bar { + background: $purple1; +} + +// profile in deck view + +.account__header__bar { + background: $purple5; +} + +.account__header__image { + background: $purple1; +} + +.notification__filter-bar, .account__section-headline { + background: $purple1; +} + +.dropdown-menu, .dropdown-menu__item a { + background: $purple4; +} + +.dropdown-menu__item a { + &:hover, &:focus { + background: $purple2; + } +} + +.dropdown-menu__separator { + border-bottom: 1px solid darken($purple4, 4%); +} + +.button.logo-button.button--destructive:active, .button.logo-button.button--destructive:focus, .button.logo-button.button--destructive:hover { + background: $pink; +} + +// public profiles + +.public-layout .header { + background: $purple3; +} + +.public-layout .header .brand:active, .public-layout .header .brand:focus, .public-layout .header .brand:hover { + background: darken($purple3, 4%); +} + +.public-layout .public-account-header__bar .avatar img { + background: $purple2; + border: 4px solid $purple2; +} + +.public-layout .header .nav-button { + background: darken($purple3, 4%); + &:hover, &:focus { + background: darken($purple3, 8%); + } +} + +.public-layout .public-account-header__bar:before { + background: $purplescrollbar; +} + +.public-layout .public-account-header__tabs__tabs .counter.active::after { + border-bottom: 4px solid $lemon; +} + +.public-layout .public-account-bio { + background: $purple3; +} + +.hero-widget__text { + background: $purple2; +} + +.activity-stream .entry { + background: $purple2; +} + +.simple_form .hint a { + color: $mint; +} + +.oauth-prompt strong, .follow-prompt strong { + color: $purple4; +} + +.simple_form input[type=text]:active, .simple_form input[type=text]:focus, .simple_form input[type=number]:active, .simple_form input[type=number]:focus, .simple_form input[type=email]:active, .simple_form input[type=email]:focus, .simple_form input[type=password]:active, .simple_form input[type=password]:focus, .simple_form textarea:active, .simple_form textarea:focus { + border-color: $mint; +} + +.nothing-here { + background: $purple2; +} + + +// admin zone + +.admin-wrapper .content h2 { + color: $purple4; +} + +.admin-wrapper .sidebar-wrapper { + background: $purple2; +} + +.admin-wrapper .sidebar ul .simple-navigation-active-leaf a { + background: $purpleborder; + &:hover, &:focus { + background: lighten($purpleborder, 8%); + } +} + +.admin-wrapper .sidebar ul ul { + background: $purple1; +} + +.admin-wrapper .sidebar ul a:hover, .admin-wrapper .sidebar ul a:focus { + background: $purpleborder; +} + +.admin-wrapper .content .muted-hint a { + color: $mint; +} + +.card__bar { + background: $purplescrollbar; +} + +.simple_form input[type=text], .simple_form input[type=number], .simple_form input[type=email], .simple_form input[type=password], .simple_form textarea { + background: darken($purple1, 6%); +} + +.simple_form select { + background: darken($purple1, 6%) url("data:image/svg+xml;utf8,") no-repeat right 8px center/auto 16px +} + +.table th, .table td { + background: darken($purple2, 6%); +} + +.table > thead > tr > th { + color: $lemon; +} + +.table > tbody > tr:nth-child(odd) > td, .table > tbody > tr:nth-child(odd) > th { + background: $purple3; +} + +// directory + +.accounts-table tbody td { + background: $purple3; +} + +.page-header { + background: $purpleborder; + + h1 { + color: $purple4; + } +} + +.box-widget, .contact-widget, .landing-page__information.contact-widget { + background: $purple2; +} + +.notice-widget a { + color: $mint; +} + +.directory__tag a { + background: $purple2; + &:hover, &:focus { + background: lighten($purple2, 4%); + } +} + +// about/more + +.landing-page__call-to-action { + background: $purple3; +} + +.rich-formatting h3, .rich-formatting h4, .rich-formatting h2, .rich-formatting h1 { + color: lighten($purpleicon, 8%); +} + +.landing-page__information strong { + color: lighten($purpleicon, 10%); +} + +// about + +.simple_form .input.boolean label a { + color: $mint; +} + +::-webkit-input-placeholder { /* Edge */ + color: $purpleicon; +} + +:-ms-input-placeholder { /* Internet Explorer 10-11 */ + color: $purpleicon; +} + +::placeholder { + color: $purpleicon; +} + +.landing .hero-widget__footer { + background: $purple3; +} diff --git a/app/javascript/styles/fairy-floss/variables.scss b/app/javascript/styles/fairy-floss/variables.scss new file mode 100644 index 000000000..6a714f3ff --- /dev/null +++ b/app/javascript/styles/fairy-floss/variables.scss @@ -0,0 +1,70 @@ +// FAIRY FLOSS VARIABLES + +// Purples +$purple1: #2e2b3b; +$purple2: #504b68; +$purple3: #5f5676; +$purple4: #c8c4d4; +$purple5: #474059; +$purpleicon: #ada6bf; +$purpleborder: #5f5676; +$purplescrollbar: #5a5475; +$mint: #c2ffdf; +$pink: #ffb8d1; +$lemon: #fff683; +$coral: #ff857f; + +// Commonly used web colors +$black: #000000; // Black +$white: #ffffff; // White +$success-green: #79bd9a !default; // Padua +$error-red: #df405a !default; // Cerise +$warning-red: #ff5050 !default; // Sunset Orange +$gold-star: #ca8f04 !default; // Dark Goldenrod + +// Values from the classic Mastodon UI +$classic-base-color: $purple1; // Midnight Express +$classic-primary-color: $purple4; // Echo Blue +$classic-secondary-color: #d9e1e8; // Pattens Blue +$classic-highlight-color: #ff857f; // Summer Sky + +// Variables for defaults in UI +$base-shadow-color: $black !default; +$base-overlay-background: $black !default; +$base-border-color: $white !default; +$simple-background-color: $white !default; +$valid-value-color: $success-green !default; +$error-value-color: $error-red !default; + +// Tell UI to use selected colors +$ui-base-color: $classic-base-color !default; // Darkest +$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest +$ui-primary-color: $classic-primary-color !default; // Lighter +$ui-secondary-color: $classic-secondary-color !default; // Lightest +$ui-highlight-color: $classic-highlight-color !default; + +// Variables for texts +$primary-text-color: $white !default; +$darker-text-color: $ui-primary-color !default; +$dark-text-color: $purpleicon !default; +$secondary-text-color: $ui-secondary-color !default; +$highlight-text-color: $ui-highlight-color !default; +$action-button-color: $purpleicon !default; +// For texts on inverted backgrounds +$inverted-text-color: $ui-base-color !default; +$lighter-text-color: $ui-base-lighter-color !default; +$light-text-color: $ui-primary-color !default; + +// Language codes that uses CJK fonts +$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW; + +// Variables for components +$media-modal-media-max-width: 100%; +// put margins on top and bottom of image to avoid the screen covered by image. +$media-modal-media-max-height: 80%; + +$no-gap-breakpoint: 415px; + +$font-sans-serif: 'mastodon-font-sans-serif' !default; +$font-display: 'mastodon-font-display' !default; +$font-monospace: 'mastodon-font-monospace' !default; diff --git a/config/locales/en.yml b/config/locales/en.yml index eadbde443..cb4cbee72 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1015,6 +1015,7 @@ en: contrast: Mastodon (High contrast) default: Mastodon (Dark) mastodon-light: Mastodon (Light) + fairy-floss: Fairy Floss (Pastel dark) time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/themes.yml b/config/themes.yml index 9c21c9459..eb4938bdb 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,3 +1,4 @@ default: styles/application.scss contrast: styles/contrast.scss mastodon-light: styles/mastodon-light.scss +fairy-floss: styles/fairy-floss.scss From 09ec02601bf1d66b3e162dc247221f0e329107c3 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 20 Aug 2019 15:28:36 +0100 Subject: [PATCH 019/129] Small changes to macaron theme - Change hover colour for shared links to purple - Change background colour of textbox in list editing popup to blue - Fix bug which made a border green instead of grey when being notified of a new follower --- app/javascript/styles/macaron/diff.scss | 2019 +++++++++++++++++++++++ 1 file changed, 2019 insertions(+) create mode 100644 app/javascript/styles/macaron/diff.scss diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss new file mode 100644 index 000000000..b20a6578f --- /dev/null +++ b/app/javascript/styles/macaron/diff.scss @@ -0,0 +1,2019 @@ +// Notes! +// Sass color functions, "darken" and "lighten" are automatically replaced. + +html { + scrollbar-color: $pink rgba($pink, 0.25); +} + +.loading-bar + { + background-color: $green; + } + +.status__content a, .reply-indicator__content a { + &:hover, &:active, &:focus { + color: $bilberry; + } +} + +::-webkit-scrollbar-thumb { + background: $pink; + border: 0; +} + +::-webkit-scrollbar-thumb { + background: $pink; + border: 0; +} + +::-webkit-scrollbar-thumb:hover { + background: $pink; + border: 0; +} + +::-webkit-scrollbar-track:hover { + background: $green; +} + +.ui { + background: $cream; +} + +// Change the colors of button texts +.button { + color: $white; + + &.button-alternative-2 { + color: $white; + } +} + +// Change default background colors of columns +.column > .scrollable, +.getting-started, +.column-inline-form { + background: $white; + border: 1px solid lighten(#eeeeee, 4%); + border-top: 0; +} + +.getting-started { + background: $green; + border: 1px solid lighten($green, 8%); +} + +.column-back-button, +.column-header { + background: #c8c4dd; + border: 1px solid lighten($purple, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } + + &--slim-button { + border: 0; + top: -49px; + right: 1px; + } +} + + + +.column-header__back-button, +.column-header__button, +.column-header__button.active, +.account__header__bar { + background: $purple; +} + +.column-header__button.active { + color: $ui-highlight-color; + + &:hover, + &:active, + &:focus { + color: $ui-highlight-color; + background: lighten($purple, 4%); + } +} + +.account__header__bar .avatar .account__avatar { + border-color: $white; +} + +.getting-started__footer a { + color: $ui-secondary-color; + text-decoration: underline; +} + +.column-subheading { + background: $green; + border-bottom: 1px solid lighten($green, 8%); +} + +.getting-started, +.scrollable { + .column-link { + background: $blue; + border-bottom: 1px solid lighten($blue, 8%); + + &:hover, + &:active, + &:focus { + background: lighten($blue, 8%); + } + } +} + +.getting-started .navigation-bar { + border-top: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid lighten($ui-base-color, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } +} + +.compose-form__autosuggest-wrapper, +.poll__text input[type="text"], +.compose-form .spoiler-input__input, +.compose-form__poll-wrapper select, +.search__input, +.setting-text, +.box-widget input[type="text"], +.box-widget input[type="email"], +.box-widget input[type="password"], +.box-widget textarea, +.statuses-grid .detailed-status { + border: 1px solid lighten(#eeeeee, 4%); +} + +.poll__chart { + background: darken($purple, 4%) +} + +.poll__chart.leading { + background: $pink; +} + +.status { + border-bottom: 1px solid lighten(#eeeeee, 4%); +} + +.detailed-status__action-bar { + border-top: 1px solid lighten($purple, 4%); + border-bottom: 1px solid lighten($purple, 4%); +} + +.search__input { + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + border-bottom: 0; + } + + background: $green; + border: 1px solid lighten($green, 8%); +} + +.search__input { + &:focus{ + background: $purple; + border: 1px solid lighten($purple, 8%); + } +} + +.list-editor .search .search__input { + border-top: 0; + border-bottom: 0; +} + +.compose-form__poll-wrapper select { + background: $simple-background-color url("data:image/svg+xml;utf8,") no-repeat right 8px center / auto 16px; +} + +.compose-form__poll-wrapper, +.compose-form__poll-wrapper .poll__footer { + border-top-color: lighten($ui-base-color, 8%); +} + +.notification__filter-bar, .account__section-headline { + background: $green; + border: 1px solid lighten($green, 8%); + border-top: 0; +} + +.notification__filter-bar button { + background: $green; +} + +.compose-form .compose-form__buttons-wrapper { + background: $ui-base-color; + border: 1px solid lighten($ui-base-color, 8%); + border-top: 0; +} + +.drawer__inner { + background: $pink; + border: 1px solid lighten($pink, 8%); +} + +.drawer__header { + background: $blue; + border: 1px solid lighten($blue, 8%); +} + +.drawer__header a { + &:active, + &:focus, + &:hover { + background: lighten($blue, 4%); + } +} + +.drawer__inner__mastodon { + background: $pink url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; +} + +// Change the colors used in compose-form +.compose-form { + .compose-form__modifiers { + .compose-form__upload__actions .icon-button { + color: lighten($white, 7%); + + &:active, + &:focus, + &:hover { + color: $white; + } + } + + .compose-form__upload-description input { + color: lighten($white, 7%); + + &::placeholder { + color: lighten($white, 7%); + } + } + } + + .compose-form__buttons-wrapper { + background: darken($ui-base-color, 6%); + } + + .autosuggest-textarea__suggestions { + background: darken($ui-base-color, 6%); + } + + .autosuggest-textarea__suggestions__item { + &:hover, + &:focus, + &:active, + &.selected { + background: lighten($ui-base-color, 4%); + } + } +} + +.account__header__tabs__buttons .icon-button { + border-color: lighten($purple, 8%); +} + +.emoji-mart-bar { + border-color: lighten($ui-base-color, 4%); + + &:first-child { + background: darken($ui-base-color, 6%); + } +} + +.emoji-mart-search input { + background: rgba($ui-base-color, 0.3); + border-color: $ui-base-color; +} + +// Change the background colors of statuses +.focusable:focus { + background: darken($green, 2%); +} + +.status.status-direct { + background: darken($ui-base-color, 2%); +} + +.focusable:focus .status.status-direct { + background: $ui-base-color; +} + +.status.status-direct:not(.read) { + background: $ui-base-color; + border-bottom-color: lighten($ui-base-color, 4%); +} + +.detailed-status, +.detailed-status__action-bar { + background: darken($purple, 10%); +} + +.reply-indicator { + background: darken($purple, 8%); +} + +// Change the background colors of status__content__spoiler-link +.reply-indicator__content .status__content__spoiler-link, +.status__content .status__content__spoiler-link { + background: $pink; + + &:hover { + background: lighten($pink, 4%); + } +} + +// Change the background colors of media and video spoilers +.media-spoiler, +.video-player__spoiler { + background: $ui-base-color; +} + +.privacy-dropdown.active .privacy-dropdown__value.active .icon-button { + color: $white; +} + +.account-gallery__item a { + background-color: $ui-base-color; +} + +// Change the colors used in the dropdown menu +.dropdown-menu { + background: $white; + + &__arrow { + &.left { + border-left-color: $white; + } + + &.top { + border-top-color: $white; + } + + &.bottom { + border-bottom-color: $white; + } + + &.right { + border-right-color: $white; + } + } + + &__item { + a { + background: $white; + color: $darker-text-color; + } + } +} + +body.admin { + background: $cream; +} + +.card>a:hover { + .card__bar { + background: $blue; + } +} + +.batch-table__toolbar { + background: $green; +} + +.batch-table__row { + border-top: 0; + border: 1px solid #fffdef; + background: $blue; +} + +.batch-table__row:nth-child(2n) { + background: $green; +} + +.filters .filter-subset a { + border-bottom: 2px solid $green; +} + +.filters .filter-subset a:hover, +.filters .filter-subset a:focus { + border-bottom: 2px solid lighten($green, 8%); +} + +.filters .filter-subset a.selected:hover, +.filters .filter-subset a.selected:focus { + border-bottom: 2px solid lighten($blueberry, 8%); +} + +.table>tbody>tr:nth-child(odd)>td, .table>tbody>tr:nth-child(odd)>th { + background: $green; +} + +.table td, .table th { + padding: 8px; + line-height: 18px; + vertical-align: top; + border-top: 1px solid $green; + text-align: left; + background: $blue; +} + +.card__bar { + background: $purple; +} + +.admin-wrapper .sidebar { + background: $green; +} + +.admin-wrapper .content h2, .admin-wrapper .content h4 { + border-bottom: 1px solid #eeeeee; +} + +.admin-wrapper .sidebar ul a.selected { + background: $purple; +} + +.admin-wrapper .sidebar ul a:hover { + background: lighten($blue, 8%); +} + +.selected ul li a { + background: $blue; +} + +.admin-wrapper .sidebar ul .simple-navigation-active-leaf a { + background: $blueberry; +} + +.dashboard__counters > div > div, +.dashboard__counters > div > a { + background: $pink; +} + +.dashboard__counters > div > a:hover, +.dashboard__counters > div > a:focus { + background: lighten($pink, 4%); +} + +// Change the text colors on inverted background +.privacy-dropdown__option.active, +.privacy-dropdown__option:hover, +.privacy-dropdown__option.active .privacy-dropdown__option__content, +.privacy-dropdown__option.active .privacy-dropdown__option__content strong, +.privacy-dropdown__option:hover .privacy-dropdown__option__content, +.privacy-dropdown__option:hover .privacy-dropdown__option__content strong, +.dropdown-menu__item a:active, +.dropdown-menu__item a:focus, +.dropdown-menu__item a:hover, +.actions-modal ul li:not(:empty) a.active, +.actions-modal ul li:not(:empty) a.active button, +.actions-modal ul li:not(:empty) a:active, +.actions-modal ul li:not(:empty) a:active button, +.actions-modal ul li:not(:empty) a:focus, +.actions-modal ul li:not(:empty) a:focus button, +.actions-modal ul li:not(:empty) a:hover, +.actions-modal ul li:not(:empty) a:hover button, +.admin-wrapper .sidebar ul .simple-navigation-active-leaf a, +.simple_form .block-button, +.simple_form .button, +.simple_form button { + color: $white; +} + +.dropdown-menu__separator { + border-bottom-color: lighten($ui-base-color, 4%); +} + +// Change the background colors of modals +.actions-modal, +.boost-modal, +.confirmation-modal, +.mute-modal, +.report-modal, +.embed-modal, +.error-modal, +.onboarding-modal { + background: $ui-base-color; +} + +.column-header__collapsible-inner { + background: darken($blue, 4%); + border: 1px solid lighten($blue, 8%); + border-top: 0; +} + +.boost-modal__action-bar, +.confirmation-modal__action-bar, +.mute-modal__action-bar, +.onboarding-modal__paginator, +.error-modal__footer { + background: darken($ui-base-color, 6%); + + .onboarding-modal__nav, + .error-modal__nav { + &:hover, + &:focus, + &:active { + background-color: darken($ui-base-color, 12%); + } + } +} + +.display-case__case { + background: $white; +} + +.embed-modal .embed-modal__container .embed-modal__html { + background: $white; + + &:focus { + background: darken($ui-base-color, 6%); + } +} + +.react-toggle-track { + background: $ui-secondary-color; +} + +.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { + background: darken($ui-secondary-color, 10%); +} + +.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track { + background: lighten($ui-highlight-color, 10%); +} + +// Change the default color used for the text in an empty column or on the error column +.empty-column-indicator, +.error-column { + color: $primary-text-color; + background: $white; +} + +.tabs-bar { + background: $blue; + border: 1px solid lighten($blue, 8%); + border-bottom: 0; + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } + + &__link { + padding-bottom: 14px; + border-bottom-width: 1px; + border-bottom-color: lighten($blue, 8%); + + &:hover, + &:active, + &:focus { + background: lighten($blue,4%); + } + + &.active { + &:hover, + &:active, + &:focus { + background: transparent; + border-bottom-color: $ui-highlight-color; + } + } + } +} + +// Change the default colors used on some parts of the profile pages +.activity-stream-tabs { + background: $account-background-color; + border-bottom-color: lighten($ui-base-color, 8%); +} + +.getting-started__wrapper, .getting-started, .flex-spacer { + background: $purple; +} + +.box-widget, +.nothing-here, +.page-header, +.directory__tag > a, +.directory__tag > div, +.landing-page__call-to-action, +.contact-widget, +.landing .hero-widget__text, +.landing-page__information.contact-widget { + background: $white; + border: 1px solid lighten(#eeeeee, 4%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-left: 0; + border-right: 0; + border-top: 0; + } +} + +.directory__tag a:hover, .directory__tag a:focus { + background: $blue; + border: 1px solid lighten($blue, 4%); +} + +.page-header { + background: $purple; + border: 1px solid lighten($purple, 4%); +} + +.directory, .nothing-here, .directory__tag a { + background: $green; + border: 1px solid lighten($green, 4%); +} + +.box-widget { + background: $blue; + border: 1px solid lighten($blue, 4%); +} + +.landing__grid__column-login .box-widget { + background: $pink; + border: 1px solid lighten($pink, 4%); +} + +.landing .hero-widget__text { + border-top: 0; + border-bottom: 0; +} + +.simple_form { + input[type=text], + input[type=number], + input[type=email], + input[type=password], + select, + textarea { + border-color: $blueberry; + &:hover { + border-color: $bilberry; + } + } +} + +.landing .hero-widget__footer { + background: $purple; + border: 1px solid lighten($purple, 8%); + border-top: 0; + + @media screen and (max-width: $no-gap-breakpoint) { + border: 0; + } +} + +.brand__tagline { + color: $ui-secondary-color; +} + +.landing-page__call-to-action { + background: $purple; +} + +.landing-page__information.contact-widget { + background: $green; +} + +.directory__tag > a { + &:hover, + &:active, + &:focus { + background: $ui-base-color; + } + + @media screen and (max-width: $no-gap-breakpoint) { + border: 0; + } +} + +.directory__tag.active > a, +.directory__tag.active > div { + border-color: $ui-highlight-color; + + &, + h4, + h4 small, + .fa, + .trends__item__current { + color: $white; + } + + &:hover, + &:active, + &:focus { + background: $ui-highlight-color; + } +} + + +.batch-table { + &__toolbar, + &__row, + .nothing-here { + border-color: lighten($ui-base-color, 8%); + } +} + +.activity-stream { + border: 1px solid lighten($ui-base-color, 8%); + + &--under-tabs { + border-top: 0; + } + + .entry { + background: $account-background-color; + + .detailed-status.light, + .more.light, + .status.light { + border-bottom-color: lighten($ui-base-color, 8%); + } + } + + .status.light { + .status__content { + color: $primary-text-color; + } + + .display-name { + strong { + color: $primary-text-color; + } + } + } +} + +.accounts-grid { + .account-grid-card { + .controls { + .icon-button { + color: $darker-text-color; + } + } + + .name { + a { + color: $primary-text-color; + } + } + + .username { + color: $darker-text-color; + } + + .account__header__content { + color: $primary-text-color; + } + } +} + +.simple_form, +.table-form { + .warning { + box-shadow: none; + background: rgba($error-red, 0.5); + text-shadow: none; + } + + .recommended { + border-color: $ui-highlight-color; + color: $ui-highlight-color; + background-color: $blue; + } +} + +.compose-form .compose-form__warning { + border-color: $ui-highlight-color; + background-color: darken($blue, 6%); + + &, + a { + color: $ui-highlight-color; + } +} + +.status__content, +.reply-indicator__content { + a { + color: $highlight-text-color; + } +} + +.status.status-direct { + background: darken($green, 6%); +} + +.button.logo-button { + color: $white; + + svg { + fill: $white; + } +} + +.public-layout { + .activity-stream { + border-color: lighten(#eeeeee, 4%); + } + + .account__section-headline { + background: $green; + border: 1px solid lighten($green, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } + } + + .header, + .public-account-header, + .public-account-bio { + box-shadow: none; + } + + .hero-widget__text { + background: darken($blue, 4%); + border: 1px solid lighten($blue, 4%); + } + + .public-account-bio { + background: $blue; + border: 1px solid lighten($blue, 4%); + } + + .header { + background: $ui-base-color; + border: 1px solid lighten($ui-base-color, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border: 0; + } + + .brand { + &:hover, + &:focus, + &:active { + background: darken($pink, 4%); + } + } + } + + .public-account-header { + &__image { + background: lighten($ui-base-color, 12%); + + &::after { + box-shadow: none; + } + } + + &__bar { + &::before { + background: $account-background-color; + border: 1px solid lighten($ui-base-color, 8%); + border-top: 0; + } + + .avatar img { + border-color: $account-background-color; + } + + @media screen and (max-width: $no-columns-breakpoint) { + background: $account-background-color; + border: 1px solid lighten($ui-base-color, 8%); + border-top: 0; + } + } + + &__tabs { + &__name { + h1, + h1 small { + color: $white; + + @media screen and (max-width: $no-columns-breakpoint) { + color: $primary-text-color; + } + } + } + } + + &__extra { + .public-account-bio { + border: 0; + } + + .public-account-bio .account__header__fields { + border-color: lighten($ui-base-color, 8%); + } + } + } +} + +.notification__filter-bar button.active::after, +.account__section-headline a.active::after { + border-color: transparent transparent $white; +} + +.hero-widget, +.box-widget, +.contact-widget, +.landing-page__information.contact-widget, +.moved-account-widget, +.memoriam-widget, +.activity-stream, +.nothing-here, +.directory__tag > a, +.directory__tag > div, +.card > a, +.page-header, +.compose-form .compose-form__warning { + box-shadow: none; +} + +body { + background: $cream; +} + +.public-layout .header, .public-layout .public-account-header__image { + background: $pink; + border: 1px solid lighten($pink, 8%); +} + +.public-layout .header .nav-button { + background: darken($pink, 4%); + + &:hover, &:focus { + background: darken($pink, 6%); + } +} + +.public-layout .public-account-header__bar .avatar img { + border: 4px solid $purple; +} + +.public-layout .public-account-header__bar:before { + background: $purple; +} + +.public-layout .public-account-header__tabs__tabs .counter { + border-right: 1px solid lighten($purple, 8%); +} + +.public-layout .public-account-header__tabs__tabs .counter::after { + border-bottom: 4px solid lighten($purple, 8%); +} + +.public-layout .public-account-header__image { + background: $pink; +} + +.notification__filter-bar button.active::before, .notification__filter-bar button.active::after, .notification__filter-bar a.active::before, .notification__filter-bar a.active::after, .account__section-headline button.active::before, .account__section-headline button.active::after, .account__section-headline a.active::before, .account__section-headline a.active::after { + border-color: transparent transparent $white; +} + +.public-layout .footer .grid .column-2 h4 a, +.public-layout .footer, +.public-layout .footer h4, +.public-layout .footer ul a { + color: $blueberry; +} + +.public-layout .footer .brand svg { + fill: $blueberry; +} + +.account__header__image { + background: $pink; +} + +.detailed-status__wrapper { + background: $purple; +} + +// Notes! +// Sass color functions, "darken" and "lighten" are automatically replaced. + +html { + scrollbar-color: $pink rgba($pink, 0.25); +} + +.loading-bar + { + background-color: $green; + } + +.status__content a, .reply-indicator__content a { + &:hover, &:active, &:focus { + color: $bilberry; + } +} + +::-webkit-scrollbar-thumb { + background: $pink; + border: 0; +} + +::-webkit-scrollbar-thumb { + background: $pink; + border: 0; +} + +::-webkit-scrollbar-thumb:hover { + background: $pink; + border: 0; +} + +::-webkit-scrollbar-track:hover { + background: $green; +} + +.ui { + background: $cream; +} + +// Change the colors of button texts +.button { + color: $white; + + &.button-alternative-2 { + color: $white; + } +} + +// Change default background colors of columns +.column > .scrollable, +.getting-started, +.column-inline-form { + background: $white; + border: 1px solid lighten(#eeeeee, 4%); + border-top: 0; +} + +.getting-started { + background: $green; + border: 1px solid lighten($green, 8%); +} + +.column-back-button, +.column-header { + background: #c8c4dd; + border: 1px solid lighten($purple, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } + + &--slim-button { + border: 0; + top: -49px; + right: 1px; + } +} + + + +.column-header__back-button, +.column-header__button, +.column-header__button.active, +.account__header__bar { + background: $purple; +} + +.column-header__button.active { + color: $ui-highlight-color; + + &:hover, + &:active, + &:focus { + color: $ui-highlight-color; + background: lighten($purple, 4%); + } +} + +.account__header__bar .avatar .account__avatar { + border-color: $white; +} + +.getting-started__footer a { + color: $ui-secondary-color; + text-decoration: underline; +} + +.column-subheading { + background: $green; + border-bottom: 1px solid lighten($green, 8%); +} + +.getting-started, +.scrollable { + .column-link { + background: $blue; + border-bottom: 1px solid lighten($blue, 8%); + + &:hover, + &:active, + &:focus { + background: lighten($blue, 8%); + } + } +} + +.getting-started .navigation-bar { + border-top: 1px solid lighten($ui-base-color, 8%); + border-bottom: 1px solid lighten($ui-base-color, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } +} + +.compose-form__autosuggest-wrapper, +.poll__text input[type="text"], +.compose-form .spoiler-input__input, +.compose-form__poll-wrapper select, +.search__input, +.setting-text, +.box-widget input[type="text"], +.box-widget input[type="email"], +.box-widget input[type="password"], +.box-widget textarea, +.statuses-grid .detailed-status { + border: 1px solid lighten(#eeeeee, 4%); +} + +.poll__chart { + background: darken($purple, 4%) +} + +.poll__chart.leading { + background: $pink; +} + +.status { + border-bottom: 1px solid lighten(#eeeeee, 4%); +} + +.detailed-status__action-bar { + border-top: 1px solid lighten($purple, 4%); + border-bottom: 1px solid lighten($purple, 4%); +} + +.search__input { + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + border-bottom: 0; + } + + background: $green; + border: 1px solid lighten($green, 8%); +} + +.search__input { + &:focus{ + background: $purple; + border: 1px solid lighten($purple, 8%); + } +} + +.list-editor .search .search__input { + border-top: 0; + border-bottom: 0; +} + +.compose-form__poll-wrapper select { + background: $simple-background-color url("data:image/svg+xml;utf8,") no-repeat right 8px center / auto 16px; +} + +.compose-form__poll-wrapper, +.compose-form__poll-wrapper .poll__footer { + border-top-color: lighten($ui-base-color, 8%); +} + +.notification__filter-bar, .account__section-headline { + background: $green; + border: 1px solid lighten($green, 8%); + border-top: 0; +} + +.notification__filter-bar button { + background: $green; +} + +.compose-form .compose-form__buttons-wrapper { + background: $ui-base-color; + border: 1px solid lighten($ui-base-color, 8%); + border-top: 0; +} + +.drawer__inner { + background: $pink; + border: 1px solid lighten($pink, 8%); +} + +.drawer__header { + background: $blue; + border: 1px solid lighten($blue, 8%); +} + +.drawer__header a { + &:active, + &:focus, + &:hover { + background: lighten($blue, 4%); + } +} + +.drawer__inner__mastodon { + background: $pink url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; +} + +// Change the colors used in compose-form +.compose-form { + .compose-form__modifiers { + .compose-form__upload__actions .icon-button { + color: lighten($white, 7%); + + &:active, + &:focus, + &:hover { + color: $white; + } + } + + .compose-form__upload-description input { + color: lighten($white, 7%); + + &::placeholder { + color: lighten($white, 7%); + } + } + } + + .compose-form__buttons-wrapper { + background: darken($ui-base-color, 6%); + } + + .autosuggest-textarea__suggestions { + background: darken($ui-base-color, 6%); + } + + .autosuggest-textarea__suggestions__item { + &:hover, + &:focus, + &:active, + &.selected { + background: lighten($ui-base-color, 4%); + } + } +} + +.account__header__tabs__buttons .icon-button { + border-color: lighten($purple, 8%); +} + +.emoji-mart-bar { + border-color: lighten($ui-base-color, 4%); + + &:first-child { + background: darken($ui-base-color, 6%); + } +} + +.emoji-mart-search input { + background: rgba($ui-base-color, 0.3); + border-color: $ui-base-color; +} + +// Change the background colors of statuses +.focusable:focus { + background: darken($green, 2%); +} + +.status.status-direct { + background: darken($ui-base-color, 2%); +} + +.focusable:focus .status.status-direct { + background: $ui-base-color; +} + +.status.status-direct:not(.read) { + background: $ui-base-color; + border-bottom-color: lighten($ui-base-color, 4%); +} + +.detailed-status, +.detailed-status__action-bar { + background: darken($purple, 10%); +} + +.reply-indicator { + background: darken($purple, 8%); +} + +// Change the background colors of status__content__spoiler-link +.reply-indicator__content .status__content__spoiler-link, +.status__content .status__content__spoiler-link { + background: $pink; + + &:hover { + background: lighten($pink, 4%); + } +} + +// Change the background colors of media and video spoilers +.media-spoiler, +.video-player__spoiler { + background: $ui-base-color; +} + +.privacy-dropdown.active .privacy-dropdown__value.active .icon-button { + color: $white; +} + +.account-gallery__item a { + background-color: $ui-base-color; +} + +// Change the colors used in the dropdown menu +.dropdown-menu { + background: $white; + + &__arrow { + &.left { + border-left-color: $white; + } + + &.top { + border-top-color: $white; + } + + &.bottom { + border-bottom-color: $white; + } + + &.right { + border-right-color: $white; + } + } + + &__item { + a { + background: $white; + color: $darker-text-color; + } + } +} + +body.admin { + background: $cream; +} + +.card>a:hover { + .card__bar { + background: $blue; + } +} + +.batch-table__toolbar { + background: $green; +} + +.batch-table__row { + border-top: 0; + border: 1px solid #fffdef; + background: $blue; +} + +.batch-table__row:nth-child(2n) { + background: $green; +} + +.filters .filter-subset a { + border-bottom: 2px solid $green; +} + +.filters .filter-subset a:hover, +.filters .filter-subset a:focus { + border-bottom: 2px solid lighten($green, 8%); +} + +.filters .filter-subset a.selected:hover, +.filters .filter-subset a.selected:focus { + border-bottom: 2px solid lighten($blueberry, 8%); +} + +.table>tbody>tr:nth-child(odd)>td, .table>tbody>tr:nth-child(odd)>th { + background: $green; +} + +.table td, .table th { + padding: 8px; + line-height: 18px; + vertical-align: top; + border-top: 1px solid $green; + text-align: left; + background: $blue; +} + +.card__bar { + background: $purple; +} + +.admin-wrapper .sidebar { + background: $green; +} + +.admin-wrapper .content h2, .admin-wrapper .content h4 { + border-bottom: 1px solid #eeeeee; +} + +.admin-wrapper .sidebar ul a.selected { + background: $purple; +} + +.admin-wrapper .sidebar ul a:hover { + background: lighten($blue, 8%); +} + +.selected ul li a { + background: $blue; +} + +.admin-wrapper .sidebar ul .simple-navigation-active-leaf a { + background: $blueberry; +} + +.dashboard__counters > div > div, +.dashboard__counters > div > a { + background: $pink; +} + +.dashboard__counters > div > a:hover, +.dashboard__counters > div > a:focus { + background: lighten($pink, 4%); +} + +// Change the text colors on inverted background +.privacy-dropdown__option.active, +.privacy-dropdown__option:hover, +.privacy-dropdown__option.active .privacy-dropdown__option__content, +.privacy-dropdown__option.active .privacy-dropdown__option__content strong, +.privacy-dropdown__option:hover .privacy-dropdown__option__content, +.privacy-dropdown__option:hover .privacy-dropdown__option__content strong, +.dropdown-menu__item a:active, +.dropdown-menu__item a:focus, +.dropdown-menu__item a:hover, +.actions-modal ul li:not(:empty) a.active, +.actions-modal ul li:not(:empty) a.active button, +.actions-modal ul li:not(:empty) a:active, +.actions-modal ul li:not(:empty) a:active button, +.actions-modal ul li:not(:empty) a:focus, +.actions-modal ul li:not(:empty) a:focus button, +.actions-modal ul li:not(:empty) a:hover, +.actions-modal ul li:not(:empty) a:hover button, +.admin-wrapper .sidebar ul .simple-navigation-active-leaf a, +.simple_form .block-button, +.simple_form .button, +.simple_form button { + color: $white; +} + +.dropdown-menu__separator { + border-bottom-color: lighten($ui-base-color, 4%); +} + +// Change the background colors of modals +.actions-modal, +.boost-modal, +.confirmation-modal, +.mute-modal, +.report-modal, +.embed-modal, +.error-modal, +.onboarding-modal { + background: $ui-base-color; +} + +.column-header__collapsible-inner { + background: darken($blue, 4%); + border: 1px solid lighten($blue, 8%); + border-top: 0; +} + +.boost-modal__action-bar, +.confirmation-modal__action-bar, +.mute-modal__action-bar, +.onboarding-modal__paginator, +.error-modal__footer { + background: darken($ui-base-color, 6%); + + .onboarding-modal__nav, + .error-modal__nav { + &:hover, + &:focus, + &:active { + background-color: darken($ui-base-color, 12%); + } + } +} + +.display-case__case { + background: $white; +} + +.embed-modal .embed-modal__container .embed-modal__html { + background: $white; + + &:focus { + background: darken($ui-base-color, 6%); + } +} + +.react-toggle-track { + background: $ui-secondary-color; +} + +.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { + background: darken($ui-secondary-color, 10%); +} + +.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track { + background: lighten($ui-highlight-color, 10%); +} + +// Change the default color used for the text in an empty column or on the error column +.empty-column-indicator, +.error-column { + color: $primary-text-color; + background: $white; +} + +.tabs-bar { + background: $blue; + border: 1px solid lighten($blue, 8%); + border-bottom: 0; + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } + + &__link { + padding-bottom: 14px; + border-bottom-width: 1px; + border-bottom-color: lighten($blue, 8%); + + &:hover, + &:active, + &:focus { + background: lighten($blue,4%); + } + + &.active { + &:hover, + &:active, + &:focus { + background: transparent; + border-bottom-color: $ui-highlight-color; + } + } + } +} + +// Change the default colors used on some parts of the profile pages +.activity-stream-tabs { + background: $account-background-color; + border-bottom-color: lighten($ui-base-color, 8%); +} + +.getting-started__wrapper, .getting-started, .flex-spacer { + background: $purple; +} + +.box-widget, +.nothing-here, +.page-header, +.directory__tag > a, +.directory__tag > div, +.landing-page__call-to-action, +.contact-widget, +.landing .hero-widget__text, +.landing-page__information.contact-widget { + background: $white; + border: 1px solid lighten(#eeeeee, 4%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-left: 0; + border-right: 0; + border-top: 0; + } +} + +.directory__tag a:hover, .directory__tag a:focus { + background: $blue; + border: 1px solid lighten($blue, 4%); +} + +.page-header { + background: $purple; + border: 1px solid lighten($purple, 4%); +} + +.directory, .nothing-here, .directory__tag a { + background: $green; + border: 1px solid lighten($green, 4%); +} + +.box-widget { + background: $blue; + border: 1px solid lighten($blue, 4%); +} + +.landing__grid__column-login .box-widget { + background: $pink; + border: 1px solid lighten($pink, 4%); +} + +.landing .hero-widget__text { + border-top: 0; + border-bottom: 0; +} + +.simple_form { + input[type=text], + input[type=number], + input[type=email], + input[type=password], + select, + textarea { + border-color: $blueberry; + &:hover { + border-color: $bilberry; + } + } +} + +.landing .hero-widget__footer { + background: $purple; + border: 1px solid lighten($purple, 8%); + border-top: 0; + + @media screen and (max-width: $no-gap-breakpoint) { + border: 0; + } +} + +.brand__tagline { + color: $ui-secondary-color; +} + +.landing-page__call-to-action { + background: $purple; +} + +.landing-page__information.contact-widget { + background: $green; +} + +.directory__tag > a { + &:hover, + &:active, + &:focus { + background: $ui-base-color; + } + + @media screen and (max-width: $no-gap-breakpoint) { + border: 0; + } +} + +.directory__tag.active > a, +.directory__tag.active > div { + border-color: $ui-highlight-color; + + &, + h4, + h4 small, + .fa, + .trends__item__current { + color: $white; + } + + &:hover, + &:active, + &:focus { + background: $ui-highlight-color; + } +} + + +.batch-table { + &__toolbar, + &__row, + .nothing-here { + border-color: lighten($ui-base-color, 8%); + } +} + +.activity-stream { + border: 1px solid lighten($ui-base-color, 8%); + + &--under-tabs { + border-top: 0; + } + + .entry { + background: $account-background-color; + + .detailed-status.light, + .more.light, + .status.light { + border-bottom-color: lighten($ui-base-color, 8%); + } + } + + .status.light { + .status__content { + color: $primary-text-color; + } + + .display-name { + strong { + color: $primary-text-color; + } + } + } +} + +.accounts-grid { + .account-grid-card { + .controls { + .icon-button { + color: $darker-text-color; + } + } + + .name { + a { + color: $primary-text-color; + } + } + + .username { + color: $darker-text-color; + } + + .account__header__content { + color: $primary-text-color; + } + } +} + +.simple_form, +.table-form { + .warning { + box-shadow: none; + background: rgba($error-red, 0.5); + text-shadow: none; + } + + .recommended { + border-color: $ui-highlight-color; + color: $ui-highlight-color; + background-color: $blue; + } +} + +.compose-form .compose-form__warning { + border-color: $ui-highlight-color; + background-color: darken($blue, 6%); + + &, + a { + color: $ui-highlight-color; + } +} + +.status__content, +.reply-indicator__content { + a { + color: $highlight-text-color; + } +} + +.status.status-direct { + background: darken($green, 6%); +} + +.button.logo-button { + color: $white; + + svg { + fill: $white; + } +} + +.public-layout { + .activity-stream { + border-color: lighten(#eeeeee, 4%); + } + + .account__section-headline { + background: $green; + border: 1px solid lighten($green, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border-top: 0; + } + } + + .header, + .public-account-header, + .public-account-bio { + box-shadow: none; + } + + .hero-widget__text { + background: darken($blue, 4%); + border: 1px solid lighten($blue, 4%); + } + + .public-account-bio { + background: $blue; + border: 1px solid lighten($blue, 4%); + } + + .header { + background: $ui-base-color; + border: 1px solid lighten($ui-base-color, 8%); + + @media screen and (max-width: $no-gap-breakpoint) { + border: 0; + } + + .brand { + &:hover, + &:focus, + &:active { + background: darken($pink, 4%); + } + } + } + + .public-account-header { + &__image { + background: lighten($ui-base-color, 12%); + + &::after { + box-shadow: none; + } + } + + &__bar { + &::before { + background: $account-background-color; + border: 1px solid lighten($ui-base-color, 8%); + border-top: 0; + } + + .avatar img { + border-color: $account-background-color; + } + + @media screen and (max-width: $no-columns-breakpoint) { + background: $account-background-color; + border: 1px solid lighten($ui-base-color, 8%); + border-top: 0; + } + } + + &__tabs { + &__name { + h1, + h1 small { + color: $white; + + @media screen and (max-width: $no-columns-breakpoint) { + color: $primary-text-color; + } + } + } + } + + &__extra { + .public-account-bio { + border: 0; + } + + .public-account-bio .account__header__fields { + border-color: lighten($ui-base-color, 8%); + } + } + } +} + +.notification__filter-bar button.active::after, +.account__section-headline a.active::after { + border-color: transparent transparent $white; +} + +.hero-widget, +.box-widget, +.contact-widget, +.landing-page__information.contact-widget, +.moved-account-widget, +.memoriam-widget, +.activity-stream, +.nothing-here, +.directory__tag > a, +.directory__tag > div, +.card > a, +.page-header, +.compose-form .compose-form__warning { + box-shadow: none; +} + +body { + background: $cream; +} + +.public-layout .header, .public-layout .public-account-header__image { + background: $pink; + border: 1px solid lighten($pink, 8%); +} + +.public-layout .header .nav-button { + background: darken($pink, 4%); + + &:hover, &:focus { + background: darken($pink, 6%); + } +} + +.public-layout .public-account-header__bar .avatar img { + border: 4px solid $purple; +} + +.public-layout .public-account-header__bar:before { + background: $purple; +} + +.public-layout .public-account-header__tabs__tabs .counter { + border-right: 1px solid lighten($purple, 8%); +} + +.public-layout .public-account-header__tabs__tabs .counter::after { + border-bottom: 4px solid lighten($purple, 8%); +} + +.public-layout .public-account-header__image { + background: $pink; +} + +.notification__filter-bar button.active::before, .notification__filter-bar button.active::after, .notification__filter-bar a.active::before, .notification__filter-bar a.active::after, .account__section-headline button.active::before, .account__section-headline button.active::after, .account__section-headline a.active::before, .account__section-headline a.active::after { + border-color: transparent transparent $white; +} + +.public-layout .footer .grid .column-2 h4 a, +.public-layout .footer, +.public-layout .footer h4, +.public-layout .footer ul a { + color: $blueberry; +} + +.public-layout .footer .brand svg { + fill: $blueberry; +} + +.account__header__image { + background: $pink; +} + +.detailed-status__wrapper { + background: $purple; +} + +a.status-card.compact:hover { + background: $purple; + border: 1px solid lighten($purple, 4%); +} + +.column-inline-form { + background: $blue; + border: 1px solid lighten($blue, 4%); +} + +.account { + border-bottom: 1px solid #eeeeee; +} From 7ee0582c3472f27b800d5f30a6fef96a1462698f Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 20 Aug 2019 21:32:48 +0100 Subject: [PATCH 020/129] Additional theme tweaks for macaron Additional refinements and bugfixes: - fixed bug where notifications of DMs showed as the wrong colour - fixed colours of poll notifications - fixed colours of borders in profile - made loading indicator more pastel green --- app/javascript/styles/macaron/diff.scss | 1023 +---------------------- 1 file changed, 21 insertions(+), 1002 deletions(-) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index b20a6578f..b86c4c068 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -150,1014 +150,19 @@ html { } .poll__chart { - background: darken($purple, 4%) + background: darken($purple, 4%); +} + +.muted .poll__chart { + background: rgba($purple, 0.8); } .poll__chart.leading { background: $pink; } -.status { - border-bottom: 1px solid lighten(#eeeeee, 4%); -} - -.detailed-status__action-bar { - border-top: 1px solid lighten($purple, 4%); - border-bottom: 1px solid lighten($purple, 4%); -} - -.search__input { - @media screen and (max-width: $no-gap-breakpoint) { - border-top: 0; - border-bottom: 0; - } - - background: $green; - border: 1px solid lighten($green, 8%); -} - -.search__input { - &:focus{ - background: $purple; - border: 1px solid lighten($purple, 8%); - } -} - -.list-editor .search .search__input { - border-top: 0; - border-bottom: 0; -} - -.compose-form__poll-wrapper select { - background: $simple-background-color url("data:image/svg+xml;utf8,") no-repeat right 8px center / auto 16px; -} - -.compose-form__poll-wrapper, -.compose-form__poll-wrapper .poll__footer { - border-top-color: lighten($ui-base-color, 8%); -} - -.notification__filter-bar, .account__section-headline { - background: $green; - border: 1px solid lighten($green, 8%); - border-top: 0; -} - -.notification__filter-bar button { - background: $green; -} - -.compose-form .compose-form__buttons-wrapper { - background: $ui-base-color; - border: 1px solid lighten($ui-base-color, 8%); - border-top: 0; -} - -.drawer__inner { - background: $pink; - border: 1px solid lighten($pink, 8%); -} - -.drawer__header { - background: $blue; - border: 1px solid lighten($blue, 8%); -} - -.drawer__header a { - &:active, - &:focus, - &:hover { - background: lighten($blue, 4%); - } -} - -.drawer__inner__mastodon { - background: $pink url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; -} - -// Change the colors used in compose-form -.compose-form { - .compose-form__modifiers { - .compose-form__upload__actions .icon-button { - color: lighten($white, 7%); - - &:active, - &:focus, - &:hover { - color: $white; - } - } - - .compose-form__upload-description input { - color: lighten($white, 7%); - - &::placeholder { - color: lighten($white, 7%); - } - } - } - - .compose-form__buttons-wrapper { - background: darken($ui-base-color, 6%); - } - - .autosuggest-textarea__suggestions { - background: darken($ui-base-color, 6%); - } - - .autosuggest-textarea__suggestions__item { - &:hover, - &:focus, - &:active, - &.selected { - background: lighten($ui-base-color, 4%); - } - } -} - -.account__header__tabs__buttons .icon-button { - border-color: lighten($purple, 8%); -} - -.emoji-mart-bar { - border-color: lighten($ui-base-color, 4%); - - &:first-child { - background: darken($ui-base-color, 6%); - } -} - -.emoji-mart-search input { - background: rgba($ui-base-color, 0.3); - border-color: $ui-base-color; -} - -// Change the background colors of statuses -.focusable:focus { - background: darken($green, 2%); -} - -.status.status-direct { - background: darken($ui-base-color, 2%); -} - -.focusable:focus .status.status-direct { - background: $ui-base-color; -} - -.status.status-direct:not(.read) { - background: $ui-base-color; - border-bottom-color: lighten($ui-base-color, 4%); -} - -.detailed-status, -.detailed-status__action-bar { - background: darken($purple, 10%); -} - -.reply-indicator { - background: darken($purple, 8%); -} - -// Change the background colors of status__content__spoiler-link -.reply-indicator__content .status__content__spoiler-link, -.status__content .status__content__spoiler-link { - background: $pink; - - &:hover { - background: lighten($pink, 4%); - } -} - -// Change the background colors of media and video spoilers -.media-spoiler, -.video-player__spoiler { - background: $ui-base-color; -} - -.privacy-dropdown.active .privacy-dropdown__value.active .icon-button { - color: $white; -} - -.account-gallery__item a { - background-color: $ui-base-color; -} - -// Change the colors used in the dropdown menu -.dropdown-menu { - background: $white; - - &__arrow { - &.left { - border-left-color: $white; - } - - &.top { - border-top-color: $white; - } - - &.bottom { - border-bottom-color: $white; - } - - &.right { - border-right-color: $white; - } - } - - &__item { - a { - background: $white; - color: $darker-text-color; - } - } -} - -body.admin { - background: $cream; -} - -.card>a:hover { - .card__bar { - background: $blue; - } -} - -.batch-table__toolbar { - background: $green; -} - -.batch-table__row { - border-top: 0; - border: 1px solid #fffdef; - background: $blue; -} - -.batch-table__row:nth-child(2n) { - background: $green; -} - -.filters .filter-subset a { - border-bottom: 2px solid $green; -} - -.filters .filter-subset a:hover, -.filters .filter-subset a:focus { - border-bottom: 2px solid lighten($green, 8%); -} - -.filters .filter-subset a.selected:hover, -.filters .filter-subset a.selected:focus { - border-bottom: 2px solid lighten($blueberry, 8%); -} - -.table>tbody>tr:nth-child(odd)>td, .table>tbody>tr:nth-child(odd)>th { - background: $green; -} - -.table td, .table th { - padding: 8px; - line-height: 18px; - vertical-align: top; - border-top: 1px solid $green; - text-align: left; - background: $blue; -} - -.card__bar { - background: $purple; -} - -.admin-wrapper .sidebar { - background: $green; -} - -.admin-wrapper .content h2, .admin-wrapper .content h4 { - border-bottom: 1px solid #eeeeee; -} - -.admin-wrapper .sidebar ul a.selected { - background: $purple; -} - -.admin-wrapper .sidebar ul a:hover { - background: lighten($blue, 8%); -} - -.selected ul li a { - background: $blue; -} - -.admin-wrapper .sidebar ul .simple-navigation-active-leaf a { - background: $blueberry; -} - -.dashboard__counters > div > div, -.dashboard__counters > div > a { - background: $pink; -} - -.dashboard__counters > div > a:hover, -.dashboard__counters > div > a:focus { - background: lighten($pink, 4%); -} - -// Change the text colors on inverted background -.privacy-dropdown__option.active, -.privacy-dropdown__option:hover, -.privacy-dropdown__option.active .privacy-dropdown__option__content, -.privacy-dropdown__option.active .privacy-dropdown__option__content strong, -.privacy-dropdown__option:hover .privacy-dropdown__option__content, -.privacy-dropdown__option:hover .privacy-dropdown__option__content strong, -.dropdown-menu__item a:active, -.dropdown-menu__item a:focus, -.dropdown-menu__item a:hover, -.actions-modal ul li:not(:empty) a.active, -.actions-modal ul li:not(:empty) a.active button, -.actions-modal ul li:not(:empty) a:active, -.actions-modal ul li:not(:empty) a:active button, -.actions-modal ul li:not(:empty) a:focus, -.actions-modal ul li:not(:empty) a:focus button, -.actions-modal ul li:not(:empty) a:hover, -.actions-modal ul li:not(:empty) a:hover button, -.admin-wrapper .sidebar ul .simple-navigation-active-leaf a, -.simple_form .block-button, -.simple_form .button, -.simple_form button { - color: $white; -} - -.dropdown-menu__separator { - border-bottom-color: lighten($ui-base-color, 4%); -} - -// Change the background colors of modals -.actions-modal, -.boost-modal, -.confirmation-modal, -.mute-modal, -.report-modal, -.embed-modal, -.error-modal, -.onboarding-modal { - background: $ui-base-color; -} - -.column-header__collapsible-inner { - background: darken($blue, 4%); - border: 1px solid lighten($blue, 8%); - border-top: 0; -} - -.boost-modal__action-bar, -.confirmation-modal__action-bar, -.mute-modal__action-bar, -.onboarding-modal__paginator, -.error-modal__footer { - background: darken($ui-base-color, 6%); - - .onboarding-modal__nav, - .error-modal__nav { - &:hover, - &:focus, - &:active { - background-color: darken($ui-base-color, 12%); - } - } -} - -.display-case__case { - background: $white; -} - -.embed-modal .embed-modal__container .embed-modal__html { - background: $white; - - &:focus { - background: darken($ui-base-color, 6%); - } -} - -.react-toggle-track { - background: $ui-secondary-color; -} - -.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { - background: darken($ui-secondary-color, 10%); -} - -.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track { - background: lighten($ui-highlight-color, 10%); -} - -// Change the default color used for the text in an empty column or on the error column -.empty-column-indicator, -.error-column { - color: $primary-text-color; - background: $white; -} - -.tabs-bar { - background: $blue; - border: 1px solid lighten($blue, 8%); - border-bottom: 0; - - @media screen and (max-width: $no-gap-breakpoint) { - border-top: 0; - } - - &__link { - padding-bottom: 14px; - border-bottom-width: 1px; - border-bottom-color: lighten($blue, 8%); - - &:hover, - &:active, - &:focus { - background: lighten($blue,4%); - } - - &.active { - &:hover, - &:active, - &:focus { - background: transparent; - border-bottom-color: $ui-highlight-color; - } - } - } -} - -// Change the default colors used on some parts of the profile pages -.activity-stream-tabs { - background: $account-background-color; - border-bottom-color: lighten($ui-base-color, 8%); -} - -.getting-started__wrapper, .getting-started, .flex-spacer { - background: $purple; -} - -.box-widget, -.nothing-here, -.page-header, -.directory__tag > a, -.directory__tag > div, -.landing-page__call-to-action, -.contact-widget, -.landing .hero-widget__text, -.landing-page__information.contact-widget { - background: $white; - border: 1px solid lighten(#eeeeee, 4%); - - @media screen and (max-width: $no-gap-breakpoint) { - border-left: 0; - border-right: 0; - border-top: 0; - } -} - -.directory__tag a:hover, .directory__tag a:focus { - background: $blue; - border: 1px solid lighten($blue, 4%); -} - -.page-header { - background: $purple; - border: 1px solid lighten($purple, 4%); -} - -.directory, .nothing-here, .directory__tag a { - background: $green; - border: 1px solid lighten($green, 4%); -} - -.box-widget { - background: $blue; - border: 1px solid lighten($blue, 4%); -} - -.landing__grid__column-login .box-widget { - background: $pink; - border: 1px solid lighten($pink, 4%); -} - -.landing .hero-widget__text { - border-top: 0; - border-bottom: 0; -} - -.simple_form { - input[type=text], - input[type=number], - input[type=email], - input[type=password], - select, - textarea { - border-color: $blueberry; - &:hover { - border-color: $bilberry; - } - } -} - -.landing .hero-widget__footer { - background: $purple; - border: 1px solid lighten($purple, 8%); - border-top: 0; - - @media screen and (max-width: $no-gap-breakpoint) { - border: 0; - } -} - -.brand__tagline { - color: $ui-secondary-color; -} - -.landing-page__call-to-action { - background: $purple; -} - -.landing-page__information.contact-widget { - background: $green; -} - -.directory__tag > a { - &:hover, - &:active, - &:focus { - background: $ui-base-color; - } - - @media screen and (max-width: $no-gap-breakpoint) { - border: 0; - } -} - -.directory__tag.active > a, -.directory__tag.active > div { - border-color: $ui-highlight-color; - - &, - h4, - h4 small, - .fa, - .trends__item__current { - color: $white; - } - - &:hover, - &:active, - &:focus { - background: $ui-highlight-color; - } -} - - -.batch-table { - &__toolbar, - &__row, - .nothing-here { - border-color: lighten($ui-base-color, 8%); - } -} - -.activity-stream { - border: 1px solid lighten($ui-base-color, 8%); - - &--under-tabs { - border-top: 0; - } - - .entry { - background: $account-background-color; - - .detailed-status.light, - .more.light, - .status.light { - border-bottom-color: lighten($ui-base-color, 8%); - } - } - - .status.light { - .status__content { - color: $primary-text-color; - } - - .display-name { - strong { - color: $primary-text-color; - } - } - } -} - -.accounts-grid { - .account-grid-card { - .controls { - .icon-button { - color: $darker-text-color; - } - } - - .name { - a { - color: $primary-text-color; - } - } - - .username { - color: $darker-text-color; - } - - .account__header__content { - color: $primary-text-color; - } - } -} - -.simple_form, -.table-form { - .warning { - box-shadow: none; - background: rgba($error-red, 0.5); - text-shadow: none; - } - - .recommended { - border-color: $ui-highlight-color; - color: $ui-highlight-color; - background-color: $blue; - } -} - -.compose-form .compose-form__warning { - border-color: $ui-highlight-color; - background-color: darken($blue, 6%); - - &, - a { - color: $ui-highlight-color; - } -} - -.status__content, -.reply-indicator__content { - a { - color: $highlight-text-color; - } -} - -.status.status-direct { - background: darken($green, 6%); -} - -.button.logo-button { - color: $white; - - svg { - fill: $white; - } -} - -.public-layout { - .activity-stream { - border-color: lighten(#eeeeee, 4%); - } - - .account__section-headline { - background: $green; - border: 1px solid lighten($green, 8%); - - @media screen and (max-width: $no-gap-breakpoint) { - border-top: 0; - } - } - - .header, - .public-account-header, - .public-account-bio { - box-shadow: none; - } - - .hero-widget__text { - background: darken($blue, 4%); - border: 1px solid lighten($blue, 4%); - } - - .public-account-bio { - background: $blue; - border: 1px solid lighten($blue, 4%); - } - - .header { - background: $ui-base-color; - border: 1px solid lighten($ui-base-color, 8%); - - @media screen and (max-width: $no-gap-breakpoint) { - border: 0; - } - - .brand { - &:hover, - &:focus, - &:active { - background: darken($pink, 4%); - } - } - } - - .public-account-header { - &__image { - background: lighten($ui-base-color, 12%); - - &::after { - box-shadow: none; - } - } - - &__bar { - &::before { - background: $account-background-color; - border: 1px solid lighten($ui-base-color, 8%); - border-top: 0; - } - - .avatar img { - border-color: $account-background-color; - } - - @media screen and (max-width: $no-columns-breakpoint) { - background: $account-background-color; - border: 1px solid lighten($ui-base-color, 8%); - border-top: 0; - } - } - - &__tabs { - &__name { - h1, - h1 small { - color: $white; - - @media screen and (max-width: $no-columns-breakpoint) { - color: $primary-text-color; - } - } - } - } - - &__extra { - .public-account-bio { - border: 0; - } - - .public-account-bio .account__header__fields { - border-color: lighten($ui-base-color, 8%); - } - } - } -} - -.notification__filter-bar button.active::after, -.account__section-headline a.active::after { - border-color: transparent transparent $white; -} - -.hero-widget, -.box-widget, -.contact-widget, -.landing-page__information.contact-widget, -.moved-account-widget, -.memoriam-widget, -.activity-stream, -.nothing-here, -.directory__tag > a, -.directory__tag > div, -.card > a, -.page-header, -.compose-form .compose-form__warning { - box-shadow: none; -} - -body { - background: $cream; -} - -.public-layout .header, .public-layout .public-account-header__image { - background: $pink; - border: 1px solid lighten($pink, 8%); -} - -.public-layout .header .nav-button { - background: darken($pink, 4%); - - &:hover, &:focus { - background: darken($pink, 6%); - } -} - -.public-layout .public-account-header__bar .avatar img { - border: 4px solid $purple; -} - -.public-layout .public-account-header__bar:before { - background: $purple; -} - -.public-layout .public-account-header__tabs__tabs .counter { - border-right: 1px solid lighten($purple, 8%); -} - -.public-layout .public-account-header__tabs__tabs .counter::after { - border-bottom: 4px solid lighten($purple, 8%); -} - -.public-layout .public-account-header__image { - background: $pink; -} - -.notification__filter-bar button.active::before, .notification__filter-bar button.active::after, .notification__filter-bar a.active::before, .notification__filter-bar a.active::after, .account__section-headline button.active::before, .account__section-headline button.active::after, .account__section-headline a.active::before, .account__section-headline a.active::after { - border-color: transparent transparent $white; -} - -.public-layout .footer .grid .column-2 h4 a, -.public-layout .footer, -.public-layout .footer h4, -.public-layout .footer ul a { - color: $blueberry; -} - -.public-layout .footer .brand svg { - fill: $blueberry; -} - -.account__header__image { - background: $pink; -} - -.detailed-status__wrapper { - background: $purple; -} - -// Notes! -// Sass color functions, "darken" and "lighten" are automatically replaced. - -html { - scrollbar-color: $pink rgba($pink, 0.25); -} - -.loading-bar - { - background-color: $green; - } - -.status__content a, .reply-indicator__content a { - &:hover, &:active, &:focus { - color: $bilberry; - } -} - -::-webkit-scrollbar-thumb { - background: $pink; - border: 0; -} - -::-webkit-scrollbar-thumb { - background: $pink; - border: 0; -} - -::-webkit-scrollbar-thumb:hover { - background: $pink; - border: 0; -} - -::-webkit-scrollbar-track:hover { - background: $green; -} - -.ui { - background: $cream; -} - -// Change the colors of button texts -.button { - color: $white; - - &.button-alternative-2 { - color: $white; - } -} - -// Change default background colors of columns -.column > .scrollable, -.getting-started, -.column-inline-form { - background: $white; - border: 1px solid lighten(#eeeeee, 4%); - border-top: 0; -} - -.getting-started { - background: $green; - border: 1px solid lighten($green, 8%); -} - -.column-back-button, -.column-header { - background: #c8c4dd; - border: 1px solid lighten($purple, 8%); - - @media screen and (max-width: $no-gap-breakpoint) { - border-top: 0; - } - - &--slim-button { - border: 0; - top: -49px; - right: 1px; - } -} - - - -.column-header__back-button, -.column-header__button, -.column-header__button.active, -.account__header__bar { - background: $purple; -} - -.column-header__button.active { - color: $ui-highlight-color; - - &:hover, - &:active, - &:focus { - color: $ui-highlight-color; - background: lighten($purple, 4%); - } -} - -.account__header__bar .avatar .account__avatar { - border-color: $white; -} - -.getting-started__footer a { - color: $ui-secondary-color; - text-decoration: underline; -} - -.column-subheading { - background: $green; - border-bottom: 1px solid lighten($green, 8%); -} - -.getting-started, -.scrollable { - .column-link { - background: $blue; - border-bottom: 1px solid lighten($blue, 8%); - - &:hover, - &:active, - &:focus { - background: lighten($blue, 8%); - } - } -} - -.getting-started .navigation-bar { - border-top: 1px solid lighten($ui-base-color, 8%); - border-bottom: 1px solid lighten($ui-base-color, 8%); - - @media screen and (max-width: $no-gap-breakpoint) { - border-top: 0; - } -} - -.compose-form__autosuggest-wrapper, -.poll__text input[type="text"], -.compose-form .spoiler-input__input, -.compose-form__poll-wrapper select, -.search__input, -.setting-text, -.box-widget input[type="text"], -.box-widget input[type="email"], -.box-widget input[type="password"], -.box-widget textarea, -.statuses-grid .detailed-status { - border: 1px solid lighten(#eeeeee, 4%); -} - -.poll__chart { - background: darken($purple, 4%) -} - -.poll__chart.leading { - background: $pink; +.muted .poll__chart.leading { + background: rgba($pink, 0.8); } .status { @@ -2017,3 +1022,17 @@ a.status-card.compact:hover { .account { border-bottom: 1px solid #eeeeee; } + +.notification-favourite .status.status-direct:not(.read) { + background: transparent; + border-bottom: #eeeeee; +} + +.loading-indicator__figure { + border: 0 solid lighten($green, 12%); +} + +.account__header__bio .account__header__fields { + border-top: 1px solid lighten($purple, 8%); + border-bottom: 1px solid lighten($purple, 8%); +} From a38871cb943514c9fc42d48025a62b4d7f36fafb Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Wed, 21 Aug 2019 08:21:56 -0700 Subject: [PATCH 021/129] Updating README with new versioning scheme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f3383ca4..23df2517b 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ Part of why I don't want to stray far from mainline Mastodon is that this projec ## Versioning -Hometown follows Mastodon versioning, so Hometown v2.9.2 is up to date with Mastodon v2.9.2. +Hometown uses [semantic versioning](https://semver.org) and follows a versioning convention like `v1.0.0+2.9.3`. The 1.0.0 part is the actual Hometown version number, and then the 2.9.3 after the + sign is what's known in semantic versioning as "build metadata". It just means that a particular release is synchronized with Mastodon version 2.9.3, so for example an upgrade from `v1.0.0+2.9.2` to `v1.0.0+2.9.3` would upgrade _Mastodon_ but not provide any new Hometown features or fixes. ## License From 8d20caee4409d4b1d3aa21cb45b6cab8f26bd7f7 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Wed, 21 Aug 2019 08:28:20 -0700 Subject: [PATCH 022/129] Add contribution info to readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 23df2517b..12295d44f 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,10 @@ Part of why I don't want to stray far from mainline Mastodon is that this projec Hometown uses [semantic versioning](https://semver.org) and follows a versioning convention like `v1.0.0+2.9.3`. The 1.0.0 part is the actual Hometown version number, and then the 2.9.3 after the + sign is what's known in semantic versioning as "build metadata". It just means that a particular release is synchronized with Mastodon version 2.9.3, so for example an upgrade from `v1.0.0+2.9.2` to `v1.0.0+2.9.3` would upgrade _Mastodon_ but not provide any new Hometown features or fixes. +## Contributing to Hometown + +Setting up your Hometown development environment is [exactly like setting up your Mastodon development environment](https://docs.joinmastodon.org/development/overview/). Pull requests should be made to the `hometown-dev` branch, which is our default branch in Github. + ## License Copyright (C) 2016-2019 Eugen Rochko and other Mastodon contributors; see [AUTHORS.md](AUTHORS.md). From 63a7118ef12facd25d2bc1ec828868432b78967c Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 21 Aug 2019 21:14:51 +0100 Subject: [PATCH 023/129] Bugfix for notification border colours - Fix bug which showed certain notifications with the wrong bottom border colour --- app/javascript/styles/fairy-floss/diff.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/styles/fairy-floss/diff.scss b/app/javascript/styles/fairy-floss/diff.scss index 7463796e2..2eb4d4edf 100644 --- a/app/javascript/styles/fairy-floss/diff.scss +++ b/app/javascript/styles/fairy-floss/diff.scss @@ -513,3 +513,7 @@ a.mention, .notification__message .fa { .landing .hero-widget__footer { background: $purple3; } + +.status.status-direct:not(.read), .account { + border-bottom: 1px solid lighten($purple2, 8%); +} From 18f6b7e9949f2634398153ec2f62f735326b48f6 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Thu, 22 Aug 2019 21:16:44 +0100 Subject: [PATCH 024/129] Fix public account page header colours --- app/javascript/styles/macaron/diff.scss | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index b86c4c068..1e7f0422a 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -1036,3 +1036,13 @@ a.status-card.compact:hover { border-top: 1px solid lighten($purple, 8%); border-bottom: 1px solid lighten($purple, 8%); } + +@media screen and (max-width: 600px) { + .public-layout .public-account-header__bar { + background: $blue; + } + + .public-layout .public-account-header__extra .public-account-bio .account__header__fields { + border-color: lighten($blue, 8%); + } +} From 3da7ff7230a4de11f87724aa1d33d776f0616706 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Thu, 22 Aug 2019 21:49:43 +0100 Subject: [PATCH 025/129] fix colour of bottom border of favourite notifications --- app/javascript/styles/macaron/diff.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index 1e7f0422a..d513dbdee 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -1025,7 +1025,7 @@ a.status-card.compact:hover { .notification-favourite .status.status-direct:not(.read) { background: transparent; - border-bottom: #eeeeee; + border-bottom: 1px solid lighten(#eeeeee, 4%); } .loading-indicator__figure { From 1befe817c26fb6a923c8d85b5a4ffcb18521b240 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sat, 31 Aug 2019 16:50:29 -0700 Subject: [PATCH 026/129] Fixing stray merge cruft --- app/javascript/styles/macaron/diff.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index 60dd68cb8..d513dbdee 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -155,7 +155,6 @@ html { .muted .poll__chart { background: rgba($purple, 0.8); ->>>>>>> 3da7ff7230a4de11f87724aa1d33d776f0616706 } .poll__chart.leading { From 32b4537e32bcfe5deabd217b60dfe56623306544 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sat, 31 Aug 2019 17:10:41 -0700 Subject: [PATCH 027/129] Update README.md --- README.md | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/README.md b/README.md index 12295d44f..f07816d33 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,7 @@ Mastodon is a **free, open-source social network server** based on ActivityPub. __Hometown__ is a light weight fork of Mastodon. This fork is based on the principle of: minimum code change for maximum user experience change. -Hometown is launching with a few key differences from Mastodon. - -* Local only posting (aka posts that never federate) -* Accepting more content types "natively", like in-line reading of full articles (behind a cut for length) -* Some accessibility features set to default - -Those are the only changes! They are pretty minor in terms of the source code involved, but they drastically change the experience of being on Mastodon. I'll explain each of these in more detail now. - -Some changes are to come in the future: - -* Better list management +Please [check out our wiki](https://github.com/hometown-fork/hometown/wiki) for a list of Hometown-exclusive features. Some but not all of these are covered in this document. ## Support this project From 9b22e2c3fa6da2da65420de0bb63262496cdbd1f Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Fri, 6 Sep 2019 19:10:32 +0100 Subject: [PATCH 028/129] correct border colour of account header fields from green to purple --- app/javascript/styles/macaron/diff.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index d513dbdee..59d61bbd6 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -1037,6 +1037,10 @@ a.status-card.compact:hover { border-bottom: 1px solid lighten($purple, 8%); } +.account__header__fields dl { + border-bottom: 1px solid lighten($purple, 8%); +} + @media screen and (max-width: 600px) { .public-layout .public-account-header__bar { background: $blue; From b6f84d7c669ee0f9abe752293c189701c7d64f69 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Sat, 7 Sep 2019 14:35:33 +0100 Subject: [PATCH 029/129] Fix inconsistent link underlining --- app/javascript/styles/mastodon/components.scss | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 7ec5b4260..a9fa6bd40 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -324,12 +324,6 @@ color: $lighter-text-color; font-weight: 500; text-decoration: underline; - - &:hover, - &:active, - &:focus { - text-decoration: none; - } } } @@ -801,13 +795,9 @@ } &.mention { - &:hover { - text-decoration: none; - span { text-decoration: underline; } - } } .fa { From 58805e7432b554a4ea990e396604917e0bb28974 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 10 Sep 2019 20:43:19 +0100 Subject: [PATCH 030/129] Correct local-only indicator spacing - fixes issue #8 --- app/javascript/styles/mastodon/components.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 7ec5b4260..8926a2bf8 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1107,6 +1107,7 @@ .status__action-bar-dropdown { height: 23.15px; width: 23.15px; + margin-right: 18px; } .detailed-status__action-bar-dropdown { From 4ba1695ae3be81f255b385ced3c77bdb9ac783c2 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Tue, 10 Sep 2019 14:07:46 -0700 Subject: [PATCH 031/129] Indicate version number in link footer. --- app/javascript/mastodon/features/ui/components/link_footer.js | 2 +- app/javascript/mastodon/locales/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/link_footer.js b/app/javascript/mastodon/features/ui/components/link_footer.js index ecb0a23a8..9f77c5781 100644 --- a/app/javascript/mastodon/features/ui/components/link_footer.js +++ b/app/javascript/mastodon/features/ui/components/link_footer.js @@ -25,7 +25,7 @@ const LinkFooter = ({ withHotkeys }) => ( values={{ github: {repository} (v{version}) }} /> hometown-fork/hometown }} />

diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 77ae2809a..c01f799c2 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -145,7 +145,7 @@ "getting_started.directory": "Profile directory", "getting_started.documentation": "Documentation", "getting_started.heading": "Getting started", - "getting_started.hometown_open_source_notice": "Hometown is also open source, at {hometown}.", + "getting_started.hometown_open_source_notice": "Hometown is also open source, at {hometown} (v1.0.2).", "getting_started.invite": "Invite people", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Security", From e5cd6d0cda77f6a6b71580ba86c11c04124acdbd Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Thu, 12 Sep 2019 18:16:59 +0100 Subject: [PATCH 032/129] Corrects syntax for spoiler tags to valid HTML (fixes #10) --- app/javascript/mastodon/components/status_content.js | 2 +- app/javascript/styles/mastodon/components.scss | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/status_content.js b/app/javascript/mastodon/components/status_content.js index 3ac03b728..ec517508d 100644 --- a/app/javascript/mastodon/components/status_content.js +++ b/app/javascript/mastodon/components/status_content.js @@ -223,7 +223,7 @@ export default class StatusContent extends React.PureComponent {
} + {status.get('activity_pub_type') === 'Article' ? '' : }

{mentionsPlaceholder} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 8926a2bf8..7aaa52d95 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -6027,3 +6027,14 @@ noscript { padding: 0.35rem; } } + +div.status__content, +div.status__content--with-action, +div.status__content--with-spoiler { + p { + span.show_more_button { + display: block; + margin: 0.25rem 0 0 0; + } + } +} From b43b748813b8d72d531ae11c147b9c3501324162 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Thu, 12 Sep 2019 23:05:30 +0100 Subject: [PATCH 033/129] 'Back to Mastodon' is now 'Back home', and posts are now toots in US English --- config/locales/en.yml | 48 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index cabc9100c..838a3174c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,7 +1,7 @@ --- en: about: - about_hashtag_html: These are public toots tagged with #%{hashtag}. You can interact with them if you have an account anywhere in the fediverse. + about_hashtag_html: These are public posts tagged with #%{hashtag}. You can interact with them if you have an account anywhere in the fediverse. about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. about_this: About active_count_after: active @@ -21,9 +21,9 @@ en:

A good place for rules

The extended description has not been set up yet.

federation_hint_html: With an account on %{instance} you'll be able to follow people on any Mastodon server and beyond. - generic_description: "%{domain} is one server in the network" + generic_description: "%{domain} is one server in the federated network" get_apps: Try a mobile app - hosted_on: Mastodon hosted on %{domain} + hosted_on: Hometown hosted on %{domain} learn_more: Learn more privacy_policy: Privacy policy see_whats_happening: See what's happening @@ -59,10 +59,10 @@ en: pin_errors: following: You must be already following the person you want to endorse posts: - one: Toot - other: Toots - posts_tab_heading: Toots - posts_with_replies: Toots and replies + one: Post + other: Posts + posts_tab_heading: Posts + posts_with_replies: Posts and replies reserved_username: The username is reserved roles: admin: Admin @@ -341,11 +341,11 @@ en: relays: add_new: Add new relay delete: Delete - description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. + description_html: A federation relay is an intermediary server that exchanges large volumes of public posts between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. disable: Disable disabled: Disabled enable: Enable - enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. + enable_hint: Once enabled, your server will subscribe to all public posts from this relay, and will begin sending this server's public posts to it. enabled: Enabled inbox_url: Relay URL pending: Waiting for relay's approval @@ -431,7 +431,7 @@ en: open: Anyone can sign up title: Registrations mode show_known_fediverse_at_about_page: - desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show local toots. + desc_html: When toggled, it will show posts from all the known fediverse on preview. Otherwise it will only show local posts. title: Show known fediverse on timeline preview show_staff_badge: desc_html: Show a staff badge on a user page @@ -609,7 +609,7 @@ en: archive_takeout: date: Date download: Download your archive - hint_html: You can request an archive of your toots and uploaded media. The exported data will be in the ActivityPub format, readable by any compliant software. You can request an archive every 7 days. + hint_html: You can request an archive of your posts and uploaded media. The exported data will be in the ActivityPub format, readable by any compliant software. You can request an archive every 7 days. in_progress: Compiling your archive... request: Request your archive size: Size @@ -669,7 +669,7 @@ en: i_am_html: I am %{username} on %{service}. identity: Identity inactive: Inactive - publicize_checkbox: 'And toot this:' + publicize_checkbox: 'And post this:' publicize_toot: 'It is proven! I am %{username} on %{service}: %{url}' status: Verification status view_proof: View proof @@ -812,20 +812,20 @@ en: remote_interaction: favourite: proceed: Proceed to favourite - prompt: 'You want to favourite this toot:' + prompt: 'You want to favourite this post:' reblog: proceed: Proceed to boost - prompt: 'You want to boost this toot:' + prompt: 'You want to boost this post:' reply: proceed: Proceed to reply - prompt: 'You want to reply to this toot:' + prompt: 'You want to reply to this post:' remote_unfollow: error: Error title: Title unfollowed: Unfollowed scheduled_statuses: - over_daily_limit: You have exceeded the limit of %{limit} scheduled toots for that day - over_total_limit: You have exceeded the limit of %{limit} scheduled toots + over_daily_limit: You have exceeded the limit of %{limit} scheduled posts for that day + over_total_limit: You have exceeded the limit of %{limit} scheduled posts too_soon: The scheduled date must be in the future sessions: activity: Last activity @@ -873,7 +873,7 @@ en: account_settings: Account settings appearance: Appearance authorized_apps: Authorized apps - back: Back to Mastodon + back: Back home delete: Account deletion development: Development edit_profile: Edit profile @@ -907,9 +907,9 @@ en: open_in_web: Open in web over_character_limit: character limit of %{max} exceeded pin_errors: - limit: You have already pinned the maximum number of toots - ownership: Someone else's toot cannot be pinned - private: Non-public toot cannot be pinned + limit: You have already pinned the maximum number of posts + ownership: Someone else's post cannot be pinned + private: Non-public post cannot be pinned reblog: A boost cannot be pinned poll: total_votes: @@ -927,7 +927,7 @@ en: unlisted: Unlisted unlisted_long: Everyone can see, but not listed on public timelines stream_entries: - pinned: Pinned toot + pinned: Pinned post reblogged: boosted sensitive_content: Sensitive content terms: @@ -1047,8 +1047,8 @@ en: warning: explanation: disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked. - silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you. - suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers. + silence: While your account is limited, only people who are already following you will see your posts on this server, and you may be excluded from various public listings. However, others may still manually follow you. + suspend: Your account has been suspended, and all of your posts and your uploaded media files have been irreversibly removed from this server, and servers where you had followers. review_server_policies: Review server policies subject: disable: Your account %{acct} has been frozen From 30db0c5ee29d857f5974c0b0696f181cf744610b Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Thu, 12 Sep 2019 23:08:06 +0100 Subject: [PATCH 034/129] 'Back to Mastodon' is now 'Back home', and posts are now toots in British English --- config/locales/en_GB.yml | 42 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml index 33ba16210..ec4c23c0f 100644 --- a/config/locales/en_GB.yml +++ b/config/locales/en_GB.yml @@ -1,7 +1,7 @@ --- en_GB: about: - about_hashtag_html: These are public toots tagged with #%{hashtag}. You can interact with them if you have an account anywhere in the fediverse. + about_hashtag_html: These are public posts tagged with #%{hashtag}. You can interact with them if you have an account anywhere in the fediverse. about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. about_this: About active_count_after: active @@ -59,10 +59,10 @@ en_GB: pin_errors: following: You must be already following the person you want to endorse posts: - one: Toot - other: Toots - posts_tab_heading: Toots - posts_with_replies: Toots and replies + one: Post + other: Posts + posts_tab_heading: Posts + posts_with_replies: Posts and replies reserved_username: The username is reserved roles: admin: Admin @@ -332,11 +332,11 @@ en_GB: relays: add_new: Add new relay delete: Delete - description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. + description_html: A federation relay is an intermediary server that exchanges large volumes of public posts between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. disable: Disable disabled: Disabled enable: Enable - enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. + enable_hint: Once enabled, your server will subscribe to all public posts from this relay, and will begin sending this server's public posts to it. enabled: Enabled inbox_url: Relay URL pending: Waiting for relay's approval @@ -422,7 +422,7 @@ en_GB: open: Anyone can sign up title: Registrations mode show_known_fediverse_at_about_page: - desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show local toots. + desc_html: When toggled, it will show posts from all the known fediverse on preview. Otherwise it will only show local posts. title: Show known fediverse on timeline preview show_staff_badge: desc_html: Show a staff badge on a user page @@ -589,7 +589,7 @@ en_GB: archive_takeout: date: Date download: Download your archive - hint_html: You can request an archive of your toots and uploaded media. The exported data will be in the ActivityPub format, readable by any compliant software. You can request an archive every 7 days. + hint_html: You can request an archive of your posts and uploaded media. The exported data will be in the ActivityPub format, readable by any compliant software. You can request an archive every 7 days. in_progress: Compiling your archive... request: Request your archive size: Size @@ -781,20 +781,20 @@ en_GB: remote_interaction: favourite: proceed: Proceed to favourite - prompt: 'You want to favourite this toot:' + prompt: 'You want to favourite this post:' reblog: proceed: Proceed to boost - prompt: 'You want to boost this toot:' + prompt: 'You want to boost this post:' reply: proceed: Proceed to reply - prompt: 'You want to reply to this toot:' + prompt: 'You want to reply to this post:' remote_unfollow: error: Error title: Title unfollowed: Unfollowed scheduled_statuses: - over_daily_limit: You have exceeded the limit of %{limit} scheduled toots for that day - over_total_limit: You have exceeded the limit of %{limit} scheduled toots + over_daily_limit: You have exceeded the limit of %{limit} scheduled posts for that day + over_total_limit: You have exceeded the limit of %{limit} scheduled posts too_soon: The scheduled date must be in the future sessions: activity: Last activity @@ -839,7 +839,7 @@ en_GB: title: Sessions settings: authorized_apps: Authorized apps - back: Back to Mastodon + back: Back home delete: Account deletion development: Development edit_profile: Edit profile @@ -870,9 +870,9 @@ en_GB: open_in_web: Open in web over_character_limit: character limit of %{max} exceeded pin_errors: - limit: You have already pinned the maximum number of toots - ownership: Someone else's toot cannot be pinned - private: Non-public toot cannot be pinned + limit: You have already pinned the maximum number of posts + ownership: Someone else's post cannot be pinned + private: Non-public post cannot be pinned reblog: A boost cannot be pinned poll: total_votes: @@ -890,7 +890,7 @@ en_GB: unlisted: Unlisted unlisted_long: Everyone can see, but not listed on public timelines stream_entries: - pinned: Pinned toot + pinned: Pinned post reblogged: boosted sensitive_content: Sensitive content terms: @@ -1008,8 +1008,8 @@ en_GB: warning: explanation: disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked. - silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you. - suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers. + silence: While your account is limited, only people who are already following you will see your posts on this server, and you may be excluded from various public listings. However, others may still manually follow you. + suspend: Your account has been suspended, and all of your posts and your uploaded media files have been irreversibly removed from this server, and servers where you had followers. review_server_policies: Review server policies subject: disable: Your account %{acct} has been frozen From 6ae391bbb3ebcea2b81ca1dee0d120d08a8b075d Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Thu, 12 Sep 2019 23:52:17 +0100 Subject: [PATCH 035/129] Making more toots into posts --- app/javascript/mastodon/locales/en.json | 44 ++++++++++++------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 77ae2809a..036534638 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -23,8 +23,8 @@ "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", - "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", + "account.posts": "Posts", + "account.posts_with_replies": "Posts and replies", "account.report": "Report @{name}", "account.requested": "Awaiting approval. Click to cancel follow request", "account.share": "Share @{name}'s profile", @@ -54,7 +54,7 @@ "column.lists": "Lists", "column.mutes": "Muted users", "column.notifications": "Notifications", - "column.pins": "Pinned toots", + "column.pins": "Pinned posts", "column.public": "Federated timeline", "column_back_button.label": "Back", "column_header.hide_settings": "Hide settings", @@ -65,9 +65,9 @@ "column_header.unpin": "Unpin", "column_subheading.settings": "Settings", "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This toot will only be sent to the mentioned users.", + "compose_form.direct_message_warning": "This post will only be sent to the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts 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's on your mind?", @@ -75,8 +75,8 @@ "compose_form.poll.duration": "Poll duration", "compose_form.poll.option_placeholder": "Choice {number}", "compose_form.poll.remove_option": "Remove this choice", - "compose_form.publish": "Toot", - "compose_form.publish_loud": "{publish}!", + "compose_form.publish": "Post", + "compose_form.publish_loud": "{publish}", "compose_form.sensitive.hide": "Mark media as sensitive", "compose_form.sensitive.marked": "Media is marked as sensitive", "compose_form.sensitive.unmarked": "Media is not marked as sensitive", @@ -117,14 +117,14 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", - "empty_column.account_timeline": "No toots here!", + "empty_column.account_timeline": "No posts here!", "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", "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.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.", "empty_column.follow_requests": "You don't have any follow requests yet. When you 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 search to get started and meet other users.", @@ -135,9 +135,9 @@ "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 servers to fill it up", "federation.change": "Adjust status federation", - "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.long": "Allow post to reach other instances", "federation.federated.short": "Federated", - "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.long": "Restrict this post only to my instance", "federation.local_only.short": "Local-only", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", @@ -174,11 +174,11 @@ "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", "introduction.interactions.action": "Finish tutorial!", "introduction.interactions.favourite.headline": "Favourite", - "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.favourite.text": "You can save a post for later, and let the author know that you liked it, by favouriting it.", "introduction.interactions.reblog.headline": "Boost", - "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reblog.text": "You can share other people's posts with your followers by boosting them.", "introduction.interactions.reply.headline": "Reply", - "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.interactions.reply.text": "You can reply to other people's and your own posts, which will chain them together in a conversation.", "introduction.welcome.action": "Let's go!", "introduction.welcome.headline": "First steps", "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", @@ -203,7 +203,7 @@ "keyboard_shortcuts.muted": "to open muted users list", "keyboard_shortcuts.my_profile": "to open your profile", "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.pinned": "to open pinned posts list", "keyboard_shortcuts.profile": "to open author's profile", "keyboard_shortcuts.reply": "to reply", "keyboard_shortcuts.requests": "to open follow requests list", @@ -211,7 +211,7 @@ "keyboard_shortcuts.start": "to open \"get started\" column", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", - "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.post": "to start a brand new post", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Close", @@ -235,7 +235,7 @@ "navigation_bar.apps": "Mobile apps", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", - "navigation_bar.compose": "Compose new toot", + "navigation_bar.compose": "Compose new post", "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", @@ -250,7 +250,7 @@ "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Pinned toots", + "navigation_bar.pins": "Pinned posts", "navigation_bar.preferences": "Preferences", "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federated timeline", @@ -319,7 +319,7 @@ "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", - "search_results.statuses": "Toots", + "search_results.statuses": "Posts", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "status.admin_account": "Open moderation interface for @{name}", "status.admin_status": "Open this status in the moderation interface", @@ -342,12 +342,12 @@ "status.mute_conversation": "Mute conversation", "status.open": "Expand this status", "status.pin": "Pin on profile", - "status.pinned": "Pinned toot", + "status.pinned": "Pinned post", "status.read_more": "Read more", "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", "status.reply": "Reply", "status.replyAll": "Reply to thread", From 0eeb168bbe5da974da9aeed9c328533d8169c7c0 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Fri, 13 Sep 2019 00:06:19 +0100 Subject: [PATCH 036/129] reworded 'the visually impaired' to 'visually impaired users' It's less clunky and dated language, and Darius said I could do it --- app/javascript/mastodon/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 036534638..32dab8ede 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -379,7 +379,7 @@ "upload_button.label": "Add media ({formats})", "upload_error.limit": "File upload limit exceeded.", "upload_error.poll": "File upload not allowed with polls.", - "upload_form.description": "Describe for the visually impaired", + "upload_form.description": "Describe for visually impaired users", "upload_form.focus": "Change preview", "upload_form.undo": "Delete", "upload_progress.label": "Uploading...", From 288709e4301c9d200a6d52c63161492ad028ec39 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Fri, 13 Sep 2019 00:53:29 +0100 Subject: [PATCH 037/129] change 'Mastodon' to site name on signup page --- app/views/about/show.html.haml | 2 +- config/locales/en.yml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index f24f4e195..de5463f4f 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -35,7 +35,7 @@ %h4 = fa_icon 'globe fw' = t('about.see_whats_happening') - %small= t('about.browse_public_posts') + %small= t('about.browse_public_posts', title: site_title) .directory__tag = link_to 'https://joinmastodon.org/apps', target: '_blank', rel: 'noopener' do diff --git a/config/locales/en.yml b/config/locales/en.yml index 838a3174c..5c322d4c5 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -11,7 +11,7 @@ en: apps: Mobile apps apps_platforms: Use Mastodon from iOS, Android and other platforms browse_directory: Browse a profile directory and filter by interests - browse_public_posts: Browse a live stream of public posts on Mastodon + browse_public_posts: Browse a live stream of public posts on %{title} contact: Contact contact_missing: Not set contact_unavailable: N/A @@ -20,7 +20,7 @@ en: extended_description_html: |

A good place for rules

The extended description has not been set up yet.

- federation_hint_html: With an account on %{instance} you'll be able to follow people on any Mastodon server and beyond. + federation_hint_html: With an account on %{instance} you'll be able to follow people on any Hometown or Mastodon server and beyond. generic_description: "%{domain} is one server in the federated network" get_apps: Try a mobile app hosted_on: Hometown hosted on %{domain} @@ -39,7 +39,7 @@ en: one: user other: users user_count_before: Home to - what_is_mastodon: What is Mastodon? + what_is_mastodon: What is Hometown/Mastodon? accounts: choices_html: "%{name}'s choices:" follow: Follow @@ -437,13 +437,13 @@ en: desc_html: Show a staff badge on a user page title: Show staff badge site_description: - desc_html: Introductory paragraph on the API. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <a> and <em>. + desc_html: Introductory paragraph on the API. Describe what makes this Hometown server special and anything else important. You can use HTML tags, in particular <a> and <em>. title: Server description site_description_extended: desc_html: A good place for your code of conduct, rules, guidelines and other things that set your server apart. You can use HTML tags title: Custom extended information site_short_description: - desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. + desc_html: Displayed in sidebar and meta tags. Describe what Hometown is and what makes this server special in a single paragraph. title: Short server description site_terms: desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags From d904046775e5dd7a3a4b5b1b404146cd30472fd4 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Fri, 13 Sep 2019 01:09:33 +0100 Subject: [PATCH 038/129] Swapping out Mastodon for site title in sessions, noscript and backup confirmation message --- app/views/auth/registrations/_sessions.html.haml | 2 +- app/views/home/index.html.haml | 2 +- app/views/user_mailer/backup_ready.html.haml | 2 +- config/locales/en.yml | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/auth/registrations/_sessions.html.haml b/app/views/auth/registrations/_sessions.html.haml index d7d96a1bb..80f9f722c 100644 --- a/app/views/auth/registrations/_sessions.html.haml +++ b/app/views/auth/registrations/_sessions.html.haml @@ -1,5 +1,5 @@ %h4= t 'sessions.title' -%p.muted-hint= t 'sessions.explanation' +%p.muted-hint= t('sessions.explanation', title: site_title) .table-wrapper %table.table.inline-table diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 4c7fac0b6..8e1d5f4c9 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -14,4 +14,4 @@ = image_pack_tag 'logo.svg', alt: 'Mastodon' %div - = t('errors.noscript_html', apps_path: 'https://joinmastodon.org/apps') + = t('errors.noscript_html', apps_path: 'https://joinmastodon.org/apps', title: site_title) diff --git a/app/views/user_mailer/backup_ready.html.haml b/app/views/user_mailer/backup_ready.html.haml index 85140b08b..6009d584d 100644 --- a/app/views/user_mailer/backup_ready.html.haml +++ b/app/views/user_mailer/backup_ready.html.haml @@ -36,7 +36,7 @@ %tbody %tr %td.column-cell.text-center - %p= t 'user_mailer.backup_ready.explanation' + %p= t('user_mailer.backup_ready.explanation', title: site_title) %table.email-table{ cellspacing: 0, cellpadding: 0 } %tbody diff --git a/config/locales/en.yml b/config/locales/en.yml index 5c322d4c5..22fd622e7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -601,7 +601,7 @@ en: '500': content: We're sorry, but something went wrong on our end. title: This page is not correct - noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. + noscript_html: To use the %{title} web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. existing_username_validator: not_found: could not find a local user with that username not_found_multiple: could not find %{usernames} @@ -850,7 +850,7 @@ en: weibo: Weibo current_session: Current session description: "%{browser} on %{platform}" - explanation: These are the web browsers currently logged in to your Mastodon account. + explanation: These are the web browsers currently logged in to your %{title} account. ip: IP platforms: adobe_air: Adobe Air @@ -1041,7 +1041,7 @@ en: wrong_code: The entered code was invalid! Are server time and device time correct? user_mailer: backup_ready: - explanation: You requested a full backup of your Mastodon account. It's now ready for download! + explanation: You requested a full backup of your %{title} account. It's now ready for download! subject: Your archive is ready for download title: Archive takeout warning: @@ -1070,7 +1070,7 @@ en: full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. review_preferences_action: Change preferences review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. - subject: Welcome to Mastodon + subject: Welcome to %{title} tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete. tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! From 639a883d9be736aa6e7c367ddec9e96810052fb4 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Fri, 13 Sep 2019 01:43:51 +0100 Subject: [PATCH 039/129] Changing some mentions of 'Mastodon' to either be specific to the instance or general to the fediverse --- app/views/settings/profiles/show.html.haml | 2 +- app/views/user_mailer/welcome.html.haml | 2 +- config/locales/en.yml | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml index f8a8fddd3..4f2a0dfa7 100644 --- a/app/views/settings/profiles/show.html.haml +++ b/app/views/settings/profiles/show.html.haml @@ -45,7 +45,7 @@ .fields-row__column.fields-group.fields-row__column-6 %h6= t('verification.verification') - %p.hint= t('verification.explanation_html') + %p.hint= t('verification.explanation_html', instance: site_hostname) .input-copy .input-copy__wrapper diff --git a/app/views/user_mailer/welcome.html.haml b/app/views/user_mailer/welcome.html.haml index 1f75ff48a..de1d8395b 100644 --- a/app/views/user_mailer/welcome.html.haml +++ b/app/views/user_mailer/welcome.html.haml @@ -135,7 +135,7 @@ %h5= t 'user_mailer.welcome.tips' %ul %li - %span= t 'user_mailer.welcome.tip_mobile_webapp' + %span= t 'user_mailer.welcome.tip_mobile_webapp', instance: @instance %li %span= t 'user_mailer.welcome.tip_following' %li diff --git a/config/locales/en.yml b/config/locales/en.yml index 22fd622e7..d02e07ceb 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1070,11 +1070,11 @@ en: full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. review_preferences_action: Change preferences review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. - subject: Welcome to %{title} - tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete. + subject: Welcome to Mastodon + tip_federated_timeline: The federated timeline is a firehose view of the wider network. But it only includes people your neighbours are subscribed to, so it's not complete. tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! - tip_mobile_webapp: If your mobile browser offers you to add Mastodon to your homescreen, you can receive push notifications. It acts like a native app in many ways! + tip_mobile_webapp: If your mobile browser offers you to add %{instance} to your homescreen, you can receive push notifications. It acts like a native app in many ways! tips: Tips title: Welcome aboard, %{name}! users: @@ -1085,5 +1085,5 @@ en: seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' verification: - explanation_html: 'You can verify yourself as the owner of the links in your profile metadata. For that, the linked website must contain a link back to your Mastodon profile. The link back must have a rel="me" attribute. The text content of the link does not matter. Here is an example:' + explanation_html: 'You can verify yourself as the owner of the links in your profile metadata. For that, the linked website must contain a link back to your %{instance} profile. The link back must have a rel="me" attribute. The text content of the link does not matter. Here is an example:' verification: Verification From 4b7548c7604eecefc1ff191f1c94e513f6b3ebfa Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Fri, 13 Sep 2019 01:54:58 +0100 Subject: [PATCH 040/129] rewording text to be more specific to platforms/hometown --- app/views/about/show.html.haml | 2 +- config/locales/en.yml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index de5463f4f..c9514c162 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -42,7 +42,7 @@ %h4 = fa_icon 'tablet fw' = t('about.get_apps') - %small= t('about.apps_platforms') + %small= t('about.apps_platforms', title: site_title) .landing__grid__column.landing__grid__column-login .box-widget diff --git a/config/locales/en.yml b/config/locales/en.yml index d02e07ceb..d4bf3fd82 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2,14 +2,14 @@ en: about: about_hashtag_html: These are public posts tagged with #%{hashtag}. You can interact with them if you have an account anywhere in the fediverse. - about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. + about_mastodon_html: Hometown is adapted from Mastodon, a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. about_this: About active_count_after: active active_footnote: Monthly Active Users (MAU) administered_by: 'Administered by:' api: API apps: Mobile apps - apps_platforms: Use Mastodon from iOS, Android and other platforms + apps_platforms: Use %{title} from iOS, Android and other platforms browse_directory: Browse a profile directory and filter by interests browse_public_posts: Browse a live stream of public posts on %{title} contact: Contact @@ -601,7 +601,7 @@ en: '500': content: We're sorry, but something went wrong on our end. title: This page is not correct - noscript_html: To use the %{title} web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. + noscript_html: To use the %{title} web application, please enable JavaScript. Alternatively, try one of the native apps for Hometown/Mastodon for your platform. existing_username_validator: not_found: could not find a local user with that username not_found_multiple: could not find %{usernames} @@ -938,7 +938,7 @@ en:
  • Basic account information: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.
  • Posts, following and other public information: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
  • -
  • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
  • +
  • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Hometown/Mastodon.
  • IPs and other metadata: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
@@ -949,7 +949,7 @@ en:

Any of the information we collect from you may be used in the following ways:

    -
  • To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.
  • +
  • To provide the core functionality of Hometown/Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.
  • To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations.
  • The email address you provide may be used to send you information, notifications about other people interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.
From 5406acd04beac3d70b862dc9db4961d243f9f922 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Fri, 13 Sep 2019 02:36:45 +0100 Subject: [PATCH 041/129] Welcome email now welcomes you to your instance title, not to mastodon --- app/mailers/user_mailer.rb | 2 +- config/locales/en.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 8f3a4ab3a..b494e62fb 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -63,7 +63,7 @@ class UserMailer < Devise::Mailer return if @resource.disabled? I18n.with_locale(@resource.locale || I18n.default_locale) do - mail to: @resource.email, subject: I18n.t('user_mailer.welcome.subject') + mail to: @resource.email, subject: I18n.t('user_mailer.welcome.subject', title: Setting.site_title) end end diff --git a/config/locales/en.yml b/config/locales/en.yml index d4bf3fd82..3892adb84 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1070,7 +1070,7 @@ en: full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. review_preferences_action: Change preferences review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. - subject: Welcome to Mastodon + subject: Welcome to %{title} tip_federated_timeline: The federated timeline is a firehose view of the wider network. But it only includes people your neighbours are subscribed to, so it's not complete. tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! From f10703ae073097c876595e8e7e710dc59691d25e Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Fri, 13 Sep 2019 22:37:40 +0100 Subject: [PATCH 042/129] Remove share intent button for local-only posts - closes #12 --- app/javascript/mastodon/components/status_action_bar.js | 2 +- .../mastodon/features/status/components/action_bar.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 27c2b4665..c21ba218c 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -245,7 +245,7 @@ class StatusActionBar extends ImmutablePureComponent { replyTitle = intl.formatMessage(messages.replyAll); } - const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && ( + const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && federated && ( ); diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js index 3e511b7a6..2783d215d 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.js +++ b/app/javascript/mastodon/features/status/components/action_bar.js @@ -16,6 +16,7 @@ const messages = defineMessages({ reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost to original audience' }, cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, + local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' }, favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }, mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' }, muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, @@ -138,6 +139,7 @@ class ActionBar extends React.PureComponent { const publicStatus = ['public', 'unlisted'].includes(status.get('visibility')); const mutingConversation = status.get('muted'); + const federated = !status.get('local_only'); let menu = []; @@ -175,7 +177,7 @@ class ActionBar extends React.PureComponent { } } - const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && ( + const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && federated && (
); From 7d7712e1ba41ecf6101cc015309ab8225b1d773c Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Fri, 13 Sep 2019 20:27:32 -0700 Subject: [PATCH 043/129] Fixing header CSS for rich text statuses Making the headers larger in font size, and differentiating the h1 and h2 headers. --- app/javascript/styles/mastodon/components.scss | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 2c0f0beb7..3088424fd 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -727,14 +727,14 @@ margin-bottom: 20px; } - h1, - h2 { + h1 { font-weight: 700; - font-size: 18px; + font-size: 22px; } h2 { - font-size: 16px; + font-weight: 700; + font-size: 20px; } h3, From e7d13cd08aa40148f483ccc086e32b08f5b49553 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 16 Sep 2019 21:02:08 +0100 Subject: [PATCH 044/129] All 'Mastodon' references in emails (except unlock_instructions) changed to instance title unlock_instructions doesn't seem to exist elsewhere in the project so I've left it as is. --- app/mailers/user_mailer.rb | 10 +++++----- .../reconfirmation_instructions.html.haml | 2 +- config/locales/devise.en.yml | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index b494e62fb..99f8de5ed 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -17,7 +17,7 @@ class UserMailer < Devise::Mailer I18n.with_locale(@resource.locale || I18n.default_locale) do mail to: @resource.unconfirmed_email.presence || @resource.email, - subject: I18n.t(@resource.pending_reconfirmation? ? 'devise.mailer.reconfirmation_instructions.subject' : 'devise.mailer.confirmation_instructions.subject', instance: @instance), + subject: I18n.t(@resource.pending_reconfirmation? ? 'devise.mailer.reconfirmation_instructions.subject' : 'devise.mailer.confirmation_instructions.subject', instance: @instance, title: Setting.site_title), template_name: @resource.pending_reconfirmation? ? 'reconfirmation_instructions' : 'confirmation_instructions' end end @@ -30,7 +30,7 @@ class UserMailer < Devise::Mailer return if @resource.disabled? I18n.with_locale(@resource.locale || I18n.default_locale) do - mail to: @resource.email, subject: I18n.t('devise.mailer.reset_password_instructions.subject') + mail to: @resource.email, subject: I18n.t('devise.mailer.reset_password_instructions.subject', title: Setting.site_title) end end @@ -41,7 +41,7 @@ class UserMailer < Devise::Mailer return if @resource.disabled? I18n.with_locale(@resource.locale || I18n.default_locale) do - mail to: @resource.email, subject: I18n.t('devise.mailer.password_change.subject') + mail to: @resource.email, subject: I18n.t('devise.mailer.password_change.subject', title: Setting.site_title) end end @@ -52,7 +52,7 @@ class UserMailer < Devise::Mailer return if @resource.disabled? I18n.with_locale(@resource.locale || I18n.default_locale) do - mail to: @resource.email, subject: I18n.t('devise.mailer.email_changed.subject') + mail to: @resource.email, subject: I18n.t('devise.mailer.email_changed.subject', title: Setting.site_title) end end @@ -75,7 +75,7 @@ class UserMailer < Devise::Mailer return if @resource.disabled? I18n.with_locale(@resource.locale || I18n.default_locale) do - mail to: @resource.email, subject: I18n.t('user_mailer.backup_ready.subject') + mail to: @resource.email, subject: I18n.t('user_mailer.backup_ready.subject', title: Setting.site_title) end end diff --git a/app/views/user_mailer/reconfirmation_instructions.html.haml b/app/views/user_mailer/reconfirmation_instructions.html.haml index 7f10ba94f..c02d44724 100644 --- a/app/views/user_mailer/reconfirmation_instructions.html.haml +++ b/app/views/user_mailer/reconfirmation_instructions.html.haml @@ -57,4 +57,4 @@ %tbody %tr %td.column-cell.text-center.padded - %p= t 'devise.mailer.reconfirmation_instructions.extra' + %p= t 'devise.mailer.reconfirmation_instructions.extra', title: site_title diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index 2930733c0..a5ca02c77 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -23,28 +23,28 @@ en: explanation: You have created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email. explanation_when_pending: You applied for an invite to %{host} with this email address. Once you confirm your e-mail address, we will review your application. You can't login until then. If your application is rejected, your data will be removed, so no further action will be required from you. If this wasn't you, please ignore this email. extra_html: Please also check out the rules of the server and our terms of service. - subject: 'Mastodon: Confirmation instructions for %{instance}' + subject: '%{title}: Confirmation instructions' title: Verify email address email_changed: explanation: 'The email address for your account is being changed to:' extra: If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the server admin if you're locked out of your account. - subject: 'Mastodon: Email changed' + subject: '%{title}: Email changed' title: New email address password_change: explanation: The password for your account has been changed. extra: If you did not change your password, it is likely that someone has gained access to your account. Please change your password immediately or contact the server admin if you're locked out of your account. - subject: 'Mastodon: Password changed' + subject: '%{title}: Password changed' title: Password changed reconfirmation_instructions: explanation: Confirm the new address to change your email. - extra: If this change wasn't initiated by you, please ignore this email. The email address for the Mastodon account won't change until you access the link above. - subject: 'Mastodon: Confirm email for %{instance}' + extra: If this change wasn't initiated by you, please ignore this email. The email address for the %{title} account won't change until you access the link above. + subject: '%{title}: Confirm email' title: Verify email address reset_password_instructions: action: Change password explanation: You requested a new password for your account. extra: If you didn't request this, please ignore this email. Your password won't change until you access the link above and create a new one. - subject: 'Mastodon: Reset password instructions' + subject: '%{title}: Reset password instructions' title: Password reset unlock_instructions: subject: 'Mastodon: Unlock instructions' From 3d4f3d783a4738989442d494f3e4018397742a75 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 16 Sep 2019 21:09:31 +0100 Subject: [PATCH 045/129] Update the mobile web app copy to be factually accurate about iOS, and also grammatically correct iOS still doesn't have web push notifications :( and the original wording makes it sound like it does :( :( --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 3892adb84..ba2154279 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1074,7 +1074,7 @@ en: tip_federated_timeline: The federated timeline is a firehose view of the wider network. But it only includes people your neighbours are subscribed to, so it's not complete. tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! - tip_mobile_webapp: If your mobile browser offers you to add %{instance} to your homescreen, you can receive push notifications. It acts like a native app in many ways! + tip_mobile_webapp: If your Android mobile browser prompts you to add %{instance} to your homescreen, you can receive push notifications from the web app. It acts like a native app in many ways! On iOS, you can still pin %{instance} to your homescreen, but you will not receive push notifications. tips: Tips title: Welcome aboard, %{name}! users: From e83b30c39ddb792bed6259a7ab4380600ec21367 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 16 Sep 2019 21:13:35 +0100 Subject: [PATCH 046/129] De-tooting/removing mention of Mastodon --- .../mastodon/features/compose/components/search_results.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/search_results.js b/app/javascript/mastodon/features/compose/components/search_results.js index 2f338dd24..90f5848d7 100644 --- a/app/javascript/mastodon/features/compose/components/search_results.js +++ b/app/javascript/mastodon/features/compose/components/search_results.js @@ -73,7 +73,7 @@ class SearchResults extends ImmutablePureComponent { count += results.get('statuses').size; statuses = (
-
+
{results.get('statuses').map(statusId => )}
@@ -81,10 +81,10 @@ class SearchResults extends ImmutablePureComponent { } else if(results.get('statuses') && results.get('statuses').size === 0 && !searchEnabled && !(searchTerm.startsWith('@') || searchTerm.startsWith('#') || searchTerm.includes(' '))) { statuses = (
-
+
- +
); From 0eabec41a06cdf8b6da7f2617fc079bb4975f925 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 16 Sep 2019 21:47:23 +0100 Subject: [PATCH 047/129] Remove Mastodon from draft warning text --- app/javascript/mastodon/features/ui/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index 791133afd..17d0c1d69 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -55,7 +55,7 @@ import { previewState as previewVideoState } from './components/video_modal'; import '../../components/status'; const messages = defineMessages({ - beforeUnload: { id: 'ui.beforeunload', defaultMessage: 'Your draft will be lost if you leave Mastodon.' }, + beforeUnload: { id: 'ui.beforeunload', defaultMessage: 'Your draft will be lost if you leave.' }, }); const mapStateToProps = state => ({ From ee4011b66f4c125c8bf6060c033b54f463936d0d Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 16 Sep 2019 21:47:42 +0100 Subject: [PATCH 048/129] Change Mastodon to Hometown in admin dashboard --- app/views/admin/dashboard/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index d448e3862..a26b4ce85 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -57,7 +57,7 @@ %h4= t 'admin.dashboard.software' %ul %li - Mastodon + Hometown %span.pull-right= @version %li Ruby From 5676f2fd43c6ea371d8f683728a18fb378f0d6a1 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 16 Sep 2019 21:49:49 +0100 Subject: [PATCH 049/129] Remove svg logo from buttons --- app/helpers/stream_entries_helper.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/helpers/stream_entries_helper.rb b/app/helpers/stream_entries_helper.rb index 02a860a74..7f76ccb4f 100644 --- a/app/helpers/stream_entries_helper.rb +++ b/app/helpers/stream_entries_helper.rb @@ -16,20 +16,20 @@ module StreamEntriesHelper 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')]) + safe_join([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')]) + safe_join([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')]) + safe_join([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')]) + safe_join([t('accounts.follow')]) end end end From 292bd538486362ca02bf41c2732212ab84c28060 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 16 Sep 2019 22:04:02 +0100 Subject: [PATCH 050/129] Change alt text for logo in noscript view and admin view to name of instance --- app/views/home/index.html.haml | 2 +- app/views/layouts/admin.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 8e1d5f4c9..2a4a31423 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -11,7 +11,7 @@ .app-holder#mastodon{ data: { props: Oj.dump(default_props) } } %noscript - = image_pack_tag 'logo.svg', alt: 'Mastodon' + = image_pack_tag 'logo.svg', alt: site_title %div = t('errors.noscript_html', apps_path: 'https://joinmastodon.org/apps', title: site_title) diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 083f2fac7..65a8913aa 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -6,7 +6,7 @@ .sidebar-wrapper .sidebar = link_to root_path do - = image_pack_tag 'logo.svg', class: 'logo', alt: 'Mastodon' + = image_pack_tag 'logo.svg', class: 'logo', alt: site_title = render_navigation .content-wrapper From 2a3459dfac6cf98297b80d2d0de3593a41797f26 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 16 Sep 2019 22:06:41 +0100 Subject: [PATCH 051/129] Change mailer logo alt text to instance name --- app/views/layouts/mailer.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml index 343bcb265..db5935cf7 100644 --- a/app/views/layouts/mailer.html.haml +++ b/app/views/layouts/mailer.html.haml @@ -24,7 +24,7 @@ %tr %td.column-cell = link_to root_url do - = image_tag full_pack_url('media/images/mailer/logo_full.png'), alt: 'Mastodon', height: 34, class: 'logo' + = image_tag full_pack_url('media/images/mailer/logo_full.png'), alt: site_title, height: 34, class: 'logo' = yield @@ -49,4 +49,4 @@ %p= link_to t('application_mailer.notification_preferences'), settings_preferences_notifications_url %td.column-cell.text-right = link_to root_url do - = image_tag full_pack_url('media/images/mailer/logo_transparent.png'), alt: 'Mastodon', height: 24 + = image_tag full_pack_url('media/images/mailer/logo_transparent.png'), alt: site_title, height: 24 From f1760c1aeec80e224878cfaf47c7e25e20e1ae42 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Mon, 16 Sep 2019 22:23:53 +0100 Subject: [PATCH 052/129] Changed hostname on signup page to site title --- app/views/about/_registration.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml index ff32ec8c4..9d27f9b7e 100644 --- a/app/views/about/_registration.html.haml +++ b/app/views/about/_registration.html.haml @@ -1,6 +1,6 @@ = simple_form_for(new_user, url: user_registration_path) do |f| .simple_form__overlay-area - %p.lead= t('about.federation_hint_html', instance: content_tag(:strong, site_hostname)) + %p.lead= t('about.federation_hint_html', instance: content_tag(:strong, site_title)) .fields-group = f.simple_fields_for :account do |account_fields| From f0b1c82d22681a886bab87f15aa49ab732abbdd2 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 16 Sep 2019 15:41:33 -0700 Subject: [PATCH 053/129] Namespace the rich text CSS --- .../styles/mastodon/components.scss | 133 +++++++++--------- 1 file changed, 67 insertions(+), 66 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index f14b23f56..9e5d91c1d 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -706,80 +706,81 @@ height: 20px; margin: -3px 0 0; } + .status__content__text { + p, + pre, + blockquote { + margin-bottom: 20px; + white-space: pre-wrap; - p, - pre, - blockquote { - margin-bottom: 20px; - white-space: pre-wrap; - - &:last-child { - margin-bottom: 2px; + &:last-child { + margin-bottom: 2px; + } } - } - h1, - h2, - h3, - h4, - h5 { - margin-top: 20px; - margin-bottom: 20px; - } - - h1 { - font-weight: 700; - font-size: 22px; - } - - h2 { - font-weight: 700; - font-size: 20px; - } - - h3, - h4, - h5 { - font-weight: 500; - } - - blockquote { - padding-left: 10px; - border-left: 3px solid $darker-text-color; - color: $darker-text-color; - white-space: normal; - - p:last-child { - margin-bottom: 0; + h1, + h2, + h3, + h4, + h5 { + margin-top: 20px; + margin-bottom: 20px; } - } - b, - strong { - font-weight: 700; - } - - em, - i { - font-style: italic; - } - - ul, - ol { - margin-left: 1em; - margin-bottom: 1em; - - p { - margin: 0; + h1 { + font-weight: 700; + font-size: 22px; } - } - ul { - list-style-type: disc; - } + h2 { + font-weight: 700; + font-size: 20px; + } - ol { - list-style-type: decimal; + h3, + h4, + h5 { + font-weight: 500; + } + + blockquote { + padding-left: 10px; + border-left: 3px solid $darker-text-color; + color: $darker-text-color; + white-space: normal; + + p:last-child { + margin-bottom: 0; + } + } + + b, + strong { + font-weight: 700; + } + + em, + i { + font-style: italic; + } + + ul, + ol { + margin-left: 1em; + margin-bottom: 1em; + + p { + margin: 0; + } + } + + ul { + list-style-type: disc; + } + + ol { + list-style-type: decimal; + } } a { From 41846b1e1f9564259ed840597320af4b2ea50853 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 12:08:06 +0100 Subject: [PATCH 054/129] toot removal --- .../features/account/components/header.js | 4 +- .../account_timeline/components/header.js | 4 +- .../features/account_timeline/index.js | 2 +- .../features/compose/components/action_bar.js | 2 +- .../compose/components/compose_form.js | 2 +- .../compose/components/federation_dropdown.js | 4 +- .../compose/containers/warning_container.js | 2 +- .../mastodon/features/compose/index.js | 2 +- .../features/favourited_statuses/index.js | 2 +- .../mastodon/features/favourites/index.js | 2 +- .../features/getting_started/index.js | 2 +- .../mastodon/features/introduction/index.js | 6 +-- .../features/keyboard_shortcuts/index.js | 4 +- .../features/pinned_statuses/index.js | 2 +- .../mastodon/features/reblogs/index.js | 2 +- .../features/ui/components/columns_area.js | 2 +- app/javascript/mastodon/locales/ast.json | 14 ++--- app/javascript/mastodon/locales/bg.json | 18 +++---- app/javascript/mastodon/locales/ca.json | 2 +- app/javascript/mastodon/locales/da.json | 4 +- .../mastodon/locales/defaultMessages.json | 54 +++++++++---------- app/javascript/mastodon/locales/uk.json | 2 +- config/locales/simple_form.en.yml | 24 ++++----- 23 files changed, 81 insertions(+), 81 deletions(-) diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js index ac97bad71..c2c1a53a5 100644 --- a/app/javascript/mastodon/features/account/components/header.js +++ b/app/javascript/mastodon/features/account/components/header.js @@ -33,7 +33,7 @@ const messages = defineMessages({ unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' }, hideReblogs: { id: 'account.hide_reblogs', defaultMessage: 'Hide boosts from @{name}' }, showReblogs: { id: 'account.show_reblogs', defaultMessage: 'Show boosts from @{name}' }, - pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' }, + pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned posts' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, @@ -306,7 +306,7 @@ class Header extends ImmutablePureComponent {
- {shortNumberFormat(account.get('statuses_count'))} + {shortNumberFormat(account.get('statuses_count'))} diff --git a/app/javascript/mastodon/features/account_timeline/components/header.js b/app/javascript/mastodon/features/account_timeline/components/header.js index 844b8a236..6b9971bad 100644 --- a/app/javascript/mastodon/features/account_timeline/components/header.js +++ b/app/javascript/mastodon/features/account_timeline/components/header.js @@ -113,8 +113,8 @@ export default class Header extends ImmutablePureComponent { {!hideTabs && (
- - + +
)} diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js index 27581bfdc..7582c03ff 100644 --- a/app/javascript/mastodon/features/account_timeline/index.js +++ b/app/javascript/mastodon/features/account_timeline/index.js @@ -95,7 +95,7 @@ class AccountTimeline extends ImmutablePureComponent { ); } - const emptyMessage = blockedBy ? : ; + const emptyMessage = blockedBy ? : ; return ( diff --git a/app/javascript/mastodon/features/compose/components/action_bar.js b/app/javascript/mastodon/features/compose/components/action_bar.js index d0303dbfb..177b828d3 100644 --- a/app/javascript/mastodon/features/compose/components/action_bar.js +++ b/app/javascript/mastodon/features/compose/components/action_bar.js @@ -6,7 +6,7 @@ import { defineMessages, injectIntl } from 'react-intl'; const messages = defineMessages({ edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, - pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' }, + pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned posts' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index fbb5a1d5e..6da6bdb78 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -27,7 +27,7 @@ const allowedAroundShortCode = '><\u0085\u0020\u00a0\u1680\u2000\u2001\u2002\u20 const messages = defineMessages({ placeholder: { id: 'compose_form.placeholder', defaultMessage: 'What is on your mind?' }, spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' }, - publish: { id: 'compose_form.publish', defaultMessage: 'Toot' }, + publish: { id: 'compose_form.publish', defaultMessage: 'Post' }, publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' }, }); diff --git a/app/javascript/mastodon/features/compose/components/federation_dropdown.js b/app/javascript/mastodon/features/compose/components/federation_dropdown.js index 571cbcb6b..9050adad5 100644 --- a/app/javascript/mastodon/features/compose/components/federation_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/federation_dropdown.js @@ -10,9 +10,9 @@ import classNames from 'classnames'; const messages = defineMessages({ federate_short: { id: 'federation.federated.short', defaultMessage: 'Federated' }, - federate_long: { id: 'federation.federated.long', defaultMessage: 'Allow toot to reach other instances' }, + federate_long: { id: 'federation.federated.long', defaultMessage: 'Allow post to reach other instances' }, local_only_short: { id: 'federation.local_only.short', defaultMessage: 'Local-only' }, - local_only_long: { id: 'federation.local_only.long', defaultMessage: 'Restrict this toot only to my instance' }, + local_only_long: { id: 'federation.local_only.long', defaultMessage: 'Restrict this post only to my instance' }, change_federation: { id: 'federation.change', defaultMessage: 'Adjust status federation' }, }); diff --git a/app/javascript/mastodon/features/compose/containers/warning_container.js b/app/javascript/mastodon/features/compose/containers/warning_container.js index 8200a319f..fc0c0fd1e 100644 --- a/app/javascript/mastodon/features/compose/containers/warning_container.js +++ b/app/javascript/mastodon/features/compose/containers/warning_container.js @@ -19,7 +19,7 @@ const WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning } if (hashtagWarning) { - return } />; + return } />; } if (directMessageWarning) { diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index 0731abcf4..0780b7d8c 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -24,7 +24,7 @@ const messages = defineMessages({ community: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, - compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new toot' }, + compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new post' }, }); const mapStateToProps = (state, ownProps) => ({ diff --git a/app/javascript/mastodon/features/favourited_statuses/index.js b/app/javascript/mastodon/features/favourited_statuses/index.js index fa9401b90..2d577dc33 100644 --- a/app/javascript/mastodon/features/favourited_statuses/index.js +++ b/app/javascript/mastodon/features/favourited_statuses/index.js @@ -71,7 +71,7 @@ class Favourites extends ImmutablePureComponent { const { intl, shouldUpdateScroll, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; const pinned = !!columnId; - const emptyMessage = ; + const emptyMessage = ; return ( diff --git a/app/javascript/mastodon/features/favourites/index.js b/app/javascript/mastodon/features/favourites/index.js index d1ac229a2..9a69df49f 100644 --- a/app/javascript/mastodon/features/favourites/index.js +++ b/app/javascript/mastodon/features/favourites/index.js @@ -46,7 +46,7 @@ class Favourites extends ImmutablePureComponent { ); } - const emptyMessage = ; + const emptyMessage = ; return ( diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index fc7840ec1..cc393ae67 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -27,7 +27,7 @@ const messages = defineMessages({ blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' }, domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' }, mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' }, - pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' }, + pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned posts' }, lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' }, discover: { id: 'navigation_bar.discover', defaultMessage: 'Discover' }, personal: { id: 'navigation_bar.personal', defaultMessage: 'Personal' }, diff --git a/app/javascript/mastodon/features/introduction/index.js b/app/javascript/mastodon/features/introduction/index.js index 754477bb9..989f33e9c 100644 --- a/app/javascript/mastodon/features/introduction/index.js +++ b/app/javascript/mastodon/features/introduction/index.js @@ -74,17 +74,17 @@ const FrameInteractions = ({ onNext }) => (

-

+

-

+

-

+

diff --git a/app/javascript/mastodon/features/keyboard_shortcuts/index.js b/app/javascript/mastodon/features/keyboard_shortcuts/index.js index 01b45652c..b92bcd42c 100644 --- a/app/javascript/mastodon/features/keyboard_shortcuts/index.js +++ b/app/javascript/mastodon/features/keyboard_shortcuts/index.js @@ -82,7 +82,7 @@ class KeyboardShortcuts extends ImmutablePureComponent { alt+n - + backspace @@ -126,7 +126,7 @@ class KeyboardShortcuts extends ImmutablePureComponent { g+p - + g+u diff --git a/app/javascript/mastodon/features/pinned_statuses/index.js b/app/javascript/mastodon/features/pinned_statuses/index.js index 98cdbda3c..f29806937 100644 --- a/app/javascript/mastodon/features/pinned_statuses/index.js +++ b/app/javascript/mastodon/features/pinned_statuses/index.js @@ -10,7 +10,7 @@ import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; const messages = defineMessages({ - heading: { id: 'column.pins', defaultMessage: 'Pinned toot' }, + heading: { id: 'column.pins', defaultMessage: 'Pinned post' }, }); const mapStateToProps = state => ({ diff --git a/app/javascript/mastodon/features/reblogs/index.js b/app/javascript/mastodon/features/reblogs/index.js index c05d21c74..5d0d8c89a 100644 --- a/app/javascript/mastodon/features/reblogs/index.js +++ b/app/javascript/mastodon/features/reblogs/index.js @@ -46,7 +46,7 @@ class Reblogs extends ImmutablePureComponent { ); } - const emptyMessage = ; + const emptyMessage = ; return ( diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js index 042e44e43..ae3d4f0a9 100644 --- a/app/javascript/mastodon/features/ui/components/columns_area.js +++ b/app/javascript/mastodon/features/ui/components/columns_area.js @@ -33,7 +33,7 @@ const componentMap = { }; const messages = defineMessages({ - publish: { id: 'compose_form.publish', defaultMessage: 'Toot' }, + publish: { id: 'compose_form.publish', defaultMessage: 'Post' }, }); const shouldHideFAB = path => path.match(/^\/statuses\/|^\/search|^\/getting-started/); diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index d4706768c..faa7da094 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -23,7 +23,7 @@ "account.mute": "Silenciar a @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", - "account.posts": "Toots", + "account.posts": "Posts", "account.posts_with_replies": "Toots y rempuestes", "account.report": "Report @{name}", "account.requested": "Awaiting approval. Click to cancel follow request", @@ -67,7 +67,7 @@ "community.column_settings.media_only": "Media Only", "compose_form.direct_message_warning": "Esti toot namái va unviase a los usuarios mentaos.", "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts 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": "¿En qué pienses?", @@ -123,7 +123,7 @@ "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "Entá nun tienes dengún mensaxe direutu. Cuando unvies o recibas dalgún, va apaecer equí.", "empty_column.domain_blocks": "Entá nun hai dominios anubríos.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.", "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", "empty_column.follow_requests": "Entá nun tienes denguna solicitú de siguimientu. Cuando recibas una, va amosase equí.", "empty_column.hashtag": "There is nothing in this hashtag yet.", @@ -171,13 +171,13 @@ "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", "introduction.federation.local.headline": "Local", "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", - "introduction.interactions.action": "Finish toot-orial!", + "introduction.interactions.action": "Finish tutorial!", "introduction.interactions.favourite.headline": "Favourite", - "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.favourite.text": "You can save a post for later, and let the author know that you liked it, by favouriting it.", "introduction.interactions.reblog.headline": "Boost", - "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reblog.text": "You can share other people's posts with your followers by boosting them.", "introduction.interactions.reply.headline": "Reply", - "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.interactions.reply.text": "You can reply to other people's and your own posts, which will chain them together in a conversation.", "introduction.welcome.action": "Let's go!", "introduction.welcome.headline": "First steps", "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index f534aa4ba..f281a5619 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -67,7 +67,7 @@ "community.column_settings.media_only": "Media Only", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public posts 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": "Какво си мислиш?", @@ -123,8 +123,8 @@ "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.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.", "empty_column.follow_requests": "You don't have any follow requests yet. When you 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 search to get started and meet other users.", @@ -175,12 +175,12 @@ "introduction.interactions.favourite.headline": "Favourite", "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", "introduction.interactions.reblog.headline": "Boost", - "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reblog.text": "You can share other people's posts with your followers by boosting them.", "introduction.interactions.reply.headline": "Reply", - "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.interactions.reply.text": "You can reply to other people's and your own posts, which will chain them together in a conversation.", "introduction.welcome.action": "Let's go!", "introduction.welcome.headline": "First steps", - "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special — it hosts your profile, so remember its name.", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked users list", "keyboard_shortcuts.boost": "to boost", @@ -202,7 +202,7 @@ "keyboard_shortcuts.muted": "to open muted users list", "keyboard_shortcuts.my_profile": "to open your profile", "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.pinned": "to open pinned posts list", "keyboard_shortcuts.profile": "to open author's profile", "keyboard_shortcuts.reply": "to reply", "keyboard_shortcuts.requests": "to open follow requests list", @@ -249,7 +249,7 @@ "navigation_bar.logout": "Излизане", "navigation_bar.mutes": "Muted users", "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Pinned toots", + "navigation_bar.pins": "Pinned posts", "navigation_bar.preferences": "Предпочитания", "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Публичен канал", @@ -318,7 +318,7 @@ "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", - "search_results.statuses": "Toots", + "search_results.statuses": "Posts", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "status.admin_account": "Open moderation interface for @{name}", "status.admin_status": "Open this status in the moderation interface", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 5f76bed2b..1c4a23138 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -23,7 +23,7 @@ "account.mute": "Silencia @{name}", "account.mute_notifications": "Notificacions desactivades de @{name}", "account.muted": "Silenciat", - "account.posts": "Toots", + "account.posts": "Posts", "account.posts_with_replies": "Toots i respostes", "account.report": "Informe @{name}", "account.requested": "Esperant aprovació. Clic per a cancel·lar la petició de seguiment", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index c478f2953..33e84a928 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -173,9 +173,9 @@ "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", "introduction.interactions.action": "Slut tutorial!", "introduction.interactions.favourite.headline": "Favorisere", - "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.favourite.text": "You can save a post for later, and let the author know that you liked it, by favouriting it.", "introduction.interactions.reblog.headline": "Boost", - "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reblog.text": "You can share other people's posts with your followers by boosting them.", "introduction.interactions.reply.headline": "Svar", "introduction.interactions.reply.text": "Du kan svare andres og din egen bidrag, hvilke vil kæde dem sammen i en konversation.", "introduction.welcome.action": "Læd os gå!", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 236d573e8..f2cbcbcab 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -409,7 +409,7 @@ "id": "status.filtered" }, { - "defaultMessage": "Pinned toot", + "defaultMessage": "Pinned post", "id": "status.pinned" }, { @@ -493,11 +493,11 @@ { "descriptors": [ { - "defaultMessage": "Toots", + "defaultMessage": "Posts", "id": "account.posts" }, { - "defaultMessage": "Toots and replies", + "defaultMessage": "Posts and replies", "id": "account.posts_with_replies" }, { @@ -556,7 +556,7 @@ "id": "empty_column.account_unavailable" }, { - "defaultMessage": "No toots here!", + "defaultMessage": "No posts here!", "id": "empty_column.account_timeline" } ], @@ -641,7 +641,7 @@ "id": "account.show_reblogs" }, { - "defaultMessage": "Pinned toots", + "defaultMessage": "Pinned posts", "id": "navigation_bar.pins" }, { @@ -709,7 +709,7 @@ "id": "account.badges.bot" }, { - "defaultMessage": "Toots", + "defaultMessage": "Posts", "id": "account.posts" }, { @@ -765,7 +765,7 @@ "id": "account.edit_profile" }, { - "defaultMessage": "Pinned toots", + "defaultMessage": "Pinned posts", "id": "navigation_bar.pins" }, { @@ -814,7 +814,7 @@ "id": "compose_form.spoiler_placeholder" }, { - "defaultMessage": "Toot", + "defaultMessage": "Post", "id": "compose_form.publish" }, { @@ -892,7 +892,7 @@ "id": "federation.federated.short" }, { - "defaultMessage": "Allow toot to reach other instances", + "defaultMessage": "Allow post to reach other instances", "id": "federation.federated.long" }, { @@ -900,7 +900,7 @@ "id": "federation.local_only.short" }, { - "defaultMessage": "Restrict this toot only to my instance", + "defaultMessage": "Restrict this post only to my instance", "id": "federation.local_only.long" }, { @@ -1030,7 +1030,7 @@ "id": "search_results.accounts" }, { - "defaultMessage": "Toots", + "defaultMessage": "Posts", "id": "search_results.statuses" }, { @@ -1153,11 +1153,11 @@ "id": "compose_form.lock_disclaimer.lock" }, { - "defaultMessage": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "defaultMessage": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", "id": "compose_form.hashtag_warning" }, { - "defaultMessage": "This toot will only be sent to all the mentioned users.", + "defaultMessage": "This post will only be sent to all the mentioned users.", "id": "compose_form.direct_message_warning" }, { @@ -1198,7 +1198,7 @@ "id": "navigation_bar.logout" }, { - "defaultMessage": "Compose new toot", + "defaultMessage": "Compose new post", "id": "navigation_bar.compose" } ], @@ -1241,7 +1241,7 @@ "id": "column.favourites" }, { - "defaultMessage": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "defaultMessage": "You don't have any favourite posts yet. When you favourite one, it will show up here.", "id": "empty_column.favourited_statuses" } ], @@ -1250,7 +1250,7 @@ { "descriptors": [ { - "defaultMessage": "No one has favourited this toot yet. When someone does, they will show up here.", + "defaultMessage": "No one has favourited this post yet. When someone does, they will show up here.", "id": "empty_column.favourites" } ], @@ -1359,7 +1359,7 @@ "id": "navigation_bar.mutes" }, { - "defaultMessage": "Pinned toots", + "defaultMessage": "Pinned posts", "id": "navigation_bar.pins" }, { @@ -1520,7 +1520,7 @@ "id": "introduction.interactions.reply.headline" }, { - "defaultMessage": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "defaultMessage": "You can reply to other people's and your own posts, which will chain them together in a conversation.", "id": "introduction.interactions.reply.text" }, { @@ -1528,7 +1528,7 @@ "id": "introduction.interactions.reblog.headline" }, { - "defaultMessage": "You can share other people's toots with your followers by boosting them.", + "defaultMessage": "You can share other people's posts with your followers by boosting them.", "id": "introduction.interactions.reblog.text" }, { @@ -1536,11 +1536,11 @@ "id": "introduction.interactions.favourite.headline" }, { - "defaultMessage": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "defaultMessage": "You can save a post for later, and let the author know that you liked it, by favouriting it.", "id": "introduction.interactions.favourite.text" }, { - "defaultMessage": "Finish toot-orial!", + "defaultMessage": "Finish tutorial!", "id": "introduction.interactions.action" } ], @@ -1609,7 +1609,7 @@ "id": "keyboard_shortcuts.compose" }, { - "defaultMessage": "to start a brand new toot", + "defaultMessage": "to start a brand new post", "id": "keyboard_shortcuts.toot" }, { @@ -1653,7 +1653,7 @@ "id": "keyboard_shortcuts.favourites" }, { - "defaultMessage": "to open pinned toots list", + "defaultMessage": "to open pinned posts list", "id": "keyboard_shortcuts.pinned" }, { @@ -1932,7 +1932,7 @@ { "descriptors": [ { - "defaultMessage": "Pinned toot", + "defaultMessage": "Pinned post", "id": "column.pins" } ], @@ -1954,7 +1954,7 @@ { "descriptors": [ { - "defaultMessage": "No one has boosted this toot yet. When someone does, they will show up here.", + "defaultMessage": "No one has boosted this post yet. When someone does, they will show up here.", "id": "status.reblogs.empty" } ], @@ -2210,7 +2210,7 @@ { "descriptors": [ { - "defaultMessage": "Toot", + "defaultMessage": "Post", "id": "compose_form.publish" } ], @@ -2517,4 +2517,4 @@ ], "path": "app/javascript/mastodon/features/video/index.json" } -] \ No newline at end of file +] diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 63c73563e..6a56f99f0 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -318,7 +318,7 @@ "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", - "search_results.statuses": "Toots", + "search_results.statuses": "Posts", "search_results.total": "{count, number} {count, plural, one {результат} few {результати} many {результатів} other {результатів}}", "status.admin_account": "Open moderation interface for @{name}", "status.admin_status": "Open this status in the moderation interface", diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 93235ad1f..dae22f8e8 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -3,10 +3,10 @@ en: simple_form: hints: account_warning_preset: - text: You can use toot syntax, such as URLs, hashtags and mentions + text: You can use post syntax, such as URLs, hashtags and mentions admin_account_action: send_email_notification: The user will receive an explanation of what happened with their account - text_html: Optional. You can use toot syntax. You can add warning presets to save time + text_html: Optional. You can use post syntax. You can add warning presets to save time type_html: Choose what to do with %{acct} warning_preset_id: Optional. You can still add custom text to end of the preset defaults: @@ -20,21 +20,21 @@ en: fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use - irreversible: Filtered toots will disappear irreversibly, even if filter is later removed + irreversible: Filtered posts will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers password: Use at least 8 characters - phrase: Will be matched regardless of casing in text or content warning of a toot + phrase: Will be matched regardless of casing in text or content warning of a post scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. - setting_aggregate_reblogs: Do not show new boosts for toots that have been recently boosted (only affects newly-received boosts) - setting_default_federation: Toots do not federate to other instances unless manually changed while composing + setting_aggregate_reblogs: Do not show new boosts for posts that have been recently boosted (only affects newly-received boosts) + setting_default_federation: Posts do not federate to other instances unless manually changed while composing setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click setting_display_media_default: Hide media marked as sensitive setting_display_media_hide_all: Always hide all media setting_display_media_show_all: Always show media marked as sensitive setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages - setting_show_application: The application you use to toot will be displayed in the detailed view of your toots + setting_show_application: The application you use to post will be displayed in the detailed view of your posts username: Your username will be unique on %{domain} whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word featured_tag: @@ -46,7 +46,7 @@ en: sessions: otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' user: - chosen_languages: When checked, only toots in selected languages will be displayed in public timelines + chosen_languages: When checked, only posts in selected languages will be displayed in public timelines labels: account: fields: @@ -94,20 +94,20 @@ en: setting_aggregate_reblogs: Group boosts in timelines setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting - setting_default_federation: Allow my toots to reach other instances by default + setting_default_federation: Allow my posts to reach other instances by default setting_default_language: Posting language setting_default_privacy: Posting privacy setting_default_sensitive: Always mark media as sensitive - setting_delete_modal: Show confirmation dialog before deleting a toot + setting_delete_modal: Show confirmation dialog before deleting a post setting_display_media: Media display setting_display_media_default: Default setting_display_media_hide_all: Hide all setting_display_media_show_all: Show all - setting_expand_spoilers: Always expand toots marked with content warnings + setting_expand_spoilers: Always expand posts marked with content warnings setting_hide_network: Hide your network setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations - setting_show_application: Disclose application used to send toots + setting_show_application: Disclose application used to send posts setting_system_font_ui: Use system's default font setting_theme: Site theme setting_unfollow_modal: Show confirmation dialog before unfollowing someone From 87ad6ac03a43d551d0dbfb06ab15a576f9de4670 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 16:46:21 +0100 Subject: [PATCH 055/129] Add default hometown mascot images --- app/javascript/images/defaultmascot.svg | 1 + app/javascript/images/defaultmascotdark.svg | 1 + app/javascript/images/defaultmascotlight.svg | 1 + 3 files changed, 3 insertions(+) create mode 100644 app/javascript/images/defaultmascot.svg create mode 100644 app/javascript/images/defaultmascotdark.svg create mode 100644 app/javascript/images/defaultmascotlight.svg diff --git a/app/javascript/images/defaultmascot.svg b/app/javascript/images/defaultmascot.svg new file mode 100644 index 000000000..e1381af8a --- /dev/null +++ b/app/javascript/images/defaultmascot.svg @@ -0,0 +1 @@ +Asset 5 diff --git a/app/javascript/images/defaultmascotdark.svg b/app/javascript/images/defaultmascotdark.svg new file mode 100644 index 000000000..352118ec2 --- /dev/null +++ b/app/javascript/images/defaultmascotdark.svg @@ -0,0 +1 @@ +logo black diff --git a/app/javascript/images/defaultmascotlight.svg b/app/javascript/images/defaultmascotlight.svg new file mode 100644 index 000000000..03ede1333 --- /dev/null +++ b/app/javascript/images/defaultmascotlight.svg @@ -0,0 +1 @@ +logo white From 2ebe82c49bad1af9757516f89ec7ccaa699fa07a Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 16:57:08 +0100 Subject: [PATCH 056/129] Utility function to detect background colour and select either light or dark default hometown logo --- .../mastodon/features/compose/index.js | 13 ++++++++++-- .../features/compose/util/svg_select.js | 21 +++++++++++++++++++ .../styles/mastodon/components.scss | 6 ++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 app/javascript/mastodon/features/compose/util/svg_select.js diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index 0780b7d8c..4d53b9905 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -12,8 +12,10 @@ import Motion from '../ui/util/optional_motion'; import spring from 'react-motion/lib/spring'; import SearchResultsContainer from './containers/search_results_container'; import { changeComposing } from '../../actions/compose'; -import elephantUIPlane from '../../../images/elephant_ui_plane.svg'; +import defaultmascotlight from '../../../images/defaultmascotlight.svg'; +import defaultmascotdark from '../../../images/defaultmascotdark.svg'; import { mascot } from '../../initial_state'; +import {svgSelect} from './util/svg_select'; import Icon from 'mastodon/components/icon'; const messages = defineMessages({ @@ -32,6 +34,13 @@ const mapStateToProps = (state, ownProps) => ({ showSearch: ownProps.multiColumn ? state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']) : ownProps.isSearchPage, }); +let instanceMascot; +if (mascot) { + instanceMascot = ; +} else { + instanceMascot = ; +} + export default @connect(mapStateToProps) @injectIntl class Compose extends React.PureComponent { @@ -110,7 +119,7 @@ class Compose extends React.PureComponent {
- + {instanceMascot}
} diff --git a/app/javascript/mastodon/features/compose/util/svg_select.js b/app/javascript/mastodon/features/compose/util/svg_select.js new file mode 100644 index 000000000..346f4f5f7 --- /dev/null +++ b/app/javascript/mastodon/features/compose/util/svg_select.js @@ -0,0 +1,21 @@ +export function svgSelect(light, dark) { + + var svgbg = window.getComputedStyle(document.getElementsByClassName("drawer__inner")[0], null).getPropertyValue("background-color"); + var rgbArray = ((svgbg.replace(/[^0-9,]/g, "")).split(",")).map(Number).map(x => x/255); + + for ( var i = 0; i < rgbArray.length; ++i ) { + if ( rgbArray[i] <= 0.03928 ) { + rgbArray[i] = rgbArray[i] / 12.92 + } else { + rgbArray[i] = Math.pow( ( rgbArray[i] + 0.055 ) / 1.055, 2.4); + } + } + + var luminance = 0.2126 * rgbArray[0] + 0.7152 * rgbArray[1] + 0.0722 * rgbArray[2]; + + if ( luminance <= 0.179 ) { + return light; + } else { + return dark; + } +} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 7ec5b4260..57dbed893 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2365,6 +2365,12 @@ a.account__display-name { user-select: none; } + img.defaultmascot { + width: 70px; + padding-left: 1rem; + margin-top: -2rem; + } + @media screen and (min-height: 640px) { display: block; } From 8acc541fa981dbe130e9162422ee08f0f2ee35a9 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 20:21:48 +0100 Subject: [PATCH 057/129] Remove elephants from CSS --- app/javascript/styles/macaron/diff.scss | 21 +++++++++++++++++++ .../styles/mastodon-light/diff.scss | 21 +++++++++++++++++++ .../styles/mastodon/components.scss | 4 ++-- app/javascript/styles/mastodon/modal.scss | 2 +- 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index d513dbdee..5a59b273d 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -1046,3 +1046,24 @@ a.status-card.compact:hover { border-color: lighten($blue, 8%); } } + +.regeneration-indicator { + + &__figure { + background: url('../images/defaultmascotdark.svg') no-repeat center 0; + } + + &.missing-indicator { + + .regeneration-indicator__figure { + background-image: url('../images/defaultmascotdark.svg'); + } + } +} + +.modal-layout__mastodon { + + > * { + background: url('../images/defaultmascotdark.svg') no-repeat left bottom / contain; + } +} diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index ee8a7d265..aefeccf93 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -700,3 +700,24 @@ html { .compose-form .compose-form__warning { box-shadow: none; } + +.regeneration-indicator { + + &__figure { + background: url('../images/defaultmascotdark.svg') no-repeat center 0; + } + + &.missing-indicator { + + .regeneration-indicator__figure { + background-image: url('../images/defaultmascotdark.svg'); + } + } +} + +.modal-layout__mastodon { + + > * { + background: url('../images/defaultmascotdark.svg') no-repeat left bottom / contain; + } +} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 57dbed893..b1be25f89 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3042,7 +3042,7 @@ a.status-card.compact:hover { } &__figure { - background: url('../images/elephant_ui_working.svg') no-repeat center 0; + background: url('../images/defaultmascotlight.svg') no-repeat center 0; width: 100%; height: 160px; background-size: contain; @@ -3056,7 +3056,7 @@ a.status-card.compact:hover { padding-top: 20px + 48px; .regeneration-indicator__figure { - background-image: url('../images/elephant_ui_disappointed.svg'); + background-image: url('../images/defaultmascotlight.svg'); } } diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss index 962ed1ef5..1c074f268 100644 --- a/app/javascript/styles/mastodon/modal.scss +++ b/app/javascript/styles/mastodon/modal.scss @@ -15,7 +15,7 @@ > * { flex: 1; max-height: 235px; - background: url('../images/elephant_ui_plane.svg') no-repeat left bottom / contain; + background: url('../images/defaultmascotlight.svg') no-repeat left bottom / contain; } } From 31d5547be31212130e4234b32293202946ade63d Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 20:22:29 +0100 Subject: [PATCH 058/129] Replace error elephant with hometown logo --- app/javascript/mastodon/components/error_boundary.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/error_boundary.js b/app/javascript/mastodon/components/error_boundary.js index d1ca5bf75..f1302e65e 100644 --- a/app/javascript/mastodon/components/error_boundary.js +++ b/app/javascript/mastodon/components/error_boundary.js @@ -1,6 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import illustration from '../../images/elephant_ui_disappointed.svg'; +import defaultmascotlight from '../../images/defaultmascotlight.svg'; +import defaultmascotdark from '../../images/defaultmascotdark.svg'; +import {svgSelect} from '../features/compose/util/svg_select'; export default class ErrorBoundary extends React.PureComponent { @@ -31,7 +33,7 @@ export default class ErrorBoundary extends React.PureComponent { return (
- +
); } From 303979644fe9eeaf5ce9ea18bb8c07d19d81e5ff Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 21:26:22 +0100 Subject: [PATCH 059/129] Change avatar --- public/avatars/original/missing-mastodon.png | Bin 0 -> 3292 bytes public/avatars/original/missing.png | Bin 3292 -> 55780 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/avatars/original/missing-mastodon.png diff --git a/public/avatars/original/missing-mastodon.png b/public/avatars/original/missing-mastodon.png new file mode 100644 index 0000000000000000000000000000000000000000..34c8e45e61ce1e1ddeb6a9f69dc1979816a7286e GIT binary patch literal 3292 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 T1m@pU{u3x2G_pqP0p|YzWF96{ literal 0 HcmV?d00001 diff --git a/public/avatars/original/missing.png b/public/avatars/original/missing.png index 34c8e45e61ce1e1ddeb6a9f69dc1979816a7286e..a28161e3d75d97d07f2bc430a72abb7517f46bd6 100644 GIT binary patch literal 55780 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

mO%?DY>08v$O0r^Whdb|c1#l4-E$v3r$_fc- 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 T1m@pU{u3x2G_pqP0p|YzWF96{ From e6c1b3917a221943b3f4f050ff2d222ac486013d Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 21:26:33 +0100 Subject: [PATCH 060/129] Change SVG logo to name of instance --- app/views/layouts/public.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/public.html.haml b/app/views/layouts/public.html.haml index 2929ac599..e52a4f0bf 100644 --- a/app/views/layouts/public.html.haml +++ b/app/views/layouts/public.html.haml @@ -8,7 +8,7 @@ %nav.header .nav-left = link_to root_url, class: 'brand' do - = svg_logo_full + = site_title = link_to t('directories.directory'), explore_path, class: 'nav-link optional' if Setting.profile_directory = link_to t('about.about_this'), about_more_path, class: 'nav-link optional' From 5f2dbce5e03e76e5f933cee9883e941a73e6b7f5 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 21:26:46 +0100 Subject: [PATCH 061/129] Change landing page logo to name of instance --- app/views/about/show.html.haml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index c9514c162..8988493ce 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -7,9 +7,9 @@ .landing .landing__brand - = link_to root_url, class: 'brand' do - = svg_logo_full - %span.brand__tagline=t 'about.tagline' + %h1 + = link_to root_url, class: 'brand' do + = site_title .landing__grid .landing__grid__column.landing__grid__column-registration From 4b0be3f830a3f0b9adbb69d820457ef170782d52 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 21:27:00 +0100 Subject: [PATCH 062/129] Nudge logo down --- app/javascript/styles/mastodon/components.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index b1be25f89..786a4a969 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2368,7 +2368,6 @@ a.account__display-name { img.defaultmascot { width: 70px; padding-left: 1rem; - margin-top: -2rem; } @media screen and (min-height: 640px) { From 62c2286656560170d587699055d4bc4d933373e0 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 21:27:10 +0100 Subject: [PATCH 063/129] Brand link styling --- app/javascript/styles/mastodon/about.scss | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index 61637ce96..3a26c3fb7 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -834,6 +834,16 @@ $small-breakpoint: 960px; .brand { position: relative; text-decoration: none; + color: $secondary-text-color; +} + +a.brand { + color: $primary-text-color; +} + +h1 a.brand { + color: $secondary-text-color; + font-size: 3.8em; } .brand__tagline { @@ -853,4 +863,3 @@ $small-breakpoint: 960px; color: $dark-text-color; } } - From a11573e9f2cea9d9d26d48853ad7a71798c98c02 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 21:27:23 +0100 Subject: [PATCH 064/129] Remove zigzag --- app/javascript/styles/macaron/diff.scss | 2 +- app/javascript/styles/mastodon-light/diff.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index 5a59b273d..d4089e007 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -240,7 +240,7 @@ html { } .drawer__inner__mastodon { - background: $pink url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; + background: $pink; } // Change the colors used in compose-form diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index aefeccf93..209fe53b6 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -147,7 +147,7 @@ html { } .drawer__inner__mastodon { - background: $white url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; + background: $white; } // Change the colors used in compose-form From b51aba95b3ba9a105582ca67ec534c111533a810 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 22:00:48 +0100 Subject: [PATCH 065/129] hometown logo in footer --- app/helpers/stream_entries_helper.rb | 2 +- app/javascript/images/hometownlogo.svg | 1 + app/javascript/mastodon/features/introduction/index.js | 2 +- app/views/layouts/application.html.haml | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 app/javascript/images/hometownlogo.svg diff --git a/app/helpers/stream_entries_helper.rb b/app/helpers/stream_entries_helper.rb index 7f76ccb4f..4b49218ca 100644 --- a/app/helpers/stream_entries_helper.rb +++ b/app/helpers/stream_entries_helper.rb @@ -35,7 +35,7 @@ module StreamEntriesHelper end def svg_logo - content_tag(:svg, tag(:use, 'xlink:href' => '#mastodon-svg-logo'), 'viewBox' => '0 0 216.4144 232.00976') + content_tag(:svg, tag(:use, 'xlink:href' => '#hometownlogo'), 'viewBox' => '0 0 611.55 611.55') end def svg_logo_full diff --git a/app/javascript/images/hometownlogo.svg b/app/javascript/images/hometownlogo.svg new file mode 100644 index 000000000..8133a5cc6 --- /dev/null +++ b/app/javascript/images/hometownlogo.svg @@ -0,0 +1 @@ + diff --git a/app/javascript/mastodon/features/introduction/index.js b/app/javascript/mastodon/features/introduction/index.js index 989f33e9c..22d6ecf4c 100644 --- a/app/javascript/mastodon/features/introduction/index.js +++ b/app/javascript/mastodon/features/introduction/index.js @@ -8,7 +8,7 @@ import { closeOnboarding } from '../../actions/onboarding'; import screenHello from '../../../images/screen_hello.svg'; import screenFederation from '../../../images/screen_federation.svg'; import screenInteractions from '../../../images/screen_interactions.svg'; -import logoTransparent from '../../../images/logo_transparent.svg'; +import hometownlogo from '../../../images/hometownlogo.svg'; const FrameWelcome = ({ domain, onNext }) => (

diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 747d80bf0..5bf199a21 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -35,5 +35,5 @@ = content_for?(:content) ? yield(:content) : yield %div{ style: 'display: none'} - = render file: Rails.root.join('app', 'javascript', 'images', 'logo_transparent.svg') + = render file: Rails.root.join('app', 'javascript', 'images', 'hometownlogo.svg') = render file: Rails.root.join('app', 'javascript', 'images', 'logo_full.svg') From b0bfb640b1f8769fd2d6adf3d8bead1595abfa82 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 17 Sep 2019 22:06:34 +0100 Subject: [PATCH 066/129] Switch out logo in emails for site title --- app/views/layouts/mailer.html.haml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml index db5935cf7..e01272946 100644 --- a/app/views/layouts/mailer.html.haml +++ b/app/views/layouts/mailer.html.haml @@ -24,7 +24,8 @@ %tr %td.column-cell = link_to root_url do - = image_tag full_pack_url('media/images/mailer/logo_full.png'), alt: site_title, height: 34, class: 'logo' + %h1 + = site_title = yield @@ -49,4 +50,5 @@ %p= link_to t('application_mailer.notification_preferences'), settings_preferences_notifications_url %td.column-cell.text-right = link_to root_url do - = image_tag full_pack_url('media/images/mailer/logo_transparent.png'), alt: site_title, height: 24 + %h4 + = site_title From 20e17e496f159b09b3cfd12a7bd7cc43031c54f9 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 18 Sep 2019 17:21:53 +0100 Subject: [PATCH 067/129] Fix header spacing in emails --- app/javascript/styles/mailer.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss index b4fb1d709..ce7ffdb35 100644 --- a/app/javascript/styles/mailer.scss +++ b/app/javascript/styles/mailer.scss @@ -218,6 +218,11 @@ h1 { line-height: 36px; } +.column-cell a h1 { + margin: 0 8px 10px; + line-height: 26px; +} + h2 { font-size: 23px; line-height: 30px; From ec0a3e232d6e8d0b476caf86bede0a997e16ab3d Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 18 Sep 2019 21:26:33 +0100 Subject: [PATCH 068/129] Move background colour auto-detect script to where the other webpack files are --- app/javascript/mastodon/components/error_boundary.js | 2 +- app/javascript/mastodon/features/compose/index.js | 3 +-- .../mastodon/{features/compose/util => }/svg_select.js | 0 3 files changed, 2 insertions(+), 3 deletions(-) rename app/javascript/mastodon/{features/compose/util => }/svg_select.js (100%) diff --git a/app/javascript/mastodon/components/error_boundary.js b/app/javascript/mastodon/components/error_boundary.js index f1302e65e..b8b037fe0 100644 --- a/app/javascript/mastodon/components/error_boundary.js +++ b/app/javascript/mastodon/components/error_boundary.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import defaultmascotlight from '../../images/defaultmascotlight.svg'; import defaultmascotdark from '../../images/defaultmascotdark.svg'; -import {svgSelect} from '../features/compose/util/svg_select'; +import {svgSelect} from '../svg_select'; export default class ErrorBoundary extends React.PureComponent { diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index 4d53b9905..b995a0caf 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -15,7 +15,6 @@ import { changeComposing } from '../../actions/compose'; import defaultmascotlight from '../../../images/defaultmascotlight.svg'; import defaultmascotdark from '../../../images/defaultmascotdark.svg'; import { mascot } from '../../initial_state'; -import {svgSelect} from './util/svg_select'; import Icon from 'mastodon/components/icon'; const messages = defineMessages({ @@ -38,7 +37,7 @@ let instanceMascot; if (mascot) { instanceMascot = ; } else { - instanceMascot = ; + instanceMascot = ; } export default @connect(mapStateToProps) diff --git a/app/javascript/mastodon/features/compose/util/svg_select.js b/app/javascript/mastodon/svg_select.js similarity index 100% rename from app/javascript/mastodon/features/compose/util/svg_select.js rename to app/javascript/mastodon/svg_select.js From 76426333d957f7f8e0319cfe3cc7ba9268d5b651 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 18 Sep 2019 22:54:09 +0100 Subject: [PATCH 069/129] Add inline svg logos to index and error_boundary.js and style --- app/javascript/mastodon/components/error_boundary.js | 5 +---- app/javascript/mastodon/features/compose/index.js | 4 +--- app/javascript/styles/mastodon/components.scss | 8 ++++++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/components/error_boundary.js b/app/javascript/mastodon/components/error_boundary.js index b8b037fe0..59ad61e43 100644 --- a/app/javascript/mastodon/components/error_boundary.js +++ b/app/javascript/mastodon/components/error_boundary.js @@ -1,8 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import defaultmascotlight from '../../images/defaultmascotlight.svg'; -import defaultmascotdark from '../../images/defaultmascotdark.svg'; -import {svgSelect} from '../svg_select'; export default class ErrorBoundary extends React.PureComponent { @@ -33,7 +30,7 @@ export default class ErrorBoundary extends React.PureComponent { return (
- +
); } diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index b995a0caf..96f99c2a8 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -12,8 +12,6 @@ import Motion from '../ui/util/optional_motion'; import spring from 'react-motion/lib/spring'; import SearchResultsContainer from './containers/search_results_container'; import { changeComposing } from '../../actions/compose'; -import defaultmascotlight from '../../../images/defaultmascotlight.svg'; -import defaultmascotdark from '../../../images/defaultmascotdark.svg'; import { mascot } from '../../initial_state'; import Icon from 'mastodon/components/icon'; @@ -37,7 +35,7 @@ let instanceMascot; if (mascot) { instanceMascot = ; } else { - instanceMascot = ; + instanceMascot = ; } export default @connect(mapStateToProps) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 786a4a969..a6f45619f 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -6031,3 +6031,11 @@ noscript { padding: 0.35rem; } } + +.drawer__inner__mastodon svg#hometownlogo { + position: absolute; + fill: $secondary-text-color; + width: 90px; + height: 100px; + bottom: 0; +} From 1c114185c85fea0ea6be6a043ab62417a15c736b Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 18 Sep 2019 22:55:01 +0100 Subject: [PATCH 070/129] Make it so that if there is no custom mascot uploaded the logo on the about/more page will always be correctly coloured --- app/javascript/styles/mastodon/about.scss | 6 ++++++ app/views/about/more.html.haml | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index 3a26c3fb7..e71371a84 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -846,6 +846,12 @@ h1 a.brand { font-size: 3.8em; } +.originalmascotimg svg { + width: 200px; + fill: $secondary-text-color; + margin-top: -25px; +} + .brand__tagline { display: block; position: absolute; diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index b248ed1d2..a2f7a3d98 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -24,8 +24,13 @@ %strong= number_with_delimiter @instance_presenter.status_count %span= t 'about.status_count_after', count: @instance_presenter.status_count .row__mascot - .landing-page__mascot - = image_tag @instance_presenter.mascot&.file&.url || asset_pack_path('media/images/elephant_ui_plane.svg'), alt: '' + - if @instance_presenter.mascot&.file&.url + .landing-page__mascot + = image_tag @instance_presenter.mascot&.file&.url + - else + .landing-page__mascot{:class => ("originalmascot")} + %div{:class => ("originalmascotimg")} + = svg_logo .column-2 .landing-page__information.contact-widget From 47248ec6281c5b23c9df0d9beb0462e738f959ef Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 18 Sep 2019 23:04:06 +0100 Subject: [PATCH 071/129] Corrects b51aba95b --- app/javascript/mastodon/features/introduction/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/introduction/index.js b/app/javascript/mastodon/features/introduction/index.js index 22d6ecf4c..989f33e9c 100644 --- a/app/javascript/mastodon/features/introduction/index.js +++ b/app/javascript/mastodon/features/introduction/index.js @@ -8,7 +8,7 @@ import { closeOnboarding } from '../../actions/onboarding'; import screenHello from '../../../images/screen_hello.svg'; import screenFederation from '../../../images/screen_federation.svg'; import screenInteractions from '../../../images/screen_interactions.svg'; -import hometownlogo from '../../../images/hometownlogo.svg'; +import logoTransparent from '../../../images/logo_transparent.svg'; const FrameWelcome = ({ domain, onNext }) => (
From a6df5c6cdfc1c5db2d9b413181cfbbef4c50c4c8 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 18 Sep 2019 23:17:15 +0100 Subject: [PATCH 072/129] remove zigzag from mastodon original theme --- app/javascript/styles/mastodon/components.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index a6f45619f..039ff2022 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2349,7 +2349,7 @@ a.account__display-name { } .drawer__inner__mastodon { - background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; + background: lighten($ui-base-color, 13%); flex: 1; min-height: 47px; display: none; From a4e41f14c40a8316ecc1137360896ff5338fd0e4 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 18 Sep 2019 23:36:25 +0100 Subject: [PATCH 073/129] Entirely remove logo from admin panel --- app/views/layouts/admin.html.haml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 65a8913aa..da94f928d 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -5,8 +5,7 @@ .admin-wrapper .sidebar-wrapper .sidebar - = link_to root_path do - = image_pack_tag 'logo.svg', class: 'logo', alt: site_title + %div{:class => ("logo")} = render_navigation .content-wrapper From adfdc9b968e0cab836353074e5d5c79881a3b64e Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 18 Sep 2019 23:41:06 +0100 Subject: [PATCH 074/129] Remove a missed toot --- app/javascript/mastodon/features/introduction/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/introduction/index.js b/app/javascript/mastodon/features/introduction/index.js index 989f33e9c..3e9594ee3 100644 --- a/app/javascript/mastodon/features/introduction/index.js +++ b/app/javascript/mastodon/features/introduction/index.js @@ -89,7 +89,7 @@ const FrameInteractions = ({ onNext }) => (
- +
); From 1e1eed84bd54d899fe785271e2da515a77de2996 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Sun, 22 Sep 2019 22:35:31 +0100 Subject: [PATCH 075/129] CSS changes for single-column view on smaller screens --- .../styles/mastodon/components.scss | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 9e5d91c1d..49d6350f0 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1570,6 +1570,11 @@ a.account__display-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; + + @media screen and (max-width: 1550px) { + resize: vertical; + } + } .display-name__html { @@ -1878,6 +1883,13 @@ a.account__display-name { width: 285px; pointer-events: auto; height: 100%; + + @media screen and (max-width: 1550px) { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 10px; + } + } } @@ -2261,6 +2273,12 @@ a.account__display-name { height: calc(100% - 10px); overflow-y: hidden; + @media screen and (max-width: 1550px) { + height: auto; + min-height: 100%; + overflow-y: visible; + } + .navigation-bar { padding-top: 20px; padding-bottom: 20px; @@ -2287,6 +2305,11 @@ a.account__display-name { background-color: $white; border-radius: 4px 4px 0 0; flex: 0 1 auto; + + @media screen and (max-width: 1550px) { + overflow-y: visible; + } + } .autosuggest-textarea__textarea { From 2a7cc4ff1ecd67f434400df60210104e85860846 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 1 Oct 2019 15:09:08 +0100 Subject: [PATCH 076/129] Switch out logo on login pages for instance name --- app/views/layouts/auth.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/auth.html.haml b/app/views/layouts/auth.html.haml index 585e24655..9b90e125d 100644 --- a/app/views/layouts/auth.html.haml +++ b/app/views/layouts/auth.html.haml @@ -5,8 +5,8 @@ .container-alt .logo-container %h1 - = link_to root_path do - = svg_logo_full + = link_to root_path, class: 'brand' do + = site_title .form-container = render 'flashes' From bcce240c18a5f665bc82804d5fae68b5a9438b46 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 1 Oct 2019 15:22:37 +0100 Subject: [PATCH 077/129] Bring styling of signup page header into line with the auth page header from 2a7cc4ff1 --- app/javascript/styles/mastodon/about.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index e71371a84..e8dedd009 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -658,6 +658,8 @@ $small-breakpoint: 960px; justify-content: center; align-items: center; padding: 50px; + font-family: $font-display, sans-serif; + font-weight: bold; svg { fill: $primary-text-color; From 7fb4c7d89dc39bcb33322eb22a7028ab804757b0 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 1 Oct 2019 16:45:17 +0100 Subject: [PATCH 078/129] Only show hero widget on /about page if there's a custom hero or thumbnail uploaded --- app/views/about/show.html.haml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index 8988493ce..e86eeddfe 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -49,8 +49,9 @@ = render 'login' .hero-widget - .hero-widget__img - = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.jpg'), alt: @instance_presenter.site_title + - if @instance_presenter.hero.present? || @instance_presenter.thumbnail.present? + .hero-widget__img + = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url, alt: @instance_presenter.site_title - if @instance_presenter.site_short_description.present? .hero-widget__text From b151f24dd8c940fd00c4fdd5ad06bc0ba873f763 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 1 Oct 2019 16:53:32 +0100 Subject: [PATCH 079/129] =?UTF-8?q?Only=20show=20header=20image=20containe?= =?UTF-8?q?r=20on=20/about/more=20page=20if=20there's=20a=20custom=20hero?= =?UTF-8?q?=20or=20thum=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/about/more.html.haml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index a2f7a3d98..f369820c0 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -8,8 +8,9 @@ .grid-3 .column-0 .public-account-header.public-account-header--no-bar - .public-account-header__image - = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.jpg'), alt: @instance_presenter.site_title, class: 'parallax' + - if @instance_presenter.hero.present? || @instance_presenter.thumbnail.present? + .public-account-header__image + = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url, alt: @instance_presenter.site_title, class: 'parallax' .column-1 .landing-page__call-to-action{ dir: 'ltr' } From 3556a0a3c6add5a461feddb74d6f9d846157ecda Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 1 Oct 2019 17:02:33 +0100 Subject: [PATCH 080/129] Only show hero image on static public profile pages if a custom one has been uploaded --- app/views/application/_sidebar.html.haml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/application/_sidebar.html.haml b/app/views/application/_sidebar.html.haml index b5ce5845e..3a7144423 100644 --- a/app/views/application/_sidebar.html.haml +++ b/app/views/application/_sidebar.html.haml @@ -1,6 +1,7 @@ .hero-widget - .hero-widget__img - = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.jpg'), alt: @instance_presenter.site_title + - if @instance_presenter.hero.present? || @instance_presenter.thumbnail.present? + .hero-widget__img + = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url, alt: @instance_presenter.site_title .hero-widget__text %p= @instance_presenter.site_short_description.html_safe.presence || @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname) From 142f601d41f79d232227e5751e300cbfc49471bb Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 1 Oct 2019 17:03:14 +0100 Subject: [PATCH 081/129] Make the custom avatar the same size as the original mastodon one --- public/avatars/original/missing.png | Bin 55780 -> 31690 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/avatars/original/missing.png b/public/avatars/original/missing.png index a28161e3d75d97d07f2bc430a72abb7517f46bd6..b950e8246f830b9e571bc877669d82fde6288fc8 100644 GIT binary patch literal 31690 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

}wf*j&@R#Q6M4ppsp)K|v8-g)LKr+n

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

AxneYw~N7#A&FF6OUYBe+_)cNv@&LU+xz(M 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 literal 55780 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

mO%?DY>08v$O0r^Whdb|c1#l4-E$v3r$_fc- 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 Date: Tue, 1 Oct 2019 17:31:17 +0100 Subject: [PATCH 082/129] Fix CSS wrapping bug in navigation on public pages for longer instance names --- app/javascript/styles/mastodon/containers.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss index 3564bf07b..75eab3fd2 100644 --- a/app/javascript/styles/mastodon/containers.scss +++ b/app/javascript/styles/mastodon/containers.scss @@ -256,6 +256,7 @@ .brand { display: block; padding: 15px; + white-space: nowrap; svg { display: block; From 3d09d6369d4b1a7578e33e97af9d405e88e73f06 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 1 Oct 2019 18:16:18 +0100 Subject: [PATCH 083/129] Bugfix live stream of public posts so the description box shows the site title rather than the template for it --- app/views/public_timelines/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/public_timelines/show.html.haml b/app/views/public_timelines/show.html.haml index 913d5d855..b2cf3b411 100644 --- a/app/views/public_timelines/show.html.haml +++ b/app/views/public_timelines/show.html.haml @@ -8,7 +8,7 @@ .page-header %h1= t('about.see_whats_happening') - %p= t('about.browse_public_posts') + %p= t('about.browse_public_posts', title: site_title) #mastodon-timeline{ data: { props: Oj.dump(default_props) }} #modal-container From 08f61483346025d41cf79b0a74fd43d00bc70d8f Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Tue, 1 Oct 2019 18:44:35 +0100 Subject: [PATCH 084/129] Remove keysmash elephant from 404 page and replace with the name of the instance --- app/javascript/styles/mastodon/basics.scss | 6 ++++++ app/views/layouts/error.html.haml | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index b5a77ce94..64ee7bae1 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -109,6 +109,12 @@ body { height: auto; margin-top: -120px; } + + h1 { + a.brand { + font-size: 36px; + } + } } h1 { diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml index 25c85abf9..414ac9c72 100644 --- a/app/views/layouts/error.html.haml +++ b/app/views/layouts/error.html.haml @@ -8,10 +8,11 @@ = stylesheet_pack_tag 'common', media: 'all' = stylesheet_pack_tag Setting.default_settings['theme'], media: 'all' = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' - = javascript_pack_tag 'error', integrity: true, crossorigin: 'anonymous' %body.error .dialog .dialog__illustration - %img{ alt: Setting.default_settings['site_title'], src: '/oops.png' }/ + %h1 + = link_to root_url, class: 'brand' do + = site_title .dialog__message %h1= yield :content From 682afe8d2d289090cdc77db4793c13b98a74aacc Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 2 Oct 2019 00:57:31 +0100 Subject: [PATCH 085/129] Switch out old hometown logo for new one Also tidies up a bunch of svgs that were hardcoded and shouldn't have been --- app/helpers/stream_entries_helper.rb | 2 +- app/javascript/images/hometown.svg | 1 + app/javascript/images/hometownlogo.svg | 1 - .../mastodon/components/error_boundary.js | 2 +- .../mastodon/features/compose/index.js | 2 +- .../styles/mastodon/components.scss | 13 +++---- .../styles/mastodon/containers.scss | 34 +++++++++++++++++++ app/javascript/styles/mastodon/modal.scss | 1 - app/views/about/more.html.haml | 10 ++++-- app/views/layouts/application.html.haml | 2 +- 10 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 app/javascript/images/hometown.svg delete mode 100644 app/javascript/images/hometownlogo.svg diff --git a/app/helpers/stream_entries_helper.rb b/app/helpers/stream_entries_helper.rb index 4b49218ca..50cf77d48 100644 --- a/app/helpers/stream_entries_helper.rb +++ b/app/helpers/stream_entries_helper.rb @@ -35,7 +35,7 @@ module StreamEntriesHelper end def svg_logo - content_tag(:svg, tag(:use, 'xlink:href' => '#hometownlogo'), 'viewBox' => '0 0 611.55 611.55') + content_tag(:svg, tag(:use, 'xlink:href' => '#hometownlogo'), 'viewBox' => '0 0 100 100') end def svg_logo_full diff --git a/app/javascript/images/hometown.svg b/app/javascript/images/hometown.svg new file mode 100644 index 000000000..055a5c40f --- /dev/null +++ b/app/javascript/images/hometown.svg @@ -0,0 +1 @@ + diff --git a/app/javascript/images/hometownlogo.svg b/app/javascript/images/hometownlogo.svg deleted file mode 100644 index 8133a5cc6..000000000 --- a/app/javascript/images/hometownlogo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/app/javascript/mastodon/components/error_boundary.js b/app/javascript/mastodon/components/error_boundary.js index 59ad61e43..35723f2eb 100644 --- a/app/javascript/mastodon/components/error_boundary.js +++ b/app/javascript/mastodon/components/error_boundary.js @@ -30,7 +30,7 @@ export default class ErrorBoundary extends React.PureComponent { return (

); } diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index 96f99c2a8..a1df33b12 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -35,7 +35,7 @@ let instanceMascot; if (mascot) { instanceMascot = ; } else { - instanceMascot = ; + instanceMascot = ; } export default @connect(mapStateToProps) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index a6371e476..85850c3b5 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3033,9 +3033,8 @@ a.status-card.compact:hover { } &__figure { - background: url('../images/defaultmascotlight.svg') no-repeat center 0; width: 100%; - height: 160px; + height: 10px; background-size: contain; position: absolute; top: 50%; @@ -3045,14 +3044,10 @@ a.status-card.compact:hover { &.missing-indicator { padding-top: 20px + 48px; - - .regeneration-indicator__figure { - background-image: url('../images/defaultmascotlight.svg'); - } } &__label { - margin-top: 200px; + margin-top: 0px; strong { display: block; @@ -6027,7 +6022,7 @@ noscript { .drawer__inner__mastodon svg#hometownlogo { position: absolute; fill: $secondary-text-color; - width: 90px; + width: 100px; height: 100px; bottom: 0; } @@ -6041,4 +6036,4 @@ div.status__content--with-spoiler { margin: 0.25rem 0 0 0; } } -} \ No newline at end of file +} diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss index 75eab3fd2..9457c901b 100644 --- a/app/javascript/styles/mastodon/containers.scss +++ b/app/javascript/styles/mastodon/containers.scss @@ -392,8 +392,42 @@ border-radius: 4px 4px 0 0; } + .originalheader { + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + align-content: space-between; + + svg { + fill: $secondary-text-color; + height: 300px; + } + + h1 { + flex-grow: 2; + text-align: center; + white-space: nowrap; + font-family: $font-sans-serif, sans-serif; + } + } + + + @media screen and (max-width: 600px) { height: 200px; + + .originalheader { + svg { + height: 200px; + } + + h1 { + font-size: 0.5rem; + } + } } } diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss index 1c074f268..2a0d477ac 100644 --- a/app/javascript/styles/mastodon/modal.scss +++ b/app/javascript/styles/mastodon/modal.scss @@ -15,7 +15,6 @@ > * { flex: 1; max-height: 235px; - background: url('../images/defaultmascotlight.svg') no-repeat left bottom / contain; } } diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index f369820c0..50e0d8881 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -8,9 +8,15 @@ .grid-3 .column-0 .public-account-header.public-account-header--no-bar - - if @instance_presenter.hero.present? || @instance_presenter.thumbnail.present? - .public-account-header__image + .public-account-header__image + - if @instance_presenter.hero.present? || @instance_presenter.thumbnail.present? = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url, alt: @instance_presenter.site_title, class: 'parallax' + - else + %div{:class => ("originalheader")} + = svg_logo + %h1 + = link_to root_url, class: 'brand' do + = site_title .column-1 .landing-page__call-to-action{ dir: 'ltr' } diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 5bf199a21..9b25ce5f8 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -35,5 +35,5 @@ = content_for?(:content) ? yield(:content) : yield %div{ style: 'display: none'} - = render file: Rails.root.join('app', 'javascript', 'images', 'hometownlogo.svg') + = render file: Rails.root.join('app', 'javascript', 'images', 'hometown.svg') = render file: Rails.root.join('app', 'javascript', 'images', 'logo_full.svg') From 25616678118a96cde0b594d9889d3f383ca51869 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 2 Oct 2019 00:58:27 +0100 Subject: [PATCH 086/129] Remove hardcoded mascots from light and macaron themes --- app/javascript/styles/macaron/diff.scss | 21 ------------------- .../styles/mastodon-light/diff.scss | 21 ------------------- 2 files changed, 42 deletions(-) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index c4c94392c..c858a9bfb 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -1050,24 +1050,3 @@ a.status-card.compact:hover { border-color: lighten($blue, 8%); } } - -.regeneration-indicator { - - &__figure { - background: url('../images/defaultmascotdark.svg') no-repeat center 0; - } - - &.missing-indicator { - - .regeneration-indicator__figure { - background-image: url('../images/defaultmascotdark.svg'); - } - } -} - -.modal-layout__mastodon { - - > * { - background: url('../images/defaultmascotdark.svg') no-repeat left bottom / contain; - } -} diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 209fe53b6..c017012b3 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -700,24 +700,3 @@ html { .compose-form .compose-form__warning { box-shadow: none; } - -.regeneration-indicator { - - &__figure { - background: url('../images/defaultmascotdark.svg') no-repeat center 0; - } - - &.missing-indicator { - - .regeneration-indicator__figure { - background-image: url('../images/defaultmascotdark.svg'); - } - } -} - -.modal-layout__mastodon { - - > * { - background: url('../images/defaultmascotdark.svg') no-repeat left bottom / contain; - } -} From 5678f4135d5cd692948c12d54bd8f1266729c484 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 2 Oct 2019 01:01:57 +0100 Subject: [PATCH 087/129] remove redundant mascot images --- app/javascript/images/defaultmascotdark.svg | 1 - app/javascript/images/defaultmascotlight.svg | 1 - 2 files changed, 2 deletions(-) delete mode 100644 app/javascript/images/defaultmascotdark.svg delete mode 100644 app/javascript/images/defaultmascotlight.svg diff --git a/app/javascript/images/defaultmascotdark.svg b/app/javascript/images/defaultmascotdark.svg deleted file mode 100644 index 352118ec2..000000000 --- a/app/javascript/images/defaultmascotdark.svg +++ /dev/null @@ -1 +0,0 @@ -logo black diff --git a/app/javascript/images/defaultmascotlight.svg b/app/javascript/images/defaultmascotlight.svg deleted file mode 100644 index 03ede1333..000000000 --- a/app/javascript/images/defaultmascotlight.svg +++ /dev/null @@ -1 +0,0 @@ -logo white From daf7299bedf81eacc81b36b4be86ded1d6748188 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 2 Oct 2019 01:02:05 +0100 Subject: [PATCH 088/129] remove redundant CSS --- app/javascript/styles/mastodon/components.scss | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 85850c3b5..56dcfc4ac 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2357,11 +2357,6 @@ a.account__display-name { user-select: none; } - img.defaultmascot { - width: 70px; - padding-left: 1rem; - } - @media screen and (min-height: 640px) { display: block; } From 2dbcba953a5959b8ea7a6c0397784f8859e78ad9 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 2 Oct 2019 01:10:49 +0100 Subject: [PATCH 089/129] Update default avatar --- public/avatars/original/missing.png | Bin 31690 -> 11407 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/avatars/original/missing.png b/public/avatars/original/missing.png index b950e8246f830b9e571bc877669d82fde6288fc8..336b13e37cdf7d3b51535f0d2153357b1502c659 100644 GIT binary patch literal 11407 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 literal 31690 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

}wf*j&@R#Q6M4ppsp)K|v8-g)LKr+n

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

AxneYw~N7#A&FF6OUYBe+_)cNv@&LU+xz(M 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 From 0fbcba4e91a20f6fa21b46453b3a6fada7874345 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 2 Oct 2019 01:15:18 +0100 Subject: [PATCH 090/129] Revert "Update default avatar" This reverts commit 2dbcba953a5959b8ea7a6c0397784f8859e78ad9. --- public/avatars/original/missing.png | Bin 11407 -> 31690 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/avatars/original/missing.png b/public/avatars/original/missing.png index 336b13e37cdf7d3b51535f0d2153357b1502c659..b950e8246f830b9e571bc877669d82fde6288fc8 100644 GIT binary patch literal 31690 zcmeFYbyQqW*Dly-aQ9%royIk|2X_x{!QCM^bdUrMF2Mr?cSvw2KnTGdLhulR!xX>o zecyY(J9pNsxqlCQwF8wdL7Q9b(m0#>9rlNw3CIkYP^!P}QU4_8NXKL|uWGS$ydPzQ7Fe!=#bCv(?tM0w}^*qLZzIXQW~^x(&L zbg@d@biC`#G@0cQWhquH%qnqG<-8eEUE*cCet8!@cU}8NAqVx<0n7WQy<&4Kb1P3J zm~zOTK8>_|5>qnBv-EMiFDUS?FSaNY0Rv|Z&fY=Y_+vQ?h5-3|y!y~E&ln1Uh-wxN z49MO2+&;V_|I*Mx4e3LIz=v;!6~ZNrLiBCa*=Q+4^U)#i6i;hUA&4Q6HJi)JYd9PW zxKI(#*-1pm(Py1*L`VxMrSlFXLKuR_lRAQeWab19Iql2;>I?Z^3PDu$cNL@v4L}Pu zBOs8&M8+}1hU^y=S%$$y1VSV@PN;+n9tub=<&%{#?>1{D;2{t?*h$L|CWny+H;RXL zS$X=~>SqX$F>{Qk0+2OiiCnpXAMJ1u9tgKAwx>HXL=|EsCQ4#9JE+lv=P0UoCAgk1 z=phbSL;75fti^r+CqV+Sl}&Va*Y8D;?x}Kw3#EXhlT*6v*QRBu!0J6;&am0`wFo`@ zl_uFKdDVKZjr^JH!CUG>>0ajj3^eo5<&LV{oN}e|c~MHAD<>nw3`xRolV|VN5EsId{0^>T>;l$U!xr*q2+~Q@y6UF+ahb5K``-NV~vJYcvwgiy=eGpjbGmv zTsdlUCp})2+ugAYjFJRW1e>%ns73l75H2b;qA zpY#p*oslc@SyOU2@m?1dhKs1sNh1B7_ zz9J();a+?~uswmi{DC2fgFN*)lE?EJo^A{6eNDvfd z(j0N+i+o0ufxZk*M9e2@;}{4{lmcyBjBp{0$kQ;Pp$B-qHg;N1Z~I#R1q1&wZ80aD7*a?#9m@BW^!ibAWV-H ziDCVsv-ZnX&#l=N+cmrecS(K;1C0rP1g4a)RL0?uAY2q|hcY5D^Od}Tq)K9cYTu6W z8ihi#^efVvP&f093_P3Ad9z%7oF>8-y?-r>_4&LB+vA`2teDOG;1oqSC8>#-8(iE7 zIw`oM3nc0y2_XwX3V9+P6B3IXb^_=C2H+O47DTe0V6prFU|tWU4%vt##;pf zY8E`q*a;aHuG|b+QKgTxO?XdYj$_W~7~YX6=2*%8rkzqG{a`U|powlD%ByNfSD#!w zd~Idx4i$>bmanFH$$0T@^(`?oIe|gkv;J^A$$44kf^S+!>Za;lJX~B=meZE*)@Zg$ zwk+ntlb(rtm^1J^jP>yKLiOSv@Mn@cJY!B{lNsIhpFRzJ%J_6y+gDF+Rc^j#=GV_X zInrM-<}gY&)|TA(=A308vTw`JoyD8QylB&;-DJ`9!m-m)>%hvJ)Z4?GC4ek|^oH;6 zv%jQR99Vo_Xu}JVLBOB7*X*>Kuw39@W&<%f>p!J}oP5 z_$}70POY>p9<7sZ7p`h&uD|Vm`<~LBrJOEpk*>@7S^GNq75Sd|a{d-uzZ+)ku^o}$ zTpZM!6! zf=Pi%{%7IWPf%5T$sa1dS+2#d%_nbS%3>N7J`QQT#d^!EVXA>Yg)${IMKqsl*St6Ph`A-Ykrp|L@~(cE83A3^U(hexNX_(y@QI@x5mmBZ4cw=Ml0fuhMU&al+5 z_pm)P7qfi%p=P6I@3fV@$sTl%b~ z%A^1`wWPV!#1wIc)zVO{ubL=YOjaw^?!mEE*u34yA zHT~4u)cVOb#k@M5WMtM{zhWwkpc=$J}Wbq^~ zNVMWv->haTWFlr|^OFjs3dBRJc~5PpzYbz0T4RL<75$&14^c#mekZgxA0^~-F3k^jmpLDaA)y znwMFa`kE{!nNqQvf|e|qe1@u$B#Tg_PABBm)OY)+=bN77c+Je!%()_B{9PiF9Oi00 zSu#a^b$wTKH6LCKlMnydIwFWn31Z$X*DVim>TN=DdbP??8#MP1b@}iep*0)1TN{Z>u_*w1PC6C-~s+O3-sHI-chqo{8tV3vA!ns!M4*47ixowFFg!CM5**_i6Z})L%PsiaJfXKd zS{|Joy_zVFc!%JgX+hJoTfhFY4|n8k1T8H+7QKpmaRQ}qn>LxQu)dA%cXbZquA0Cj z{gc|)n+${dYBAYE&ri>+E{97?KdPBjC6zN((`hs4cGdi@_;vf@q9$`Dtkgq|Gp`_z zwA{P0%cMw4%R~3l(UiTKzree0qPzMyyT7%>zxY}UvjekrcRjG@3Y!?7L$uW{r1tLJ zQStTYboywGtI2R{oUux)@G{AF!Rf8VZz1DHhBsc}`+CkytAaCZQ^wxOyEdli#q{;o z#e9ukCG1U3zjS|AP5os*oD>NZrd;*zT=p2epXhAY^$`(P5ivR@U3t}26Y^k~?yR?o zaQH;8y|JxE^qaqLv3&ckLyfA7R-WnV`90X=i5%JNWuG{{t7Z(kaf7)x_ z)UdAp4I#b^-ih8x{7ahtUax+t9_Ar*27fk--iDqd-Wig>$-s`Au9UW&Uh`1*aBe~G zZ%v;zk`I6^8l)u&C)C9jq8|v?at&d6s+V{69YYr43R#O}qNQ?co?6ZjS&5*2K|pt! z+|LxHtUC6VEn2^(R>h6UZMub}Ro;*AQuERXX+EMOvQnlC=7cku;>$GrY?~oSV&^sa z&?}}0CQ5_VV%}1k(q9#6)uxqPWsx(wGxHy^ihOh)#*vAnO^P6!K@7yoFEf(a8rZ`> zVi^d`chpHA6qA3Xpw0fB&Dk#MmE*H}{`JK3Z`@z8HLc^D&&T5f_7ANpFeB>NX_1*UICdHd78Jh8dXz_d+nAz7A8%^{|hy`9yp>NQ5_8Jixca ztmMR&%R8df>P};SI=?Pwn||+jR@^|-eq!xdDeQ#_)xXnZ!dcdwFvp-q~6 zJa)PCf4x~aKz}jnriW!xW#6&lxo&0&nlkx!$@ zl?d@s{L=AZ+f9Da&G+7&+^CgzT`j?9aA~jQ6GtecF&v(M5ho?92+q75v&w)jU5VaB zeutf=U)5lk#&?N9EugfoEmO~Qs_ ztR2s7Gx}ot*$1#0vR{lTp(!^hYpA3yFw~itJy9dOQSF(S|I^&w#?5iSF`~Rs&phf} zBiqy~<}gvc)ctq$`N^-f-H!Lt9#=fk-Neeo!7Q09_kmXTOabMlq@A~aYI8S>7#Y;M zM9$kb46H+DJG%{41@iVP?mcx2y|qlPT5U0xc5^taUOIL+xXNBRxLO*_eD=D<9N%FV zxM;|Bc5;5z>eY0oKA5nm=reu1<3-u7=l9?{_vH!d@)35b|EJvb6_5?Wlu?#JN7L zmCxO&ENEH|;h*uCuJIe8C^t zAFv(b+oe_Ad z_L_bQ+qu8I8tZ@2lkH`~8Tv0E9-8LRm{2{3>$JTd#0V28dy0qglGKE6f(MnS5t__p z+YEsnr)}!0eRTOjusD72;ZW}21$j0_YyyR9dybRIrHNQeQww2Bv>%CYop0A~;oZ*V z!HM+2i^iAd10*5r50NSY0;Mio*wjdWv_=tV!}$?;o?y>RL^xv3Vw#}6!crI64yy&Go)2C^^rhhcI`S!Cu)Go!QsHv{n5F3Mtpu2hj z2f=B8LyLoSU_pFU;I{wnIV|sAozVn z#CL^=qeNT%cv7tXgdGYwHb-5T*}}!|BaW5EqUIZ-up)?FqjR-sFNeh!Mr>SWKQ|`v!o5EIbrP8D%fRnNmRxa**SB(8{ z-Q&0ixB9fl-*7$Q_W7hxe_(kv_Up^S7{hqlB-Vk^{Gec

}wf*j&@R#Q6M4ppsp)K|v8-g)LKr+n

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

AxneYw~N7#A&FF6OUYBe+_)cNv@&LU+xz(M z6|noj#019y(kQ!4|zd+ow|A`Q7YFK$UBbL#XJ>pXEDleN!wyp=kPeid5D_wW(S0s zAbkT-1wY6Sqp2wG!}}#-?E46}OVCE*Q{;%eAiqKkin!xdc`0OHFpj*N zlZ%TM@g=G#1j2{rU?=wacu=hQlIk1~I6?6@pOVz=NZtE+#?EfV8LA(YR0*CxE(kb6 zUhC|i#cPf$L?M`e3VRdGtsmsu&S@wF##u7jLdQTcU~-#g`9qxcdoFfhrkeA1vm;eea@E{ zb(c+O!UUQ!I?WsAXR5#X@WcK zCwg6ml7A-LA*G&sQ-QKo2kt;_2ucq&&W;1N=ok4I1}bI`Z*O_B3s@8G3c6di(?@QP z7cK<+eK0%jiFb02TMG>=yO6j+{3dN|t=`G|)BCRU&?amvocV_Qw zZwENk5cTf}6MhqjS8Zr$cqGDrSzRRt0N}-#ZEL81^07dma=yh*hz`yz<<bS16dOA zJAW7E;ZUvAFMJFWia`!3jHEz2Tzt(m`>iO~pl^^gSVcNAp@pxhX&u^>Du7GAL5vUg z4eKPc77AmYq@E`^`d_w1`=>RFHkATc~l??(RZJH=T;qDbZDo5%3L`jQBNX#{LdBoY_=&K=z`%FHjeO;bv(K;-X%^6G&(Ku`wsS=3|-z|pvgaM@($%E z>2|{RgA^(D51$%%KSPZ{uC5ifHVxh^_2E_*F;s%{{qVEiUiFi6^#S!l@%Ew*s5Ga? zj);E`GOGYzQM8Jsi~=-+uKfUN6rivu}K6quDgzw>W~BI052q5$bxqd zV>$1YMWgPsTF?T7VUSJMadnoCM4^&K+1QD{)*e309sW}DY!+)uo8peMWF?lv2Gne- z4R5I55+Hm37R&)4s%$Rw#MknxO?cfCcvo0hXkgbm24M=g4I2|z5_3W!)^g~bB69Da z2^O-9#sn*w+(zWqXsP25vbE1fukf316Tn+FsK@_`s4 zu&N}4Ps_Wf9+)0B!O)9@^o4z_nA+XHJv}|KD=@<IGceDmsQzuzI?D(yXg&!TEYULk#1rD<Tz2yPK5+ z$?NKI&e^qZ8h+{w&I$_>Ilb=6|NLFPEDsUV9n^+U`Zv-FzN_+*+;tPA=1)QYtl>TV zzV8FZ)a-oR&MbqB}lFMX8GTj8G!_c5T>S*#8<86efz^9br6oFTdk;UfuQ~I+d$+`Ur28L zbHc5u#%^E+NO!EVLSOnt}4`4Xm{$Qn7ffqBa?Xroxdh zomXwT!ZZo9QR+mB^8@zrIZ*o;-;&Tw(cd#5>X}>#?4&glKSK~PdvTJB8bmN z`Y^+_ilu-KAxmSd$sdwPb^#ZR=U8QMi`sFBxp&ea9?yQ#%_KF0cRp*e;fen!LCEmT zt*dmbMV`&o9bX7#)!AyVo~Lo$xcd31foJJY*cT1cQJBft{t#r?En5~O$! zk5D+Cm88?g&@e6Fgb!c|;lH$9G3-rgOK?8dK?<3#*h(|>Z*ZF#w(_`fG~f9yWv8v1^8P7)WNu#=r@tdABj|JymF(n%HNtI!+Od^24p?G zyy%H=W!9tq7dga-g%Hkx%ea>VaNxB+fY>0`_3t42HQ7ZlNjt)?$qOrtC zS-psq(R6=NaTxNK1V0oIO2?~YPhGl{wsF8as?kfn&6NPB5;=a%#aK7_kTTvP=_!=ANT8mIf0cC5c9>iXRgq5dv245b?ZpXk>H7 z!?AookL-Ev(huwteBOWjF^6$Q`t}9AE90W+}7A|C=9IH$r2MUGednO9eONV z9|Zc}>;Vye-9SlcsUxI&;bRkZq1Bkmqw+k@CTpJYO?%8j${VP-?n?6!Z|AEN zWO}1H)qj#0k6c_ z*doZSP`5#Z=`Fw;FwkNMKA6U*+?Pf1#$w5h(lOknTsbTM|DN5Zy8`R=fe-s*Y-}A! zPx9dOZJ)3VYlUyzT(Pg&hEY+!Te^qce`dm)%&r^pcgfMIX5Pjzt%!NDnvw`vM+cWX zgO&C2yq&PI=&0oI`{k*BLH&CSH*!U;7|K=RJm8HTN7btSiULjmiYA~QgItZ7_&*?1 zAQjGcnHn&YUA9PSAJkbWb{ke$lQT5jw@^vPWD>o(asP3Q}8zZLub|ojOBjCsb>pQG_ZER+=FBkiI z>YsnTp}~f)8aR=VN5@-E@Q!r5j?G8f`b#WLa6`M)C6$GdDp!br{afJym$ph#rXMI) z8TBsQUZ-@joSvC!KffkVewF04<25T3;WMV`B*Vcv#pNf=YtHW=KkkG_{bf1q>vmiV zU&e~D{1^llQ&Lhs86e-U3zSRFlb18Yx5K7O!8=%TVV#Hj3>Yv-hPFD$pppmjrN{E< z62D!c-ub%hjUkL2&yjK2n!gqVMj>1C8 z<6|!*B7D3&(=!^IGR)P%Q7-E=PE16xjM64|-%e(OH$AXYqtY;EgptswLAQ*kTpYr8 zmFtj}2F?c_S;?$DR`5!Iv3C5%;?_6Z;ptS+zMZ9#a-Ka*2qPNYYSo1@wHD zj}~tG3A9_wbMt$EchT>p}wvFlI!8- zbl2tYR&tyym0tZjn6#bdT*Lbih#j#7Ot)I~sMK0BX%2Gg(5Eobx!7DPSl>ZdKnga2T&dy&AZxiN4bd8Kq11AOfSN$wkb^iOfC_b9A zhI#yIX(vC2KHRkyw;#;55AD!?TGa`2BG{n#lu@!_5XMZ%MzB{U=Cv;5(P7cVeUIkp zz>%MIOPRw*lV|Zlc)fe!Cibgn=eL#=-X6$-y};!7Y#n{sGNrSA;dBr-9$d62i^And zZNvatm;=6yQ85Ol3_unn6TR%T7l;;rxY+wsql=!CNzB3pz%_fxuBRH+u(%(Nmr?N^ zKw!4^m+5JgiF&VHu!y9=8AFoUl}kDxJURK5$T09Tc-)yAp3oTR2ha*&b!wDjW9C;>WD=R= zJx`j+E%D3JOV=TMM&6`^4p1BxqI{M8VJ%HL2y76d7R&Fg{6dnPoId9RQo--U(^?Y< z-zCtd79VQ%xRU@r8f;Q8mHZ>-MFG|F&N(@F@NQzF7?S;{zAVHDCr5GdBYuf(|K}qK zj-u{evp%0N zldY1NpUCuB)g_Ym8AM<=ZbMssGRsGfcWHmqe)0o%0&@`?TXjl&eYQ4f5l{?L@l3hN zwR0j6B!lG&ChT+69aG)=*e;_O@Qov66+drXEH{poGmJ@0(2vo|A=3 z%%yOZiB$@xu6)Q{Yv?f&{|C$>U~%|?U%2I^tJ`V053ycQmkzy2em?y8x7w9~<3_Fk zi$X<<6dimg>8XhDx76top`BjsQDJeHa6st>TYLKC8g@XRoQRj0U8fUT-v_M*JU<%3 zFG#7RrAFw;a%i6;^fd-t4f(Z$wzzgCyPEGKf=VRi#rvS)2Fp%%S!5Ku_49q-U+H+u z42Q^bl>4Pqnqt-rfjW->OCQe$Zd1_x~44T6D6NxxUm z9Yq7xIM6ci8Mf%hM(%LOAQ_B}2U%5A5xmsZRCzf%eXO0Y8?x^&ih>H3)iuKR((E6cfA`neK( z%kxItm+t)j2Csu+Fy=pW>VnPVsS9W(JtD+Jf>%n7@B#e=Tp;8MM_PcvOnP&^QOUDW5$^=pMLw9(X-goAYe$X#l3Al?8$fDLX!nD=#SITC0r zIJ)HDye=YiEGq3grBWb=b`GcLtPfp^p)a%4Igk^-|4_l86@-}6QHI^S?s^k}8lw|# zQ`mTEfN==C8-64Wj|R)7fK2_Je*xV{-{xi~Ca6DfWWYN8<1B41h77hp7E89>@G90n zz9EP+@?Ti-TkJZ9uPY<7b*?}`_H&j)bQ-V509kE%;ynvFT)6DRDi_V+N~iWi*xvIy z8gx=<&A8Bm`txJ&bR}$1JM>|07gQU0ZD3v`O z7BHQ{_OR!PT4oYgaOvXQZRDP4$6gE3n>I2}fCguI8l9$V8hbbNf<=rpns9dC(b3W0 zwhH|&fjXEK&UdolUo!mUXm_Y9;M-#S_yc&jk~Ic_4OicbkvDM2pI_jeLDpbdr) zc=%nyl{7bgxToF8?*DK#4267wPdajAgP?=}JjY&Tmo_UQ!qJ@u6AN1VS5sl~;5CQ2 z@U4aR0xld?5G*Zs*DoFGvHN95)P@8>y-F}#zc8Dc^j{t`XPCzqx>&9ecS7A62)mCx z9~xpsdW^qOptb*vjzx2CI%ksX%s*}`z=y?IQd?~SW^#QM1=c40sOK&)_viE4xO`P&ox#!a1_AK@y)%?^#uRzKOZe3i@!f0u-HK;zJqT_lUKT3QLy04^C5ng;`A*#13rVkIQahG9Y1rh2>n+Rvh=&D@XY?Bl?h7$ z<@W~fQ7JJP_AKhsoy=$8@rPp%_!jMast)zmHXeHnvtQsQ1BU2>74AS^VtJS_HM!%a zE+F99JC5WO#ZifgiOJAu$KmJO%-kX2GNznh2;AZcoRipADCYHmtSlJg!>$fLx4ey7!>0!RQcyh>At_l zoQk|dSZ&p)v9-_b`rdozyS}`86Lj#Lo%t@jaDkX$+2DcE5egNfa46=Q{}W@LLBMz3 z#OthPacv8cC!x6aQmjPW;LUoWKv0c!jM#lFWhU)Pi6*HIT>39GgL|fG#l*mc zVWQC}j{2OHm7G9vFgSi> zwq6w!E;!_TL&aAhq^F& z0Yuas>~8p-4>kB3?>KT=EdNy1Id3IkUkh(o-g137UpakKMj#JfH*a;1=*$(w`BI-v zvT7;!hn&k0poOjzsT^nb0)xepcX#MKUbiz=_%SfUmttA}yTI_Wj6m%4;Ys3IV;5Ul zm)XY!)x#MD#Yp_;!M(hRttygul|RgA^d*1Zx6ojz@Rm%y#svEdJk=!)T&Y5b32lR) z%C8#|e~2M9TCd?eGhT15icl!;AxLdw5A9RnX{T=8w;M|^Lic}@B&(p%1H!UnRKw?k zJ~Jqi0D;dj zM{S6*nv}f5hh|e6sd6Z%*Kn@SkK}AG@q0;-yUP^DNIZ|MM6uT6?xP5vedGeXgdLuU zZge2!?@z!ELHr&|a+b&CF^_^BX!%sW^Py03qN=YN6+Q)S-OvNm@zxFnT#DBxdA_gl zzHnGTr~(mta(DOT;i=YXv1iF232liK#0~v6LuJdbjpIYE zCAStoPx6TzS~c+$6$3w)9t918*kNToon>9;QK*7kcuM7dWcIN*=?Ez>gTbI31`!1E zG&u2Zt3tCg>BXw}hKjm;q^|-Adv$K>0|Cb(eAx>VK`<`l83Nt@WVn9n8T+0RZUTd4RazeT8|l+OYo)(ouR zpyeniV~FrquJIC_qnuas-d*_MomR+Vl?g-XNX=xMo$&BqQz$(Q!1%Jw_buRfVkODT03F1VdF$)7gN`7737s3z zKslb=mc)@`1Id2)^p>7t*#Q-Ne9W7??ARQ4Cr+Ft>F457cEeO}~xnnRm&32H+B z#lvEQ0(TkCiWV=r6)av*nNx>@9s0ijqCrfg^;UV?A&aim7hkg+rGdqL2zJ7G*R4)Y zjc{Tv!k+Pz-m{8OvRGw={ixN2T+!*FZo2s<|11bP1VPO%YD_GTSp?yt{7(skIOn8- zC^izRXF06(TLgQzc;BI$ny~F55W=%fdSzrIuXUk+2X=c1ug$4UgX0M1^Eo+R{=%Q< zhvKwWIxYk$Xv7xA%1ScTyv*Q#^_MOCr?q`@?K|Rthbk&=oxS;e30`#Qc7n1Js9vJF zUv5l;q%nSq6Vm(vJm{YvjzLonI09is0#2fOtycZ@c$3`T!h^lE2?cs;E~%_NwU~4L zX|K8kV#CI5W;#`AXB+Fv>zfGjU3_^(-x&zXK{1M@mRuPb?DmyM3zoL&|EORcJ3e>E8AwRm8 zKE&^t8@zfn*mxatt`MJ95Gy6|+S4u{;X7jDq&ISgCh6EdU*3t2V__q_5=z*%1J|*8 z!RbWw30BJ>Nx$xpJ3J_zIr}M%ymPw+5Lu)L_gpYA+mf1&EYJ=PyqmuJgL;Q*pL9GC=F5 zJOyx3jue-O6n(MMXU1I_0-yXYcRN~ak0z*Ti?89N2f`2l@Qak(J=dP_;Pt9<6MREm zo0d!{y|8|V7LJm9 zPiVkAHO6Q@xsu89bV9@E+MDw6kSc=hRZ`D4t@m7N23K@m<9IyI+}EM<8B`(TC-O9D zxOa%2KNu2FVBtSY_Y%j_!pY5!)?qop>LhLrKV-sMC+OOpeyMiL7K?+Goi4Rlaw z(&C!t=kni>l;s>78%dKXVV-aEdA*4|Z77NF|Y?1O(_wUYDre^b37tArY z@M@wGPinnMFm)kj(k(njFTdkGT!?%h!)H;3;FsOH)j+}m#w8&jl!~NYFZ~m1jYm76_^EHA@Xp7c* z_d92BjeDUj(d~(u?^NY_WWo53W`3DxTC$1>6(AAIW*613r@|@5+$maFqL5 z!77hz(F@b~$6Ny4X0F#%zdgMezbVU*Oq>EAU=BpS6yRSFy<=6=0yvg7Wcub3P7Djk#yq5v}L_!a) zd_XanMRRk2HFcJ^n- i^i4Do++p|5FS;&CR|~0`#9{x-3uOfj`4ZVj0sjYq0H)CZ literal 11407 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 From 96678c881377ad60dcc7a5a5a4f666c53140901d Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 2 Oct 2019 01:27:19 +0100 Subject: [PATCH 091/129] Switch out favicons for hometown ones --- public/android-chrome-192x192.png | Bin 13534 -> 7215 bytes public/apple-touch-icon.png | Bin 4880 -> 6376 bytes public/favicon.ico | Bin 9086 -> 34494 bytes public/mstile-150x150.png | Bin 4523 -> 22374 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index 7a99a19641acd1558c8416b16c16a814fd953491..677aa9bc7b5456d6bf7c61b3fd072714d5ec303b 100644 GIT binary patch literal 7215 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 literal 4880 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 diff --git a/public/favicon.ico b/public/favicon.ico index 79000c9cc43c2044b5ab5129202e993aa2cf70af..10d892a88aa20f20f8383c4aef9c902ebca0b1b1 100644 GIT binary patch literal 34494 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 literal 9086 zcmdT~TWl0n7@k@cG)M&lYBb2LS}E-=pg}YN6Ql8#Xi^J4Xdomcrcb`8#F(&9=oX4f z4JP6(L5&JXjF*5sm=y7n618-<+fqs|SPBISmX@WrWsl!?c4v1kXU4ryphLd?=ltit zd~@cXGqY#Vv>f~^@@n`yU3+DgrcKo}tpF$jRshszax_#TX#8lbEY3lHJTL*62`mHr zz_&mha1yu(MB?a$JPP~_ya%iZReEPb(*FiMF4}rCD`||w_`qCXC9n%P1&A!r2H$sq z#lZDh5mh)NW+AW@I1XgPQ{@{*%-a=d(^esl^nok|IssL_%c1LQtn}WNHbIMnf$xee zxpEHA0IZ{b9b%n_ew>9uMqR{t)***#ZUGsu z99YLkQsn#>?562qa9`!3e=~3^Fa@|1xEr_!m=VWx$Z5b`z*Jx|a0@Ul==a)cI^_50 z;Tp8-^Js?r^R?W4eBz)Qeez(>Fyfak+|lk3;&TRTs8yqbb@H>&4h%G*Y$TG-5jH39|ae# z1z!Vv-P0fweB=E*=pw*qamXev>+5AB;ZQ{}&!ONN1to39wJS zop;8Z`I|aykB56Z1I~f+`%JZ|cc{1L$e8mth&5u5mnr80ou)|!$_p+h=U>2=>xVsN zM)Q0{I0uz{c@Ebu=YPf^XYQMfwc6+hXX|gESZzDh#)!*vFt~n>>E6>jT(9ldGq!Gw zr2iZoMlALFJ~$s%J-Y{b-*jY`1;B+{Piep-^<}D6`p8(Xq2kaNLv!=g{`Wa+^K#F|P|} z)`i1wQOt|KNQ95q+2Z!pZpZuL0uu+W!Qrle&6bMr@p@rhqv_vsaJ$Vu+*v0YD?yjj8&F?=cuj7$z&xzj9-lPreqa#BmzuwRuK|5Y| z`qAHZz>oQu*K|$HbIU*O&*~W(Zy2UAQqO=~;UNHx> zW1jXeSJ~^x%y}>Pu5seb`;5H%TYt5tcJ24nekKCz@&#)souj|?K%B2*U2y)_0o)UI zz7|+Nnzk$!!{<+?lz!l3NY*;v+|H1ed^tga96!x{Qu*C@zVhJ`MCF00l52ceFZwddqecM{f6I(tzzhG zhZsE5D*9S##IfD4ih%Oj;gx!h(~kDi5B`k9cyjHwt=~#M{I(~*(?NOwKF8g8v%bNr ze(fwdmyP`WjT#7`&u5^UKgVfDd+CQ*j1zlC>et0Je-Gj(Ho?%o4ybg?X&;Ntd$JB( z^BK-3Q$O!UaLA4A*TuFV(VqnTY3G(Imr=Fj9`R)I4fzv%+2uaiOn`f;hIzT_ZLSZq z*!qCLRpQRyPkeUdx$#Z%PJYXP&vf7^ zfc4LB5`(~K%>NMLa^Ifc8<=lKl22l(&{ay=WcVgY1H|AO&hG)-E6WE;fYku^Cw~BH zffj(ZcLCu0t^S_NKJ^?w2+*E>^nU>;02r6?6aPnoc>`6+Z=>w%hp5qV#h|7MC@7?>}&Vyi@hoTQl`` zO?OZC)8{$oJOfl#ltO~XhX()vNHWsmssI2O@_!dBH0TqL`j-;W4bDMY+Zg~r9{leD zOJP7J002k&7WLHsq6PM=%k?`kaXl5v9Pe@f((Vy^*=q8e6^kf zBl9D`Ww9hY1ak#3iH)Uv1-+pl`=OyllQL1I!QoC0S{~j^rghG;d=*6>6`Zbk+V4az zdCb!?I2z4+n$2o5R=@&CDJUq4z^%lXge4^<&&V*OK(}9}yMO=wEsvHb#KXf&NdW%$ z2pgNDsi~>DBz0_bboAKY!Gwea6}${?Ha0eTivJHA75SD!{l(>VadFuWW#PfC_52`U zbzZc?6|&>c^?RjT=XfJ|zCqd==ytvgi$H8n$5V&^khVq}MU1MI?w(KkA;XY3(XR6G zlExQOg#Z9rjaFDaUpZ%vD?>OxA5MRWF`T0spSL-3?;nKk_2G1(CebMMm(QBixm{Q> zdfdva-?aAb4sU%xN8tzwEEps6vN-HG^mt7^r1RS1gh*os2t&e>35%nGlY+0` zzisUM^cm@NScjuA>b!6luF;4ZJl&9h)M{~|^Ya;ax_+qD z52eXV7jgkdVOs@ce_s$aMI;`MB?uq?y0cz3neIN<5+UxFrVIf{7yKx_;>B3AYbEmg zS~En6=@Sdk>^c4S{0B>O=WkK$@G+}NwIC|$mxr&btE*8j1oEFM!zbu!gJ!E`#4Aw8 zzZ1H@%Xp06(2#}v{DMcIz{G|Dh};m|tp9Fw8!)u{n%AgRv2MoSbb6QJzWT%RbM2x9 zLNs92#45{rBZ3GX77SOw3emvr*y#B9xX2sT6-c1YNu@U4t= z9yJbYkbsU7(5yp%%zX?6+l>F|^p@9RHBJ$35{@PrhZlTwUSFoW25-I1t3Epb4i}2o z@Fe(F(AenwZHP#{Ykynp`leAZW@>6Gh#^{CB|a2+%UHkNo|ZQlG5}!P%-QwiTej_L z?=zpDX7nuqXo7158lDu>LN;wv|Hu{jZeG7H5uk3eWv#Hg+eCVQb1t3#7yMN3F#;}+ z6(%at03aIioJ2MOl1>qKcF;d3C+B&e=g8zq;PKC5~gm zUfSIq+;qMe{P^gW{RvbuD$AjPP@Tp?{}THa8Q_<6d{+0$9)uQ+$A@j6<4i0WgU|6C ziVtbJiyJ%RU~S|r)f$F5C3rKXa!_-{=pw6 z3yMdT55(y@9`cyijU^eJLnH?M)N+H;k!`*;i=mR*0mkJG4=cE_zkf5ozlDG0eIOt1 z-9)IZpd(za;IS=>BId60hJ_`2kdIE$XwJF!~R&D#*j988NV0p+hbCWwSLV zwRkd7P-|!e8c`zufOas9FUgm+#Za7{=Ms<0yGI$K{B2%3KdNR*znEMoqFEQwdynHA z%TD=`1Sui`*b;nx&=o$~8-*UvFp1N!Mtaxb2-2`iv5Bwqg8?72y|m+m&t+dfxd3md@!ryp8RGK#nouAeK)x zTc}nsj-$ejzI<98I}pbWZ!#RsAyrEG39lucauk@skxER7AWpu5{-WaqMz(Ohx0Ig9nb^}_7UzTB!;pr3@ulDck_#_2b zFczVAEDLMvHNqiWr+uQnFpPC{8W@9bz7?DuIwu`MFyJ#B4G2<%5A@Z#oo>O}F78i1 zZ|0SZHoMxj=0XV8<+Gb89#`D`%iDiaAl({95HF+*T))2b=Dow#@}K@YCY;40Du^Ik zP5csDY7uV~gIsn!v|Dyvw0l1KctSD;wjzd6IYtw35!-V=GI{hP7)Iw%D@l%MbU+tH zPoYr&NVQ*d2qW0ZWhgoOIoE80qnJCvE6}b!QQY1i9v_Wo|3E$eoA!^a`rI2=kRW}# zbO*F-xUCKEv7j-uA@h6ejGd-bT@OXE^eOTw4F^v9ldaH;;{~3E_k;tY@xDV(`}aq& zIX2<1uC3i1w&q5}Wq;nN>UA&R9jEyz)e2W6^fxK$Tlwe*E2iq%3x?l%-bm8Z;upu( zQ!U@$kb?Q)#kAX2CR$JP%9!x}T1e^K2f#XBv@5@?t*+JI?bCUTbbet;5xTMq-hV#* zoYHSR!yp0gI-ePMhY?tJ;)$YPtayPMo%$Rh^6=Tzd%yPH>KB>zFPOfmyWeeWF(*#E zwh``=Ll%VG>bT5Ib>~JQAd&L+=9_w6Fu$&t&W*c~#5XqLlAHxb3B7i&mnDuU=9FgZ zpru^LPJCy-Fz867(eoU*_omE5zK<6Gpm>y(BDt9B4AoX#M4gw>j`W_qZiFFnW@9 zQZjmht$9Ol{38xIUpn14WY~qSuTPQpplvH7pTUWgR3_iNr9ll(gyp*bQ1a{Q>S~0E z3v006bkz9$VY+p;vD94nGq%`o?}dn3@y~>ICz4J^D`ps!BcanV!}aD2JqKyiwDfWuE|UYf&0giLlxGNaxBoc5Lv*5G|Ilc!MH@ ze>MV=w6`h@qg-{7Pg;WadBhm>?$;u5X$s^0PFN#PeA~j=ue0Crm2QYB`R(&QBFn>4 zC@33(glz9}3!~$vv!XnmNgx3CPfvS?LhphGQqy6j$7g0%pNK*FjaPm!i2rr9#cLO| zZ5Xq?`>BpkPsx$ab+9Ull6w6lyp*e1kA3ASeUu1Q(xG-n%NwID=puaQg8qfHxzPL` ze645waZR<8$zmxiN3w7?s)v$_y@ZgW^5sbENSHTMtw4`phXwV31)2T)m~=C25;vf1 zbmjZVR2|sSK~L(aLb9#IHrTN4{G_kd?i9N5c(i6Oq2$h0(qCQaYQXj*czpJBxe{pd z9~8R!BgbkvLZm;CDY*@$cltNd4-nrg@`0mj1$$E{YMt~0?164(Swq#jcvI$7M|NHj zJFTMnVDH8N_{2LaK|mRg_;^AlIax*8+k{AsGnt5(Tv}!oOvgfoR1w0M5<8{n0|I70 zYmWp`f@4s@b32~|6V`%IO2(*g>|ylg{6Uawkc;D~UaH=qKPk6IXk(X$DoMC2Rvgm% zqFZTPNodOoSfo+4Qm483S>u<6{6=q+o0Z^C?;MV@h z{ZX~Z520qO2>&xi`esQmQbaealF_(<&QqO$dAAJWxVnpTG4MrZQR2}-d9L})2`5yzf^S2iu@aFE^TZNn zoKw=U0pZl^{w>R!dx!%!-;{NSsadV`6(eOj*3b z!CJ@lutI9xS)r<0bh~iE;xqsLg*s35Iw(_zD`c=S=?Ga-|M?YdT45V}q9}en6O6(x z@BF!US7*1uE1cBeDN;`yyi|k)VWO{;!)ZH??SWuYMIQU)f2~gVQmI+i_zBlmE#NW+6 zP~5)fAD4&PSOG=eUqUQg>nC(dVMr|G34MKi)8CFM0Oggkdt7^_uBanN+?FFbvzwb8 z41z8AyB;q_wSC^77ZAT+CLzm^C5eW3xno3o<(8>jYW|b!sk>PTdx7fTmu8qvgT*Z_Eh7g7%trR)a^vib`i3JKcFMd^j>mnw}6%J7LI zfsx5c9Hf%c)zcP4ESs@+cl)+kKjs`?oDgBQOU0i5$({B!m^;xo;S2dpc2}$gVZu+_ zt3ltV&EPBlqt{7h6Iie$xAoD1c_3BTKA#*TtX8WXQLfJ}@S*hMdC$3~`oLv=VUDx) zqGb(~JYiI6*5V5T!-$!b2#ZFd`(JoRt3r|~RVPPKRQ!b+P2mKub6fW|y$@~Z9G9X# zkhxI}I}den`RoV-I{eI=MjF;wRr76aZJ&EdHUiFmw|gn?UlOu{;~2U@#ddxS4U&1bEAr#Um$3U{0-il|xk5nX@ORzP8xJKV zF6P&D^RN(h!1h${7gCymhv4h$>l~ae<@dA#2l2?!+9NU8=j#)a5ipqUpP+6Uv?AvT zo|&Y-Ef)bj?L`QZwhr8m_qhS8^2l%RREC3tz$DJ9Xg>Mu2%VZ##3c`V<imO2&4vpl3^M_-_Ovje_I6)@z3~ww@PBq$z{cn z_fhK{`oZrXfBP@DTFm}gNNk88c*lcFTf4J6SSezXBZLwB3gy0tZiJt1a$}?$&N$g+ z24aWvp0iV)PK|b6<;Jk+fo2Yr*f+^{cXzj4zdK*|eLT%VQeFA*3btmLpMI}vr}?d7 zKDCNup6h#=f8qGj+Pfah(0dPc|M1X%roq9)6Ct-_VHkP&%X26}YNz{3h$@EH7Mxms znR;}5V0TvbU(RO#(NFA=usWL)RZt_E6D%%k&mBbuK8^VIXE+Q_xtB0-CK*DtQpEu( z!wz&%!W4`LylIEjIa49^tt|^hH1XGazn|y6D=IU7x&0Mv7!R!ldjC9lLNa{%gCPn6 z-?yFt-qu1RobD2k$DopYcf8bvOw)b0kyQg>2TLAg{rT2=eP;MBKh)xrbc{B4MJvG2 z487?-7Vfyr5WCLU5JMtVfVtvORruU1cv_G*ElFs-RMVfyQ5EHcB_T|Byv$)qIsQSi zH)6hv%N~u-fq!J+0Oz*q$%bl4!3o7BQqqK;I^nB}hYvWp8VNnh3x2!mHa~`6061S} z#*8z6`YdeP-GEm>*}(WL{HoFd6Va_fB6w5Rm(a3*c+?l?0mmo4glYO*U4W zXS$^^vvX52M6Xc$+iv!_+HJ%_Q^{jd!4>)T7`ygM!UJf&r}*Y@t_;Whp?*ro#?hX~_b=cUbknQHcdZ+qkHTi|%OLrH)u`6G z{FAJW@-RJ_?`%!_AL?O#-NnMT#HR&uHdzx2bV`r&?>=Pt;kIdv+FhW&d3o0O^uIJPmX0v|((f3g!u$__JU4pGcG-dn^fE4yG}8*Znr( zM0oY`cIHG3bC+T5oI*RQ+n zQ6krS-&ekN;?qdN(ulmcwT0iaf1<&zz5g{Us+1syW#>8X-0H9sZipu2fEVtzABvC* zuVeMESpvmLt!}FUjHcIDui3SEi0=7ht!p+YkJk>zc;V<79W*8p!aW-KKBzQ5IE$6V2G`|S zL9-Tw0N?;O^H{D2@dV#I$JFOHE2tv~mLT(lCoHYia6Bl!fj1V3=HUDuRSo_-<(Qdo zo&LVyg$g{G=Saq{p$ja-uVok$7#bTo0RGq^;;vB{BTLl;uOYc#CDr|_Ix9#iyQ`<^ z#XM%Kb{hH%H9D^jNzi{Z&EXc#ez;KL!P~?JRwEAFONp^$+H*k2+uPgs;mm7hYe`dn zwb99Xx1J+3egRI&WBR*PE2*O2)mtQ1Z3Gf2vMf^rX$K!y44q}JSVKM>l`}^v+|6gT z?ig5kR!zo)-~(h1X?0Y1lNy5wD#A*nJjUb|T#HJq2h7~9c$64X_emF|mLKsy=^RAC zh5G)sgPLDW0(_{!8<+{gT`6gGq028GQ<8t^l${>Nu~M$%ZC%6gn=0#y4KR% z2OT1ifJe|=?4V`T(6J}Z@9OGIOzG;?JO*6Y&`=1pFp@fC=#t%n%tf(8q>i>P0$SQ< z7Y12UoBARxupgfw zBLP7z$OEGMjVX~bVdB@f+dHIt3#L+GuZyO;g--K6U`>afUtAES^ZzqEc($oS z#^+Zmbn^0J))W>l|2MPPv(qfttb+tXnZ?rN+R7VgIlnVM!?340_%buOJ32c}M&K6n zqXZcjTmHR&har+(O@SQ>!;V~zuSU}z2<6c0U6_WtT1iD#)+qk%D&G=NsFoJdXN$VZ zraT%7JJgY#OCcA)S2N^FzQZ~SjozYoV@N&ni^4`Yt+1J3{ zz>ed*+3vi3?LyUZts4~hbp(MA7+cv#2~1RDyPnO>%>q>;%sA$>f^}ec-Vf@4mP<{ z&z|UNwZ?H&nCdkdvx5RYuVP#{EZ(eFFHPwgy4L&fYq%Ftan$@!oLuEJcJmLWK^^^e zjYj>;cy93ePIT!4C~}fkq^WaM-B|?^y8hkxG4ly{M@St=-#@lIns02@c6S#=#HQcE zFLI)XD-+d&SGkaxAQYY)IX)*ko+_Khu8HlQL4?v@q*}xrYmt^}vd<-AL^I*=fwq^K z#*2Bqb!=xXio~UklQPdTip5$wRpqoX9H2 zg?mEm)SknIeox@vzn8)8a~1^_R@5?-eGTU#BpDt#n*FOBRSC($Oo7Kt%$#=A2sPZ1 zv9ZW5uC^YD8b=XRyZFA+HYyEH`7Onr!?k{?qrWDjOKFgQIr(F&E)^({rST?fBb=IA z=T|VQ<6+ESmvY=bXW5ai_0I$1yVl#gN(b-F>H@{PM+`8SiIxGp zBzzx+*!5t%a}oeLQZ_ZSJWna&_0@#LP|ghDw@Rn2>QwT%W=I9-sZ6?uAH1VUHPJuw zGEJn+X(VIuyZf7@qK_lT!7Mz=ZBwP=!`)8L^;_;Ute`B(*=$;eCPJ%x=OJ*t?S(+mrYkF6(A zNEzR!&obliiM0#N`A3$>rD@PheJ?lx4xk>h%C(ava9aKx4)ajjxM>(>(a(~1p*IZn z!h8R00B-gL%}jeykn-e>wS6k~Ztkh_YJ5(njSZI=VuwEEEYEb$ZFemx0QDqJe-qK> zYB#hkKy%7lgQ!ROZ1r9^PLnqxH|fJ<{;F#BdxM7O6Z6gv%h~%uG^veGK1rH$J{S0U zD}kP*`2u!XyyI^pzY$J|M)@NXZ4OAf#+-dKRmK-QPMQyCsPd%lVI7WsQ;bTUOFIQJ zQcm%ajj0X}T60bYPh7pSpD_`jmnf=cjibjkT$zhaJDSv6?EF#9{8cS9IjY7<_?W{V z%7rhxX6d`pU&AIc@HE>3pSd}rVv!eLX+&&DbJ6=eJHHl8;`hY|N*u!6?N@aiju~PH ziM<7Jge}uad6i9$f71V4LBtyT`oCU)hLY#Yhoyoi?L`wCy8keQqQ@HF87$ikits4E zFj3i$Q4^4yQqb8+01^i)#5A4d$ZbxGY5Dop+*f`DTVAo5NG8PcRM^hIA@$#}acO@0 z(7N7#-CCMExA5A%ZWpS6W;qmttmD#K6SucV>G7Oga@^_`yQ>WDA4bNYF#?^I%o18Z z$$oqvf&|u@tjv|P?aHMYUu1Fwv#H|T>;-}~93{abXF zsDimY;^$>i+%tcU6FB?6!mc}cdi|Mv^s=zD+w{>TlDM^U~%%WkX&6e#8vQJF-IeSW)o*0+0HZ z2tUV)PC4a}$+jaji4_(hZJ_JRb{5&vs%mRd+^09Yu11J#*o7Qn!&{bn!3a>^1Q7<@ ziW99YNGnL*#7}%M0yun7Ut?%%p6`BpZ&^bz>RnUj>NL%)N+%G%X$Fk~x~cK&r&oNH zqIBp=74iZ)bQw&;%3@^xBP~i2a`X$9`E*gTABOBw5t$fCn!2l=!Iz%FOcx z!P)5M)U?OlB_0`=9AnfFvahL9D!c^Q^BW%&1R$R_yyJMZJp1)KTH(jld4oZhZWk$!~ zHrX?H!hT!zk$a;SAza7-5?malSuB{~?wZ|)N%!21hyQ#0VAu>`p~~O`zw7W}1mxKf z+D+j;WU`MrT1m*V`-FTpm4Iv(2e<2dh=X7d#`rJn=twea!EkTP}>uTyFkbS>lJ~e2-WuqrlXMGlw8M z{NkiE3l%IW?MOKS9a}N*%%;+vIm(9q0@a*gRsabMfdBRHfXDWycYzyHZ9U!BymsXw zS7HEKPR_FR)sc~DT9330h3Jsb8iu5no0cCK*xjLEnD^njKwXCwIlF*k9cOtfqjVMc zqD&Z7$PrgWXbqU-BpmI0skK2EdIGH09Zfyy?MV8#8Aij~D9VR^f9M(GV))pf6=y{H zS3&S4-TcRqT4!l;1_Q;w?KGh;y2a+}DZ|K8n%It#OJScNL2VdV(;iNla9kU$qJJ|# zXJ(_Uh2RM|r|YI#h4(oqN-@A!Boh_u@L~OK8uNZy>Y3%O>Yq{|Y~F~~5uG$^!_m=X zT~oa>XnC_o4VON{RO>Xu3%%?-!7zIN?~#-v=km>p_z>1tS>g0?ZPy`~#1Xn8DXjKR z7_mV;&$s;-nHf|G!Beq!-|1Yjg6E);AS+4l`-_r*zMUZz8y4`0$*<~xzO)S-wKwgk zpl+b2kBRF8?91i`_}?Iqv+~FU7yr>2B z)&lemJ zNh9=gB@0eLi4f`OSH5HY6K;29yUR&FSsnC0*r>}IplRo4Lo;Xc^#g^x1=&eT%l!mn zi9%6#dz?U!y`jIYe3p-eIvv@e^=Y$oZq$ny8o3x7Nz@t(<4T< z?VjD|OMrihuG_#KqKZt!jt=PCWHp(k&LM-NG@Xu?lDvS^-0gInDp1umj7|1mY~GG!F=+6Fv`243bktf-;a{}cB=_scGx7K% z8hDxw!6PLya8FH+l$C>|xj4%1!uByPHm}g%P%^#UXr5Ej<7Ue1+l0(WrSmabIn3)B zlVm!gfaDYPZOo!b*eGSNj$x>&zneAH;^n{(^>|D<9pfI_AkL{TS z2jVkYF8m0igAnw$2%KIX-jW3d@d>PoJSa+vnV}La?IQ) zXN#_BkS3j?M`jV)JqKe7hT&w#7Z*bZY5LJ;wI8o$$t|8U=z~Un2#cBL*Nf@?7(5@) z1o&v%?FNV3btgx52VCRvQ$F7lBP_3(FxE3yvzwMc)SPwgC;imxafMckO~p9)LTkzK z`M2?ick9ZAAlOtE!&v93SMHwI6b7Bwk2(U;c?=k#VpQYugxCyf;T>s$-%~1mH6FRi zkZ<`+&olg-;XLBOVfq&q_|j33xUwT$Fd*vnCW&M#z`g51>;00em%h3YpvywR&cLO; zmzZ1>Vfyj%D73SWu@&?mgRHA?+>8baJBcC@-D&egg@Vz*RGG&6h<@m}c8LH~-!~DC z@?`$#Nfi~a(1=GJ$t7rDuOytA+^fZ9_mQ2?GsG2>5Ap6>c!S~OVbBR7QaMIz+hG!k zP|X3?$qFtgx-4T_)nULdy1A$=@0?=(DpqR=&YD-A+UB*2EszB>1||lxCez4M5^qh$ z<>nG2z;yN>s?eph_;o84EO>dz_9WI|PAU<~qIU73JFxIuLTtX;at9spNJn7f3#+wS z_Uq20+D1zPN~SE3nP3gSYkh0g0R-V@T&v$UG~g@N)V=`4Nb-?omg#i9nq?5L3jhkY zLCkPZK=rP`dSYv2Ox3C{`iv?Q!E2Y!f&Tc7$2mYWWn>MZDipPm!@eaa=qyWK(vKf9 z@>YPf^%=9=X*uMg8E6H0Qjy(yAO4Q^?ECGd!IZ z9;C|!I-opa!(s(4^!Q^B@#|5b))O?ve}L0A;g#2q+(d^QR@NhRw*>MNv*(#d$*DJ( zo*4@|BuUS`5<`PfoisKv*5>Rh4CU?{HKN*rk_laRz5EAMf9WJrrVRlC*n0|2z+^=o zb9L;d$Z0;Zlp(Hl{ID0OE*bDZLfXZAfakB zA^PRhmBe3|=g*Ex)69o`*>Hl(q>@JjS-@(^@c8v58xi zru5ri17rK3jyZ%ZZ1tmcS+MCGD?)wid`^;XO6I+axdO;s>YP7=|SqKMzILznr*n4)xeH~sF5$Jl-3V-HCxmy-?bYe$XC zk3X=FU92zI9BE3o(LxuDaQS53ZSNooHHBFDisAwcWy)W&WRR{%PdNMp9k*4vYrC4V z2uN!&A3jJu$|9CK+kU8Z^f+N?aNc=B`c-8W-)0ONlf(UJw;dYV9Tt1%Rixr@XH3lj zTA}sVASc4;#p!y0YvGM1Vpef`yv?}bLMxS;iO6XYE~Y1%@0Hqk8CCX2F<9=Cn5$Bc zU(4aIB+j#|BUzR0cjKPp!_W55H^tIesU$N(-*jnd#9+4HmOLG0LN6jVLm-TfyEUiH zvmr(Jk)@4L&pUQUevmm1&2zF2o^JBuE_D~vEl&nUC=W_O?sf*g9LQ9((uU+l2^uyo zPRN#+TOH0`3(sRn6@pQ)VxIljeQwccOvLa`gPqmFU~pAI5$%3nNq zDX%5t!Qvx9DY@?)2D%(j#g+V^p*dhdGOuRz;uyDz6iO8FWQt4CtmdcNLjA7QU74cU zz=@79AVXj5&nR$Iw9txH9y|I^wdSagjIo48v^ylD~ElOXr0qvgEA%eRi?bes2Cfq}KYvQ$bWyE6nG`W;14h~hg z$ml}$W!+2{U5)8WCyyD?NY1Q)iyBT8!cl|U;+RYjy?K+s_|%*!-LevPF<^EV^+xFq znIRfE&18)w2d?$9AOo;ji`=}jQ$(a)A)N%8s%o04!Dx_RQh|^`^S3w;dV!g*Bk4u* zX|nudFyc2R{aBrHmcn#C;iL0klG3-~8w6R7`BR8r%*j2L)Mv5vN#$P*xWAjWZ3OJ!b7IV_%?EQ>FWRuSXTpK_BoGpW21r8NanB47 zEpXe;>RPs`a;EXn?)5|p7ZJDegCE(`#jn^HEiTk8-Yu@k3o7X5#Cu_k;?P1Zc9qV~ zHxpQiEOoO;oJDYWw!bHbOZmu((Vw=RI7poVs32RtxC_LgWysAW68G!O8W?$K-(Fv@ z2QlK(zHcz1qD|xpu_XS?H$OU%euzl>s*pgK-N?}#LFOTTJ%aep1P8FE3QEat-nZ)q1mHJLJnXylIrM_8>8dhPTcHTPiPR7fUhTKFb=5fKYYdM>4hgaKp zE>)wNV)JCZwO#Hk(4R6mbxv9SgNv8H;gq7GZrVc?2S~M8^l9yak|KEh0Qh|A^Yu7S z2(K@>UNihCylkg*B|;yIJA!Oo_o2|J(PC`i9ul#yxTud@?|t)WWN-j_p!nBwj&J8@VX662lngsI4I)W~HwFT17gCGpnhI{_Ll5da)-VuN!pTGxw09>V$Kh#eB8H z*p{`V7ECB+mYa}q-94y`E4A?Qib)=vb@7BP-^ZaXRQtU6mnxX0`{jY*cfDb6B)5Cx z>FjuLkXG2*%0<_DTdAGAyLis=^4kNzdEv zreOK~gMFaACXNgu9%6-;tjm-NSyb7Pa$$Co5{=FCpSusLGWkFEEl1bET=6x4Bz z-1xy#iMzA;oroXQSilkiH2Q6BqT-e$gn9FZ~ z{fG2gdp((Y9CnUogya_`!I*>z0d-yv^zWxQLPM+ntgo{L9>p~^aa>Vezt#MPK>)wG z6sPvS84!5n)c~7VZ}JsHUH32KN8<~VFcHlkEm4#YB=XJwAQ%M7*3Jr=Vao#tqai2k z+!7RY=XsLUYJbttB7H3z(6_UX-flZnR-l*iL;#g7T5NfF6l(aX6iJdjwTmPuf=Z?t z`+sQq!Qte(Bc}@9Awnbgf85!oJ1^NxcuifV*G+PQoW6^vAO++b$X4QbxnjOc@a6kY zqciK}Rk`JN7V&?=UX+2)H@7ukcaZk%RX#MjY>ZlM&?#H<3t|RNP$z z0VD7gx@^An!D@D{1$qMB`LYMWzvn{ZKM(NVeSFy_!vD%i5Ct+fc`_3cW_|vj3Q814*-f8!Aot0|)gR{XZW2=7QVo|~TK>aTzoL5kr%J{L1KZAXrr~N7k&L5SY=)|5 z3Kw9u@c!qqhx)Eb<%PA1J9v-6d~qP`gNFv zp=7YPZ<@3HZ`N?esD2eXt<7yoJ}8yhh}4x5;2`}zGx*Q$Iq>i6A@9HXlePUJQgK@bT83sQNN9R8)G?VXh6trq)$94r8z{rm5APj`<) zAj3x_4OT!3gXZ>h>j#`6$kCAQdqk9#Jfd7kwOARQ_YEws^O&t`H>FlqBcX7i56sXL z{!|z}V<^>QWT>Dg4y9J{VG6ZT`YOuOX>VyuCQ}yOk*6myKACwTucv7-cFyqm)>VHQ ze=a<2Y|qnM&=INf@hH8_mPnY!=R`2tqP(G6w0fA_`q`Q64Y}Y~SG%tqzx;45sE2*`edTw;bm!Z^Uo~YAIr*|E*k~Yu~G3jJqm(rRBxN zu%yiwyX?pM@3TCGQ8?(j8)A^-sVoCDieIpPZ&ikf<&0u6rG^??D=WY|<~B^J?pKbc zFG%~yy)5wC21n~ObpN}okv@iv6I;6u%v_yj4tlTaMYv;3a3*&yINx?Yd*5% zg{j3HJ_BugikDP<8xR}a){xXn6$b46UYtS3U3>XER-4`d@%ItU-oTBg<@wvj*y?Gf zLoSe)FrCL4+wXDyt0sGz)m{+!znTqRKE5Pd;|vq#L$MNYE0450J%!7 ze4L)ac#}tI`R7vR7rWUtTl(nW0h2+SI{M%N+Ullqb%>w7&q_Q3VIqo>Y~of)WPR@6 zs~}dn$%aN&pf0;lw)6%=^|Qx8)#v{fYbaxt`Rucw*B==Oieor3DE%tBC3(LcxDMm$ zZdWA+`8}iK{B~_XrB!_`*!vA4UD2pEjTbH4Z;g2@o6hUT7FN5Ua)Oc3E8je!bLovy zv(ELIc)vKw5F&PkV9BNHNk3oDuerkc1Ww!dQY0Lg=OXHk(QLccw0*_QmAO4Km?fyu za(hdRQ`3MRgh2*b+a_U4i$mi>ISRZ(Q(}wH-dj{NhA}VrqXxV{%>{>$+ zR!r`li>txE2^32-7DO#uelUd2=Z-+bk$1)SzZLIfklEKQNwc#n?Xxe0-s`~s0;Wb# zacqh*oj>W%ypP9`{&2#MSxZ#gapuVfMemfy66*jz#oiT5F<^)CP5W5a^F^O}=;lH(E> zFNLm)4*h3cAZ#0O?)Kd(ANn5t6tSf&-7b|Qj2_6gxiGfb=-K_s7(~UKUXxP0{DyRc z&(ifHeq+FOes%>&r&eZU!fN|^|BQI@LfRG={ws93@$3}8eRh!5>fYk~o1?0HklUoD zTOnC4G0UlV-E_}eQBC(R@N7V4Huvh<>O3o5z7@O5Jhou5K@x8FC^yEp+H3t8MjrddN&%a*ESy znbQ2Ncl#9tDWGElrbE(A8*KTtSsrS1?c)9>nure@WEGz0-k}Det&#VaJAlRA!ZrDv zQk^8CsrIqC5yTooe9~gIWpNLpw^8HgB2D$h#Dd1D0~50xL1+m@ZgV#waN`VQ;^Oi0$r}G4jkAJKqM6lbjwk7RO%$nmi3aAwO8GAloMlb5cDSW>Lr8Ud zV>?{$R7MDJIP{sNt#F#$^thNX9jRXjMXrjr6v{7`mPz zvt=sCxZBH>>xxM%ZUZ$bLty&Sl z5!cvPz^VK#H9LQ0bq0r*uEI;evfXl`)^svfP0{eLC%oL>Q=3bZIAairSO`z~Qr6&P zE~&pJL$ES@DE3K6R29iL5-b4I-Qq<&8Bj_c3vzNge0=$cd0Q5?1C|WDnCr#S_&B@G zQ?`lauXzgqVO zcA9@tEVe&V=h5tBD$TV<3`x@3)Q}2Xt>y^^lbE7QqZXPmy~&dQgH6gd=s$^nl#gTZ zoT)FbnbfvGBOn$^E@Y|TIW&V+Z-k+5#K_OQF!d^CL%)(GN1(Osb`j9wGaH_TL8ytZ zF~?5a#9%6VyUYl-_rKFohvtfA{U()oi3L_V~tWM-?+f0RZOA<|Lggs}Thc*%yz5NK&bu7Mc#hevHiK zNn(_z_f3S9I&VUq4b%_aY+GW`Q9M`LxPkzJoS5@dymlu zBH`D`AQ0US@G$<|^O#LnuQ zpq>l!r@p=$tN73&npEC1xzzwu;fRHrEy$*Xj*^~N{SANvas2S!=k+*}F{9%kk8i|( zo(Yfpgzy`XOB4}Q+`~tT5HR29{wRtrdhZSabGOn~ql^?f6k_UOA^Rssm=&dkMi+re zj8ItR1tHf5e97?bp#YnzXs9pNk!Z30AyrbyC05}?l&+#?(Yj}tUQkZB7`w|dtzzOrl4aJ@aK-@TD0;%rC62Es~OX@6i zs^pjWfC|a8z;mL@{B8M=b6w@g9>El*RB322LgG{yb#MlAnrb3!98D2PB3`lh#dAYa z{w3gz$x$Qw=b4618yWPKPokU|dl%ZBPZFb0-1*j7MwN)D8 zAQlspUQd0zQ+d4XNIkCxdHnzbSeBVzUu|~?onW>AMhWB_cw#f!KSz=Dp7A@DMky!< z(Q9SzEbBZ(_(*4sjg7bqq!VdoxNG;Z5=>bs_vh-6)sSrVs}2@ByQVguZ+A zBReTlUr{8e1$f;mW$@(*bKlVcyR~>fYgm4FT#&8V^psx={f5{wed9LG2YZxbL^@~MZODZO z`)mJG&UydC(e`baXnRKlOO{}{u|lFpO9;_>534L92zFPLs1ZbqC3+X4MelXB=rxES zSg}e(uVIzwyyJQQh3B{DKbZNH@+3bYcxnQ;i@qeXBHzQv;kn=lsC!UrMtC(cZ&NE6jLOzn3FcCmkOBZt*Tsuq} z#{i!Mzl}E$t>Wx67zHZ9-JYK!Vsn(U!Scn%G%y@ms2XlX$CGU^*g2^8vckz zE)v~RdB1#h;TXYO-;$v8%r$Zor_pqm`o^nN>;699rvWxQI)g^dT}@m$IN2GAXZ%E2 zjv$7w`IS)xq)4`nll79pCTMw%JdY%VD-^n&^5l(rW1u*Q`C;K4@j^L4 z=%d?D`b^7{QKSB$();X<+YvHJx<+UGLHQn09#K3N(*?GkqpjVHGgf~b*mV^BrZ-UaOSlhlrqlC>iwE ztKLAhB)AvmmwY5`8m-q}I^8?n71jIkofu}3ni(5;k@b*tvklo3vZSz?UE``4#Db&t z3$Yr;KdjwLvY^2+q9@nel9!n(D}12*s7!x z8@VFCWI6f4{5K~@_41GllY@O+yQq%P@(vYK@rbnf>$RdVUf35gx4mKeyVxfy=k#jl zTr2-_m1r7>Cx%^!yOnq-?(csj>qt^4DnC%FB*+SdD@Yk_9OELx#eB7NPR|J4=Y4u) z;LQp%2(P}rlaG;70^T|<;{>Ie1i9YelN`;41Mw1R7Mvt)+28TJWJmg&@M zJvJMO7mDm0ClIPL7M*N7-i9XA?M2fV)CI!M(^)dghoqh53N_h<_oqs$_p3b74dUsc zE0ZZ=6vvM;hw6B06AcS*$s^I1u{2;RR#B>yi4;@rOFpllHA{Ds+@oCu>V;Sg8)`QJ zN1Y+x2|;Ys2TXY8yx8as@suX3Z*CU~=26uG?FqEY;v%+ZDhe3BXGW z|9&9l(&kdA+bh)`mjoem%b9!@pa}IR2KS$y!4?0LN$=xJ2uE#~J=DST+S05tsfWZn zsyKpN#awt~XKi*d3pRC(An?>w{L94C7gXSkDw;-N0{uxGudo)=%5DTJARM}K`FBI;7q5UAa(58J$ z>MF|VVpu}=PCk9a`0QuUDL*c{)FJ(h z=P=7rXSjzsmcy$-?_n4AZ#e}Lr-;=lB|*>T55=ob{C zHe%fPTH203E8I*>KxB9dgmJCdX1WDbV}5GI2lE)7x{2HEK9MK6x@q|vaoFoT+xSWT z1oCnc3&rJ42{gIjLq0y}31co?QoI6GmmZ!VVeo2xR`k7_P^!o~bLSJJQ zaj>fBOjolMS?0$fUcp(8qfK{E42>R)KJNK2g~lyamc-heL<=^n5V_{_KRrulJtjSW z!cKb54jv9mc@SxYUl!%cZL05sIlW4l2PR9oOEiYc8$2gI+-dleT0+S1WQo3xGG()> zy|@LIM(nItbH3WT84h7Ka@e^U!~0^q!%rnsC0Pc&Z2PTzE^F)-@g;2^f}Z;^X4IUq zGD=If#URnW8xti2pkFsn-F6|y`t~4JOCw_PpMSEd_U9?);a^XU=$%+nPJEB))N}h~ zuyBPz8Vqny*xyYLXm)#Kox%yVEyhi%#tco;ZqG0O-tLw6A)*iKSj9Blw;tO^j4#-S zWveUq=F3BIMV!;CpN(x)FKj)udVE4f0}HQI#+I5VqT_)bX+-|}p$gia%AP>AJ*R*= zM#e0z`TgDTXb9%%QlIvD_Y@#hvbUgb)isAhFzgGXf<(eJpZmz||7rMV5w7VRt}uCQ z>{BX66?MG}rY5}vWB5TX_8qiYG#l~@B!fJcFi=k2#L)KVC zch-Enh%+E^Fl4nnl$LJDIcS*ofesE01r$zR_TXFnVsi!EBDI2vm{YqEOTDc z$2^#Q5-*6tKj5p_2Hw(ACErS(tw7J*i(%JStj)#sW|eO>#g>UX?5b({QLGc zWVR4lXiD1B>c~h*z5@D#*G{a~M=SAhdy|E=tu4huple$4p2*j?C2d_vljx0-bucH& zH?^f=f9Ms}IMKhIyos{CN|kK#DwrZPRYiEwTLf#NUTm38lNq*>P|C zNcaF~|NPu+e7iWdYVNF(Q_OPKMvt@TJtwG4prnGtC*P)jy}_5B%%HZ=H{5 zHn^4K5HHI?DC;rZ71>ET;Z2WCJ8|#U*)a=vr(gcQ03Y`1mDpMa6TK9#rgmCcvIoau z?B-2;AcLEU%yyfu>40UthrL*_hk@2FiF4%4eV-5!in-j@4p99IQzLd5g-_7k>=27{ zEh$gEZdFL$qH=_A#b=b;CqZSetl7R<51noFeXfkui%REQTGooDNYAxQ=r#;s&b=^ohWwISdBTw7ZIB9J)N;`6im{zi+E2?;RC0!$el zcHi4T*1b`YDz(qnWf=9&$h?AV%kuix&55>#SITA^MyKHc9&MSWh|!c7d2h39DitZ7 z7UT9Md;3;$ZpwVnov@Ja%B;PHc(+8$(yj3mYm9gvo5UkawOJ3JY!#1z00QF zPJuke0?o|aGZY()?r4ilyBBZhF(Fp6Ml`s1`ygWG=k zWooRzj2iGl%`03{11#s^K!FPqWcAj;epLbr#ukHqXrYLir|+fhIdg}eB>bBCy!t^| z`^+nqoO?Rn=0{7VW`E&UXu5H?&4ax~cK_A;`U51A4#v;-$C?&i7k)z}>UrbS;!lI= zLi=?N+o2pu;iWF#77ibKnkxM`;lkgp++Pw`E&{OQugeRC311oqM?x#JoW!`^N32ER ztbu;#IXrp)1I3prVEECS3U_6Wxs5amKKksTtf zb7)eTuN#vT6}G336zLl5Bu!$6?Y;i!MJbmN{Y_l)_ z#IBJbq_kOe%Rfw#PGm^8tz)FvYz)QA{t0*ZsHtBV6VqDa3#CLpbubvG^oT-xPJ+y z#$bhmGgLOsFK^GJkD{JogU>>Ayxw_OV~|@FePIYi&5wQT1CwyIqHKypUgM6y2}CK~B7J?rxi41SKFgJW&qbX0 zu8_XGtD2O+6O^d-MrBN6L&I_yv8m(w%Wpx^K<~j9jveIM8C0;nic-4tmAWF|0 z#H+_jwbh;^_Y7lgRBpCTZJ^p#@>~uBlJ&iylF5-rlC7;ZPPXZbib6QR^oZPv(0>qO9;_yz8CKB1t&n ziH~uQnnhqc!bPs<8#Md_unfn6Rbuu^bB1pPHLsU%I`HAj5Jum?S~g+&s-}NsxA|0E zc6zhg+JMt(3tWO#i1uyW2LEj?B^Zrc#pc}Fo+wEwe!*+L_3h~7G}<<|HGzW27s6)i zUF{?%c2`B^IAG&(s07b5<$x$M35aMQNnC&2(u?o`rmK&g69;Q^wG4e^Mny_5K7^N& z^FHH|G~OV&|54tpd@Guci*oG4!d`WfE$R4j^4~X9A2FxDI@A<~PlVo=W~w%@_VSmT zV^Mcjr2jICLv+4pX3CVrD8DZC>2!bo^0nEcA^O)4?4c&?e?bk9p@_w7H!swV2yMd)r8cwX9NCt$cPxmfq8yM7 zaz*PDZ;d$nJ1@pX?O~#WKebL_)Mrp13KwOE@uvQWKOlhw(c@=>tG%Y@-1jQN>{mV* zKTeQ-9|DHgzn6uxnMv5vCvK(+iryuW=3QlI4S6Tu1MWzFcZJ9^lASy4O9Q&OJIizg zNmaa}x8q6m%ZAPJcfiaA=<>7!Y;XzHU~@Y87`K|PW@0Q+{meNgQb3~y2-tIgxY)># zpkIop@0ARR7q4(JD3eo{5%;Sp4}z_dNZ1qgjL4g**~=_s|H!&mfcP>8I$+Ulc7>TT zbT|dq(MxkXmkkM0zP>?&vPZelzZ`oJ$SVeIy-)U9<*3?3>ArjF>w^;x@4&?TN%N^a z8VOb~#lH@W)`xk%?-MHKUM#)r>(8d-{m*&exsgQ_P^Wa@V{N#ym;r9dQp7RG!2*h8 zG=7dcJo|OQ1WfvOl~?y?oy;-r=t-EKZzD1e_l2Rg~~f2SR1Wy6aA9CA-Xu(SH5#@JtLhU0D#>3SOi z*zBZ7Zq@UyF80g{q!K&21v;3X$NeoDNO8!e&gZi$@lwa_GyAZ-j{vk5DG9 z%bZ33Jg|*zbxcZRie~|5>PNo#drhB=PRFM%1MYqR9 z7ZpmRo{v*c-BmNsza;Mt^L1D+HEX=_ymbp~=H9cswzE@#j{v+2@m^b1D$cv?m~3=6 z$Ww_lnZG;gV*D8;q3W4V$83#+V@hYkHtwlaZ@I{|#Ile~hi=@_|5_2?l86$q10e?=i2TWNuMW=BHN*vRN8ay8Dpr0iMBtVs&ta_J`Qwvk$Sg^2CM zMkrMC2wnLeiF;Jacbp0&ghe}s1w}kw-Zg6W~?Y1pOwOzQ&zB%~&cmCRz2{f-&lq7DLK5>_= zFsr&@bkVomu;#jYO)HTI4C~6L>1e!AG`db_q}%#m@rHz24sD2e?e(7+S6M0Lv3J#E z1F8=SmV+DDUdPJKZzgM-n_XSh(xGXWyNGX%XmOw%Bd#Gc?F5L5{7zo{ylM{;a#?`! znKckyzeEz3mlD@Ph%~O~YicR>-GS%h1o1O4;N} zrdxD=$L}4n_mYr>uz28^ausxf(NI(lxrx6_u8_{CmOi#dKDS=^!bbHw+jUD@yS_SL zsy=4fc&>NPHAlO=@2t*q-RxJ{f_g{D+!wZaBMx8G6^MC4F<&_DkHr1qxHlN<3&xzj zXsVsldGXph^E-n|Z^z-hDS+9XhY9 zCur`A^aWy}Xd;vSchE#E(oYmyBC>6YJqCo3&upa@BFM%h%}$Is9o_{Uo$lBIymsyWJ5?+#?E4 z{TbWRJzY=KDvOwh=Q*G99w7s-OoC15ogJNx9ky$x02aDPJV^?)%nc6+qQPjwqp(r&@vHq++ z(WAA8`o~s--gH#qes5PNHU&(|F^CZB%#dm=#ieUMfU>>87!V-rYGg#XLYLO7W{ZWsSy@{RP~v8vW02)Z9%m z4-n#n^x4nGUSF)g;9I-g{m?3fDDM!$Gk`6f@=MuW6RS@2OsdE$ggD-|Tys)*w;SxM zuW!|g#Cd`cn)H&EE>9><$qjCBdO$f4k&h4q4G!1~dLLzW_j3BheiIyOq$7mq=$nJ) zWHL#a-Q8}O1COkhr?pc;5f(EJTlsafkXj5z1Dw6*I(@BIosDO0H7Bigr>(H{9G3UV zEJ1H5SB)3;F!T?vatr$J80dd1)4y9`4Z?UW;JbuliT@rjjY~~LLJ`834ez!f{v(is z$rv8s#m!xab3sT;F+v~2%qW3iyG4iw?5>E85g+NkV)WzN$!g-q6G=p1?7r-P0p;P< z@{}QBQ2z+9NGW9t*Q=NRYJod55))uuK^JE`y)$vZ5EF^8IAzOjllSGmh+1Lqzi5AM zgJ!}q38EZC;*7sE9H}Nsm+1#B#1LiP7_??{6Y@ZNpg`B460&0jBKx zyY=`fz~kOOJ`6WC97#@pEXQ@b;fxJVZ$f9`w};F*x+AayfkY}$Ec+-rv2=R14C`v9 z4GezD<7y8kcY2-7wtoyMEUjN3Fj+l04bzKy-{Un(5)mSv^XD6`oK8;iK4?QCaZZl` z#|Q$>;zR9>*Gzu!%ejBq7yFHNAAiSZuP=&VIN}f@juf*e7mFI!w5wN1x+pTNLGOomXegca|ZMvdMP z9<1N4KG`$w*0DO*@hX-=Nj|0V@>blMt~jt-5O$}cLi*(|CVoLNSoCn_L-?0SxB%zz z%On`-v0KL*gv#Md7chVt+Rgh-dZ$0iS7r0fsFsn15Mv7GZk~F!FZ$MY-NZ71Z)IRx zJ+AVge?;alZq{?xZ#gd4cx6QL^LynUPh_qTyM~YmaUwhD?c9QzzR5kG9!M|s&XV2F5on~p4m53Z11H}TPBuuFZm&xqqQ zm*0ZJ;>=a@1&wMPKwsFXnOCoRpjuX1k@53?UMa6QVu6Jv(+4ngrc~kDjS`=Ed6V|} z4Vu}t3TP`Vecln4hx0zafeU{)SqKq1X>js6Ey0n7LlXNgg)a;6zzn8Qr8R`ZI}XSg z{?MMT82s?2KHZ?s^n;~??wj2)^I+5YxV7t`w9n{_K)pntm>gD56lcfJ_nR;{hMkcZ zd23Hw`5~hjw6dSo@Fl*sMXTu@CV*dO z4`FrXsI!3UhO@n~M1oyUZs@RKQDuL&*|kdCWaIJTIJuIAaM4a3Rv{j5^2v_|_U|1= zANVV{bcH3cgo9dy$-1~j&*f=xcL}>Adv8#bZt`-j9aFl=LI}e#4=X-?psVkN}LTp9z8&vEF z(Q|}b&sh4_b=cSuV)sI59d`>SU{7MzPN6Ho>Bs}&`A#oc2p6|>#k1elaq$`+9Cnof zSAV(N9%1yF%4+4ozKh%R+z)eb++!tYM~K_xJP=;clZTLpUS{{jX4SB1eK@y4-{Ib& zyeBxTmhFfF!&}WMEBDa`GYX@ZvLfVnt{@KK5?%-qS^?#r9U<06?j6FkjpI#GWX!0O4s3VH)Yjt%f842oaP9I{-VvU&ugsLggk7A&-N7 zAtO9O+R=XL9z#Dxm`yt%CCtF~2}PJ?`|+BSBFt}uu<6i+G`|tT)kT;(v&WF62(xLp zd_&kQY^4aZYgNa(Njuupb76Mv+e6)jVj~@^2#E`S`luPsrUXUEIc~3iNwc0fuRRZ! zZ^0sr#uCV-OBTZScIhJ&A?Jn|k(V}U$U=xrV?4s23Kk(Uk3U^cSU^55MTDZGj}RVO zTvL5>tM2XXL(4lmbZ4~QQAcQSMP{v0kcAL|Xo2jLLkNx#Y>?L=oLQKx`~Asmrpt&R zlvo0|wL=!d7dL8r;n7DZcpD*vNE~I$R6Pi#wbFL4WZoklXgWEHIf|J-{ zgos<5R6!WRC+n1mTcHR!wjYjIh`Ve5_!?>!=|@5pp^dI>WeBOdLYo(K?~_P=s6>GVI`1B5??Dm2&TO7e9pQBn3lC z2?+?9OBxcEC#=a5;V+UtWZfkWAu@PuzL50=9~>n={mJ;Z-JNiBWD;Eb97TlQP#kx} z*`F}0v}L%_k9#>dQ4og^&xDdpJiep8U>sM}SY*`81P%Lyfk+llh!hW?PGT}k+|l~3 zt-GH#b`vgh1JZ-MDHbqbHj;;fEV7#X4= z?-7!<=0Vx5={YBM9+M3j9NySEL{V505#n4?ciI+DP^EOBAvMY=wHMj{hRpLwB0}Vu z_;SC=A4yPnXs$r4{+6Y%}l^ ziV)i&wgICnEa2AipMA#qGd2`tlXM4Akt8yDmUOuKkW~*QCXgZ=HGgngK)4A;Z4s~X z34|g{SBn$SNqeI^08b?R$;fpN10(XQEoto%w|C=9M4X4p7D8rGe%XkJZNX?9<+X4y zM}o|z%MMgAT)L+V*f2)ZB@?o$h>$l3(+NLOC{w^$h)nf^lT((aYzW{Am3?N4E7F25 z{n1d~Zb66!%tNRLiqcV7{#aZC!@>^CaD*|!+^k3hBMJO>cQ9`AMG=eyPOw3@ z$@;ecW=F}c&-WYO+pR}RXXM31<-+?bWhk|U-zZ?@C(#J;bvW zdPsKyGX*or1Z9>t2uo5s;vRvD+G7Ht9Q=eVYXRM^{!(;{E+b{P{*scSL1kqHtQ9pz z5aLTgl3+pf4p=(AZ!-&3@r)=T8euB9Tk)Gg0LK$X0ZLnmcoqGm2y;S+{r`s}-GZF) zp_t5Hr!Fd&P=xmsA^tvp9h~?{ zpc2ZmjLWg<<2*%pj}Vrm%9OpmL)R;iD<72t5lst&%j6MTRMRg~nz|)I5e^7y?0nzW zEub+PF@3lX_TnZDPM@WzfDi1u{OnnVqou*dFD8k<_kmBlE zOi)*_!4*EL^x!%bin-#_EO1V)K&*-cBL-XMI7TF}xsNX!uzaQk{~VY4K-x(J>nNB# zw?TvYY|9Qa4v>=?kG402Mf;-O_waC4L<LYm^k>A5@#C8&t=$zs#Lg7zE}yOhTCMv6O3x@he3W0mik&{K2Uvh6oSLEf*T8ePEJQ)?z zfBs}VulFX&i!(%MFJd()LN4p71gAzE0FbQL6N<+O2qR7huO3smQSF;*q+HikoX4kD zNl}%)p~H4T@56=fz&+P@lBp~+aIK)&?}yF$>C0s!>SrEP2ycU&kg}K{BOl_-{&&!f zkU&Hf>K&oLNM3luc^=`47rK1VlVMcD%u9z-j0}xn%R$8YP^Lu&|W3 zcVlvZsMa1r{AVs99XQZ?!*QJ>1Y6ps^Sy}6hGGRn41V1}KwDvYDwr%~OoGjkl1T^y zsKi}x>7%RU&#cod+Mz?BK8)Q>m+kHHzVn^l8)m=K8tAl#O|Ah!j4!O62=hhSI@CUf z_Pf5rw(PL^qh|fWM)f1B< Date: Wed, 2 Oct 2019 01:32:11 +0100 Subject: [PATCH 092/129] Replace avatar with new logo/colour scheme to match original mastodon one --- public/avatars/original/missing.png | Bin 31690 -> 12601 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/avatars/original/missing.png b/public/avatars/original/missing.png index b950e8246f830b9e571bc877669d82fde6288fc8..29b27183b711a8a9457dc1ef7b206c352ea5dd22 100644 GIT binary patch literal 12601 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 ffbV%}&=Y0XPcvSTkBS2Ul$W-qz6M&&F5o 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

}wf*j&@R#Q6M4ppsp)K|v8-g)LKr+n

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

AxneYw~N7#A&FF6OUYBe+_)cNv@&LU+xz(M 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 From 06db8ef2e996cdefe153c952ffa7c3a9e5db3f57 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 2 Oct 2019 20:30:41 +0100 Subject: [PATCH 093/129] Add placeholder image to signup page and change font to display font --- .../styles/mastodon/containers.scss | 25 ++++++++++++++++++- app/views/about/show.html.haml | 6 +++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss index 9457c901b..f466a44ab 100644 --- a/app/javascript/styles/mastodon/containers.scss +++ b/app/javascript/styles/mastodon/containers.scss @@ -191,6 +191,29 @@ } } +.originalhero { + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + align-content: space-between; + + svg { + fill: $secondary-text-color; + height: 200px; + } + + h1 { + flex-grow: 2; + text-align: center; + white-space: nowrap; + font-family: $font-display, sans-serif; + font-size: 0.6rem; + } + } + .public-layout { @media screen and (max-width: $no-gap-breakpoint) { padding-top: 48px; @@ -410,7 +433,7 @@ flex-grow: 2; text-align: center; white-space: nowrap; - font-family: $font-sans-serif, sans-serif; + font-family: $font-display, sans-serif; } } diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index e86eeddfe..55c6c1e01 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -52,6 +52,12 @@ - if @instance_presenter.hero.present? || @instance_presenter.thumbnail.present? .hero-widget__img = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url, alt: @instance_presenter.site_title + - else + %div{:class => ("originalhero")} + = svg_logo + %h1 + = link_to root_url, class: 'brand' do + = site_title - if @instance_presenter.site_short_description.present? .hero-widget__text From 247d2787fee9b203f2afb5493a8831dce89924c2 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Tue, 8 Oct 2019 13:35:26 -0700 Subject: [PATCH 094/129] Fixing stray typo --- app/javascript/mastodon/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index aa89a3755..e45447778 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -234,7 +234,7 @@ "keyboard_shortcuts.start": "to open \"get started\" column", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", - "keyboard_shortcuts.post": "to start a brand new post", + "keyboard_shortcuts.toot": "to start a brand new post", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Close", From 77565306fe78b7a4e3279dbee0b165103e9f5e29 Mon Sep 17 00:00:00 2001 From: David Underwood Date: Tue, 8 Oct 2019 20:02:18 -0400 Subject: [PATCH 095/129] Stops feed regen task from crashing --- app/lib/feed_manager.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index e60ccb044..095203ab3 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -133,7 +133,7 @@ class FeedManager break if statuses.empty? statuses.each do |status| - next if filter_from_home?(status, account) + next if filter_from_home?(status, account.id) added += 1 if add_to_feed(:home, account.id, status, account.user&.aggregates_reblogs?) end From b7e808aefb93b4bb634390cf82641176a8721e0a Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 9 Oct 2019 14:31:31 +0100 Subject: [PATCH 096/129] Fixes resizable display names CSS bug in Safari and Firefox Reverts a CSS change made in error in PR #22, which caused display names to show up as resizable in Safari and Firefox --- app/javascript/styles/mastodon/components.scss | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index d7e1722bf..e09b3702c 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1674,11 +1674,6 @@ a.account__display-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - - @media screen and (max-width: 1550px) { - resize: vertical; - } - } .display-name__html { From 3a154c3920f3b58e2708f8a94fde485e8e973020 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Wed, 9 Oct 2019 07:41:15 -0700 Subject: [PATCH 097/129] Change default server name --- config/settings.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/settings.yml b/config/settings.yml index 42040df0e..49c134a25 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -2,7 +2,7 @@ # important settings can be changed from the admin interface. defaults: &defaults - site_title: Mastodon + site_title: Hometown site_short_description: '' site_description: '' site_extended_description: '' From 672a7b8a878ac3a28930a6ef0ad65ebcaa7e5d92 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 9 Oct 2019 19:55:31 +0100 Subject: [PATCH 098/129] Fix audio ui for macaron theme --- app/javascript/styles/macaron/diff.scss | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index c858a9bfb..cd445ea6b 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -145,7 +145,8 @@ html { .box-widget input[type="email"], .box-widget input[type="password"], .box-widget textarea, -.statuses-grid .detailed-status { +.statuses-grid .detailed-status +.audio-player { border: 1px solid lighten(#eeeeee, 4%); } @@ -1050,3 +1051,23 @@ a.status-card.compact:hover { border-color: lighten($blue, 8%); } } + +.audio-player { + background: $ui-base-color; + border: 1px solid lighten($ui-base-color, 8%); + + &__progress-placeholder { + background-color: rgba(lighten($ui-highlight-color, 8%), 0.5); + } + + &__wave-placeholder { + background-color: lighten($ui-base-color, 16%); + } +} + +.audio-player .video-player__controls button, +.audio-player .video-player__time-sep, +.audio-player .video-player__time-current, +.audio-player .video-player__time-total { + color: $primary-text-color; +} From 8a9e6b9f49cbbc889e0b907e59667eedd975614b Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 9 Oct 2019 20:06:45 +0100 Subject: [PATCH 099/129] Fairy Floss theme colour tweaks --- app/javascript/styles/fairy-floss/diff.scss | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/javascript/styles/fairy-floss/diff.scss b/app/javascript/styles/fairy-floss/diff.scss index 2eb4d4edf..373683b20 100644 --- a/app/javascript/styles/fairy-floss/diff.scss +++ b/app/javascript/styles/fairy-floss/diff.scss @@ -517,3 +517,16 @@ a.mention, .notification__message .fa { .status.status-direct:not(.read), .account { border-bottom: 1px solid lighten($purple2, 8%); } + +.drawer__inner__mastodon svg#hometownlogo { + fill: $ui-primary-color; +} + +.audio-player, +.audio-player .video-player__controls { + background: $ui-base-color; +} + +.video-player__buttons button { + color: $ui-primary-color; +} From a443072f2754ea99006a9fa58bbbfbb58f5114cd Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 9 Oct 2019 20:22:18 +0100 Subject: [PATCH 100/129] Fix default mascot behaviour in advanced web view Corrected version of self-closed pull request #27 --- app/javascript/mastodon/features/compose/index.js | 14 +++++++++++++- app/javascript/styles/mastodon/components.scss | 13 ++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index 74f695fba..deb6748e4 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -40,7 +40,19 @@ let instanceMascot; if (mascot) { instanceMascot = ; } else { - instanceMascot = ; + instanceMascot = ; } export default @connect(mapStateToProps) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index d7e1722bf..a7c8a334b 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2533,19 +2533,19 @@ a.account__display-name { min-height: 47px; display: none; - > img { + > img, svg { display: block; object-fit: contain; object-position: bottom left; width: 100%; - height: 100%; + height: auto; pointer-events: none; user-drag: none; user-select: none; } @media screen and (min-height: 640px) { - display: block; + display: flex; } } @@ -6597,11 +6597,10 @@ noscript { } .drawer__inner__mastodon svg#hometownlogo { - position: absolute; + box-sizing: border-box; fill: $secondary-text-color; - width: 100px; - height: 100px; - bottom: 0; + margin: 0 0 10px 10px; + align-self: flex-end; } div.status__content, From f303e280a749080c1065fd9f9b9113d511394db1 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 9 Oct 2019 20:34:18 +0100 Subject: [PATCH 101/129] Adjust colours on about/more page --- app/javascript/styles/fairy-floss/diff.scss | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/javascript/styles/fairy-floss/diff.scss b/app/javascript/styles/fairy-floss/diff.scss index 373683b20..a746c5bab 100644 --- a/app/javascript/styles/fairy-floss/diff.scss +++ b/app/javascript/styles/fairy-floss/diff.scss @@ -352,6 +352,18 @@ a.mention, .notification__message .fa { border: 4px solid $purple2; } +.public-layout .public-account-header__image { + background: $ui-base-color; +} + +.public-layout .public-account-header__image .originalheader svg, .originalmascotimg svg { + fill: $ui-primary-color; +} + +.public-layout .public-account-header__image .originalheader h1 a.brand { + color: $ui-primary-color; +} + .public-layout .header .nav-button { background: darken($purple3, 4%); &:hover, &:focus { From f1387375ec5d6d03cd9fee471b16d9eb2fecfc6d Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Wed, 9 Oct 2019 20:36:12 +0100 Subject: [PATCH 102/129] Adjust custom mascot size on about/more page --- app/javascript/styles/mastodon/about.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index 518e5274e..a0f5e9de1 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -585,7 +585,7 @@ $small-breakpoint: 960px; bottom: 25px; img { - height: 190px; + height: 155px; width: auto; } } From dbaf8e4aed2fcdb10f2b16fa509e4110f9f15b68 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Thu, 10 Oct 2019 21:30:15 +0100 Subject: [PATCH 103/129] Replace mastodon logos in admin area with name of instance --- app/javascript/styles/mastodon/admin.scss | 27 +++++++++++++++++++++-- app/views/layouts/admin.html.haml | 11 +++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index dde1d69ba..76b6f35d4 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -46,6 +46,12 @@ $content-width: 840px; position: relative; bottom: -2px; } + + h2 { + height: 20px; + position: relative; + bottom: -2px; + } } &__icon { @@ -68,15 +74,32 @@ $content-width: 840px; .logo { display: block; - margin: 40px auto; - width: 100px; + margin: 60px 0 0 20px; height: 100px; + + h2 .brand { + color: $primary-text-color; + display: block; + font-size: 24px; + line-height: 28px; + font-weight: 400; + padding-bottom: 40px; + border-bottom: 1px solid lighten($ui-base-color, 8%); + } + } @media screen and (max-width: $no-columns-breakpoint) { & > a:first-child { display: none; } + + .logo, + .logo h2, + .logo h2 .brand { + display: none; + } + } ul { diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 57bda45e2..b75d47a24 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -6,13 +6,16 @@ .sidebar-wrapper .sidebar-wrapper__inner .sidebar - = link_to root_path do - = image_pack_tag 'logo.svg', class: 'logo', alt: 'Mastodon' + .logo + %h2 + = link_to root_url, class: 'brand' do + = site_title .sidebar__toggle .sidebar__toggle__logo - = link_to root_path do - = svg_logo_full + %h2 + = link_to root_path, class: 'brand' do + = site_title = link_to '#', class: 'sidebar__toggle__icon' do = fa_icon 'bars' From bd3867b32e8abd3b4c404448c26f58a0d08bef7e Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 2 Dec 2019 00:25:59 -0500 Subject: [PATCH 104/129] Remove DB dependancy from assets:precompile When running `bundle exec rails assets:precompile` inside docker build, with `site_title` it requires a DB connection, where as `Setting.default_settings['site_title']` doesn't. Running a docker build without this commit, the following error is reported: ``` ... [build-hometown:5785] ** Execute assets:generate_static_pages [build-hometown:5786] rails aborted! [build-hometown:5787] ActionView::Template::Error: could not connect to server: Connection refused [build-hometown:5788] Is the server running on host "localhost" (127.0.0.1) and accepting [build-hometown:5789] TCP/IP connections on port 5432? [build-hometown:5790] could not connect to server: Cannot assign requested address [build-hometown:5791] Is the server running on host "localhost" (::1) and accepting [build-hometown:5792] TCP/IP connections on port 5432? [build-hometown:5793] /opt/mastodon/vendor/bundle/ruby/2.6.0/gems/pg-1.1.4/lib/pg.rb:56:in `initialize' [build-hometown:5794] /opt/mastodon/vendor/bundle/ruby/2.6.0/gems/pg-1.1.4/lib/pg.rb:56:in `new' [build-hometown:5795] /opt/mastodon/vendor/bundle/ruby/2.6.0/gems/pg-1.1.4/lib/pg.rb:56:in `connect' ... ``` I can provide the full trace logs if needed. --- app/views/layouts/error.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml index 414ac9c72..b288e6ed8 100644 --- a/app/views/layouts/error.html.haml +++ b/app/views/layouts/error.html.haml @@ -13,6 +13,6 @@ .dialog__illustration %h1 = link_to root_url, class: 'brand' do - = site_title + = Setting.default_settings['site_title'] .dialog__message %h1= yield :content From 6bd0dadcfd460cb95112af5a815a37b32a61a793 Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Tue, 5 Feb 2019 17:47:41 -0800 Subject: [PATCH 105/129] add max_toot_chars from glitch-soc --- .env.production.sample | 3 +++ .../mastodon/features/compose/components/compose_form.js | 7 ++++--- app/javascript/mastodon/initial_state.js | 1 + app/serializers/initial_state_serializer.rb | 7 ++++++- app/serializers/rest/instance_serializer.rb | 6 +++++- app/validators/status_length_validator.rb | 2 +- 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/.env.production.sample b/.env.production.sample index f9a8bb7c1..8a679044e 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -169,6 +169,9 @@ STREAMING_CLUSTER_NUM=1 # UID=1000 # GID=1000 +# Maximum allowed character count +# MAX_TOOT_CHARS=500 + # LDAP authentication (optional) # LDAP_ENABLED=true # LDAP_HOST=localhost diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index 6da6bdb78..2c8909839 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -21,6 +21,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { length } from 'stringz'; import { countableText } from '../util/counter'; import Icon from 'mastodon/components/icon'; +import { maxChars } from '../../../initial_state'; const allowedAroundShortCode = '><\u0085\u0020\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\u0009\u000a\u000b\u000c\u000d'; @@ -90,7 +91,7 @@ class ComposeForm extends ImmutablePureComponent { const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props; const fulltext = [this.props.spoilerText, countableText(this.props.text)].join(''); - if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > 500 || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) { + if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > maxChars || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) { return; } @@ -183,7 +184,7 @@ class ComposeForm extends ImmutablePureComponent { const { intl, onPaste, showSearch, anyMedia } = this.props; const disabled = this.props.isSubmitting; const text = [this.props.spoilerText, countableText(this.props.text)].join(''); - const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > 500 || (text.length !== 0 && text.trim().length === 0 && !anyMedia); + const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > maxChars || (text.length !== 0 && text.trim().length === 0 && !anyMedia); let publishText = ''; if (this.props.privacy === 'private' || this.props.privacy === 'direct') { @@ -246,7 +247,7 @@ class ComposeForm extends ImmutablePureComponent {

-
+
diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 56fb58546..deebe1815 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -12,6 +12,7 @@ export const boostModal = getMeta('boost_modal'); export const deleteModal = getMeta('delete_modal'); export const me = getMeta('me'); export const searchEnabled = getMeta('search_enabled'); +export const maxChars = (initialState && initialState.max_toot_chars) || 500; export const invitesEnabled = getMeta('invites_enabled'); export const repository = getMeta('repository'); export const source_url = getMeta('source_url'); diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index e5c43bd7b..ef65ff362 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -2,10 +2,15 @@ class InitialStateSerializer < ActiveModel::Serializer attributes :meta, :compose, :accounts, - :media_attachments, :settings + :media_attachments, :settings, + :max_toot_chars has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer + def max_toot_chars + StatusLengthValidator::MAX_CHARS + end + def meta store = { streaming_api_base_url: Rails.configuration.x.streaming_api_base_url, diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index 1bd71683c..3fc251a5a 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -4,7 +4,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer include RoutingHelper attributes :uri, :title, :short_description, :description, :email, - :version, :urls, :stats, :thumbnail, + :version, :urls, :stats, :thumbnail, :max_toot_chars, :languages, :registrations, :approval_required has_one :contact_account, serializer: REST::AccountSerializer @@ -39,6 +39,10 @@ class REST::InstanceSerializer < ActiveModel::Serializer instance_presenter.thumbnail ? full_asset_url(instance_presenter.thumbnail.file.url) : full_pack_url('media/images/preview.jpg') end + def max_toot_chars + StatusLengthValidator::MAX_CHARS + end + def stats { user_count: instance_presenter.user_count, diff --git a/app/validators/status_length_validator.rb b/app/validators/status_length_validator.rb index 93bae2fa8..92ee5e643 100644 --- a/app/validators/status_length_validator.rb +++ b/app/validators/status_length_validator.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class StatusLengthValidator < ActiveModel::Validator - MAX_CHARS = 500 + MAX_CHARS = (ENV['MAX_TOOT_CHARS'] || 500).to_i def validate(status) return unless status.local? && !status.reblog? From 513f13e0c1b96bd61ba6e0c1cd23385b1bbc7767 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 2 Mar 2020 09:53:30 -0800 Subject: [PATCH 106/129] fixup --- app/helpers/statuses_helper.rb | 77 ---------------------------------- 1 file changed, 77 deletions(-) diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb index 309c0d045..866a9902c 100644 --- a/app/helpers/statuses_helper.rb +++ b/app/helpers/statuses_helper.rb @@ -4,83 +4,6 @@ module StatusesHelper EMBEDDED_CONTROLLER = 'statuses' EMBEDDED_ACTION = 'embed' -<<<<<<< HEAD - 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([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([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([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([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' => '#hometownlogo'), 'viewBox' => '0 0 100 100') - 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 - -======= ->>>>>>> e0f3a4583c68b560425e30306153cf1b8f4dabe0 def link_to_more(url) link_to t('statuses.show_more'), url, class: 'load-more load-gap' end From b667732d7d8064f987b7828c325bb7b1b72cc267 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 2 Mar 2020 10:13:58 -0800 Subject: [PATCH 107/129] Updating schema --- db/schema.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/db/schema.rb b/db/schema.rb index 1d9df3eb0..cbc5f8579 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -742,6 +742,30 @@ ActiveRecord::Schema.define(version: 2020_01_26_203551) do t.index ["tag_id", "status_id"], name: "index_statuses_tags_on_tag_id_and_status_id", unique: true end + create_table "stream_entries", force: :cascade do |t| + t.bigint "activity_id" + t.string "activity_type" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "hidden", default: false, null: false + t.bigint "account_id" + t.index ["account_id", "activity_type", "id"], name: "index_stream_entries_on_account_id_and_activity_type_and_id" + t.index ["activity_id", "activity_type"], name: "index_stream_entries_on_activity_id_and_activity_type" + end + + create_table "subscriptions", force: :cascade do |t| + t.string "callback_url", default: "", null: false + t.string "secret" + t.datetime "expires_at" + t.boolean "confirmed", default: false, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.datetime "last_successful_delivery_at" + t.string "domain" + t.bigint "account_id", null: false + t.index ["account_id", "callback_url"], name: "index_subscriptions_on_account_id_and_callback_url", unique: true + end + create_table "tags", force: :cascade do |t| t.string "name", default: "", null: false t.datetime "created_at", null: false From e4241f37d1f173821d872ab4016a14d2ca5018e9 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 2 Mar 2020 11:07:39 -0800 Subject: [PATCH 108/129] bookmark links --- app/javascript/mastodon/components/status_action_bar.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index e2886e948..fa340ccfc 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -331,6 +331,7 @@ class StatusActionBar extends ImmutablePureComponent { {shareButton} +
From b728034df1c282dd99ecd1eaef04eec78b1196d4 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Mon, 2 Mar 2020 11:07:39 -0800 Subject: [PATCH 109/129] bookmark links --- app/javascript/mastodon/components/status_action_bar.js | 1 + .../features/compose/components/emoji_picker_dropdown.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index e2886e948..fa340ccfc 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -331,6 +331,7 @@ class StatusActionBar extends ImmutablePureComponent { {shareButton} +
diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js index 582bb0d39..c956b95ae 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js @@ -358,7 +358,7 @@ class EmojiPickerDropdown extends React.PureComponent { return (
- {button || 🙂 Date: Wed, 4 Mar 2020 12:54:13 -0800 Subject: [PATCH 110/129] remove errant character --- .../features/compose/components/emoji_picker_dropdown.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js index c956b95ae..3a3026378 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js @@ -362,7 +362,7 @@ class EmojiPickerDropdown extends React.PureComponent { className={classNames('emojione', { 'pulse-loading': active && loading })} alt='🙂' src={`${assetHost}/emoji/1f602.svg`} - />} + />
From c7a78558eae4e3ce8b8706628fc544f233235f45 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sat, 16 May 2020 13:01:41 -0700 Subject: [PATCH 111/129] Fixing merge & local pinned post leak --- app/controllers/accounts_controller.rb | 6 ++++- app/controllers/api/v1/statuses_controller.rb | 2 +- db/schema.rb | 24 ------------------- 3 files changed, 6 insertions(+), 26 deletions(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 3424015ce..402555e10 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -26,7 +26,11 @@ class AccountsController < ApplicationController return end - @pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses? + if current_user.nil? + @pinned_statuses = cache_collection(@account.pinned_statuses.without_local_only, Status) if show_pinned_statuses? + else + @pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses? + end @statuses = filtered_status_page @statuses = cache_collection(@statuses, Status) @rss_url = rss_url diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index 21ef3f210..4897f3e1f 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -46,7 +46,7 @@ class Api::V1::StatusesController < Api::BaseController application: doorkeeper_token.application, poll: status_params[:poll], idempotency: request.headers['Idempotency-Key'], - local_only: status_params[:local_only]), + local_only: status_params[:local_only], with_rate_limit: true) render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer diff --git a/db/schema.rb b/db/schema.rb index 28eafc383..8e214e706 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -752,30 +752,6 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do t.index ["tag_id", "status_id"], name: "index_statuses_tags_on_tag_id_and_status_id", unique: true end - create_table "stream_entries", force: :cascade do |t| - t.bigint "activity_id" - t.string "activity_type" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "hidden", default: false, null: false - t.bigint "account_id" - t.index ["account_id", "activity_type", "id"], name: "index_stream_entries_on_account_id_and_activity_type_and_id" - t.index ["activity_id", "activity_type"], name: "index_stream_entries_on_activity_id_and_activity_type" - end - - create_table "subscriptions", force: :cascade do |t| - t.string "callback_url", default: "", null: false - t.string "secret" - t.datetime "expires_at" - t.boolean "confirmed", default: false, null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.datetime "last_successful_delivery_at" - t.string "domain" - t.bigint "account_id", null: false - t.index ["account_id", "callback_url"], name: "index_subscriptions_on_account_id_and_callback_url", unique: true - end - create_table "tags", force: :cascade do |t| t.string "name", default: "", null: false t.datetime "created_at", null: false From 24934e5fdd678afd302dd0944586561998001966 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sat, 16 May 2020 13:09:52 -0700 Subject: [PATCH 112/129] Increment Hometown version --- app/javascript/mastodon/features/ui/components/link_footer.js | 2 +- app/javascript/mastodon/locales/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/link_footer.js b/app/javascript/mastodon/features/ui/components/link_footer.js index 0a1e13e53..ebca9a402 100644 --- a/app/javascript/mastodon/features/ui/components/link_footer.js +++ b/app/javascript/mastodon/features/ui/components/link_footer.js @@ -66,7 +66,7 @@ class LinkFooter extends React.PureComponent { />
hometown-fork/hometown }} />

diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 79566e282..f846ad5d8 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -176,7 +176,7 @@ "getting_started.directory": "Profile directory", "getting_started.documentation": "Documentation", "getting_started.heading": "Getting started", - "getting_started.hometown_open_source_notice": "Hometown is also open source, at {hometown} (v1.0.3).", + "getting_started.hometown_open_source_notice": "Hometown is also open source, at {hometown} (v1.0.4).", "getting_started.invite": "Invite people", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Account settings", From 8b75cc93f1f9f85cdb0f47f1f859fc467bd02a28 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sat, 16 May 2020 13:43:05 -0700 Subject: [PATCH 113/129] Adding sensible federation default for third party clients Fixes #48. --- app/services/post_status_service.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index c810eb331..61bcdd11b 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -88,8 +88,15 @@ class PostStatusService < BaseService end def local_only_option(local_only, in_reply_to, federation_setting) - return in_reply_to&.local_only? if local_only.nil? # XXX temporary, just until clients implement to avoid leaking local_only posts - return federation_setting if local_only.nil? + if local_only.nil? + if in_reply_to&.local_only? + return true + end + if !in_reply_to&.local_only? + return false + end + return !federation_setting + end local_only end From 0d1c29012bb42e4ed1004272800c2e04703e09c8 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sat, 16 May 2020 17:38:30 -0700 Subject: [PATCH 114/129] Updating wording in preferences to be clearer about federation of posts. --- config/locales/simple_form.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index c91735e75..8c5712cf6 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -41,7 +41,7 @@ en: phrase: Will be matched regardless of casing in text or content warning of a post scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. setting_aggregate_reblogs: Do not show new boosts for posts that have been recently boosted (only affects newly-received boosts) - setting_default_federation: Posts do not federate to other instances unless manually changed while composing + setting_default_federation:
  • If checked, your new posts federate to other instances unless manually changed while composing in the web interface.
  • If unchecked, your new posts stay local unless manually changed while composing in the web interface.
  • Third party apps will make new posts that respect this setting. See here for more info on third-party apps
setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click setting_display_media_default: Hide media marked as sensitive setting_display_media_hide_all: Always hide media From 80cdd62c25b5c1fc056eb3ffd2902c6a4a94f1eb Mon Sep 17 00:00:00 2001 From: "Jay W. Carman" Date: Tue, 25 Feb 2020 07:23:14 -0600 Subject: [PATCH 115/129] Fix broken link in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5f0e71dfd..874f93f03 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Hometown uses [semantic versioning](https://semver.org) and follows a versioning ## Contributing to Hometown -Setting up your Hometown development environment is [exactly like setting up your Mastodon development environment](https://docs.joinmastodon.org/development/overview/). Pull requests should be made to the `hometown-dev` branch, which is our default branch in Github. +Setting up your Hometown development environment is [exactly like setting up your Mastodon development environment](https://docs.joinmastodon.org/dev/overview/). Pull requests should be made to the `hometown-dev` branch, which is our default branch in Github. ## License From 6cdcf3e21ac12b322efedde65c368d39ff67edd5 Mon Sep 17 00:00:00 2001 From: Emma Winston Date: Sat, 30 Nov 2019 13:55:09 +0000 Subject: [PATCH 116/129] Macaron theme tweaks --- app/javascript/styles/macaron/diff.scss | 40 ++++++++++++++++++++----- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index cd445ea6b..12a3f692b 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -447,18 +447,32 @@ body.admin { .admin-wrapper .sidebar ul a.selected { background: $purple; + border-bottom: 1px solid $purple; } .admin-wrapper .sidebar ul a:hover { background: lighten($blue, 8%); + border-bottom: 1px solid lighten($blue, 8%); +} + +.admin-wrapper .sidebar ul a.selected:hover { + background: lighten($purple, 4%); + border-bottom: 1px solid lighten($purple, 4%); } .selected ul li a { background: $blue; + border-bottom: 1px solid $blue; } .admin-wrapper .sidebar ul .simple-navigation-active-leaf a { background: $blueberry; + border-bottom: 1px solid $blueberry; +} + +.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover { + background: lighten($blueberry, 4%); + border-bottom: 1px solid lighten($blueberry, 4%); } .dashboard__counters > div > div, @@ -856,8 +870,8 @@ body.admin { } .public-account-bio { - background: $blue; - border: 1px solid lighten($blue, 4%); + background: $purple; + border: 1px solid lighten($purple, 4%); } .header { @@ -923,7 +937,7 @@ body.admin { } .public-account-bio .account__header__fields { - border-color: lighten($ui-base-color, 8%); + border-color: lighten($purple, 8%); } } } @@ -968,19 +982,20 @@ body { } .public-layout .public-account-header__bar .avatar img { - border: 4px solid $purple; + border: 4px solid $blue; } .public-layout .public-account-header__bar:before { - background: $purple; + background: $blue; + border: 1px solid lighten($blue, 8%); } .public-layout .public-account-header__tabs__tabs .counter { - border-right: 1px solid lighten($purple, 8%); + border-right: 1px solid lighten($blue, 8%); } .public-layout .public-account-header__tabs__tabs .counter::after { - border-bottom: 4px solid lighten($purple, 8%); + border-bottom: 4px solid lighten($blue, 12%); } .public-layout .public-account-header__image { @@ -1038,6 +1053,10 @@ a.status-card.compact:hover { border-bottom: 1px solid lighten($purple, 8%); } +.public-account-bio .account__header__fields { + border-bottom: 1px solid lighten($purple, 8%); +} + .account__header__fields dl { border-bottom: 1px solid lighten($purple, 8%); } @@ -1048,7 +1067,12 @@ a.status-card.compact:hover { } .public-layout .public-account-header__extra .public-account-bio .account__header__fields { - border-color: lighten($blue, 8%); + border-color: lighten($purple, 8%); + background: $purple; + } + + .admin-wrapper .sidebar ul a, .admin-wrapper .sidebar ul ul a { + border-bottom: 1px solid $blue; } } From 2dbaa1d38a50a3026ef96a42dfa39a7ba145620a Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sat, 16 May 2020 18:02:09 -0700 Subject: [PATCH 117/129] Fix scrollbar appearing on small width screens Fixes #52. --- app/javascript/styles/mastodon/components.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index d29dc1e5a..58616dc1b 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2509,7 +2509,7 @@ a.account__display-name { @media screen and (max-width: 1550px) { height: auto; - min-height: 100%; + min-height: calc(100% - 10px); overflow-y: visible; } From 7b81b1b24feb47e74d38e452112c324323c9789d Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Sun, 17 May 2020 09:55:30 -0700 Subject: [PATCH 118/129] fixing logic for 3rd party apps, should now work --- app/services/post_status_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 61bcdd11b..0fd68ebc7 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -89,10 +89,10 @@ class PostStatusService < BaseService def local_only_option(local_only, in_reply_to, federation_setting) if local_only.nil? - if in_reply_to&.local_only? + if in_reply_to && in_reply_to.local_only return true end - if !in_reply_to&.local_only? + if in_reply_to && !in_reply_to.local_only return false end return !federation_setting From a17e60c785f87180144d319276fca563fc6ae930 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Thu, 21 May 2020 16:23:11 -0700 Subject: [PATCH 119/129] Update README.md --- README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/README.md b/README.md index 874f93f03..fd08ca0dd 100644 --- a/README.md +++ b/README.md @@ -64,13 +64,7 @@ What does this have to do with content types? Well, if we support an `Article` c If Hometown is going to be a universal reader, you're going to need better control over organizing your feeds than mainline Mastodon provides. -### Exclusive lists - -My first plan is to introduce a new kind of _exclusive list_. Right now if you add an account to your "friends I like" list in Mastodon, posts from people on that list appear on that list. But they also appear on your home timeline, and maybe you don't want that! You'd rather treat your "friends I like" list as your "real" home timeline, and then check your home timeline when you're bored. - -Or another case: I might have all the blogs I read in one list, but I only check it on Saturdays when I have time to read things. In that case I don't want updates from those blogs clogging up my home timeline. - -> This is not yet implemented but will be available in the first release. +I've introduced a new kind of [exclusive list](https://github.com/hometown-fork/hometown/wiki/Exclusive-lists). In vanilla Mastodon, if you add an account to your "friends I like" list, posts from people on that list appear on that list. But they also appear on your home timeline, and maybe you don't want that! You'd rather treat your "friends I like" list as your "real" home timeline, and then check your home timeline when you're bored. Check out [more details about exclusive lists on the wiki](https://github.com/hometown-fork/hometown/wiki/Exclusive-lists). ## Better accessibility defaults From 4c52d67a66834cb5546c92305b5a87b7bdb23e33 Mon Sep 17 00:00:00 2001 From: exstral Date: Sun, 24 May 2020 23:15:26 +0200 Subject: [PATCH 120/129] use the hometown logo on public pages --- app/helpers/accounts_helper.rb | 6 +----- app/views/layouts/application.html.haml | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb index 134217734..37b75a5b1 100644 --- a/app/helpers/accounts_helper.rb +++ b/app/helpers/accounts_helper.rb @@ -99,10 +99,6 @@ module AccountsHelper 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') + content_tag(:svg, tag(:use, 'xlink:href' => '#hometownlogo'), 'viewBox' => '0 0 216.4144 232.00976') end end diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index d0f4fb47f..d12e0d430 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -38,4 +38,3 @@ .logo-resources = render file: Rails.root.join('app', 'javascript', 'images', 'hometown.svg') - = render file: Rails.root.join('app', 'javascript', 'images', 'logo_full.svg') From a8cfccd839349f672a13afec02609919614a32de Mon Sep 17 00:00:00 2001 From: exstral Date: Sun, 3 May 2020 14:18:58 +0200 Subject: [PATCH 121/129] rename whitelist to allowlist and blacklist to blocklist --- config/locales/en.yml | 34 +++++++++++++++++----------------- config/locales/en_GB.yml | 12 ++++++------ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 9e4808ec8..b96368072 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -92,7 +92,7 @@ en: delete: Delete destroyed_msg: Moderation note successfully destroyed! accounts: - add_email_domain_block: Blacklist e-mail domain + add_email_domain_block: Blocklist e-mail domain approve: Approve approve_all: Approve all are_you_sure: Are you sure? @@ -193,7 +193,7 @@ en: username: Username warn: Warn web: Web - whitelisted: Whitelisted + whitelisted: Allowlisted action_logs: action_types: assigned_to_self_report: Assign Report @@ -238,15 +238,15 @@ en: create_account_warning: "%{name} sent a warning to %{target}" create_announcement: "%{name} created new announcement %{target}" create_custom_emoji: "%{name} uploaded new emoji %{target}" - create_domain_allow: "%{name} whitelisted domain %{target}" + create_domain_allow: "%{name} allowlisted domain %{target}" create_domain_block: "%{name} blocked domain %{target}" - create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" + create_email_domain_block: "%{name} blocklisted e-mail domain %{target}" demote_user: "%{name} demoted user %{target}" destroy_announcement: "%{name} deleted announcement %{target}" destroy_custom_emoji: "%{name} destroyed emoji %{target}" - destroy_domain_allow: "%{name} removed domain %{target} from whitelist" + destroy_domain_allow: "%{name} removed domain %{target} from allowlist" destroy_domain_block: "%{name} unblocked domain %{target}" - destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" + destroy_email_domain_block: "%{name} allowlisted e-mail domain %{target}" destroy_status: "%{name} removed status by %{target}" disable_2fa_user: "%{name} disabled two factor requirement for user %{target}" disable_custom_emoji: "%{name} disabled emoji %{target}" @@ -346,12 +346,12 @@ en: week_interactions: interactions this week week_users_active: active this week week_users_new: users this week - whitelist_mode: Whitelist mode + whitelist_mode: allowlist mode domain_allows: - add_new: Whitelist domain - created_msg: Domain has been successfully whitelisted - destroyed_msg: Domain has been removed from the whitelist - undo: Remove from whitelist + add_new: Add domain to allowlist + created_msg: Domain has been successfully added to allowlist + destroyed_msg: Domain has been removed from the allowlist + undo: Remove from allowlist domain_blocks: add_new: Add new domain block created_msg: Domain block is now being processed @@ -394,16 +394,16 @@ en: view: View domain block email_domain_blocks: add_new: Add new - created_msg: Successfully added e-mail domain to blacklist + created_msg: Successfully added e-mail domain to blocklist delete: Delete - destroyed_msg: Successfully deleted e-mail domain from blacklist + destroyed_msg: Successfully deleted e-mail domain from blocklist domain: Domain - empty: No e-mail domains currently blacklisted. + empty: No e-mail domains currently blocklisted. from_html: from %{domain} new: create: Add domain - title: New e-mail blacklist entry - title: E-mail blacklist + title: New e-mail blocklist entry + title: E-mail blocklist instances: by_domain: Domain delivery_available: Delivery is available @@ -447,7 +447,7 @@ en: pending: Waiting for relay's approval save_and_enable: Save and enable setup: Setup a relay connection - signatures_not_enabled: Relays will not work correctly while secure mode or whitelist mode is enabled + signatures_not_enabled: Relays will not work correctly while secure mode or allowlist mode is enabled status: Status title: Relays report_notes: diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml index a38a36e38..8607daf36 100644 --- a/config/locales/en_GB.yml +++ b/config/locales/en_GB.yml @@ -181,11 +181,11 @@ en_GB: create_account_warning: "%{name} sent a warning to %{target}" create_custom_emoji: "%{name} uploaded new emoji %{target}" create_domain_block: "%{name} blocked domain %{target}" - create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" + create_email_domain_block: "%{name} blocklisted e-mail domain %{target}" demote_user: "%{name} demoted user %{target}" destroy_custom_emoji: "%{name} destroyed emoji %{target}" destroy_domain_block: "%{name} unblocked domain %{target}" - destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" + destroy_email_domain_block: "%{name} allowlisted e-mail domain %{target}" destroy_status: "%{name} removed status by %{target}" disable_2fa_user: "%{name} disabled two factor requirement for user %{target}" disable_custom_emoji: "%{name} disabled emoji %{target}" @@ -289,14 +289,14 @@ en_GB: undo: Undo domain block email_domain_blocks: add_new: Add new - created_msg: Successfully added e-mail domain to blacklist + created_msg: Successfully added e-mail domain to blocklist delete: Delete - destroyed_msg: Successfully deleted e-mail domain from blacklist + destroyed_msg: Successfully deleted e-mail domain from blocklist domain: Domain new: create: Add domain - title: New e-mail blacklist entry - title: E-mail blacklist + title: New e-mail blocklist entry + title: E-mail blocklist followers: back_to_account: Back To Account title: "%{acct}'s Followers" From f03131519be524142c1e5610257f423fcc382524 Mon Sep 17 00:00:00 2001 From: exstral Date: Sun, 3 May 2020 13:49:40 +0200 Subject: [PATCH 122/129] change emoji button to more neutral emoji --- .../features/compose/components/emoji_picker_dropdown.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js index 3a3026378..1e911efff 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js @@ -361,7 +361,7 @@ class EmojiPickerDropdown extends React.PureComponent { 🙂
From 4f8e44645673c8c68bc87df8f923894b83f22694 Mon Sep 17 00:00:00 2001 From: exstral Date: Fri, 22 May 2020 00:19:37 +0200 Subject: [PATCH 123/129] missing comma in hometown macaron theme --- app/javascript/styles/macaron.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/macaron.scss b/app/javascript/styles/macaron.scss index a366a2361..98677275d 100644 --- a/app/javascript/styles/macaron.scss +++ b/app/javascript/styles/macaron.scss @@ -1,3 +1,3 @@ @import 'macaron/variables'; @import 'application'; -@import 'macaron/diff' +@import 'macaron/diff'; From f66a04b6d358d4c06d9e3a05394ce70ecf566edb Mon Sep 17 00:00:00 2001 From: mathilde <41020854+mthld@users.noreply.github.com> Date: Wed, 1 Jul 2020 08:38:31 +0200 Subject: [PATCH 124/129] explain why the fork is needed upstream don't want those features, fix #46 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fd08ca0dd..02e57ea07 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Photo by [Joana Mujollari](https://www.flickr.com/photos/141654969@N04/267773390 Mastodon is a **free, open-source social network server** based on ActivityPub. This is *not* the official version of Mastodon; this is a separate version (i.e. a fork) maintained by [Darius Kazemi](https://friend.camp/@darius). For more information on Mastodon, you can see the [official website](https://joinmastodon.org) and the [upstream repo](https://github.com/tootsuite/mastodon). -__Hometown__ is a light weight fork of Mastodon. This fork is based on the principle of: minimum code change for maximum user experience change. +__Hometown__ is a light weight fork of Mastodon. This fork is based on the principle of: minimum code change for maximum user experience change. These changes aren't wanted by Eugene, Mastodon's owner, and can't be upstreamed, ence the fork. Please [check out our wiki](https://github.com/hometown-fork/hometown/wiki) for a list of Hometown-exclusive features. Some but not all of these are covered in this document. From 6675ff8cc8cfc8e9ece423b8d62859d71e8d277d Mon Sep 17 00:00:00 2001 From: mathilde <41020854+mthld@users.noreply.github.com> Date: Wed, 1 Jul 2020 11:25:27 +0200 Subject: [PATCH 125/129] add server list wiki link --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fd08ca0dd..95c50b3ac 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ __Hometown__ is a light weight fork of Mastodon. This fork is based on the princ Please [check out our wiki](https://github.com/hometown-fork/hometown/wiki) for a list of Hometown-exclusive features. Some but not all of these are covered in this document. +You can also find [a list of running Hometown instances](https://github.com/hometown-fork/hometown/wiki/Hometown-servers), don't hesitate to open an issue to add yours! + ## Support this project Please consider [supporting Hometown by pledging to my Patreon](https://www.patreon.com/tinysubversions), which supports all my open source projects including this one! From 2c004244fc95fbfc50b350b1d211652e7d7e2fc1 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Tue, 7 Jul 2020 12:47:23 -0700 Subject: [PATCH 126/129] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff87ab558..f9d555b0e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Photo by [Joana Mujollari](https://www.flickr.com/photos/141654969@N04/267773390 Mastodon is a **free, open-source social network server** based on ActivityPub. This is *not* the official version of Mastodon; this is a separate version (i.e. a fork) maintained by [Darius Kazemi](https://friend.camp/@darius). For more information on Mastodon, you can see the [official website](https://joinmastodon.org) and the [upstream repo](https://github.com/tootsuite/mastodon). -__Hometown__ is a light weight fork of Mastodon. This fork is based on the principle of: minimum code change for maximum user experience change. These changes aren't wanted by Eugene, Mastodon's owner, and can't be upstreamed, ence the fork. +__Hometown__ is a light weight fork of Mastodon. This fork is based on the principle of: minimum code change for maximum user experience change. By our best understanding, our major changes are not wanted by the Mastodon project, hence maintaining this fork instead of trying to commit the changes to Mastodon. Please [check out our wiki](https://github.com/hometown-fork/hometown/wiki) for a list of Hometown-exclusive features. Some but not all of these are covered in this document. From 12ea20597864adc75a67d469b5f4286ebe588399 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Tue, 11 Aug 2020 21:21:06 -0700 Subject: [PATCH 127/129] Convert 'toot' into 'post' in clientside locale --- app/javascript/mastodon/locales/en.json | 32 ++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 0cc5b2e14..a65d7bdb5 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -36,7 +36,7 @@ "account.requested": "Awaiting approval. Click to cancel follow request", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Show boosts from @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", + "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}", "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unblock domain {domain}", "account.unendorse": "Don't feature on profile", @@ -107,7 +107,7 @@ "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 toot?", + "confirmations.delete.message": "Are you sure you want to delete this post?", "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Block entire domain", @@ -118,7 +118,7 @@ "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this toot and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", "confirmations.reply.confirm": "Reply", "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", @@ -131,7 +131,7 @@ "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", "directory.recently_active": "Recently active", - "embed.instructions": "Embed this toot on your website by copying the code below.", + "embed.instructions": "Embed this post 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", @@ -160,7 +160,7 @@ "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search 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 toots, they will appear here.", + "empty_column.list": "There is nothing in this list yet. When members of this list post new posts, they will appear here.", "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", "empty_column.mutes": "You haven't muted any users yet.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", @@ -224,12 +224,12 @@ "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked users list", "keyboard_shortcuts.boost": "to boost", - "keyboard_shortcuts.column": "to focus a toot in one of the columns", + "keyboard_shortcuts.column": "to focus a post in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "Description", "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", - "keyboard_shortcuts.enter": "to open toot", + "keyboard_shortcuts.enter": "to open post", "keyboard_shortcuts.favourite": "to favourite", "keyboard_shortcuts.favourites": "to open favourites list", "keyboard_shortcuts.federated": "to open federated timeline", @@ -297,13 +297,13 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", - "notification.favourite": "{name} favourited your toot", + "notification.favourite": "{name} favourited your post", "notification.follow": "{name} followed you", "notification.follow_request": "{name} has requested to follow you", "notification.mention": "{name} mentioned you", "notification.own_poll": "Your poll has ended", "notification.poll": "A poll you have voted in has ended", - "notification.reblog": "{name} boosted your toot", + "notification.reblog": "{name} boosted your post", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", "notifications.column_settings.alert": "Desktop notifications", @@ -334,7 +334,7 @@ "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", - "privacy.change": "Adjust toot privacy", + "privacy.change": "Adjust post privacy", "privacy.direct.long": "Visible for mentioned users only", "privacy.direct.short": "Direct", "privacy.private.long": "Visible for followers only", @@ -361,9 +361,9 @@ "report.target": "Reporting {target}", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", - "search_popout.tips.full_text": "Simple text returns toots you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.full_text": "Simple text returns posts 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": "toot", + "search_popout.tips.status": "post", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", @@ -372,12 +372,12 @@ "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this toot in the moderation interface", + "status.admin_status": "Open this post in the moderation interface", "status.block": "Block @{name}", "status.bookmark": "Bookmark", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", - "status.copy": "Copy link to toot", + "status.copy": "Copy link to post", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -391,7 +391,7 @@ "status.more": "More", "status.mute": "Mute @{name}", "status.mute_conversation": "Mute conversation", - "status.open": "Expand this toot", + "status.open": "Expand this post", "status.pin": "Pin on profile", "status.pinned": "Pinned post", "status.read_more": "Read more", @@ -429,7 +429,7 @@ "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", "timeline_hint.resources.followers": "Followers", "timeline_hint.resources.follows": "Follows", - "timeline_hint.resources.statuses": "Older toots", + "timeline_hint.resources.statuses": "Older posts", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", "trends.trending_now": "Trending now", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", From 34aebed6164a88cb19ae006e6e10c5a27e025593 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Tue, 11 Aug 2020 21:38:58 -0700 Subject: [PATCH 128/129] Fixing primary audio player UI in Macaron theme --- app/javascript/styles/macaron/diff.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/macaron/diff.scss b/app/javascript/styles/macaron/diff.scss index 12a3f692b..6600c7717 100644 --- a/app/javascript/styles/macaron/diff.scss +++ b/app/javascript/styles/macaron/diff.scss @@ -1093,5 +1093,5 @@ a.status-card.compact:hover { .audio-player .video-player__time-sep, .audio-player .video-player__time-current, .audio-player .video-player__time-total { - color: $primary-text-color; + color: $ui-primary-color; } From 1a6e1dd8046c72054426de52491a4b70f1fd4719 Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Wed, 12 Aug 2020 10:34:35 -0700 Subject: [PATCH 129/129] Custom emoji forces a post to be local-only This is to better support third-party clients. Appending the :local_only: emoji (or just the text `:local_only:` if that emoji is not set on the server) will make any post into a local-only, unfederated post. Admins are encouraged to pick something fun and/or unintrusive (think a nearly-transparent png) as the emoji. --- app/services/post_status_service.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 0fd68ebc7..c9ed8aede 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -87,7 +87,12 @@ class PostStatusService < BaseService end end - def local_only_option(local_only, in_reply_to, federation_setting) + def local_only_option(local_only, in_reply_to, federation_setting, text) + # This is intended for third party clients. The admin can set a custom :local_only: + # emoji that users can append to force a post to be local only. + if text.include? ":local_only:" + return true + end if local_only.nil? if in_reply_to && in_reply_to.local_only return true @@ -178,7 +183,7 @@ class PostStatusService < BaseService visibility: @visibility, language: language_from_option(@options[:language]) || @account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(@text, @account), application: @options[:application], - local_only: local_only_option(@options[:local_only], @in_reply_to, @account.user&.setting_default_federation), + local_only: local_only_option(@options[:local_only], @in_reply_to, @account.user&.setting_default_federation, @text), rate_limit: @options[:with_rate_limit], }.compact end