diff --git a/CONFIGURATION.md b/CONFIGURATION.md
index 3f0ecafb5..51a76d1b7 100644
--- a/CONFIGURATION.md
+++ b/CONFIGURATION.md
@@ -13,6 +13,21 @@ Instead, overload the settings by editing the following files:
* `dev.secret.exs`: custom additional configuration for `MIX_ENV=dev`
* `prod.secret.exs`: custom additional configuration for `MIX_ENV=prod`
+## Uploads configuration
+
+To configure where to upload files, and wether or not
+you want to remove automatically EXIF data from pictures
+being uploaded.
+
+ config :pleroma, Pleroma.Upload,
+ uploads: "uploads",
+ strip_exif: false
+
+* `uploads`: where to put the uploaded files, relative to pleroma's main directory.
+* `strip_exif`: whether or not to remove EXIF data from uploaded pics automatically.
+ This needs Imagemagick installed on the system ( apt install imagemagick ).
+
+
## Block functionality
config :pleroma, :activitypub,
diff --git a/config/config.exs b/config/config.exs
index cf6cbaa9d..ee30969e8 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -10,7 +10,11 @@
config :pleroma, Pleroma.Repo, types: Pleroma.PostgresTypes
-config :pleroma, Pleroma.Upload, uploads: "uploads"
+config :pleroma, Pleroma.Upload,
+ uploads: "uploads",
+ strip_exif: false
+
+config :pleroma, :emoji, shortcode_globs: ["/emoji/custom/**/*.png"]
# Configures the endpoint
config :pleroma, Pleroma.Web.Endpoint,
@@ -50,6 +54,7 @@
version: version,
name: "Pleroma",
email: "example@example.com",
+ description: "A Pleroma instance, an alternative fediverse server",
limit: 5000,
upload_limit: 16_000_000,
registrations_open: true,
@@ -58,6 +63,19 @@
public: true,
quarantined_instances: []
+config :pleroma, :fe,
+ theme: "pleroma-dark",
+ logo: "/static/logo.png",
+ background: "/static/aurora_borealis.jpg",
+ redirect_root_no_login: "/main/all",
+ redirect_root_login: "/main/friends",
+ show_instance_panel: true,
+ show_who_to_follow_panel: false,
+ who_to_follow_provider:
+ "https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-osa-api.cgi?{{host}}+{{user}}",
+ who_to_follow_link: "https://vinayaka.distsn.org/?{{host}}+{{user}}",
+ scope_options_enabled: false
+
config :pleroma, :activitypub,
accept_blocks: true,
unfollow_blocked: true,
@@ -93,6 +111,13 @@
ip: {0, 0, 0, 0},
port: 9999
+config :pleroma, :suggestions,
+ enabled: false,
+ third_party_engine:
+ "http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-suggestions-api.cgi?{{host}}+{{user}}",
+ timeout: 300_000,
+ web: "https://vinayaka.distsn.org/?{{host}}+{{user}}"
+
# Import environment specific config. This must remain at the bottom
# of this file so it overrides the configuration defined above.
import_config "#{Mix.env()}.exs"
diff --git a/lib/mix/tasks/generate_invite_token.ex b/lib/mix/tasks/generate_invite_token.ex
new file mode 100644
index 000000000..c4daa9a6c
--- /dev/null
+++ b/lib/mix/tasks/generate_invite_token.ex
@@ -0,0 +1,25 @@
+defmodule Mix.Tasks.GenerateInviteToken do
+ use Mix.Task
+
+ @shortdoc "Generate invite token for user"
+ def run([]) do
+ Mix.Task.run("app.start")
+
+ with {:ok, token} <- Pleroma.UserInviteToken.create_token() do
+ IO.puts("Generated user invite token")
+
+ IO.puts(
+ "Url: #{
+ Pleroma.Web.Router.Helpers.redirect_url(
+ Pleroma.Web.Endpoint,
+ :registration_page,
+ token.token
+ )
+ }"
+ )
+ else
+ _ ->
+ IO.puts("Error creating token")
+ end
+ end
+end
diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex
index dd6805125..bed96861f 100644
--- a/lib/pleroma/activity.ex
+++ b/lib/pleroma/activity.ex
@@ -78,4 +78,8 @@ def get_create_activity_by_object_ap_id(ap_id) when is_binary(ap_id) do
end
def get_create_activity_by_object_ap_id(_), do: nil
+
+ def normalize(obj) when is_map(obj), do: Activity.get_by_ap_id(obj["id"])
+ def normalize(ap_id) when is_binary(ap_id), do: Activity.get_by_ap_id(ap_id)
+ def normalize(_), do: nil
end
diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex
index df7ffbc41..d199c9243 100644
--- a/lib/pleroma/formatter.ex
+++ b/lib/pleroma/formatter.ex
@@ -116,7 +116,28 @@ def parse_mentions(text) do
_ -> []
end)
- @emoji @finmoji_with_filenames ++ @emoji_from_file
+ @emoji_from_globs (
+ static_path = Path.join(:code.priv_dir(:pleroma), "static")
+
+ globs =
+ Application.get_env(:pleroma, :emoji, [])
+ |> Keyword.get(:shortcode_globs, [])
+
+ paths =
+ Enum.map(globs, fn glob ->
+ Path.join(static_path, glob)
+ |> Path.wildcard()
+ end)
+ |> Enum.concat()
+
+ Enum.map(paths, fn path ->
+ shortcode = Path.basename(path, Path.extname(path))
+ external_path = Path.join("/", Path.relative_to(path, static_path))
+ {shortcode, external_path}
+ end)
+ )
+
+ @emoji @finmoji_with_filenames ++ @emoji_from_globs ++ @emoji_from_file
def emojify(text, emoji \\ @emoji)
def emojify(text, nil), do: text
@@ -223,8 +244,8 @@ def add_hashtag_links({subs, text}, tags) do
subs =
subs ++
- Enum.map(tags, fn {_, tag, uuid} ->
- url = "##{tag} "
+ Enum.map(tags, fn {tag_text, tag, uuid} ->
+ url = "#{tag_text} "
{uuid, url}
end)
diff --git a/lib/pleroma/gopher/server.ex b/lib/pleroma/gopher/server.ex
index f6abcd4d0..97a1dea77 100644
--- a/lib/pleroma/gopher/server.ex
+++ b/lib/pleroma/gopher/server.ex
@@ -54,7 +54,7 @@ def info(text) do
String.split(text, "\r")
|> Enum.map(fn text ->
- "i#{text}\tfake\(NULL)\t0\r\n"
+ "i#{text}\tfake\t(NULL)\t0\r\n"
end)
|> Enum.join("")
end
@@ -77,14 +77,14 @@ def render_activities(activities) do
link("Post ##{activity.id} by #{user.nickname}", "/notices/#{activity.id}") <>
info("#{like_count} likes, #{announcement_count} repeats") <>
- "\r\n" <>
+ "i\tfake\t(NULL)\t0\r\n" <>
info(
HtmlSanitizeEx.strip_tags(
String.replace(activity.data["object"]["content"], " ", "\r")
)
)
end)
- |> Enum.join("\r\n")
+ |> Enum.join("i\tfake\t(NULL)\t0\r\n")
end
def response("") do
diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex
index ff2af4a6f..1bcff5a7b 100644
--- a/lib/pleroma/object.ex
+++ b/lib/pleroma/object.ex
@@ -27,6 +27,10 @@ def get_by_ap_id(ap_id) do
Repo.one(from(object in Object, where: fragment("(?)->>'id' = ?", object.data, ^ap_id)))
end
+ def normalize(obj) when is_map(obj), do: Object.get_by_ap_id(obj["id"])
+ def normalize(ap_id) when is_binary(ap_id), do: Object.get_by_ap_id(ap_id)
+ def normalize(_), do: nil
+
def get_cached_by_ap_id(ap_id) do
if Mix.env() == :test do
get_by_ap_id(ap_id)
diff --git a/lib/pleroma/plugs/digest.ex b/lib/pleroma/plugs/digest.ex
new file mode 100644
index 000000000..9d6bbb085
--- /dev/null
+++ b/lib/pleroma/plugs/digest.ex
@@ -0,0 +1,10 @@
+defmodule Pleroma.Web.Plugs.DigestPlug do
+ alias Plug.Conn
+ require Logger
+
+ def read_body(conn, opts) do
+ {:ok, body, conn} = Conn.read_body(conn, opts)
+ digest = "SHA-256=" <> (:crypto.hash(:sha256, body) |> Base.encode64())
+ {:ok, body, Conn.assign(conn, :digest, digest)}
+ end
+end
diff --git a/lib/pleroma/plugs/http_signature.ex b/lib/pleroma/plugs/http_signature.ex
index 38bcd3a78..9e53371b7 100644
--- a/lib/pleroma/plugs/http_signature.ex
+++ b/lib/pleroma/plugs/http_signature.ex
@@ -19,6 +19,8 @@ def call(conn, _opts) do
cond do
signature && String.contains?(signature, user) ->
+ # set (request-target) header to the appropriate value
+ # we also replace the digest header with the one we computed
conn =
conn
|> put_req_header(
@@ -26,6 +28,14 @@ def call(conn, _opts) do
String.downcase("#{conn.method}") <> " #{conn.request_path}"
)
+ conn =
+ if conn.assigns[:digest] do
+ conn
+ |> put_req_header("digest", conn.assigns[:digest])
+ else
+ conn
+ end
+
assign(conn, :valid_signature, HTTPSignatures.validate_conn(conn))
signature ->
diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex
index 43df0d418..e0cb545b0 100644
--- a/lib/pleroma/upload.ex
+++ b/lib/pleroma/upload.ex
@@ -18,8 +18,10 @@ def store(%Plug.Upload{} = file, should_dedupe) do
File.cp!(file.path, result_file)
end
+ strip_exif_data(content_type, result_file)
+
%{
- "type" => "Image",
+ "type" => "Document",
"url" => [
%{
"type" => "Link",
@@ -67,6 +69,8 @@ def store(%{"img" => "data:image/" <> image_data}, should_dedupe) do
File.rename(uuidpath, result_file)
end
+ strip_exif_data(content_type, result_file)
+
%{
"type" => "Image",
"url" => [
@@ -80,6 +84,16 @@ def store(%{"img" => "data:image/" <> image_data}, should_dedupe) do
}
end
+ def strip_exif_data(content_type, file) do
+ settings = Application.get_env(:pleroma, Pleroma.Upload)
+ do_strip = Keyword.fetch!(settings, :strip_exif)
+ [filetype, ext] = String.split(content_type, "/")
+
+ if filetype == "image" and do_strip == true do
+ Mogrify.open(file) |> Mogrify.custom("strip") |> Mogrify.save(in_place: true)
+ end
+ end
+
def upload_path do
settings = Application.get_env(:pleroma, Pleroma.Upload)
Keyword.fetch!(settings, :uploads)
@@ -110,20 +124,20 @@ defp get_name(file, uuid, type, should_dedupe) do
if should_dedupe do
create_name(uuid, List.last(String.split(file.filename, ".")), type)
else
- unless String.contains?(file.filename, ".") do
- case type do
- "image/png" -> file.filename <> ".png"
- "image/jpeg" -> file.filename <> ".jpg"
- "image/gif" -> file.filename <> ".gif"
- "video/webm" -> file.filename <> ".webm"
- "video/mp4" -> file.filename <> ".mp4"
- "audio/mpeg" -> file.filename <> ".mp3"
- "audio/ogg" -> file.filename <> ".ogg"
- "audio/wav" -> file.filename <> ".wav"
- _ -> file.filename
+ parts = String.split(file.filename, ".")
+
+ new_filename =
+ if length(parts) > 1 do
+ Enum.drop(parts, -1) |> Enum.join(".")
+ else
+ Enum.join(parts)
end
- else
- file.filename
+
+ case type do
+ "application/octet-stream" -> file.filename
+ "audio/mpeg" -> new_filename <> ".mp3"
+ "image/jpeg" -> new_filename <> ".jpg"
+ _ -> Enum.join([new_filename, String.split(type, "/") |> List.last()], ".")
end
end
end
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 94f16c3c0..fa0ea171d 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -398,6 +398,7 @@ def get_follow_requests(%User{} = user) do
Enum.map(reqs, fn req -> req.actor end)
|> Enum.uniq()
|> Enum.map(fn ap_id -> get_by_ap_id(ap_id) end)
+ |> Enum.filter(fn u -> !following?(u, user) end)
{:ok, users}
end
@@ -607,7 +608,7 @@ def delete(%User{} = user) do
|> Enum.each(fn activity ->
case activity.data["type"] do
"Create" ->
- ActivityPub.delete(Object.get_by_ap_id(activity.data["object"]["id"]))
+ ActivityPub.delete(Object.normalize(activity.data["object"]))
# TODO: Do something with likes, follows, repeats.
_ ->
diff --git a/lib/pleroma/user_invite_token.ex b/lib/pleroma/user_invite_token.ex
new file mode 100644
index 000000000..48ee1019a
--- /dev/null
+++ b/lib/pleroma/user_invite_token.ex
@@ -0,0 +1,40 @@
+defmodule Pleroma.UserInviteToken do
+ use Ecto.Schema
+
+ import Ecto.Changeset
+
+ alias Pleroma.{User, UserInviteToken, Repo}
+
+ schema "user_invite_tokens" do
+ field(:token, :string)
+ field(:used, :boolean, default: false)
+
+ timestamps()
+ end
+
+ def create_token do
+ token = :crypto.strong_rand_bytes(32) |> Base.url_encode64()
+
+ token = %UserInviteToken{
+ used: false,
+ token: token
+ }
+
+ Repo.insert(token)
+ end
+
+ def used_changeset(struct) do
+ struct
+ |> cast(%{}, [])
+ |> put_change(:used, true)
+ end
+
+ def mark_as_used(token) do
+ with %{used: false} = token <- Repo.get_by(UserInviteToken, %{token: token}),
+ {:ok, token} <- Repo.update(used_changeset(token)) do
+ {:ok, token}
+ else
+ _e -> {:error, token}
+ end
+ end
+end
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 195679fad..ec605b694 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -30,7 +30,7 @@ defp check_actor_is_active(actor) do
end
def insert(map, local \\ true) when is_map(map) do
- with nil <- Activity.get_by_ap_id(map["id"]),
+ with nil <- Activity.normalize(map),
map <- lazy_put_activity_defaults(map),
:ok <- check_actor_is_active(map["actor"]),
{:ok, map} <- MRF.filter(map),
@@ -641,13 +641,23 @@ def publish_one(%{inbox: inbox, json: json, actor: actor, id: id}) do
Logger.info("Federating #{id} to #{inbox}")
host = URI.parse(inbox).host
+ digest = "SHA-256=" <> (:crypto.hash(:sha256, json) |> Base.encode64())
+
signature =
- Pleroma.Web.HTTPSignatures.sign(actor, %{host: host, "content-length": byte_size(json)})
+ Pleroma.Web.HTTPSignatures.sign(actor, %{
+ host: host,
+ "content-length": byte_size(json),
+ digest: digest
+ })
@httpoison.post(
inbox,
json,
- [{"Content-Type", "application/activity+json"}, {"signature", signature}],
+ [
+ {"Content-Type", "application/activity+json"},
+ {"signature", signature},
+ {"digest", digest}
+ ],
hackney: [pool: :default]
)
end
@@ -670,7 +680,7 @@ def fetch_object_from_id(id) do
recv_timeout: 20000
),
{:ok, data} <- Jason.decode(body),
- nil <- Object.get_by_ap_id(data["id"]),
+ nil <- Object.normalize(data),
params <- %{
"type" => "Create",
"to" => data["to"],
@@ -679,7 +689,7 @@ def fetch_object_from_id(id) do
"object" => data
},
{:ok, activity} <- Transmogrifier.handle_incoming(params) do
- {:ok, Object.get_by_ap_id(activity.data["object"]["id"])}
+ {:ok, Object.normalize(activity.data["object"])}
else
object = %Object{} ->
{:ok, object}
@@ -688,7 +698,7 @@ def fetch_object_from_id(id) do
Logger.info("Couldn't get object via AP, trying out OStatus fetching...")
case OStatus.fetch_activity_from_url(id) do
- {:ok, [activity | _]} -> {:ok, Object.get_by_ap_id(activity.data["object"]["id"])}
+ {:ok, [activity | _]} -> {:ok, Object.normalize(activity.data["object"])}
e -> e
end
end
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 30cd70fb6..e5fb6e033 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -13,18 +13,58 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
require Logger
+ def get_actor(%{"actor" => actor}) when is_binary(actor) do
+ actor
+ end
+
+ def get_actor(%{"actor" => actor}) when is_list(actor) do
+ Enum.at(actor, 0)
+ end
+
+ def get_actor(%{"actor" => actor}) when is_map(actor) do
+ actor["id"]
+ end
+
+ def get_actor(%{"actor" => actor_list}) do
+ Enum.find(actor_list, fn %{"type" => type} -> type == "Person" end)
+ |> Map.get("id")
+ end
+
@doc """
Modifies an incoming AP object (mastodon format) to our internal format.
"""
def fix_object(object) do
object
- |> Map.put("actor", object["attributedTo"])
+ |> fix_actor
|> fix_attachments
|> fix_context
|> fix_in_reply_to
|> fix_emoji
|> fix_tag
|> fix_content_map
+ |> fix_addressing
+ end
+
+ def fix_addressing_list(map, field) do
+ if is_binary(map[field]) do
+ map
+ |> Map.put(field, [map[field]])
+ else
+ map
+ end
+ end
+
+ def fix_addressing(map) do
+ map
+ |> fix_addressing_list("to")
+ |> fix_addressing_list("cc")
+ |> fix_addressing_list("bto")
+ |> fix_addressing_list("bcc")
+ end
+
+ def fix_actor(%{"attributedTo" => actor} = object) do
+ object
+ |> Map.put("actor", get_actor(%{"actor" => actor}))
end
def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object)
@@ -122,7 +162,14 @@ def fix_content_map(object), do: object
# TODO: validate those with a Ecto scheme
# - tags
# - emoji
- def handle_incoming(%{"type" => "Create", "object" => %{"type" => "Note"} = object} = data) do
+ def handle_incoming(%{"type" => "Create", "object" => %{"type" => objtype} = object} = data)
+ when objtype in ["Article", "Note"] do
+ actor = get_actor(data)
+
+ data =
+ Map.put(data, "actor", actor)
+ |> fix_addressing
+
with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]),
%User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do
object = fix_object(data["object"])
@@ -412,7 +459,7 @@ def handle_incoming(
def handle_incoming(_), do: :error
def get_obj_helper(id) do
- if object = Object.get_by_ap_id(id), do: {:ok, object}, else: nil
+ if object = Object.normalize(id), do: {:ok, object}, else: nil
end
def set_reply_to_uri(%{"inReplyTo" => inReplyTo} = object) do
@@ -460,14 +507,7 @@ def prepare_outgoing(%{"type" => "Create", "object" => %{"type" => "Note"} = obj
# Mastodon Accept/Reject requires a non-normalized object containing the actor URIs,
# because of course it does.
def prepare_outgoing(%{"type" => "Accept"} = data) do
- follow_activity_id =
- if is_binary(data["object"]) do
- data["object"]
- else
- data["object"]["id"]
- end
-
- with follow_activity <- Activity.get_by_ap_id(follow_activity_id) do
+ with follow_activity <- Activity.normalize(data["object"]) do
object = %{
"actor" => follow_activity.actor,
"object" => follow_activity.data["object"],
@@ -485,14 +525,7 @@ def prepare_outgoing(%{"type" => "Accept"} = data) do
end
def prepare_outgoing(%{"type" => "Reject"} = data) do
- follow_activity_id =
- if is_binary(data["object"]) do
- data["object"]
- else
- data["object"]["id"]
- end
-
- with follow_activity <- Activity.get_by_ap_id(follow_activity_id) do
+ with follow_activity <- Activity.normalize(data["object"]) do
object = %{
"actor" => follow_activity.actor,
"object" => follow_activity.data["object"],
diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex
index 64329b710..8b41a3bec 100644
--- a/lib/pleroma/web/activity_pub/utils.ex
+++ b/lib/pleroma/web/activity_pub/utils.ex
@@ -128,7 +128,7 @@ def lazy_put_object_defaults(map, activity \\ %{}) do
Inserts a full object if it is contained in an activity.
"""
def insert_full_object(%{"object" => %{"type" => type} = object_data})
- when is_map(object_data) and type in ["Note"] do
+ when is_map(object_data) and type in ["Article", "Note"] do
with {:ok, _} <- Object.create(object_data) do
:ok
end
diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex
index f4b2e0610..0b1d5a9fa 100644
--- a/lib/pleroma/web/activity_pub/views/user_view.ex
+++ b/lib/pleroma/web/activity_pub/views/user_view.ex
@@ -12,7 +12,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do
def render("user.json", %{user: user}) do
{:ok, user} = WebFinger.ensure_keys_present(user)
{:ok, _, public_key} = Salmon.keys_from_pem(user.info["keys"])
- public_key = :public_key.pem_entry_encode(:RSAPublicKey, public_key)
+ public_key = :public_key.pem_entry_encode(:SubjectPublicKeyInfo, public_key)
public_key = :public_key.pem_encode([public_key])
%{
@@ -98,9 +98,6 @@ def render("outbox.json", %{user: user, max_id: max_qid}) do
info = User.user_info(user)
params = %{
- "type" => ["Create", "Announce"],
- "actor_id" => user.ap_id,
- "whole_db" => true,
"limit" => "10"
}
@@ -111,10 +108,8 @@ def render("outbox.json", %{user: user, max_id: max_qid}) do
params
end
- activities = ActivityPub.fetch_public_activities(params)
- min_id = Enum.at(activities, 0).id
-
- activities = Enum.reverse(activities)
+ activities = ActivityPub.fetch_user_activities(user, nil, params)
+ min_id = Enum.at(Enum.reverse(activities), 0).id
max_id = Enum.at(activities, 0).id
collection =
diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex
index 8845419c2..3f18a68e8 100644
--- a/lib/pleroma/web/common_api/common_api.ex
+++ b/lib/pleroma/web/common_api/common_api.ex
@@ -7,7 +7,7 @@ defmodule Pleroma.Web.CommonAPI do
def delete(activity_id, user) do
with %Activity{data: %{"object" => %{"id" => object_id}}} <- Repo.get(Activity, activity_id),
- %Object{} = object <- Object.get_by_ap_id(object_id),
+ %Object{} = object <- Object.normalize(object_id),
true <- user.info["is_moderator"] || user.ap_id == object.data["actor"],
{:ok, delete} <- ActivityPub.delete(object) do
{:ok, delete}
@@ -16,7 +16,7 @@ def delete(activity_id, user) do
def repeat(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
- object <- Object.get_by_ap_id(activity.data["object"]["id"]) do
+ object <- Object.normalize(activity.data["object"]["id"]) do
ActivityPub.announce(user, object)
else
_ ->
@@ -26,7 +26,7 @@ def repeat(id_or_ap_id, user) do
def unrepeat(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
- object <- Object.get_by_ap_id(activity.data["object"]["id"]) do
+ object <- Object.normalize(activity.data["object"]["id"]) do
ActivityPub.unannounce(user, object)
else
_ ->
@@ -37,7 +37,7 @@ def unrepeat(id_or_ap_id, user) do
def favorite(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
false <- activity.data["actor"] == user.ap_id,
- object <- Object.get_by_ap_id(activity.data["object"]["id"]) do
+ object <- Object.normalize(activity.data["object"]["id"]) do
ActivityPub.like(user, object)
else
_ ->
@@ -48,7 +48,7 @@ def favorite(id_or_ap_id, user) do
def unfavorite(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
false <- activity.data["actor"] == user.ap_id,
- object <- Object.get_by_ap_id(activity.data["object"]["id"]) do
+ object <- Object.normalize(activity.data["object"]["id"]) do
ActivityPub.unlike(user, object)
else
_ ->
diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex
index 1a012c1b4..cbedca004 100644
--- a/lib/pleroma/web/endpoint.ex
+++ b/lib/pleroma/web/endpoint.ex
@@ -35,7 +35,8 @@ defmodule Pleroma.Web.Endpoint do
parsers: [:urlencoded, :multipart, :json],
pass: ["*/*"],
json_decoder: Jason,
- length: Application.get_env(:pleroma, :instance) |> Keyword.get(:upload_limit)
+ length: Application.get_env(:pleroma, :instance) |> Keyword.get(:upload_limit),
+ body_reader: {Pleroma.Web.Plugs.DigestPlug, :read_body, []}
)
plug(Plug.MethodOverride)
diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex
index 8ca530031..ccefb0bdf 100644
--- a/lib/pleroma/web/federator/federator.ex
+++ b/lib/pleroma/web/federator/federator.ex
@@ -95,7 +95,7 @@ def handle(:incoming_ap_doc, params) do
params = Utils.normalize_params(params)
with {:ok, _user} <- ap_enabled_actor(params["actor"]),
- nil <- Activity.get_by_ap_id(params["id"]),
+ nil <- Activity.normalize(params["id"]),
{:ok, _activity} <- Transmogrifier.handle_incoming(params) do
else
%Activity{} ->
diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
index 9d3f526c9..cd9525252 100644
--- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
+++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
@@ -1,6 +1,6 @@
defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
use Pleroma.Web, :controller
- alias Pleroma.{Repo, Activity, User, Notification, Stats}
+ alias Pleroma.{Repo, Object, Activity, User, Notification, Stats}
alias Pleroma.Web
alias Pleroma.Web.MastodonAPI.{StatusView, AccountView, MastodonView, ListView}
alias Pleroma.Web.ActivityPub.ActivityPub
@@ -11,6 +11,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
import Ecto.Query
require Logger
+ @httpoison Application.get_env(:pleroma, :httpoison)
+
action_fallback(:errors)
def create_app(conn, params) do
@@ -125,7 +127,7 @@ def masto_instance(conn, _params) do
response = %{
uri: Web.base_url(),
title: Keyword.get(@instance, :name),
- description: "A Pleroma instance, an alternative fediverse server",
+ description: Keyword.get(@instance, :description),
version: "#{@mastodon_api_level} (compatible; #{Keyword.get(@instance, :version)})",
email: Keyword.get(@instance, :email),
urls: %{
@@ -428,16 +430,43 @@ def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do
render(conn, AccountView, "relationships.json", %{user: user, targets: targets})
end
- def upload(%{assigns: %{user: _}} = conn, %{"file" => file}) do
- with {:ok, object} <- ActivityPub.upload(file) do
+ def update_media(%{assigns: %{user: _}} = conn, data) do
+ with %Object{} = object <- Repo.get(Object, data["id"]),
+ true <- is_binary(data["description"]),
+ description <- data["description"] do
+ new_data = %{object.data | "name" => description}
+
+ change = Object.change(object, %{data: new_data})
+ {:ok, media_obj} = Repo.update(change)
+
data =
- object.data
+ new_data
|> Map.put("id", object.id)
render(conn, StatusView, "attachment.json", %{attachment: data})
end
end
+ def upload(%{assigns: %{user: _}} = conn, %{"file" => file} = data) do
+ with {:ok, object} <- ActivityPub.upload(file) do
+ objdata =
+ if Map.has_key?(data, "description") do
+ Map.put(object.data, "name", data["description"])
+ else
+ object.data
+ end
+
+ change = Object.change(object, %{data: objdata})
+ {:ok, object} = Repo.update(change)
+
+ objdata =
+ objdata
+ |> Map.put("id", object.id)
+
+ render(conn, StatusView, "attachment.json", %{attachment: objdata})
+ end
+ end
+
def favourited_by(conn, %{"id" => id}) do
with %Activity{data: %{"object" => %{"likes" => likes}}} <- Repo.get(Activity, id) do
q = from(u in User, where: u.ap_id in ^likes)
@@ -873,7 +902,7 @@ def index(%{assigns: %{user: user}} = conn, _params) do
},
compose: %{
me: "#{user.id}",
- default_privacy: "public",
+ default_privacy: user.info["default_scope"] || "public",
default_sensitive: false
},
media_attachments: %{
@@ -1070,4 +1099,38 @@ def errors(conn, _) do
|> put_status(500)
|> json("Something went wrong")
end
+
+ @suggestions Application.get_env(:pleroma, :suggestions)
+
+ def suggestions(%{assigns: %{user: user}} = conn, _) do
+ if Keyword.get(@suggestions, :enabled, false) do
+ api = Keyword.get(@suggestions, :third_party_engine, "")
+ timeout = Keyword.get(@suggestions, :timeout, 5000)
+
+ host =
+ Application.get_env(:pleroma, Pleroma.Web.Endpoint)
+ |> Keyword.get(:url)
+ |> Keyword.get(:host)
+
+ user = user.nickname
+ url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user)
+
+ with {:ok, %{status_code: 200, body: body}} <-
+ @httpoison.get(url, [], timeout: timeout, recv_timeout: timeout),
+ {:ok, data} <- Jason.decode(body) do
+ data2 =
+ Enum.slice(data, 0, 40)
+ |> Enum.map(fn x ->
+ Map.put(x, "id", User.get_or_fetch(x["acct"]).id)
+ end)
+
+ conn
+ |> json(data2)
+ else
+ e -> Logger.error("Could not retrieve suggestions at fetch #{url}, #{inspect(e)}")
+ end
+ else
+ json(conn, [])
+ end
+ end
end
diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex
index f33d615cf..cc5261616 100644
--- a/lib/pleroma/web/mastodon_api/views/account_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/account_view.ex
@@ -14,6 +14,18 @@ def render("account.json", %{user: user}) do
header = User.banner_url(user) |> MediaProxy.url()
user_info = User.user_info(user)
+ emojis =
+ (user.info["source_data"]["tag"] || [])
+ |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end)
+ |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} ->
+ %{
+ "shortcode" => String.trim(name, ":"),
+ "url" => MediaProxy.url(url),
+ "static_url" => MediaProxy.url(url),
+ "visible_in_picker" => false
+ }
+ end)
+
%{
id: to_string(user.id),
username: hd(String.split(user.nickname, "@")),
@@ -30,7 +42,7 @@ def render("account.json", %{user: user}) do
avatar_static: image,
header: header,
header_static: header,
- emojis: [],
+ emojis: emojis,
fields: [],
source: %{
note: "",
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 59898457b..5dbd59dd9 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -54,8 +54,7 @@ def render(
%{
id: to_string(activity.id),
uri: object,
- # TODO: This might be wrong, check with mastodon.
- url: nil,
+ url: object,
account: AccountView.render("account.json", %{user: user}),
in_reply_to_id: nil,
in_reply_to_account_id: nil,
@@ -128,7 +127,7 @@ def render("status.json", %{activity: %{data: %{"object" => object}} = activity}
in_reply_to_id: reply_to && to_string(reply_to.id),
in_reply_to_account_id: reply_to_user && to_string(reply_to_user.id),
reblog: nil,
- content: HtmlSanitizeEx.basic_html(object["content"]),
+ content: render_content(object),
created_at: created_at,
reblogs_count: announcement_count,
favourites_count: like_count,
@@ -170,7 +169,8 @@ def render("attachment.json", %{attachment: attachment}) do
remote_url: href,
preview_url: MediaProxy.url(href),
text_url: href,
- type: type
+ type: type,
+ description: attachment["name"]
}
end
@@ -207,4 +207,21 @@ def get_visibility(object) do
"direct"
end
end
+
+ def render_content(%{"type" => "Article"} = object) do
+ summary = object["name"]
+
+ content =
+ if !!summary and summary != "" do
+ "
#{summary}
#{object["content"]}"
+ else
+ object["content"]
+ end
+
+ HtmlSanitizeEx.basic_html(content)
+ end
+
+ def render_content(object) do
+ HtmlSanitizeEx.basic_html(object["content"])
+ end
end
diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
index aec77168a..2fab60274 100644
--- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
+++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
@@ -4,8 +4,6 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
alias Pleroma.Stats
alias Pleroma.Web
- @instance Application.get_env(:pleroma, :instance)
-
def schemas(conn, _params) do
response = %{
links: [
@@ -21,20 +19,23 @@ def schemas(conn, _params) do
# Schema definition: https://github.com/jhass/nodeinfo/blob/master/schemas/2.0/schema.json
def nodeinfo(conn, %{"version" => "2.0"}) do
+ instance = Application.get_env(:pleroma, :instance)
+ media_proxy = Application.get_env(:pleroma, :media_proxy)
+ suggestions = Application.get_env(:pleroma, :suggestions)
stats = Stats.get_stats()
response = %{
version: "2.0",
software: %{
name: "pleroma",
- version: Keyword.get(@instance, :version)
+ version: Keyword.get(instance, :version)
},
protocols: ["ostatus", "activitypub"],
services: %{
inbound: [],
outbound: []
},
- openRegistrations: Keyword.get(@instance, :registrations_open),
+ openRegistrations: Keyword.get(instance, :registrations_open),
usage: %{
users: %{
total: stats.user_count || 0
@@ -42,7 +43,16 @@ def nodeinfo(conn, %{"version" => "2.0"}) do
localPosts: stats.status_count || 0
},
metadata: %{
- nodeName: Keyword.get(@instance, :name)
+ nodeName: Keyword.get(instance, :name),
+ nodeDescription: Keyword.get(instance, :description),
+ mediaProxy: Keyword.get(media_proxy, :enabled),
+ private: !Keyword.get(instance, :public, true),
+ suggestions: %{
+ enabled: Keyword.get(suggestions, :enabled, false),
+ thirdPartyEngine: Keyword.get(suggestions, :third_party_engine, ""),
+ timeout: Keyword.get(suggestions, :timeout, 5000),
+ web: Keyword.get(suggestions, :web, "")
+ }
}
}
diff --git a/lib/pleroma/web/ostatus/activity_representer.ex b/lib/pleroma/web/ostatus/activity_representer.ex
index 4179d86c9..5d831459b 100644
--- a/lib/pleroma/web/ostatus/activity_representer.ex
+++ b/lib/pleroma/web/ostatus/activity_representer.ex
@@ -246,7 +246,7 @@ def to_simple_form(
author = if with_author, do: [{:author, UserRepresenter.to_simple_form(user)}], else: []
mentions = (activity.recipients || []) |> get_mentions
- follow_activity = Activity.get_by_ap_id(follow_activity["id"])
+ follow_activity = Activity.normalize(follow_activity)
[
{:"activity:object-type", ['http://activitystrea.ms/schema/1.0/activity']},
diff --git a/lib/pleroma/web/ostatus/handlers/delete_handler.ex b/lib/pleroma/web/ostatus/handlers/delete_handler.ex
index 4f3016b65..6330d7f64 100644
--- a/lib/pleroma/web/ostatus/handlers/delete_handler.ex
+++ b/lib/pleroma/web/ostatus/handlers/delete_handler.ex
@@ -6,7 +6,7 @@ defmodule Pleroma.Web.OStatus.DeleteHandler do
def handle_delete(entry, _doc \\ nil) do
with id <- XML.string_from_xpath("//id", entry),
- object when not is_nil(object) <- Object.get_by_ap_id(id),
+ %Object{} = object <- Object.normalize(id),
{:ok, delete} <- ActivityPub.delete(object, false) do
delete
end
diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex
index f0ff0624f..916c894eb 100644
--- a/lib/pleroma/web/ostatus/ostatus.ex
+++ b/lib/pleroma/web/ostatus/ostatus.ex
@@ -89,7 +89,7 @@ def handle_incoming(xml_string) do
def make_share(entry, doc, retweeted_activity) do
with {:ok, actor} <- find_make_or_update_user(doc),
- %Object{} = object <- Object.get_by_ap_id(retweeted_activity.data["object"]["id"]),
+ %Object{} = object <- Object.normalize(retweeted_activity.data["object"]),
id when not is_nil(id) <- string_from_xpath("/entry/id", entry),
{:ok, activity, _object} = ActivityPub.announce(actor, object, id, false) do
{:ok, activity}
@@ -107,7 +107,7 @@ def handle_share(entry, doc) do
def make_favorite(entry, doc, favorited_activity) do
with {:ok, actor} <- find_make_or_update_user(doc),
- %Object{} = object <- Object.get_by_ap_id(favorited_activity.data["object"]["id"]),
+ %Object{} = object <- Object.normalize(favorited_activity.data["object"]),
id when not is_nil(id) <- string_from_xpath("/entry/id", entry),
{:ok, activity, _object} = ActivityPub.like(actor, object, id, false) do
{:ok, activity}
diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex
index 2f72fdb16..09d1b1110 100644
--- a/lib/pleroma/web/ostatus/ostatus_controller.ex
+++ b/lib/pleroma/web/ostatus/ostatus_controller.ex
@@ -6,6 +6,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do
alias Pleroma.Repo
alias Pleroma.Web.{OStatus, Federator}
alias Pleroma.Web.XML
+ alias Pleroma.Web.ActivityPub.ObjectView
alias Pleroma.Web.ActivityPub.ActivityPubController
alias Pleroma.Web.ActivityPub.ActivityPub
@@ -90,7 +91,7 @@ def object(conn, %{"uuid" => uuid}) do
%User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do
case get_format(conn) do
"html" -> redirect(conn, to: "/notice/#{activity.id}")
- _ -> represent_activity(conn, activity, user)
+ _ -> represent_activity(conn, nil, activity, user)
end
else
{:public?, false} ->
@@ -107,12 +108,12 @@ def object(conn, %{"uuid" => uuid}) do
def activity(conn, %{"uuid" => uuid}) do
with id <- o_status_url(conn, :activity, uuid),
- {_, %Activity{} = activity} <- {:activity, Activity.get_by_ap_id(id)},
+ {_, %Activity{} = activity} <- {:activity, Activity.normalize(id)},
{_, true} <- {:public?, ActivityPub.is_public?(activity)},
%User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do
- case get_format(conn) do
+ case format = get_format(conn) do
"html" -> redirect(conn, to: "/notice/#{activity.id}")
- _ -> represent_activity(conn, activity, user)
+ _ -> represent_activity(conn, format, activity, user)
end
else
{:public?, false} ->
@@ -130,14 +131,14 @@ def notice(conn, %{"id" => id}) do
with {_, %Activity{} = activity} <- {:activity, Repo.get(Activity, id)},
{_, true} <- {:public?, ActivityPub.is_public?(activity)},
%User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do
- case get_format(conn) do
+ case format = get_format(conn) do
"html" ->
conn
|> put_resp_content_type("text/html")
|> send_file(200, "priv/static/index.html")
_ ->
- represent_activity(conn, activity, user)
+ represent_activity(conn, format, activity, user)
end
else
{:public?, false} ->
@@ -151,7 +152,13 @@ def notice(conn, %{"id" => id}) do
end
end
- defp represent_activity(conn, activity, user) do
+ defp represent_activity(conn, "activity+json", activity, user) do
+ conn
+ |> put_resp_header("content-type", "application/activity+json")
+ |> json(ObjectView.render("object.json", %{object: activity}))
+ end
+
+ defp represent_activity(conn, _, activity, user) do
response =
activity
|> ActivityRepresenter.to_simple_form(user, true)
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index 34652cdde..2dadf974c 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -127,6 +127,7 @@ def user_fetcher(username) do
get("/notifications/:id", MastodonAPIController, :get_notification)
post("/media", MastodonAPIController, :upload)
+ put("/media/:id", MastodonAPIController, :update_media)
get("/lists", MastodonAPIController, :get_lists)
get("/lists/:id", MastodonAPIController, :get_list)
@@ -140,6 +141,8 @@ def user_fetcher(username) do
get("/domain_blocks", MastodonAPIController, :domain_blocks)
post("/domain_blocks", MastodonAPIController, :block_domain)
delete("/domain_blocks", MastodonAPIController, :unblock_domain)
+
+ get("/suggestions", MastodonAPIController, :suggestions)
end
scope "/api/web", Pleroma.Web.MastodonAPI do
@@ -201,9 +204,7 @@ def user_fetcher(username) do
get("/statuses/show/:id", TwitterAPI.Controller, :fetch_status)
get("/statusnet/conversation/:id", TwitterAPI.Controller, :fetch_conversation)
- if @registrations_open do
- post("/account/register", TwitterAPI.Controller, :register)
- end
+ post("/account/register", TwitterAPI.Controller, :register)
get("/search", TwitterAPI.Controller, :search)
get("/statusnet/tags/timeline/:tag", TwitterAPI.Controller, :public_and_external_timeline)
@@ -355,6 +356,7 @@ def user_fetcher(username) do
end
scope "/", Fallback do
+ get("/registration/:token", RedirectController, :registration_page)
get("/*path", RedirectController, :redirector)
end
end
@@ -369,4 +371,8 @@ def redirector(conn, _params) do
|> send_file(200, "priv/static/index.html")
end
end
+
+ def registration_page(conn, params) do
+ redirector(conn, params)
+ end
end
diff --git a/lib/pleroma/web/streamer.ex b/lib/pleroma/web/streamer.ex
index ce38f3cc3..c61bad830 100644
--- a/lib/pleroma/web/streamer.ex
+++ b/lib/pleroma/web/streamer.ex
@@ -158,7 +158,7 @@ def push_to_socket(topics, topic, %Activity{data: %{"type" => "Announce"}} = ite
user = User.get_cached_by_ap_id(socket.assigns[:user].ap_id)
blocks = user.info["blocks"] || []
- parent = Object.get_by_ap_id(item.data["object"])
+ parent = Object.normalize(item.data["object"])
unless is_nil(parent) or item.actor in blocks or parent.data["actor"] in blocks do
send(socket.transport_pid, {:text, represent_update(item, user)})
diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex
index 7a0c37ce9..24ebdf007 100644
--- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex
+++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex
@@ -99,6 +99,10 @@ def do_remote_follow(conn, %{
conn
|> render("followed.html", %{error: false})
else
+ # Was already following user
+ {:error, "Could not follow user:" <> _rest} ->
+ render(conn, "followed.html", %{error: false})
+
_e ->
conn
|> render("follow_login.html", %{
@@ -117,6 +121,11 @@ def do_remote_follow(%{assigns: %{user: user}} = conn, %{"user" => %{"id" => id}
conn
|> render("followed.html", %{error: false})
else
+ # Was already following user
+ {:error, "Could not follow user:" <> _rest} ->
+ conn
+ |> render("followed.html", %{error: false})
+
e ->
Logger.debug("Remote follow failed with error #{inspect(e)}")
@@ -126,6 +135,8 @@ def do_remote_follow(%{assigns: %{user: user}} = conn, %{"user" => %{"id" => id}
end
@instance Application.get_env(:pleroma, :instance)
+ @instance_fe Application.get_env(:pleroma, :fe)
+ @instance_chat Application.get_env(:pleroma, :chat)
def config(conn, _params) do
case get_format(conn) do
"xml" ->
@@ -148,9 +159,24 @@ def config(conn, _params) do
json(conn, %{
site: %{
name: Keyword.get(@instance, :name),
+ description: Keyword.get(@instance, :description),
server: Web.base_url(),
textlimit: to_string(Keyword.get(@instance, :limit)),
- closed: if(Keyword.get(@instance, :registrations_open), do: "0", else: "1")
+ closed: if(Keyword.get(@instance, :registrations_open), do: "0", else: "1"),
+ private: if(Keyword.get(@instance, :public, true), do: "0", else: "1"),
+ pleromafe: %{
+ theme: Keyword.get(@instance_fe, :theme),
+ background: Keyword.get(@instance_fe, :background),
+ logo: Keyword.get(@instance_fe, :logo),
+ redirectRootNoLogin: Keyword.get(@instance_fe, :redirect_root_no_login),
+ redirectRootLogin: Keyword.get(@instance_fe, :redirect_root_login),
+ chatDisabled: !Keyword.get(@instance_chat, :enabled),
+ showInstanceSpecificPanel: Keyword.get(@instance_fe, :show_instance_panel),
+ showWhoToFollowPanel: Keyword.get(@instance_fe, :show_who_to_follow_panel),
+ scopeOptionsEnabled: Keyword.get(@instance_fe, :scope_options_enabled),
+ whoToFollowProvider: Keyword.get(@instance_fe, :who_to_follow_provider),
+ whoToFollowLink: Keyword.get(@instance_fe, :who_to_follow_link)
+ }
}
})
end
diff --git a/lib/pleroma/web/twitter_api/representers/activity_representer.ex b/lib/pleroma/web/twitter_api/representers/activity_representer.ex
index 57837205e..26bfb79af 100644
--- a/lib/pleroma/web/twitter_api/representers/activity_representer.ex
+++ b/lib/pleroma/web/twitter_api/representers/activity_representer.ex
@@ -4,7 +4,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
use Pleroma.Web.TwitterAPI.Representers.BaseRepresenter
alias Pleroma.Web.TwitterAPI.Representers.ObjectRepresenter
alias Pleroma.{Activity, User}
- alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView}
+ alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView, ActivityView}
alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Formatter
@@ -164,14 +164,7 @@ def to_map(
tags = if possibly_sensitive, do: Enum.uniq(["nsfw" | tags]), else: tags
- summary = activity.data["object"]["summary"]
-
- content =
- if !!summary and summary != "" do
- "#{activity.data["object"]["summary"]} #{content}"
- else
- content
- end
+ {summary, content} = ActivityView.render_content(object)
html =
HtmlSanitizeEx.basic_html(content)
@@ -198,7 +191,8 @@ def to_map(
"tags" => tags,
"activity_type" => "post",
"possibly_sensitive" => possibly_sensitive,
- "visibility" => Pleroma.Web.MastodonAPI.StatusView.get_visibility(object)
+ "visibility" => Pleroma.Web.MastodonAPI.StatusView.get_visibility(object),
+ "summary" => object["summary"]
}
end
diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex
index c23b3c2c4..dbad08e66 100644
--- a/lib/pleroma/web/twitter_api/twitter_api.ex
+++ b/lib/pleroma/web/twitter_api/twitter_api.ex
@@ -1,11 +1,13 @@
defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
- alias Pleroma.{User, Activity, Repo, Object}
+ alias Pleroma.{UserInviteToken, User, Activity, Repo, Object}
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.TwitterAPI.UserView
alias Pleroma.Web.{OStatus, CommonAPI}
import Ecto.Query
+ @instance Application.get_env(:pleroma, :instance)
@httpoison Application.get_env(:pleroma, :httpoison)
+ @registrations_open Keyword.get(@instance, :registrations_open)
def create_status(%User{} = user, %{"status" => _} = data) do
CommonAPI.post(user, data)
@@ -120,6 +122,8 @@ def upload(%Plug.Upload{} = file, format \\ "xml") do
end
def register_user(params) do
+ tokenString = params["token"]
+
params = %{
nickname: params["nickname"],
name: params["fullname"],
@@ -129,17 +133,33 @@ def register_user(params) do
password_confirmation: params["confirm"]
}
- changeset = User.register_changeset(%User{}, params)
+ # no need to query DB if registration is open
+ token =
+ unless @registrations_open || is_nil(tokenString) do
+ Repo.get_by(UserInviteToken, %{token: tokenString})
+ end
- with {:ok, user} <- Repo.insert(changeset) do
- {:ok, user}
- else
- {:error, changeset} ->
- errors =
- Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
- |> Jason.encode!()
+ cond do
+ @registrations_open || (!is_nil(token) && !token.used) ->
+ changeset = User.register_changeset(%User{}, params)
- {:error, %{error: errors}}
+ with {:ok, user} <- Repo.insert(changeset) do
+ !@registrations_open && UserInviteToken.mark_as_used(token.token)
+ {:ok, user}
+ else
+ {:error, changeset} ->
+ errors =
+ Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
+ |> Jason.encode!()
+
+ {:error, %{error: errors}}
+ end
+
+ !@registrations_open && is_nil(token) ->
+ {:error, "Invalid token"}
+
+ !@registrations_open && token.used ->
+ {:error, "Expired token"}
end
end
diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex
index 8f5b3c786..65e67396b 100644
--- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex
+++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex
@@ -431,6 +431,19 @@ def update_profile(%{assigns: %{user: user}} = conn, params) do
user
end
+ user =
+ if default_scope = params["default_scope"] do
+ with new_info <- Map.put(user.info, "default_scope", default_scope),
+ change <- User.info_changeset(user, %{info: new_info}),
+ {:ok, user} <- User.update_and_set_cache(change) do
+ user
+ else
+ _e -> user
+ end
+ else
+ user
+ end
+
with changeset <- User.update_changeset(user, params),
{:ok, user} <- User.update_and_set_cache(changeset) do
CommonAPI.update(user)
diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex
index 62ce3b7b5..55b5287f5 100644
--- a/lib/pleroma/web/twitter_api/views/activity_view.ex
+++ b/lib/pleroma/web/twitter_api/views/activity_view.ex
@@ -228,15 +228,7 @@ def render(
tags = if possibly_sensitive, do: Enum.uniq(["nsfw" | tags]), else: tags
- summary = activity.data["object"]["summary"]
- content = object["content"]
-
- content =
- if !!summary and summary != "" do
- "#{activity.data["object"]["summary"]} #{content}"
- else
- content
- end
+ {summary, content} = render_content(object)
html =
HtmlSanitizeEx.basic_html(content)
@@ -263,7 +255,41 @@ def render(
"tags" => tags,
"activity_type" => "post",
"possibly_sensitive" => possibly_sensitive,
- "visibility" => Pleroma.Web.MastodonAPI.StatusView.get_visibility(object)
+ "visibility" => Pleroma.Web.MastodonAPI.StatusView.get_visibility(object),
+ "summary" => summary
}
end
+
+ def render_content(%{"type" => "Note"} = object) do
+ summary = object["summary"]
+
+ content =
+ if !!summary and summary != "" do
+ "#{summary}
#{object["content"]}"
+ else
+ object["content"]
+ end
+
+ {summary, content}
+ end
+
+ def render_content(%{"type" => "Article"} = object) do
+ summary = object["name"] || object["summary"]
+
+ content =
+ if !!summary and summary != "" do
+ "#{summary}
#{object["content"]}"
+ else
+ object["content"]
+ end
+
+ {summary, content}
+ end
+
+ def render_content(object) do
+ summary = object["summary"] || "Unhandled activity type: #{object["type"]}"
+ content = "#{summary}
#{object["content"]}"
+
+ {summary, content}
+ end
end
diff --git a/lib/pleroma/web/twitter_api/views/user_view.ex b/lib/pleroma/web/twitter_api/views/user_view.ex
index 711008973..7d0f0e703 100644
--- a/lib/pleroma/web/twitter_api/views/user_view.ex
+++ b/lib/pleroma/web/twitter_api/views/user_view.ex
@@ -1,6 +1,7 @@
defmodule Pleroma.Web.TwitterAPI.UserView do
use Pleroma.Web, :view
alias Pleroma.User
+ alias Pleroma.Formatter
alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Web.MediaProxy
@@ -28,9 +29,19 @@ def render("user.json", %{user: user = %User{}} = assigns) do
user_info = User.get_cached_user_info(user)
+ emoji =
+ (user.info["source_data"]["tag"] || [])
+ |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end)
+ |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} ->
+ {String.trim(name, ":"), url}
+ end)
+
+ bio = HtmlSanitizeEx.strip_tags(user.bio)
+
data = %{
"created_at" => user.inserted_at |> Utils.format_naive_asctime(),
- "description" => HtmlSanitizeEx.strip_tags(user.bio),
+ "description" => bio,
+ "description_html" => bio |> Formatter.emojify(emoji),
"favourites_count" => 0,
"followers_count" => user_info[:follower_count],
"following" => following,
@@ -39,6 +50,7 @@ def render("user.json", %{user: user = %User{}} = assigns) do
"friends_count" => user_info[:following_count],
"id" => user.id,
"name" => user.name,
+ "name_html" => HtmlSanitizeEx.strip_tags(user.name) |> Formatter.emojify(emoji),
"profile_image_url" => image,
"profile_image_url_https" => image,
"profile_image_url_profile_size" => image,
@@ -52,7 +64,8 @@ def render("user.json", %{user: user = %User{}} = assigns) do
"cover_photo" => User.banner_url(user) |> MediaProxy.url(),
"background_image" => image_url(user.info["background"]) |> MediaProxy.url(),
"is_local" => user.local,
- "locked" => !!user.info["locked"]
+ "locked" => !!user.info["locked"],
+ "default_scope" => user.info["default_scope"] || "public"
}
if assigns[:token] do
diff --git a/mix.exs b/mix.exs
index d632e0593..7a90d8a9e 100644
--- a/mix.exs
+++ b/mix.exs
@@ -45,6 +45,7 @@ defp deps do
{:cachex, "~> 3.0.2"},
{:httpoison, "~> 1.2.0"},
{:jason, "~> 1.0"},
+ {:mogrify, "~> 0.6.1"}
{:ex_machina, "~> 2.2", only: :test},
{:credo, "~> 0.9.3", only: [:dev, :test]},
{:mock, "~> 0.3.1", only: :test}
diff --git a/mix.lock b/mix.lock
index 2a826111c..9ae8fe0ac 100644
--- a/mix.lock
+++ b/mix.lock
@@ -25,6 +25,7 @@
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"},
"mochiweb": {:hex, :mochiweb, "2.15.0", "e1daac474df07651e5d17cc1e642c4069c7850dc4508d3db7263a0651330aacc", [:rebar3], [], "hexpm"},
"mock": {:hex, :mock, "0.3.1", "994f00150f79a0ea50dc9d86134cd9ebd0d177ad60bd04d1e46336cdfdb98ff9", [:mix], [{:meck, "~> 0.8.8", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm"},
+ "mogrify": {:hex, :mogrify, "0.6.1", "de1b527514f2d95a7bbe9642eb556061afb337e220cf97adbf3a4e6438ed70af", [:mix], [], "hexpm"},
"parse_trans": {:hex, :parse_trans, "3.2.0", "2adfa4daf80c14dc36f522cf190eb5c4ee3e28008fc6394397c16f62a26258c2", [:rebar3], [], "hexpm"},
"pbkdf2_elixir": {:hex, :pbkdf2_elixir, "0.12.3", "6706a148809a29c306062862c803406e88f048277f6e85b68faf73291e820b84", [:mix], [], "hexpm"},
"phoenix": {:hex, :phoenix, "1.3.2", "2a00d751f51670ea6bc3f2ba4e6eb27ecb8a2c71e7978d9cd3e5de5ccf7378bd", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
diff --git a/priv/repo/migrations/20180612110515_create_user_invite_tokens.exs b/priv/repo/migrations/20180612110515_create_user_invite_tokens.exs
new file mode 100644
index 000000000..d0a1cf784
--- /dev/null
+++ b/priv/repo/migrations/20180612110515_create_user_invite_tokens.exs
@@ -0,0 +1,12 @@
+defmodule Pleroma.Repo.Migrations.CreateUserInviteTokens do
+ use Ecto.Migration
+
+ def change do
+ create table(:user_invite_tokens) do
+ add :token, :string
+ add :used, :boolean, default: false
+
+ timestamps()
+ end
+ end
+end
diff --git a/priv/static/index.html b/priv/static/index.html
index 380dd1687..7fd882dfa 100644
--- a/priv/static/index.html
+++ b/priv/static/index.html
@@ -1 +1 @@
-Pleroma
\ No newline at end of file
+Pleroma
\ No newline at end of file
diff --git a/priv/static/packs/about.js b/priv/static/packs/about.js
index 0a386cbba..6bb569c92 100644
Binary files a/priv/static/packs/about.js and b/priv/static/packs/about.js differ
diff --git a/priv/static/packs/about.js.map b/priv/static/packs/about.js.map
index 741caf4b2..c5ba0e312 100644
Binary files a/priv/static/packs/about.js.map and b/priv/static/packs/about.js.map differ
diff --git a/priv/static/packs/admin.js b/priv/static/packs/admin.js
index e12bb2610..625c68c8c 100644
Binary files a/priv/static/packs/admin.js and b/priv/static/packs/admin.js differ
diff --git a/priv/static/packs/admin.js.map b/priv/static/packs/admin.js.map
index 32e70549d..1cfa729f6 100644
Binary files a/priv/static/packs/admin.js.map and b/priv/static/packs/admin.js.map differ
diff --git a/priv/static/packs/appcache/manifest.appcache b/priv/static/packs/appcache/manifest.appcache
index 675eadc85..a2c984c77 100644
--- a/priv/static/packs/appcache/manifest.appcache
+++ b/priv/static/packs/appcache/manifest.appcache
@@ -1,5 +1,5 @@
CACHE MANIFEST
-#ver:2018-4-9 21:57:37
+#ver:2018-8-12 18:01:32
#plugin:4.8.4
CACHE:
@@ -13,33 +13,46 @@ CACHE:
/packs/features/home_timeline.js
/packs/features/public_timeline.js
/packs/features/community_timeline.js
-/packs/features/favourited_statuses.js
-/packs/features/list_timeline.js
+/packs/features/direct_timeline.js
+/packs/features/pinned_statuses.js
+/packs/features/domain_blocks.js
/packs/features/following.js
/packs/features/followers.js
+/packs/features/favourited_statuses.js
+/packs/features/list_timeline.js
+/packs/features/account_gallery.js
/packs/features/hashtag_timeline.js
/packs/features/status.js
-/packs/features/account_gallery.js
-/packs/features/blocks.js
+/packs/features/lists.js
+/packs/modals/report_modal.js
+/packs/features/getting_started.js
/packs/features/follow_requests.js
+/packs/features/mutes.js
+/packs/features/blocks.js
/packs/features/reblogs.js
/packs/features/favourites.js
-/packs/features/getting_started.js
/packs/features/keyboard_shortcuts.js
+/packs/modals/mute_modal.js
/packs/features/generic_not_found.js
/packs/features/list_editor.js
+/packs/modals/embed_modal.js
/packs/status/media_gallery.js
+/packs/containers/media_container.js
/packs/share.js
/packs/application.js
/packs/about.js
-/packs/public.js
/packs/mailer.js
+/packs/mastodon-light.js
+/packs/contrast.js
/packs/default.js
+/packs/public.js
/packs/admin.js
/packs/common.js
/packs/common.css
/packs/mailer.css
/packs/default.css
+/packs/contrast.css
+/packs/mastodon-light.css
/packs/manifest.json
NETWORK:
diff --git a/priv/static/packs/application.js b/priv/static/packs/application.js
index 233f2dc35..047178a75 100644
Binary files a/priv/static/packs/application.js and b/priv/static/packs/application.js differ
diff --git a/priv/static/packs/application.js.map b/priv/static/packs/application.js.map
index ecf8bd078..d5fe6e761 100644
Binary files a/priv/static/packs/application.js.map and b/priv/static/packs/application.js.map differ
diff --git a/priv/static/packs/base_polyfills.js b/priv/static/packs/base_polyfills.js
index 17403bfd5..76b477453 100644
Binary files a/priv/static/packs/base_polyfills.js and b/priv/static/packs/base_polyfills.js differ
diff --git a/priv/static/packs/base_polyfills.js.map b/priv/static/packs/base_polyfills.js.map
index a4f973039..a75b2346d 100644
Binary files a/priv/static/packs/base_polyfills.js.map and b/priv/static/packs/base_polyfills.js.map differ
diff --git a/priv/static/packs/common.js b/priv/static/packs/common.js
index 1012f39a5..211f290fe 100644
Binary files a/priv/static/packs/common.js and b/priv/static/packs/common.js differ
diff --git a/priv/static/packs/common.js.map b/priv/static/packs/common.js.map
index 56366f863..95eb7961c 100644
Binary files a/priv/static/packs/common.js.map and b/priv/static/packs/common.js.map differ
diff --git a/priv/static/packs/containers/media_container.js b/priv/static/packs/containers/media_container.js
new file mode 100644
index 000000000..6d86a7442
Binary files /dev/null and b/priv/static/packs/containers/media_container.js differ
diff --git a/priv/static/packs/containers/media_container.js.map b/priv/static/packs/containers/media_container.js.map
new file mode 100644
index 000000000..b034d77fc
Binary files /dev/null and b/priv/static/packs/containers/media_container.js.map differ
diff --git a/priv/static/packs/contrast.css b/priv/static/packs/contrast.css
new file mode 100644
index 000000000..d2ea83a7e
Binary files /dev/null and b/priv/static/packs/contrast.css differ
diff --git a/priv/static/packs/contrast.css.map b/priv/static/packs/contrast.css.map
new file mode 100644
index 000000000..ce4ab036b
--- /dev/null
+++ b/priv/static/packs/contrast.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":[],"names":[],"mappings":"","file":"contrast.css","sourceRoot":""}
\ No newline at end of file
diff --git a/priv/static/packs/contrast.js b/priv/static/packs/contrast.js
new file mode 100644
index 000000000..1b3a228b1
Binary files /dev/null and b/priv/static/packs/contrast.js differ
diff --git a/priv/static/packs/contrast.js.map b/priv/static/packs/contrast.js.map
new file mode 100644
index 000000000..5633b7433
Binary files /dev/null and b/priv/static/packs/contrast.js.map differ
diff --git a/priv/static/packs/default.css b/priv/static/packs/default.css
index 2304d7504..6d19dc1a3 100644
Binary files a/priv/static/packs/default.css and b/priv/static/packs/default.css differ
diff --git a/priv/static/packs/default.js b/priv/static/packs/default.js
index 55a2f4d5e..b7a78f214 100644
Binary files a/priv/static/packs/default.js and b/priv/static/packs/default.js differ
diff --git a/priv/static/packs/default.js.map b/priv/static/packs/default.js.map
index c26d5bfd2..ae42b9641 100644
Binary files a/priv/static/packs/default.js.map and b/priv/static/packs/default.js.map differ
diff --git a/priv/static/packs/elephant-fren-d16fd77f9a9387e7d146b5f9d4dc1e7f.png b/priv/static/packs/elephant-fren-d16fd77f9a9387e7d146b5f9d4dc1e7f.png
deleted file mode 100644
index 3b64edf08..000000000
Binary files a/priv/static/packs/elephant-fren-d16fd77f9a9387e7d146b5f9d4dc1e7f.png and /dev/null differ
diff --git a/priv/static/packs/elephant_ui_disappointed-8864342480c3612e3061702851d3a798.svg b/priv/static/packs/elephant_ui_disappointed-8864342480c3612e3061702851d3a798.svg
deleted file mode 100644
index 580c15a13..000000000
--- a/priv/static/packs/elephant_ui_disappointed-8864342480c3612e3061702851d3a798.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/priv/static/packs/elephant_ui_greeting-475430963d0b00fe82b07b17857ebf6c.svg b/priv/static/packs/elephant_ui_greeting-475430963d0b00fe82b07b17857ebf6c.svg
deleted file mode 100644
index f3eb4b142..000000000
--- a/priv/static/packs/elephant_ui_greeting-475430963d0b00fe82b07b17857ebf6c.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/priv/static/packs/elephant_ui_plane-e3f2d57c12c376e189c274cbe81af8dd.svg b/priv/static/packs/elephant_ui_plane-e3f2d57c12c376e189c274cbe81af8dd.svg
deleted file mode 100644
index a2624d170..000000000
--- a/priv/static/packs/elephant_ui_plane-e3f2d57c12c376e189c274cbe81af8dd.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/priv/static/packs/elephant_ui_working-2e653cc278c2ac871c23aeb10de1c0e2.svg b/priv/static/packs/elephant_ui_working-2e653cc278c2ac871c23aeb10de1c0e2.svg
deleted file mode 100644
index 8ba475db0..000000000
--- a/priv/static/packs/elephant_ui_working-2e653cc278c2ac871c23aeb10de1c0e2.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/priv/static/packs/emoji_picker.js b/priv/static/packs/emoji_picker.js
index 569b387b4..b21ad84a2 100644
Binary files a/priv/static/packs/emoji_picker.js and b/priv/static/packs/emoji_picker.js differ
diff --git a/priv/static/packs/emoji_picker.js.map b/priv/static/packs/emoji_picker.js.map
index 7c75f4ac4..b1a143277 100644
Binary files a/priv/static/packs/emoji_picker.js.map and b/priv/static/packs/emoji_picker.js.map differ
diff --git a/priv/static/packs/extra_polyfills.js b/priv/static/packs/extra_polyfills.js
index 8449f2528..fd8164832 100644
Binary files a/priv/static/packs/extra_polyfills.js and b/priv/static/packs/extra_polyfills.js differ
diff --git a/priv/static/packs/extra_polyfills.js.map b/priv/static/packs/extra_polyfills.js.map
index 6d051101e..737b42956 100644
Binary files a/priv/static/packs/extra_polyfills.js.map and b/priv/static/packs/extra_polyfills.js.map differ
diff --git a/priv/static/packs/features/account_gallery.js b/priv/static/packs/features/account_gallery.js
index 08176bb53..ebea1168b 100644
Binary files a/priv/static/packs/features/account_gallery.js and b/priv/static/packs/features/account_gallery.js differ
diff --git a/priv/static/packs/features/account_gallery.js.map b/priv/static/packs/features/account_gallery.js.map
index 893834c76..4fa1546e6 100644
Binary files a/priv/static/packs/features/account_gallery.js.map and b/priv/static/packs/features/account_gallery.js.map differ
diff --git a/priv/static/packs/features/account_timeline.js b/priv/static/packs/features/account_timeline.js
index 04baf24d4..a23be5eba 100644
Binary files a/priv/static/packs/features/account_timeline.js and b/priv/static/packs/features/account_timeline.js differ
diff --git a/priv/static/packs/features/account_timeline.js.map b/priv/static/packs/features/account_timeline.js.map
index 971417836..1387751a8 100644
Binary files a/priv/static/packs/features/account_timeline.js.map and b/priv/static/packs/features/account_timeline.js.map differ
diff --git a/priv/static/packs/features/blocks.js b/priv/static/packs/features/blocks.js
index 7a8e17a90..bfcd511dd 100644
Binary files a/priv/static/packs/features/blocks.js and b/priv/static/packs/features/blocks.js differ
diff --git a/priv/static/packs/features/blocks.js.map b/priv/static/packs/features/blocks.js.map
index 76551b9d2..c3004b635 100644
Binary files a/priv/static/packs/features/blocks.js.map and b/priv/static/packs/features/blocks.js.map differ
diff --git a/priv/static/packs/features/community_timeline.js b/priv/static/packs/features/community_timeline.js
index b819cc4cc..96ec116dd 100644
Binary files a/priv/static/packs/features/community_timeline.js and b/priv/static/packs/features/community_timeline.js differ
diff --git a/priv/static/packs/features/community_timeline.js.map b/priv/static/packs/features/community_timeline.js.map
index efbea4b73..40184b609 100644
Binary files a/priv/static/packs/features/community_timeline.js.map and b/priv/static/packs/features/community_timeline.js.map differ
diff --git a/priv/static/packs/features/compose.js b/priv/static/packs/features/compose.js
index 90e19a148..587736356 100644
Binary files a/priv/static/packs/features/compose.js and b/priv/static/packs/features/compose.js differ
diff --git a/priv/static/packs/features/compose.js.map b/priv/static/packs/features/compose.js.map
index fd0cd5733..361eeb0ce 100644
Binary files a/priv/static/packs/features/compose.js.map and b/priv/static/packs/features/compose.js.map differ
diff --git a/priv/static/packs/features/direct_timeline.js b/priv/static/packs/features/direct_timeline.js
new file mode 100644
index 000000000..36030d532
Binary files /dev/null and b/priv/static/packs/features/direct_timeline.js differ
diff --git a/priv/static/packs/features/direct_timeline.js.map b/priv/static/packs/features/direct_timeline.js.map
new file mode 100644
index 000000000..cefde306f
Binary files /dev/null and b/priv/static/packs/features/direct_timeline.js.map differ
diff --git a/priv/static/packs/features/domain_blocks.js b/priv/static/packs/features/domain_blocks.js
new file mode 100644
index 000000000..51f9a96a9
Binary files /dev/null and b/priv/static/packs/features/domain_blocks.js differ
diff --git a/priv/static/packs/features/domain_blocks.js.map b/priv/static/packs/features/domain_blocks.js.map
new file mode 100644
index 000000000..c1213be0c
Binary files /dev/null and b/priv/static/packs/features/domain_blocks.js.map differ
diff --git a/priv/static/packs/features/favourited_statuses.js b/priv/static/packs/features/favourited_statuses.js
index ac964f821..a6056df48 100644
Binary files a/priv/static/packs/features/favourited_statuses.js and b/priv/static/packs/features/favourited_statuses.js differ
diff --git a/priv/static/packs/features/favourited_statuses.js.map b/priv/static/packs/features/favourited_statuses.js.map
index 9381645a6..710bcfa9b 100644
Binary files a/priv/static/packs/features/favourited_statuses.js.map and b/priv/static/packs/features/favourited_statuses.js.map differ
diff --git a/priv/static/packs/features/favourites.js b/priv/static/packs/features/favourites.js
index fb6335f7e..fb7a4752a 100644
Binary files a/priv/static/packs/features/favourites.js and b/priv/static/packs/features/favourites.js differ
diff --git a/priv/static/packs/features/favourites.js.map b/priv/static/packs/features/favourites.js.map
index b6950c0e2..d436693ff 100644
Binary files a/priv/static/packs/features/favourites.js.map and b/priv/static/packs/features/favourites.js.map differ
diff --git a/priv/static/packs/features/follow_requests.js b/priv/static/packs/features/follow_requests.js
index bc58231ab..0ab172a32 100644
Binary files a/priv/static/packs/features/follow_requests.js and b/priv/static/packs/features/follow_requests.js differ
diff --git a/priv/static/packs/features/follow_requests.js.map b/priv/static/packs/features/follow_requests.js.map
index c60d0bfa4..bf33e0a08 100644
Binary files a/priv/static/packs/features/follow_requests.js.map and b/priv/static/packs/features/follow_requests.js.map differ
diff --git a/priv/static/packs/features/followers.js b/priv/static/packs/features/followers.js
index 5a9af9ab4..c92425079 100644
Binary files a/priv/static/packs/features/followers.js and b/priv/static/packs/features/followers.js differ
diff --git a/priv/static/packs/features/followers.js.map b/priv/static/packs/features/followers.js.map
index 4dea7ba37..96329f4f1 100644
Binary files a/priv/static/packs/features/followers.js.map and b/priv/static/packs/features/followers.js.map differ
diff --git a/priv/static/packs/features/following.js b/priv/static/packs/features/following.js
index b62bb73c6..f0d8eb189 100644
Binary files a/priv/static/packs/features/following.js and b/priv/static/packs/features/following.js differ
diff --git a/priv/static/packs/features/following.js.map b/priv/static/packs/features/following.js.map
index a7bf798dc..c1a810b74 100644
Binary files a/priv/static/packs/features/following.js.map and b/priv/static/packs/features/following.js.map differ
diff --git a/priv/static/packs/features/generic_not_found.js b/priv/static/packs/features/generic_not_found.js
index 3f4e40d7c..457d427e9 100644
Binary files a/priv/static/packs/features/generic_not_found.js and b/priv/static/packs/features/generic_not_found.js differ
diff --git a/priv/static/packs/features/generic_not_found.js.map b/priv/static/packs/features/generic_not_found.js.map
index d689a8131..5863c0184 100644
Binary files a/priv/static/packs/features/generic_not_found.js.map and b/priv/static/packs/features/generic_not_found.js.map differ
diff --git a/priv/static/packs/features/getting_started.js b/priv/static/packs/features/getting_started.js
index 31ef4778b..801f60a84 100644
Binary files a/priv/static/packs/features/getting_started.js and b/priv/static/packs/features/getting_started.js differ
diff --git a/priv/static/packs/features/getting_started.js.map b/priv/static/packs/features/getting_started.js.map
index dff1b48c7..037892ef3 100644
Binary files a/priv/static/packs/features/getting_started.js.map and b/priv/static/packs/features/getting_started.js.map differ
diff --git a/priv/static/packs/features/hashtag_timeline.js b/priv/static/packs/features/hashtag_timeline.js
index 0950e27eb..44167ce7e 100644
Binary files a/priv/static/packs/features/hashtag_timeline.js and b/priv/static/packs/features/hashtag_timeline.js differ
diff --git a/priv/static/packs/features/hashtag_timeline.js.map b/priv/static/packs/features/hashtag_timeline.js.map
index 1f0594dca..a9fa8fc1a 100644
Binary files a/priv/static/packs/features/hashtag_timeline.js.map and b/priv/static/packs/features/hashtag_timeline.js.map differ
diff --git a/priv/static/packs/features/home_timeline.js b/priv/static/packs/features/home_timeline.js
index 4e8bca305..edcca47f7 100644
Binary files a/priv/static/packs/features/home_timeline.js and b/priv/static/packs/features/home_timeline.js differ
diff --git a/priv/static/packs/features/home_timeline.js.map b/priv/static/packs/features/home_timeline.js.map
index ac4035593..8df294335 100644
Binary files a/priv/static/packs/features/home_timeline.js.map and b/priv/static/packs/features/home_timeline.js.map differ
diff --git a/priv/static/packs/features/keyboard_shortcuts.js b/priv/static/packs/features/keyboard_shortcuts.js
index 6b691ae03..5f8e7327f 100644
Binary files a/priv/static/packs/features/keyboard_shortcuts.js and b/priv/static/packs/features/keyboard_shortcuts.js differ
diff --git a/priv/static/packs/features/keyboard_shortcuts.js.map b/priv/static/packs/features/keyboard_shortcuts.js.map
index 3d3de6bd6..e9f3e3ca6 100644
Binary files a/priv/static/packs/features/keyboard_shortcuts.js.map and b/priv/static/packs/features/keyboard_shortcuts.js.map differ
diff --git a/priv/static/packs/features/list_editor.js b/priv/static/packs/features/list_editor.js
index 8d28bb67e..a883dd9f3 100644
Binary files a/priv/static/packs/features/list_editor.js and b/priv/static/packs/features/list_editor.js differ
diff --git a/priv/static/packs/features/list_editor.js.map b/priv/static/packs/features/list_editor.js.map
index 0c17b6cc3..70a87c59f 100644
Binary files a/priv/static/packs/features/list_editor.js.map and b/priv/static/packs/features/list_editor.js.map differ
diff --git a/priv/static/packs/features/list_timeline.js b/priv/static/packs/features/list_timeline.js
index 701b7df8b..b2bb456f4 100644
Binary files a/priv/static/packs/features/list_timeline.js and b/priv/static/packs/features/list_timeline.js differ
diff --git a/priv/static/packs/features/list_timeline.js.map b/priv/static/packs/features/list_timeline.js.map
index ec2cd5e87..986e83a68 100644
Binary files a/priv/static/packs/features/list_timeline.js.map and b/priv/static/packs/features/list_timeline.js.map differ
diff --git a/priv/static/packs/features/lists.js b/priv/static/packs/features/lists.js
new file mode 100644
index 000000000..2e89557da
Binary files /dev/null and b/priv/static/packs/features/lists.js differ
diff --git a/priv/static/packs/features/lists.js.map b/priv/static/packs/features/lists.js.map
new file mode 100644
index 000000000..017f1a6de
Binary files /dev/null and b/priv/static/packs/features/lists.js.map differ
diff --git a/priv/static/packs/features/mutes.js b/priv/static/packs/features/mutes.js
new file mode 100644
index 000000000..6c72fc75c
Binary files /dev/null and b/priv/static/packs/features/mutes.js differ
diff --git a/priv/static/packs/features/mutes.js.map b/priv/static/packs/features/mutes.js.map
new file mode 100644
index 000000000..263f3a5a3
Binary files /dev/null and b/priv/static/packs/features/mutes.js.map differ
diff --git a/priv/static/packs/features/notifications.js b/priv/static/packs/features/notifications.js
index 8524d70b5..2b8cf50ce 100644
Binary files a/priv/static/packs/features/notifications.js and b/priv/static/packs/features/notifications.js differ
diff --git a/priv/static/packs/features/notifications.js.map b/priv/static/packs/features/notifications.js.map
index f17e67935..4562ad2bf 100644
Binary files a/priv/static/packs/features/notifications.js.map and b/priv/static/packs/features/notifications.js.map differ
diff --git a/priv/static/packs/features/pinned_statuses.js b/priv/static/packs/features/pinned_statuses.js
new file mode 100644
index 000000000..e1d7d508e
Binary files /dev/null and b/priv/static/packs/features/pinned_statuses.js differ
diff --git a/priv/static/packs/features/pinned_statuses.js.map b/priv/static/packs/features/pinned_statuses.js.map
new file mode 100644
index 000000000..0baa9faa1
Binary files /dev/null and b/priv/static/packs/features/pinned_statuses.js.map differ
diff --git a/priv/static/packs/features/public_timeline.js b/priv/static/packs/features/public_timeline.js
index 3564f1a02..c1efe30f8 100644
Binary files a/priv/static/packs/features/public_timeline.js and b/priv/static/packs/features/public_timeline.js differ
diff --git a/priv/static/packs/features/public_timeline.js.map b/priv/static/packs/features/public_timeline.js.map
index 1deab6853..0e701f02b 100644
Binary files a/priv/static/packs/features/public_timeline.js.map and b/priv/static/packs/features/public_timeline.js.map differ
diff --git a/priv/static/packs/features/reblogs.js b/priv/static/packs/features/reblogs.js
index 089eec8c3..aef39008a 100644
Binary files a/priv/static/packs/features/reblogs.js and b/priv/static/packs/features/reblogs.js differ
diff --git a/priv/static/packs/features/reblogs.js.map b/priv/static/packs/features/reblogs.js.map
index c5b8ffb4f..5d8c3b6de 100644
Binary files a/priv/static/packs/features/reblogs.js.map and b/priv/static/packs/features/reblogs.js.map differ
diff --git a/priv/static/packs/features/status.js b/priv/static/packs/features/status.js
index 8756a15cc..3bb031b0b 100644
Binary files a/priv/static/packs/features/status.js and b/priv/static/packs/features/status.js differ
diff --git a/priv/static/packs/features/status.js.map b/priv/static/packs/features/status.js.map
index a2667363d..561d91f68 100644
Binary files a/priv/static/packs/features/status.js.map and b/priv/static/packs/features/status.js.map differ
diff --git a/priv/static/packs/locale_ar.js b/priv/static/packs/locale_ar.js
index ec9b52fce..447feb3e2 100644
Binary files a/priv/static/packs/locale_ar.js and b/priv/static/packs/locale_ar.js differ
diff --git a/priv/static/packs/locale_ar.js.map b/priv/static/packs/locale_ar.js.map
index f0435951a..26490bd82 100644
Binary files a/priv/static/packs/locale_ar.js.map and b/priv/static/packs/locale_ar.js.map differ
diff --git a/priv/static/packs/locale_bg.js b/priv/static/packs/locale_bg.js
index 096ad9a24..944871a44 100644
Binary files a/priv/static/packs/locale_bg.js and b/priv/static/packs/locale_bg.js differ
diff --git a/priv/static/packs/locale_bg.js.map b/priv/static/packs/locale_bg.js.map
index 2df35e93d..66ad2c25f 100644
Binary files a/priv/static/packs/locale_bg.js.map and b/priv/static/packs/locale_bg.js.map differ
diff --git a/priv/static/packs/locale_ca.js b/priv/static/packs/locale_ca.js
index 28753291f..59ccbba42 100644
Binary files a/priv/static/packs/locale_ca.js and b/priv/static/packs/locale_ca.js differ
diff --git a/priv/static/packs/locale_ca.js.map b/priv/static/packs/locale_ca.js.map
index 17e0fb561..8a5036223 100644
Binary files a/priv/static/packs/locale_ca.js.map and b/priv/static/packs/locale_ca.js.map differ
diff --git a/priv/static/packs/locale_co.js b/priv/static/packs/locale_co.js
new file mode 100644
index 000000000..2a0bdbe17
Binary files /dev/null and b/priv/static/packs/locale_co.js differ
diff --git a/priv/static/packs/locale_co.js.map b/priv/static/packs/locale_co.js.map
new file mode 100644
index 000000000..7ad7e2b8b
Binary files /dev/null and b/priv/static/packs/locale_co.js.map differ
diff --git a/priv/static/packs/locale_de.js b/priv/static/packs/locale_de.js
index ee3812cb3..5da645a27 100644
Binary files a/priv/static/packs/locale_de.js and b/priv/static/packs/locale_de.js differ
diff --git a/priv/static/packs/locale_de.js.map b/priv/static/packs/locale_de.js.map
index 565173950..d0cc63eec 100644
Binary files a/priv/static/packs/locale_de.js.map and b/priv/static/packs/locale_de.js.map differ
diff --git a/priv/static/packs/locale_el.js b/priv/static/packs/locale_el.js
new file mode 100644
index 000000000..b7fa5f7d7
Binary files /dev/null and b/priv/static/packs/locale_el.js differ
diff --git a/priv/static/packs/locale_el.js.map b/priv/static/packs/locale_el.js.map
new file mode 100644
index 000000000..69b456265
Binary files /dev/null and b/priv/static/packs/locale_el.js.map differ
diff --git a/priv/static/packs/locale_en.js b/priv/static/packs/locale_en.js
index 2bbc7dc10..b65779f20 100644
Binary files a/priv/static/packs/locale_en.js and b/priv/static/packs/locale_en.js differ
diff --git a/priv/static/packs/locale_en.js.map b/priv/static/packs/locale_en.js.map
index d34cba26f..91b45f0e9 100644
Binary files a/priv/static/packs/locale_en.js.map and b/priv/static/packs/locale_en.js.map differ
diff --git a/priv/static/packs/locale_eo.js b/priv/static/packs/locale_eo.js
index d924d71f1..3ee6c3dd9 100644
Binary files a/priv/static/packs/locale_eo.js and b/priv/static/packs/locale_eo.js differ
diff --git a/priv/static/packs/locale_eo.js.map b/priv/static/packs/locale_eo.js.map
index 21a2e8d94..394d7f4dc 100644
Binary files a/priv/static/packs/locale_eo.js.map and b/priv/static/packs/locale_eo.js.map differ
diff --git a/priv/static/packs/locale_es.js b/priv/static/packs/locale_es.js
index 0e62db311..c016a2769 100644
Binary files a/priv/static/packs/locale_es.js and b/priv/static/packs/locale_es.js differ
diff --git a/priv/static/packs/locale_es.js.map b/priv/static/packs/locale_es.js.map
index ac305eb60..214cea796 100644
Binary files a/priv/static/packs/locale_es.js.map and b/priv/static/packs/locale_es.js.map differ
diff --git a/priv/static/packs/locale_eu.js b/priv/static/packs/locale_eu.js
new file mode 100644
index 000000000..829a549a8
Binary files /dev/null and b/priv/static/packs/locale_eu.js differ
diff --git a/priv/static/packs/locale_eu.js.map b/priv/static/packs/locale_eu.js.map
new file mode 100644
index 000000000..81b43e0ae
Binary files /dev/null and b/priv/static/packs/locale_eu.js.map differ
diff --git a/priv/static/packs/locale_fa.js b/priv/static/packs/locale_fa.js
index 96043d063..312a170e6 100644
Binary files a/priv/static/packs/locale_fa.js and b/priv/static/packs/locale_fa.js differ
diff --git a/priv/static/packs/locale_fa.js.map b/priv/static/packs/locale_fa.js.map
index 847a96250..b0f734db8 100644
Binary files a/priv/static/packs/locale_fa.js.map and b/priv/static/packs/locale_fa.js.map differ
diff --git a/priv/static/packs/locale_fi.js b/priv/static/packs/locale_fi.js
index c62da2a92..e94656ce8 100644
Binary files a/priv/static/packs/locale_fi.js and b/priv/static/packs/locale_fi.js differ
diff --git a/priv/static/packs/locale_fi.js.map b/priv/static/packs/locale_fi.js.map
index e749956b5..d5eca7e65 100644
Binary files a/priv/static/packs/locale_fi.js.map and b/priv/static/packs/locale_fi.js.map differ
diff --git a/priv/static/packs/locale_fr.js b/priv/static/packs/locale_fr.js
index 49b8a1be2..f45633dd3 100644
Binary files a/priv/static/packs/locale_fr.js and b/priv/static/packs/locale_fr.js differ
diff --git a/priv/static/packs/locale_fr.js.map b/priv/static/packs/locale_fr.js.map
index e7472ba63..5f939654b 100644
Binary files a/priv/static/packs/locale_fr.js.map and b/priv/static/packs/locale_fr.js.map differ
diff --git a/priv/static/packs/locale_gl.js b/priv/static/packs/locale_gl.js
index 9ff945399..440fef47d 100644
Binary files a/priv/static/packs/locale_gl.js and b/priv/static/packs/locale_gl.js differ
diff --git a/priv/static/packs/locale_gl.js.map b/priv/static/packs/locale_gl.js.map
index 2d2dad092..9e4b2486f 100644
Binary files a/priv/static/packs/locale_gl.js.map and b/priv/static/packs/locale_gl.js.map differ
diff --git a/priv/static/packs/locale_he.js b/priv/static/packs/locale_he.js
index 8900c02f9..eeda44b6e 100644
Binary files a/priv/static/packs/locale_he.js and b/priv/static/packs/locale_he.js differ
diff --git a/priv/static/packs/locale_he.js.map b/priv/static/packs/locale_he.js.map
index 23aeafea2..a8f1f32d0 100644
Binary files a/priv/static/packs/locale_he.js.map and b/priv/static/packs/locale_he.js.map differ
diff --git a/priv/static/packs/locale_hr.js b/priv/static/packs/locale_hr.js
index 173a4ce09..9ee23ffdd 100644
Binary files a/priv/static/packs/locale_hr.js and b/priv/static/packs/locale_hr.js differ
diff --git a/priv/static/packs/locale_hr.js.map b/priv/static/packs/locale_hr.js.map
index 81ef8a53f..f448b1c5b 100644
Binary files a/priv/static/packs/locale_hr.js.map and b/priv/static/packs/locale_hr.js.map differ
diff --git a/priv/static/packs/locale_hu.js b/priv/static/packs/locale_hu.js
index de811d4d7..287070ecd 100644
Binary files a/priv/static/packs/locale_hu.js and b/priv/static/packs/locale_hu.js differ
diff --git a/priv/static/packs/locale_hu.js.map b/priv/static/packs/locale_hu.js.map
index 28b436e3c..7f2670b5b 100644
Binary files a/priv/static/packs/locale_hu.js.map and b/priv/static/packs/locale_hu.js.map differ
diff --git a/priv/static/packs/locale_hy.js b/priv/static/packs/locale_hy.js
index 2184ac4ff..0e8c60236 100644
Binary files a/priv/static/packs/locale_hy.js and b/priv/static/packs/locale_hy.js differ
diff --git a/priv/static/packs/locale_hy.js.map b/priv/static/packs/locale_hy.js.map
index 19abbbfa1..7697a29ea 100644
Binary files a/priv/static/packs/locale_hy.js.map and b/priv/static/packs/locale_hy.js.map differ
diff --git a/priv/static/packs/locale_id.js b/priv/static/packs/locale_id.js
index 41746bb1f..4119de98f 100644
Binary files a/priv/static/packs/locale_id.js and b/priv/static/packs/locale_id.js differ
diff --git a/priv/static/packs/locale_id.js.map b/priv/static/packs/locale_id.js.map
index b7732cbfc..a3ea8e5a4 100644
Binary files a/priv/static/packs/locale_id.js.map and b/priv/static/packs/locale_id.js.map differ
diff --git a/priv/static/packs/locale_io.js b/priv/static/packs/locale_io.js
index e98cc9851..6bc6c6335 100644
Binary files a/priv/static/packs/locale_io.js and b/priv/static/packs/locale_io.js differ
diff --git a/priv/static/packs/locale_io.js.map b/priv/static/packs/locale_io.js.map
index edf3dd72d..29fb6a69f 100644
Binary files a/priv/static/packs/locale_io.js.map and b/priv/static/packs/locale_io.js.map differ
diff --git a/priv/static/packs/locale_it.js b/priv/static/packs/locale_it.js
index 9e75ecbaf..146bf7d0a 100644
Binary files a/priv/static/packs/locale_it.js and b/priv/static/packs/locale_it.js differ
diff --git a/priv/static/packs/locale_it.js.map b/priv/static/packs/locale_it.js.map
index 9dd851231..8f17820b6 100644
Binary files a/priv/static/packs/locale_it.js.map and b/priv/static/packs/locale_it.js.map differ
diff --git a/priv/static/packs/locale_ja.js b/priv/static/packs/locale_ja.js
index df0c08a20..1895e31b1 100644
Binary files a/priv/static/packs/locale_ja.js and b/priv/static/packs/locale_ja.js differ
diff --git a/priv/static/packs/locale_ja.js.map b/priv/static/packs/locale_ja.js.map
index 6208df945..f5fa34ceb 100644
Binary files a/priv/static/packs/locale_ja.js.map and b/priv/static/packs/locale_ja.js.map differ
diff --git a/priv/static/packs/locale_ko.js b/priv/static/packs/locale_ko.js
index ad258f4b0..55773d944 100644
Binary files a/priv/static/packs/locale_ko.js and b/priv/static/packs/locale_ko.js differ
diff --git a/priv/static/packs/locale_ko.js.map b/priv/static/packs/locale_ko.js.map
index bc701bcd2..9f2eea7c4 100644
Binary files a/priv/static/packs/locale_ko.js.map and b/priv/static/packs/locale_ko.js.map differ
diff --git a/priv/static/packs/locale_nl.js b/priv/static/packs/locale_nl.js
index 5faf0dc98..a6e46f7ef 100644
Binary files a/priv/static/packs/locale_nl.js and b/priv/static/packs/locale_nl.js differ
diff --git a/priv/static/packs/locale_nl.js.map b/priv/static/packs/locale_nl.js.map
index 82c12c526..414ddce5d 100644
Binary files a/priv/static/packs/locale_nl.js.map and b/priv/static/packs/locale_nl.js.map differ
diff --git a/priv/static/packs/locale_no.js b/priv/static/packs/locale_no.js
index 16508f274..5571969c9 100644
Binary files a/priv/static/packs/locale_no.js and b/priv/static/packs/locale_no.js differ
diff --git a/priv/static/packs/locale_no.js.map b/priv/static/packs/locale_no.js.map
index 65df2d10c..93f075f82 100644
Binary files a/priv/static/packs/locale_no.js.map and b/priv/static/packs/locale_no.js.map differ
diff --git a/priv/static/packs/locale_oc.js b/priv/static/packs/locale_oc.js
index 421d542e2..0e9ca7e97 100644
Binary files a/priv/static/packs/locale_oc.js and b/priv/static/packs/locale_oc.js differ
diff --git a/priv/static/packs/locale_oc.js.map b/priv/static/packs/locale_oc.js.map
index 019d5931b..0fa5a92a4 100644
Binary files a/priv/static/packs/locale_oc.js.map and b/priv/static/packs/locale_oc.js.map differ
diff --git a/priv/static/packs/locale_pl.js b/priv/static/packs/locale_pl.js
index 4fc3fa94b..5338adce2 100644
Binary files a/priv/static/packs/locale_pl.js and b/priv/static/packs/locale_pl.js differ
diff --git a/priv/static/packs/locale_pl.js.map b/priv/static/packs/locale_pl.js.map
index d52e32754..36c48b6b6 100644
Binary files a/priv/static/packs/locale_pl.js.map and b/priv/static/packs/locale_pl.js.map differ
diff --git a/priv/static/packs/locale_pt-BR.js b/priv/static/packs/locale_pt-BR.js
index dbc707e18..078b97b20 100644
Binary files a/priv/static/packs/locale_pt-BR.js and b/priv/static/packs/locale_pt-BR.js differ
diff --git a/priv/static/packs/locale_pt-BR.js.map b/priv/static/packs/locale_pt-BR.js.map
index 8b50f560a..3ca84d112 100644
Binary files a/priv/static/packs/locale_pt-BR.js.map and b/priv/static/packs/locale_pt-BR.js.map differ
diff --git a/priv/static/packs/locale_pt.js b/priv/static/packs/locale_pt.js
index d400ee273..8ae9df665 100644
Binary files a/priv/static/packs/locale_pt.js and b/priv/static/packs/locale_pt.js differ
diff --git a/priv/static/packs/locale_pt.js.map b/priv/static/packs/locale_pt.js.map
index edefb2ce3..d5f385b2d 100644
Binary files a/priv/static/packs/locale_pt.js.map and b/priv/static/packs/locale_pt.js.map differ
diff --git a/priv/static/packs/locale_ru.js b/priv/static/packs/locale_ru.js
index cb9de33ed..560f4f093 100644
Binary files a/priv/static/packs/locale_ru.js and b/priv/static/packs/locale_ru.js differ
diff --git a/priv/static/packs/locale_ru.js.map b/priv/static/packs/locale_ru.js.map
index 4c4a163d3..216336c1e 100644
Binary files a/priv/static/packs/locale_ru.js.map and b/priv/static/packs/locale_ru.js.map differ
diff --git a/priv/static/packs/locale_sk.js b/priv/static/packs/locale_sk.js
index b6fae91b4..b4156185b 100644
Binary files a/priv/static/packs/locale_sk.js and b/priv/static/packs/locale_sk.js differ
diff --git a/priv/static/packs/locale_sk.js.map b/priv/static/packs/locale_sk.js.map
index 2373c5fda..62b8da83e 100644
Binary files a/priv/static/packs/locale_sk.js.map and b/priv/static/packs/locale_sk.js.map differ
diff --git a/priv/static/packs/locale_sl.js b/priv/static/packs/locale_sl.js
new file mode 100644
index 000000000..b34727ba3
Binary files /dev/null and b/priv/static/packs/locale_sl.js differ
diff --git a/priv/static/packs/locale_sl.js.map b/priv/static/packs/locale_sl.js.map
new file mode 100644
index 000000000..8d5b4d937
Binary files /dev/null and b/priv/static/packs/locale_sl.js.map differ
diff --git a/priv/static/packs/locale_sr-Latn.js b/priv/static/packs/locale_sr-Latn.js
index cb1b9dbe0..d6d34066d 100644
Binary files a/priv/static/packs/locale_sr-Latn.js and b/priv/static/packs/locale_sr-Latn.js differ
diff --git a/priv/static/packs/locale_sr-Latn.js.map b/priv/static/packs/locale_sr-Latn.js.map
index 57ca9b7f0..f60a0e9d3 100644
Binary files a/priv/static/packs/locale_sr-Latn.js.map and b/priv/static/packs/locale_sr-Latn.js.map differ
diff --git a/priv/static/packs/locale_sr.js b/priv/static/packs/locale_sr.js
index 89549f27f..34028a4f5 100644
Binary files a/priv/static/packs/locale_sr.js and b/priv/static/packs/locale_sr.js differ
diff --git a/priv/static/packs/locale_sr.js.map b/priv/static/packs/locale_sr.js.map
index f739c5fe0..655f9d9fb 100644
Binary files a/priv/static/packs/locale_sr.js.map and b/priv/static/packs/locale_sr.js.map differ
diff --git a/priv/static/packs/locale_sv.js b/priv/static/packs/locale_sv.js
index 919d88726..bcb51c2ad 100644
Binary files a/priv/static/packs/locale_sv.js and b/priv/static/packs/locale_sv.js differ
diff --git a/priv/static/packs/locale_sv.js.map b/priv/static/packs/locale_sv.js.map
index 4166fa780..18e50289d 100644
Binary files a/priv/static/packs/locale_sv.js.map and b/priv/static/packs/locale_sv.js.map differ
diff --git a/priv/static/packs/locale_te.js b/priv/static/packs/locale_te.js
new file mode 100644
index 000000000..d9132297f
Binary files /dev/null and b/priv/static/packs/locale_te.js differ
diff --git a/priv/static/packs/locale_te.js.map b/priv/static/packs/locale_te.js.map
new file mode 100644
index 000000000..e7c047e13
Binary files /dev/null and b/priv/static/packs/locale_te.js.map differ
diff --git a/priv/static/packs/locale_th.js b/priv/static/packs/locale_th.js
index 989384536..fd71b71d5 100644
Binary files a/priv/static/packs/locale_th.js and b/priv/static/packs/locale_th.js differ
diff --git a/priv/static/packs/locale_th.js.map b/priv/static/packs/locale_th.js.map
index 50d3e6bee..e706b1b28 100644
Binary files a/priv/static/packs/locale_th.js.map and b/priv/static/packs/locale_th.js.map differ
diff --git a/priv/static/packs/locale_tr.js b/priv/static/packs/locale_tr.js
index ff92d5f1c..5ce254600 100644
Binary files a/priv/static/packs/locale_tr.js and b/priv/static/packs/locale_tr.js differ
diff --git a/priv/static/packs/locale_tr.js.map b/priv/static/packs/locale_tr.js.map
index 39c502198..a69fb506e 100644
Binary files a/priv/static/packs/locale_tr.js.map and b/priv/static/packs/locale_tr.js.map differ
diff --git a/priv/static/packs/locale_uk.js b/priv/static/packs/locale_uk.js
index 72f6f24a5..44bd99f3d 100644
Binary files a/priv/static/packs/locale_uk.js and b/priv/static/packs/locale_uk.js differ
diff --git a/priv/static/packs/locale_uk.js.map b/priv/static/packs/locale_uk.js.map
index 9b0c2bf16..1b156d538 100644
Binary files a/priv/static/packs/locale_uk.js.map and b/priv/static/packs/locale_uk.js.map differ
diff --git a/priv/static/packs/locale_zh-CN.js b/priv/static/packs/locale_zh-CN.js
index 5da70972a..a18dfacab 100644
Binary files a/priv/static/packs/locale_zh-CN.js and b/priv/static/packs/locale_zh-CN.js differ
diff --git a/priv/static/packs/locale_zh-CN.js.map b/priv/static/packs/locale_zh-CN.js.map
index c652abeb2..18cdc7048 100644
Binary files a/priv/static/packs/locale_zh-CN.js.map and b/priv/static/packs/locale_zh-CN.js.map differ
diff --git a/priv/static/packs/locale_zh-HK.js b/priv/static/packs/locale_zh-HK.js
index 1542eb87b..98fc9fc68 100644
Binary files a/priv/static/packs/locale_zh-HK.js and b/priv/static/packs/locale_zh-HK.js differ
diff --git a/priv/static/packs/locale_zh-HK.js.map b/priv/static/packs/locale_zh-HK.js.map
index bdf41e7d2..5c6a35df7 100644
Binary files a/priv/static/packs/locale_zh-HK.js.map and b/priv/static/packs/locale_zh-HK.js.map differ
diff --git a/priv/static/packs/locale_zh-TW.js b/priv/static/packs/locale_zh-TW.js
index 1db1e8d42..3fab66dbb 100644
Binary files a/priv/static/packs/locale_zh-TW.js and b/priv/static/packs/locale_zh-TW.js differ
diff --git a/priv/static/packs/locale_zh-TW.js.map b/priv/static/packs/locale_zh-TW.js.map
index d261e996e..89b06b4cb 100644
Binary files a/priv/static/packs/locale_zh-TW.js.map and b/priv/static/packs/locale_zh-TW.js.map differ
diff --git a/priv/static/packs/logo-fe5141d38a25f50068b4c69b77ca1ec8.svg b/priv/static/packs/logo-fe5141d38a25f50068b4c69b77ca1ec8.svg
deleted file mode 100644
index 034a9c221..000000000
--- a/priv/static/packs/logo-fe5141d38a25f50068b4c69b77ca1ec8.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/priv/static/packs/logo_alt-6090911445f54a587465e41da77a6969.svg b/priv/static/packs/logo_alt-6090911445f54a587465e41da77a6969.svg
deleted file mode 100644
index 102d4c787..000000000
--- a/priv/static/packs/logo_alt-6090911445f54a587465e41da77a6969.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/priv/static/packs/logo_full-96e7a97fe469f75a23a74852b2478fa3.svg b/priv/static/packs/logo_full-96e7a97fe469f75a23a74852b2478fa3.svg
deleted file mode 100644
index c33883342..000000000
--- a/priv/static/packs/logo_full-96e7a97fe469f75a23a74852b2478fa3.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/priv/static/packs/logo_transparent-6900bab180aa3a46c34425e5367a218f.svg b/priv/static/packs/logo_transparent-6900bab180aa3a46c34425e5367a218f.svg
deleted file mode 100644
index abd6d1f67..000000000
--- a/priv/static/packs/logo_transparent-6900bab180aa3a46c34425e5367a218f.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/priv/static/packs/mailer.js b/priv/static/packs/mailer.js
index 4fb68ab3f..9d938ac6e 100644
Binary files a/priv/static/packs/mailer.js and b/priv/static/packs/mailer.js differ
diff --git a/priv/static/packs/mailer.js.map b/priv/static/packs/mailer.js.map
index 0dbc51724..43fa0f557 100644
Binary files a/priv/static/packs/mailer.js.map and b/priv/static/packs/mailer.js.map differ
diff --git a/priv/static/packs/manifest.json b/priv/static/packs/manifest.json
index ed31f8e6d..fb013e0f6 100644
--- a/priv/static/packs/manifest.json
+++ b/priv/static/packs/manifest.json
@@ -15,15 +15,16 @@
"common.css.map": "/packs/common.css.map",
"common.js": "/packs/common.js",
"common.js.map": "/packs/common.js.map",
+ "containers/media_container.js": "/packs/containers/media_container.js",
+ "containers/media_container.js.map": "/packs/containers/media_container.js.map",
+ "contrast.css": "/packs/contrast.css",
+ "contrast.css.map": "/packs/contrast.css.map",
+ "contrast.js": "/packs/contrast.js",
+ "contrast.js.map": "/packs/contrast.js.map",
"default.css": "/packs/default.css",
"default.css.map": "/packs/default.css.map",
"default.js": "/packs/default.js",
"default.js.map": "/packs/default.js.map",
- "elephant-fren.png": "/packs/elephant-fren-d16fd77f9a9387e7d146b5f9d4dc1e7f.png",
- "elephant_ui_disappointed.svg": "/packs/elephant_ui_disappointed-8864342480c3612e3061702851d3a798.svg",
- "elephant_ui_greeting.svg": "/packs/elephant_ui_greeting-475430963d0b00fe82b07b17857ebf6c.svg",
- "elephant_ui_plane.svg": "/packs/elephant_ui_plane-e3f2d57c12c376e189c274cbe81af8dd.svg",
- "elephant_ui_working.svg": "/packs/elephant_ui_working-2e653cc278c2ac871c23aeb10de1c0e2.svg",
"emoji_picker.js": "/packs/emoji_picker.js",
"emoji_picker.js.map": "/packs/emoji_picker.js.map",
"extra_polyfills.js": "/packs/extra_polyfills.js",
@@ -38,6 +39,10 @@
"features/community_timeline.js.map": "/packs/features/community_timeline.js.map",
"features/compose.js": "/packs/features/compose.js",
"features/compose.js.map": "/packs/features/compose.js.map",
+ "features/direct_timeline.js": "/packs/features/direct_timeline.js",
+ "features/direct_timeline.js.map": "/packs/features/direct_timeline.js.map",
+ "features/domain_blocks.js": "/packs/features/domain_blocks.js",
+ "features/domain_blocks.js.map": "/packs/features/domain_blocks.js.map",
"features/favourited_statuses.js": "/packs/features/favourited_statuses.js",
"features/favourited_statuses.js.map": "/packs/features/favourited_statuses.js.map",
"features/favourites.js": "/packs/features/favourites.js",
@@ -62,8 +67,14 @@
"features/list_editor.js.map": "/packs/features/list_editor.js.map",
"features/list_timeline.js": "/packs/features/list_timeline.js",
"features/list_timeline.js.map": "/packs/features/list_timeline.js.map",
+ "features/lists.js": "/packs/features/lists.js",
+ "features/lists.js.map": "/packs/features/lists.js.map",
+ "features/mutes.js": "/packs/features/mutes.js",
+ "features/mutes.js.map": "/packs/features/mutes.js.map",
"features/notifications.js": "/packs/features/notifications.js",
"features/notifications.js.map": "/packs/features/notifications.js.map",
+ "features/pinned_statuses.js": "/packs/features/pinned_statuses.js",
+ "features/pinned_statuses.js.map": "/packs/features/pinned_statuses.js.map",
"features/public_timeline.js": "/packs/features/public_timeline.js",
"features/public_timeline.js.map": "/packs/features/public_timeline.js.map",
"features/reblogs.js": "/packs/features/reblogs.js",
@@ -97,14 +108,20 @@
"locale_bg.js.map": "/packs/locale_bg.js.map",
"locale_ca.js": "/packs/locale_ca.js",
"locale_ca.js.map": "/packs/locale_ca.js.map",
+ "locale_co.js": "/packs/locale_co.js",
+ "locale_co.js.map": "/packs/locale_co.js.map",
"locale_de.js": "/packs/locale_de.js",
"locale_de.js.map": "/packs/locale_de.js.map",
+ "locale_el.js": "/packs/locale_el.js",
+ "locale_el.js.map": "/packs/locale_el.js.map",
"locale_en.js": "/packs/locale_en.js",
"locale_en.js.map": "/packs/locale_en.js.map",
"locale_eo.js": "/packs/locale_eo.js",
"locale_eo.js.map": "/packs/locale_eo.js.map",
"locale_es.js": "/packs/locale_es.js",
"locale_es.js.map": "/packs/locale_es.js.map",
+ "locale_eu.js": "/packs/locale_eu.js",
+ "locale_eu.js.map": "/packs/locale_eu.js.map",
"locale_fa.js": "/packs/locale_fa.js",
"locale_fa.js.map": "/packs/locale_fa.js.map",
"locale_fi.js": "/packs/locale_fi.js",
@@ -147,12 +164,16 @@
"locale_ru.js.map": "/packs/locale_ru.js.map",
"locale_sk.js": "/packs/locale_sk.js",
"locale_sk.js.map": "/packs/locale_sk.js.map",
+ "locale_sl.js": "/packs/locale_sl.js",
+ "locale_sl.js.map": "/packs/locale_sl.js.map",
"locale_sr-Latn.js": "/packs/locale_sr-Latn.js",
"locale_sr-Latn.js.map": "/packs/locale_sr-Latn.js.map",
"locale_sr.js": "/packs/locale_sr.js",
"locale_sr.js.map": "/packs/locale_sr.js.map",
"locale_sv.js": "/packs/locale_sv.js",
"locale_sv.js.map": "/packs/locale_sv.js.map",
+ "locale_te.js": "/packs/locale_te.js",
+ "locale_te.js.map": "/packs/locale_te.js.map",
"locale_th.js": "/packs/locale_th.js",
"locale_th.js.map": "/packs/locale_th.js.map",
"locale_tr.js": "/packs/locale_tr.js",
@@ -165,19 +186,24 @@
"locale_zh-HK.js.map": "/packs/locale_zh-HK.js.map",
"locale_zh-TW.js": "/packs/locale_zh-TW.js",
"locale_zh-TW.js.map": "/packs/locale_zh-TW.js.map",
- "logo.svg": "/packs/logo-fe5141d38a25f50068b4c69b77ca1ec8.svg",
- "logo_alt.svg": "/packs/logo_alt-6090911445f54a587465e41da77a6969.svg",
"logo_full.png": "/packs/logo_full-5c51cffe1fcb8225ae02400d6a7e7077.png",
- "logo_full.svg": "/packs/logo_full-96e7a97fe469f75a23a74852b2478fa3.svg",
"logo_transparent.png": "/packs/logo_transparent-6f79eeb2c38ec2d12ed4d978322457d6.png",
- "logo_transparent.svg": "/packs/logo_transparent-6900bab180aa3a46c34425e5367a218f.svg",
"mailer.css": "/packs/mailer.css",
"mailer.css.map": "/packs/mailer.css.map",
"mailer.js": "/packs/mailer.js",
"mailer.js.map": "/packs/mailer.js.map",
+ "mastodon-light.css": "/packs/mastodon-light.css",
+ "mastodon-light.css.map": "/packs/mastodon-light.css.map",
+ "mastodon-light.js": "/packs/mastodon-light.js",
+ "mastodon-light.js.map": "/packs/mastodon-light.js.map",
+ "modals/embed_modal.js": "/packs/modals/embed_modal.js",
+ "modals/embed_modal.js.map": "/packs/modals/embed_modal.js.map",
+ "modals/mute_modal.js": "/packs/modals/mute_modal.js",
+ "modals/mute_modal.js.map": "/packs/modals/mute_modal.js.map",
"modals/onboarding_modal.js": "/packs/modals/onboarding_modal.js",
"modals/onboarding_modal.js.map": "/packs/modals/onboarding_modal.js.map",
- "preview.jpg": "/packs/preview-9a17d32fc48369e8ccd910a75260e67d.jpg",
+ "modals/report_modal.js": "/packs/modals/report_modal.js",
+ "modals/report_modal.js.map": "/packs/modals/report_modal.js.map",
"public.js": "/packs/public.js",
"public.js.map": "/packs/public.js.map",
"reticle.png": "/packs/reticle-7d7ce959271e5ff1193fb32cff90ea56.png",
diff --git a/priv/static/packs/mastodon-light.css b/priv/static/packs/mastodon-light.css
new file mode 100644
index 000000000..adddbc6e4
Binary files /dev/null and b/priv/static/packs/mastodon-light.css differ
diff --git a/priv/static/packs/mastodon-light.css.map b/priv/static/packs/mastodon-light.css.map
new file mode 100644
index 000000000..f3366da11
--- /dev/null
+++ b/priv/static/packs/mastodon-light.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":[],"names":[],"mappings":"","file":"mastodon-light.css","sourceRoot":""}
\ No newline at end of file
diff --git a/priv/static/packs/mastodon-light.js b/priv/static/packs/mastodon-light.js
new file mode 100644
index 000000000..6c2814cd1
Binary files /dev/null and b/priv/static/packs/mastodon-light.js differ
diff --git a/priv/static/packs/mastodon-light.js.map b/priv/static/packs/mastodon-light.js.map
new file mode 100644
index 000000000..fd60fb037
Binary files /dev/null and b/priv/static/packs/mastodon-light.js.map differ
diff --git a/priv/static/packs/modals/embed_modal.js b/priv/static/packs/modals/embed_modal.js
new file mode 100644
index 000000000..cf479060c
Binary files /dev/null and b/priv/static/packs/modals/embed_modal.js differ
diff --git a/priv/static/packs/modals/embed_modal.js.map b/priv/static/packs/modals/embed_modal.js.map
new file mode 100644
index 000000000..c76eddc38
Binary files /dev/null and b/priv/static/packs/modals/embed_modal.js.map differ
diff --git a/priv/static/packs/modals/mute_modal.js b/priv/static/packs/modals/mute_modal.js
new file mode 100644
index 000000000..8b84d0bfb
Binary files /dev/null and b/priv/static/packs/modals/mute_modal.js differ
diff --git a/priv/static/packs/modals/mute_modal.js.map b/priv/static/packs/modals/mute_modal.js.map
new file mode 100644
index 000000000..db16fa6f5
Binary files /dev/null and b/priv/static/packs/modals/mute_modal.js.map differ
diff --git a/priv/static/packs/modals/onboarding_modal.js b/priv/static/packs/modals/onboarding_modal.js
index 3d6bfd1ae..7e08d3fe9 100644
Binary files a/priv/static/packs/modals/onboarding_modal.js and b/priv/static/packs/modals/onboarding_modal.js differ
diff --git a/priv/static/packs/modals/onboarding_modal.js.map b/priv/static/packs/modals/onboarding_modal.js.map
index 6a6e30136..f326a7500 100644
Binary files a/priv/static/packs/modals/onboarding_modal.js.map and b/priv/static/packs/modals/onboarding_modal.js.map differ
diff --git a/priv/static/packs/modals/report_modal.js b/priv/static/packs/modals/report_modal.js
new file mode 100644
index 000000000..78eca1b1a
Binary files /dev/null and b/priv/static/packs/modals/report_modal.js differ
diff --git a/priv/static/packs/modals/report_modal.js.map b/priv/static/packs/modals/report_modal.js.map
new file mode 100644
index 000000000..aaa769ce1
Binary files /dev/null and b/priv/static/packs/modals/report_modal.js.map differ
diff --git a/priv/static/packs/preview-9a17d32fc48369e8ccd910a75260e67d.jpg b/priv/static/packs/preview-9a17d32fc48369e8ccd910a75260e67d.jpg
deleted file mode 100644
index ec2856748..000000000
Binary files a/priv/static/packs/preview-9a17d32fc48369e8ccd910a75260e67d.jpg and /dev/null differ
diff --git a/priv/static/packs/public.js b/priv/static/packs/public.js
index aa23ff990..ce86181d4 100644
Binary files a/priv/static/packs/public.js and b/priv/static/packs/public.js differ
diff --git a/priv/static/packs/public.js.map b/priv/static/packs/public.js.map
index 5a67153b5..4bb64556a 100644
Binary files a/priv/static/packs/public.js.map and b/priv/static/packs/public.js.map differ
diff --git a/priv/static/packs/share.js b/priv/static/packs/share.js
index a3f0778c8..6e10497f2 100644
Binary files a/priv/static/packs/share.js and b/priv/static/packs/share.js differ
diff --git a/priv/static/packs/share.js.map b/priv/static/packs/share.js.map
index a84c5f164..e3ebf0a65 100644
Binary files a/priv/static/packs/share.js.map and b/priv/static/packs/share.js.map differ
diff --git a/priv/static/packs/status/media_gallery.js b/priv/static/packs/status/media_gallery.js
index 756c6a74c..c86badb2e 100644
Binary files a/priv/static/packs/status/media_gallery.js and b/priv/static/packs/status/media_gallery.js differ
diff --git a/priv/static/packs/status/media_gallery.js.map b/priv/static/packs/status/media_gallery.js.map
index af2525f2f..cbbaf2062 100644
Binary files a/priv/static/packs/status/media_gallery.js.map and b/priv/static/packs/status/media_gallery.js.map differ
diff --git a/priv/static/static/css/app.4e316dc76ab907cb78bb88b978ce04e2.css b/priv/static/static/css/app.4e316dc76ab907cb78bb88b978ce04e2.css
new file mode 100644
index 000000000..000d2d6a7
Binary files /dev/null and b/priv/static/static/css/app.4e316dc76ab907cb78bb88b978ce04e2.css differ
diff --git a/priv/static/static/css/app.4e316dc76ab907cb78bb88b978ce04e2.css.map b/priv/static/static/css/app.4e316dc76ab907cb78bb88b978ce04e2.css.map
new file mode 100644
index 000000000..49156af2c
--- /dev/null
+++ b/priv/static/static/css/app.4e316dc76ab907cb78bb88b978ce04e2.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack:///src/App.scss","webpack:///webpack:///src/components/user_panel/user_panel.vue","webpack:///webpack:///src/components/login_form/login_form.vue","webpack:///webpack:///src/components/post_status_form/post_status_form.vue","webpack:///webpack:///src/components/media_upload/media_upload.vue","webpack:///webpack:///src/components/user_card_content/user_card_content.vue","webpack:///webpack:///src/components/still-image/still-image.vue","webpack:///webpack:///src/components/nav_panel/nav_panel.vue","webpack:///webpack:///src/components/notifications/notifications.scss","webpack:///webpack:///src/components/status/status.vue","webpack:///webpack:///src/components/attachment/attachment.vue","webpack:///webpack:///src/components/favorite_button/favorite_button.vue","webpack:///webpack:///src/components/retweet_button/retweet_button.vue","webpack:///webpack:///src/components/delete_button/delete_button.vue","webpack:///webpack:///src/components/user_finder/user_finder.vue","webpack:///webpack:///src/components/who_to_follow_panel/who_to_follow_panel.vue","webpack:///webpack:///src/components/chat_panel/chat_panel.vue","webpack:///webpack:///src/components/timeline/timeline.vue","webpack:///webpack:///src/components/status_or_conversation/status_or_conversation.vue","webpack:///webpack:///src/components/user_card/user_card.vue","webpack:///webpack:///src/components/user_profile/user_profile.vue","webpack:///webpack:///src/components/settings/settings.vue","webpack:///webpack:///src/components/style_switcher/style_switcher.vue","webpack:///webpack:///src/components/registration/registration.vue","webpack:///webpack:///src/components/user_settings/user_settings.vue"],"names":[],"mappings":"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","file":"static/css/app.4e316dc76ab907cb78bb88b978ce04e2.css","sourcesContent":["\n#app{background-size:cover;background-attachment:fixed;background-repeat:no-repeat;background-position:0 50px;min-height:100vh;max-width:100%;overflow:hidden\n}\ni{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none\n}\nh4{margin:0\n}\n#content{box-sizing:border-box;padding-top:60px;margin:auto;min-height:100vh;max-width:980px;background-color:rgba(0,0,0,0.15);-ms-flex-line-pack:start;align-content:flex-start\n}\n.text-center{text-align:center\n}\nbody{font-family:sans-serif;font-size:14px;margin:0;color:#b9b9ba;color:var(--fg, #b9b9ba);max-width:100vw;overflow-x:hidden\n}\na{text-decoration:none;color:#d8a070;color:var(--link, #d8a070)\n}\nbutton{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#b9b9ba;color:var(--fg, #b9b9ba);background-color:#182230;background-color:var(--btn, #182230);border:none;border-radius:4px;border-radius:var(--btnRadius, 4px);cursor:pointer;border-top:1px solid rgba(255,255,255,0.2);border-bottom:1px solid rgba(0,0,0,0.2);box-shadow:0px 0px 2px black;font-size:14px;font-family:sans-serif\n}\nbutton:hover{box-shadow:0px 0px 4px rgba(255,255,255,0.3)\n}\nbutton:disabled{cursor:not-allowed;opacity:0.5\n}\nbutton.pressed{color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5));background-color:#121a24;background-color:var(--bg, #121a24)\n}\nlabel.select{padding:0\n}\ninput,textarea,.select{border:none;border-radius:4px;border-radius:var(--inputRadius, 4px);border-bottom:1px solid rgba(255,255,255,0.2);border-top:1px solid rgba(0,0,0,0.2);box-shadow:0px 0px 2px black inset;background-color:#182230;background-color:var(--input, #182230);color:#b9b9ba;color:var(--lightFg, #b9b9ba);font-family:sans-serif;font-size:14px;padding:8px 7px;box-sizing:border-box;display:inline-block;position:relative;height:29px;line-height:16px\n}\ninput .icon-down-open,textarea .icon-down-open,.select .icon-down-open{position:absolute;top:0;bottom:0;right:5px;height:100%;color:#b9b9ba;color:var(--fg, #b9b9ba);line-height:29px;z-index:0;pointer-events:none\n}\ninput select,textarea select,.select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:none;margin:0;color:#b9b9ba;color:var(--fg, #b9b9ba);padding:4px 2em 3px 3px;width:100%;z-index:1;height:29px;line-height:16px\n}\ninput[type=radio],input[type=checkbox],textarea[type=radio],textarea[type=checkbox],.select[type=radio],.select[type=checkbox]{display:none\n}\ninput[type=radio]:checked+label::before,input[type=checkbox]:checked+label::before,textarea[type=radio]:checked+label::before,textarea[type=checkbox]:checked+label::before,.select[type=radio]:checked+label::before,.select[type=checkbox]:checked+label::before{color:#b9b9ba;color:var(--fg, #b9b9ba)\n}\ninput[type=radio]+label::before,input[type=checkbox]+label::before,textarea[type=radio]+label::before,textarea[type=checkbox]+label::before,.select[type=radio]+label::before,.select[type=checkbox]+label::before{display:inline-block;content:'✔';transition:color 200ms;width:1.1em;height:1.1em;border-radius:2px;border-radius:var(--checkBoxRadius, 2px);border-bottom:1px solid rgba(255,255,255,0.2);border-top:1px solid rgba(0,0,0,0.2);box-shadow:0px 0px 2px black inset;margin-right:.5em;background-color:#182230;background-color:var(--input, #182230);vertical-align:top;text-align:center;line-height:1.1em;font-size:1.1em;box-sizing:border-box;color:transparent;overflow:hidden;box-sizing:border-box\n}\noption{color:#b9b9ba;color:var(--fg, #b9b9ba);background-color:#121a24;background-color:var(--bg, #121a24)\n}\ni[class*=icon-]{color:#666;color:var(--icon, #666)\n}\n.container{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0 10px 0 10px\n}\n.gaps{margin:-1em 0 0 -1em\n}\n.item{-ms-flex:1;flex:1;line-height:50px;height:50px;overflow:hidden\n}\n.item .nav-icon{font-size:1.1em;margin-left:0.4em\n}\n.gaps>.item{padding:1em 0 0 1em\n}\n.auto-size{-ms-flex:1;flex:1\n}\nnav{width:100%;-ms-flex-align:center;align-items:center;position:fixed;height:50px\n}\nnav .inner-nav{padding-left:20px;padding-right:20px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-preferred-size:970px;flex-basis:970px;margin:auto;height:50px;background-repeat:no-repeat;background-position:center;background-size:auto 80%\n}\nnav .inner-nav a i{color:#d8a070;color:var(--link, #d8a070)\n}\nmain-router{-ms-flex:1;flex:1\n}\n.status.compact{color:rgba(0,0,0,0.42);font-weight:300\n}\n.status.compact p{margin:0;font-size:0.8em\n}\n.panel{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:0.5em;background-color:#121a24;background-color:var(--bg, #121a24);border-radius:10px;border-radius:var(--panelRadius, 10px);box-shadow:1px 1px 4px rgba(0,0,0,0.6)\n}\n.panel-body:empty::before{content:\"¯\\\\_(ツ)_/¯\";display:block;margin:1em;text-align:center\n}\n.panel-heading{border-radius:10px 10px 0 0;border-radius:var(--panelRadius, 10px) var(--panelRadius, 10px) 0 0;background-size:cover;padding:0.6em 1.0em;text-align:left;font-size:1.3em;line-height:24px;background-color:#182230;background-color:var(--btn, #182230)\n}\n.panel-heading.stub{border-radius:10px;border-radius:var(--panelRadius, 10px)\n}\n.panel-footer{border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius, 10px) var(--panelRadius, 10px)\n}\n.panel-body>p{line-height:18px;padding:1em;margin:0\n}\n.container>*{min-width:0px\n}\n.fa{color:grey\n}\nnav{z-index:1000;background-color:#182230;background-color:var(--btn, #182230);color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5));box-shadow:0px 0px 4px rgba(0,0,0,0.6)\n}\n.fade-enter-active,.fade-leave-active{transition:opacity .2s\n}\n.fade-enter,.fade-leave-active{opacity:0\n}\n.main{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1\n}\n.sidebar-bounds{-ms-flex:0;flex:0;-ms-flex-preferred-size:35%;flex-basis:35%\n}\n.sidebar-flexer{-ms-flex:1;flex:1;-ms-flex-preferred-size:345px;flex-basis:345px;width:365px\n}\n.mobile-shown{display:none\n}\n.panel-switcher{display:none;width:100%;height:46px\n}\n.panel-switcher button{display:block;-ms-flex:1;flex:1;max-height:32px;margin:0.5em;padding:0.5em\n}\n@media all and (min-width: 960px){\nbody{overflow-y:scroll\n}\n.sidebar-bounds{overflow:hidden;max-height:100vh;width:345px;position:fixed;margin-top:-10px\n}\n.sidebar-bounds .sidebar-scroller{height:96vh;width:365px;padding-top:10px;padding-right:50px;overflow-x:hidden;overflow-y:scroll\n}\n.sidebar-bounds .sidebar{width:345px\n}\n.sidebar-flexer{max-height:96vh;-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0\n}\n}\n.alert{margin:0.35em;padding:0.25em;border-radius:5px;border-radius:var(--tooltipRadius, 5px);color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5));min-height:28px;line-height:28px\n}\n.alert.error{background-color:rgba(211,16,20,0.5);background-color:var(--cAlertRed, rgba(211,16,20,0.5))\n}\n.faint{color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5))\n}\n@media all and (max-width: 959px){\n.mobile-hidden{display:none\n}\n.panel-switcher{display:-ms-flexbox;display:flex\n}\n.container{padding:0 0 0 0\n}\n.panel{margin:0.5em 0 0.5em 0\n}\n}\n.item.right{text-align:right;padding-right:20px\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/App.scss","\n.user-panel .profile-panel-background .panel-heading{background:transparent\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_panel/user_panel.vue","\n.login-form .btn{min-height:28px;width:10em\n}\n.login-form .error{text-align:center\n}\n.login-form .register{-ms-flex:1 1;flex:1 1\n}\n.login-form .login-bottom{margin-top:1.0em;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/login_form/login_form.vue","\n.tribute-container ul{padding:0px\n}\n.tribute-container ul li{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center\n}\n.tribute-container img{padding:3px;width:16px;height:16px;border-radius:10px;border-radius:var(--avatarAltRadius, 10px)\n}\n.post-status-form .visibility-tray{font-size:1.2em;padding:3px;cursor:pointer\n}\n.post-status-form .visibility-tray .selected{color:#b9b9ba;color:var(--lightFg, #b9b9ba)\n}\n.visibility-notice{padding:.5em;border:1px solid rgba(185,185,186,0.5);border:1px solid var(--faint, rgba(185,185,186,0.5));border-radius:4px;border-radius:var(--inputRadius, 4px)\n}\n.post-status-form .form-bottom,.login .form-bottom{display:-ms-flexbox;display:flex;padding:0.5em;height:32px\n}\n.post-status-form .form-bottom button,.login .form-bottom button{width:10em\n}\n.post-status-form .form-bottom p,.login .form-bottom p{margin:0.35em;padding:0.35em;display:-ms-flexbox;display:flex\n}\n.post-status-form .error,.login .error{text-align:center\n}\n.post-status-form .attachments,.login .attachments{padding:0 0.5em\n}\n.post-status-form .attachments .attachment,.login .attachments .attachment{position:relative;border:1px solid #222;border:1px solid var(--border, #222);margin:0.5em 0.8em 0.2em 0\n}\n.post-status-form .attachments i,.login .attachments i{position:absolute;margin:10px;padding:5px;background:rgba(230,230,230,0.6);border-radius:10px;border-radius:var(--attachmentRadius, 10px);font-weight:bold\n}\n.post-status-form .btn,.login .btn{cursor:pointer\n}\n.post-status-form .btn[disabled],.login .btn[disabled]{cursor:not-allowed\n}\n.post-status-form form,.login form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0.6em\n}\n.post-status-form .form-group,.login .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0.3em 0.5em 0.6em;line-height:24px\n}\n.post-status-form form textarea.form-cw,.login form textarea.form-cw{line-height:16px;resize:none;overflow:hidden;transition:min-height 200ms 100ms;min-height:1px\n}\n.post-status-form form textarea.form-control,.login form textarea.form-control{line-height:16px;resize:none;overflow:hidden;transition:min-height 200ms 100ms;min-height:1px;box-sizing:content-box\n}\n.post-status-form form textarea.form-control:focus,.login form textarea.form-control:focus{min-height:48px\n}\n.post-status-form .btn,.login .btn{cursor:pointer\n}\n.post-status-form .btn[disabled],.login .btn[disabled]{cursor:not-allowed\n}\n.post-status-form .icon-cancel,.login .icon-cancel{cursor:pointer;z-index:4\n}\n.post-status-form .autocomplete-panel,.login .autocomplete-panel{margin:0 0.5em 0 0.5em;border-radius:5px;border-radius:var(--tooltipRadius, 5px);position:absolute;z-index:1;box-shadow:1px 2px 4px rgba(0,0,0,0.5);min-width:75%;background:#121a24;background:var(--bg, #121a24);color:#b9b9ba;color:var(--lightFg, #b9b9ba)\n}\n.post-status-form .autocomplete,.login .autocomplete{cursor:pointer;padding:0.2em 0.4em 0.2em 0.4em;border-bottom:1px solid rgba(0,0,0,0.4);display:-ms-flexbox;display:flex\n}\n.post-status-form .autocomplete img,.login .autocomplete img{width:24px;height:24px;border-radius:4px;border-radius:var(--avatarRadius, 4px);object-fit:contain\n}\n.post-status-form .autocomplete span,.login .autocomplete span{line-height:24px;margin:0 0.1em 0 0.2em\n}\n.post-status-form .autocomplete small,.login .autocomplete small{margin-left:.5em;color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5))\n}\n.post-status-form .autocomplete.highlighted,.login .autocomplete.highlighted{background-color:#182230;background-color:var(--btn, #182230)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/post_status_form/post_status_form.vue","\n.media-upload {\n font-size: 26px;\n -ms-flex: 1;\n flex: 1;\n}\n.icon-upload {\n cursor: pointer;\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/media_upload/media_upload.vue","\n.profile-panel-background{background-size:cover;border-radius:10px;border-radius:var(--panelRadius, 10px)\n}\n.profile-panel-background .panel-heading{padding:0.6em 0em;text-align:center\n}\n.profile-panel-body{word-wrap:break-word;background:linear-gradient(to bottom, transparent, #121a24 80%);background:linear-gradient(to bottom, transparent, var(--bg, #121a24) 80%)\n}\n.user-info{color:#b9b9ba;color:var(--lightFg, #b9b9ba);padding:0 16px\n}\n.user-info .container{padding:16px 10px 6px 10px;display:-ms-flexbox;display:flex;max-height:56px;overflow:hidden\n}\n.user-info .container .avatar{border-radius:4px;border-radius:var(--avatarRadius, 4px);-ms-flex:1 0 100%;flex:1 0 100%;width:56px;height:56px;box-shadow:0px 1px 8px rgba(0,0,0,0.75);object-fit:cover\n}\n.user-info .container .avatar.animated::before{display:none\n}\n.user-info:hover .animated.avatar canvas{display:none\n}\n.user-info:hover .animated.avatar img{visibility:visible\n}\n.user-info .usersettings{color:#b9b9ba;color:var(--lightFg, #b9b9ba);opacity:.8\n}\n.user-info .name-and-screen-name{display:block;margin-left:0.6em;text-align:left;text-overflow:ellipsis;white-space:nowrap;-ms-flex:1 1 0px;flex:1 1 0\n}\n.user-info .user-name{text-overflow:ellipsis;overflow:hidden\n}\n.user-info .user-screen-name{color:#b9b9ba;color:var(--lightFg, #b9b9ba);display:inline-block;font-weight:light;font-size:15px;padding-right:0.1em\n}\n.user-info .user-meta{margin-bottom:.4em\n}\n.user-info .user-meta .following{font-size:14px;-ms-flex:0 0 100%;flex:0 0 100%;margin:0;padding-left:16px;text-align:left;float:left\n}\n.user-info .user-meta .floater{margin:0\n}\n.user-info .user-meta::after{display:block;content:'';clear:both\n}\n.user-info .user-interactions{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-pack:justify;justify-content:space-between\n}\n.user-info .user-interactions div{-ms-flex:1;flex:1\n}\n.user-info .user-interactions .mute{max-width:220px;min-height:28px\n}\n.user-info .user-interactions .remote-follow{max-width:220px;min-height:28px\n}\n.user-info .user-interactions .follow{max-width:220px;min-height:28px\n}\n.user-info .user-interactions button{width:92%;height:100%\n}\n.user-info .user-interactions .remote-button{height:28px !important;width:92%\n}\n.user-info .user-interactions .pressed{border-bottom-color:rgba(255,255,255,0.2);border-top-color:rgba(0,0,0,0.2)\n}\n.user-counts{display:-ms-flexbox;display:flex;line-height:16px;padding:.5em 1.5em 0em 1.5em;text-align:center;-ms-flex-pack:justify;justify-content:space-between;color:#b9b9ba;color:var(--lightFg, #b9b9ba)\n}\n.user-counts.clickable .user-count{cursor:pointer\n}\n.user-counts.clickable .user-count:hover:not(.selected){transition:border-bottom 100ms;border-bottom:3px solid #d8a070;border-bottom:3px solid var(--link, #d8a070)\n}\n.user-count{-ms-flex:1;flex:1;padding:.5em 0 .5em 0;margin:0 .5em\n}\n.user-count.selected{transition:none;border-bottom:5px solid #d8a070;border-bottom:5px solid var(--link, #d8a070);border-radius:4px;border-radius:var(--btnRadius, 4px)\n}\n.user-count h5{font-size:1em;font-weight:bolder;margin:0 0 0.25em\n}\n.user-count a{text-decoration:none\n}\n.dailyAvg{margin-left:1em;font-size:0.7em;color:#CCC\n}\n.floater{float:right;margin-top:16px\n}\n.floater .userHighlightCl{padding:2px 10px\n}\n.floater .userHighlightSel,.floater .userHighlightSel.select{padding-top:0;padding-bottom:0\n}\n.floater .userHighlightSel.select i{line-height:22px\n}\n.floater .userHighlightText{width:70px\n}\n.floater .userHighlightCl,.floater .userHighlightText,.floater .userHighlightSel,.floater .userHighlightSel.select{height:22px;vertical-align:top;margin-right:0\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_card_content/user_card_content.vue","\n.still-image{position:relative;line-height:0;overflow:hidden;width:100%;height:100%\n}\n.still-image:hover canvas{display:none\n}\n.still-image img{width:100%;height:100%\n}\n.still-image.animated:hover::before,.still-image.animated img{visibility:hidden\n}\n.still-image.animated:hover img{visibility:visible\n}\n.still-image.animated::before{content:'gif';position:absolute;line-height:10px;font-size:10px;top:5px;left:5px;background:rgba(127,127,127,0.5);color:#FFF;display:block;padding:2px 4px;border-radius:5px;border-radius:var(--tooltipRadius, 5px);z-index:2\n}\n.still-image canvas{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/still-image/still-image.vue","\n.nav-panel .panel{overflow:hidden\n}\n.nav-panel ul{list-style:none;margin:0;padding:0\n}\n.nav-panel li{border-bottom:1px solid;border-color:#222;border-color:var(--border, #222);padding:0\n}\n.nav-panel li:first-child a{border-top-right-radius:10px;border-top-right-radius:var(--panelRadius, 10px);border-top-left-radius:10px;border-top-left-radius:var(--panelRadius, 10px)\n}\n.nav-panel li:last-child a{border-bottom-right-radius:10px;border-bottom-right-radius:var(--panelRadius, 10px);border-bottom-left-radius:10px;border-bottom-left-radius:var(--panelRadius, 10px)\n}\n.nav-panel li:last-child{border:none\n}\n.nav-panel a{display:block;padding:0.8em 0.85em\n}\n.nav-panel a:hover{background-color:#151e2a;background-color:var(--lightBg, #151e2a)\n}\n.nav-panel a.router-link-active{font-weight:bolder;background-color:#151e2a;background-color:var(--lightBg, #151e2a)\n}\n.nav-panel a.router-link-active:hover{text-decoration:underline\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/nav_panel/nav_panel.vue","\n.notifications{padding-bottom:15em\n}\n.notifications .panel{background:#121a24;background:var(--bg, #121a24)\n}\n.notifications .panel-body{border-color:#222;border-color:var(--border, #222)\n}\n.notifications .panel-heading{position:relative;background:#182230;background:var(--btn, #182230);color:#b9b9ba;color:var(--fg, #b9b9ba)\n}\n.notifications .panel-heading .read-button{position:absolute;right:0.7em;height:1.8em;line-height:100%\n}\n.notifications .unseen-count{display:inline-block;background-color:red;background-color:var(--cRed, red);text-shadow:0px 0px 3px rgba(0,0,0,0.5);min-width:1.3em;border-radius:1.3em;margin:0 0.2em 0 -0.4em;color:white;font-size:0.9em;text-align:center;line-height:1.3em\n}\n.notifications .unseen{box-shadow:inset 4px 0 0 var(--cRed, red);padding-left:0\n}\n.notification{box-sizing:border-box;display:-ms-flexbox;display:flex;border-bottom:1px solid;border-bottom-color:inherit\n}\n.notification .avatar-compact{width:32px;height:32px;border-radius:10px;border-radius:var(--avatarAltRadius, 10px);overflow:hidden;line-height:0\n}\n.notification .avatar-compact.animated::before{display:none\n}\n.notification:hover .animated.avatar canvas{display:none\n}\n.notification:hover .animated.avatar img{visibility:visible\n}\n.notification .notification-usercard{margin:0\n}\n.notification .non-mention{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:0.6em;min-width:0\n}\n.notification .non-mention .avatar-container{width:32px;height:32px\n}\n.notification .non-mention .status-el{padding:0\n}\n.notification .non-mention .status-el .status{padding:0.25em 0;color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5))\n}\n.notification .non-mention .status-el .media-body{margin:0\n}\n.notification .follow-text{padding:0.5em 0\n}\n.notification .status-el{-ms-flex:1;flex:1\n}\n.notification time{white-space:nowrap\n}\n.notification .notification-right{-ms-flex:1;flex:1;padding-left:0.8em;min-width:0\n}\n.notification .notification-details{min-width:0px;word-wrap:break-word;line-height:18px;position:relative;overflow:hidden;width:100%;-ms-flex:1 1 0px;flex:1 1 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap\n}\n.notification .notification-details .name-and-action{-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis\n}\n.notification .notification-details .username{font-weight:bolder;max-width:100%;text-overflow:ellipsis;white-space:nowrap\n}\n.notification .notification-details .timeago{float:right;font-size:12px\n}\n.notification .notification-details .icon-retweet.lit{color:#0fa00f;color:var(--cGreen, #0fa00f)\n}\n.notification .notification-details .icon-user-plus.lit{color:#0095ff;color:var(--cBlue, #0095ff)\n}\n.notification .notification-details .icon-reply.lit{color:#0095ff;color:var(--cBlue, #0095ff)\n}\n.notification .notification-details .icon-star.lit{color:orange;color:orange;color:var(--cOrange, orange)\n}\n.notification .notification-details .status-content{margin:0;max-height:300px\n}\n.notification .notification-details h1{word-break:break-all;margin:0 0 0.3em;padding:0;font-size:1em;line-height:20px\n}\n.notification .notification-details h1 small{font-weight:lighter\n}\n.notification .notification-details p{margin:0;margin-top:0;margin-bottom:0.3em\n}\n.notification:last-child{border-bottom:none;border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius, 10px) var(--panelRadius, 10px)\n}\n.notification:last-child .status-el{border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius, 10px) var(--panelRadius, 10px)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/notifications/notifications.scss","\n.status-body{-ms-flex:1;flex:1;min-width:0\n}\n.status-preview.status-el{border-style:solid;border-width:1px;border-color:#222;border-color:var(--border, #222)\n}\n.status-preview-container{position:relative;max-width:100%\n}\n.status-preview{position:absolute;max-width:95%;display:-ms-flexbox;display:flex;background-color:#121a24;background-color:var(--bg, #121a24);border-color:#222;border-color:var(--border, #222);border-style:solid;border-width:1px;border-radius:5px;border-radius:var(--tooltipRadius, 5px);box-shadow:2px 2px 3px rgba(0,0,0,0.5);margin-top:0.25em;margin-left:0.5em;z-index:50\n}\n.status-preview .status{-ms-flex:1;flex:1;border:0;min-width:15em\n}\n.status-preview-loading{display:block;min-width:15em;padding:1em;text-align:center;border-width:1px;border-style:solid\n}\n.status-preview-loading i{font-size:2em\n}\n.status-el{-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;border-left-width:0px;line-height:18px;min-width:0;border-color:#222;border-color:var(--border, #222);border-left:4px red;border-left:4px var(--cRed, red)\n}\n.status-el_focused{background-color:#151e2a;background-color:var(--lightBg, #151e2a)\n}\n.timeline .status-el{border-bottom-width:1px;border-bottom-style:solid\n}\n.status-el .media-body{-ms-flex:1;flex:1;padding:0;margin:0 0 0.25em 0.8em\n}\n.status-el .usercard{margin-bottom:.7em\n}\n.status-el .media-heading{-ms-flex-wrap:nowrap;flex-wrap:nowrap\n}\n.status-el .media-heading-left{padding:0;vertical-align:bottom;-ms-flex-preferred-size:100%;flex-basis:100%\n}\n.status-el .media-heading-left small{font-weight:lighter\n}\n.status-el .media-heading-left h4{white-space:nowrap;font-size:14px;margin-right:0.25em;overflow:hidden;text-overflow:ellipsis\n}\n.status-el .media-heading-left .name-and-links{padding:0;-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:center;align-content:center\n}\n.status-el .media-heading-left .links{display:-ms-flexbox;display:flex;padding-top:1px;margin-left:0.2em;font-size:12px;color:#d8a070;color:var(--link, #d8a070);max-width:100%\n}\n.status-el .media-heading-left .links a{max-width:100%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap\n}\n.status-el .media-heading-left .reply-info{display:-ms-flexbox;display:flex\n}\n.status-el .media-heading-left .replies{line-height:16px\n}\n.status-el .media-heading-left .reply-link{margin-right:0.2em\n}\n.status-el .media-heading-right{-ms-flex-negative:0;flex-shrink:0;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:1.5em;margin-left:0.25em\n}\n.status-el .media-heading-right .timeago{margin-right:0.2em;font-size:12px;padding-top:1px\n}\n.status-el .media-heading-right i{margin-left:0.2em\n}\n.status-el a{display:inline-block;word-break:break-all\n}\n.status-el .tall-status{position:relative;height:220px;overflow-x:hidden;overflow-y:hidden\n}\n.status-el .tall-status-hider{position:absolute;height:70px;margin-top:150px;width:100%;text-align:center;line-height:110px;background:linear-gradient(to bottom, transparent, #121a24 80%);background:linear-gradient(to bottom, transparent, var(--bg, #121a24) 80%)\n}\n.status-el .tall-status-hider_focused{background:linear-gradient(to bottom, transparent, #151e2a 80%);background:linear-gradient(to bottom, transparent, var(--lightBg, #151e2a) 80%)\n}\n.status-el .tall-status-unhider{width:100%;text-align:center\n}\n.status-el .status-content{margin-right:0.5em\n}\n.status-el .status-content img,.status-el .status-content video{max-width:100%;max-height:400px;vertical-align:middle;object-fit:contain\n}\n.status-el .status-content blockquote{margin:0.2em 0 0.2em 2em;font-style:italic\n}\n.status-el .status-content p{margin:0;margin-top:0.2em;margin-bottom:0.5em\n}\n.status-el .retweet-info{padding:0.4em 0.6em 0 0.6em;margin:0\n}\n.status-el .retweet-info .avatar{border-radius:10px;border-radius:var(--avatarAltRadius, 10px);margin-left:28px;width:20px;height:20px\n}\n.status-el .retweet-info .media-body{font-size:1em;line-height:22px;display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap\n}\n.status-el .retweet-info .media-body i{padding:0 0.2em\n}\n.status-el .retweet-info .media-body a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\n}\n.status-fadein{animation-duration:0.4s;animation-name:fadein\n}\n@keyframes fadein{\nfrom{opacity:0\n}\nto{opacity:1\n}\n}\n.greentext{color:green\n}\n.status-conversation{border-left-style:solid\n}\n.status-actions{width:100%;display:-ms-flexbox;display:flex\n}\n.status-actions div,.status-actions favorite-button{padding-top:0.25em;max-width:6em;-ms-flex:1;flex:1\n}\n.icon-reply:hover{color:#0095ff;color:var(--cBlue, #0095ff)\n}\n.icon-reply.icon-reply-active{color:#0095ff;color:var(--cBlue, #0095ff)\n}\n.status .avatar-compact{width:32px;height:32px;border-radius:10px;border-radius:var(--avatarAltRadius, 10px)\n}\n.avatar{width:48px;height:48px;border-radius:4px;border-radius:var(--avatarRadius, 4px);overflow:hidden;position:relative\n}\n.avatar img{width:100%;height:100%\n}\n.avatar.animated::before{display:none\n}\n.status:hover .animated.avatar canvas{display:none\n}\n.status:hover .animated.avatar img{visibility:visible\n}\n.status{display:-ms-flexbox;display:flex;padding:0.6em\n}\n.status.is-retweet{padding-top:0.1em\n}\n.status-conversation:last-child{border-bottom:none\n}\n.muted{padding:0.25em 0.5em\n}\n.muted button{margin-left:auto\n}\n.muted .muteWords{margin-left:10px\n}\na.unmute{display:block;margin-left:auto\n}\n.reply-left{-ms-flex:0;flex:0;min-width:48px\n}\n.reply-body{-ms-flex:1;flex:1\n}\n.timeline>.status-el:last-child{border-bottom-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius, 10px) var(--panelRadius, 10px)\n}\n@media all and (max-width: 960px){\n.status-el .retweet-info .avatar{margin-left:20px\n}\n.status{max-width:100%\n}\n.status .avatar{width:40px;height:40px\n}\n.status .avatar-compact{width:32px;height:32px\n}\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/status/status.vue","\n.attachments{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-0.7em\n}\n.attachments .attachment.media-upload-container{-ms-flex:0 0 auto;flex:0 0 auto;max-height:300px;max-width:100%\n}\n.attachments .placeholder{margin-right:0.5em\n}\n.attachments .small-attachment{max-height:100px\n}\n.attachments .small-attachment.image,.attachments .small-attachment.video{max-width:35%\n}\n.attachments .attachment{-ms-flex:1 0 30%;flex:1 0 30%;margin:0.5em 0.7em 0.6em 0.0em;-ms-flex-item-align:start;align-self:flex-start;line-height:0;border-style:solid;border-width:1px;border-radius:10px;border-radius:var(--attachmentRadius, 10px);border-color:#222;border-color:var(--border, #222);overflow:hidden\n}\n.attachments .fullwidth{-ms-flex-preferred-size:100%;flex-basis:100%\n}\n.attachments.video{line-height:0\n}\n.attachments.html{-ms-flex-preferred-size:90%;flex-basis:90%;width:100%;display:-ms-flexbox;display:flex\n}\n.attachments.loading{cursor:progress\n}\n.attachments .hider{position:absolute;margin:10px;padding:5px;background:rgba(230,230,230,0.6);font-weight:bold;z-index:4;line-height:1;border-radius:5px;border-radius:var(--tooltipRadius, 5px)\n}\n.attachments .small{max-height:100px\n}\n.attachments video{max-height:500px;height:100%;width:100%;z-index:0\n}\n.attachments audio{width:100%\n}\n.attachments img.media-upload{line-height:0;max-height:300px;max-width:100%\n}\n.attachments .oembed{line-height:1.2em;-ms-flex:1 0 100%;flex:1 0 100%;width:100%;margin-right:15px;display:-ms-flexbox;display:flex\n}\n.attachments .oembed img{width:100%\n}\n.attachments .oembed .image{-ms-flex:1;flex:1\n}\n.attachments .oembed .image img{border:0px;border-radius:5px;height:100%;object-fit:cover\n}\n.attachments .oembed .text{-ms-flex:2;flex:2;margin:8px;word-break:break-all\n}\n.attachments .oembed .text h1{font-size:14px;margin:0px\n}\n.attachments .image-attachment{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1\n}\n.attachments .image-attachment .still-image{width:100%;height:100%\n}\n.attachments .image-attachment .small img{max-height:100px\n}\n.attachments .image-attachment img{object-fit:contain;width:100%;height:100%;max-height:500px;image-orientation:from-image\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/attachment/attachment.vue","\n.fav-active{cursor:pointer;animation-duration:0.6s\n}\n.fav-active:hover{color:orange;color:var(--cOrange, orange)\n}\n.favorite-button.icon-star{color:orange;color:var(--cOrange, orange)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/favorite_button/favorite_button.vue","\n.rt-active{cursor:pointer;animation-duration:0.6s\n}\n.rt-active:hover{color:#0fa00f;color:var(--cGreen, #0fa00f)\n}\n.icon-retweet.retweeted{color:#0fa00f;color:var(--cGreen, #0fa00f)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/retweet_button/retweet_button.vue","\n.icon-cancel,.delete-status{cursor:pointer\n}\n.icon-cancel:hover,.delete-status:hover{color:var(--cRed, red);color:red\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/delete_button/delete_button.vue","\n.user-finder-container{height:29px;max-width:100%\n}\n.user-finder-input{max-width:80%;vertical-align:middle\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_finder/user_finder.vue","\n.who-to-follow *{vertical-align:middle\n}\n.who-to-follow img{width:32px;height:32px\n}\n.who-to-follow p{line-height:40px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/who_to_follow_panel/who_to_follow_panel.vue","\n.floating-chat{position:fixed;right:0px;bottom:0px;z-index:1000\n}\n.chat-heading{cursor:pointer\n}\n.chat-heading .icon-comment-empty{color:#b9b9ba;color:var(--fg, #b9b9ba)\n}\n.chat-window{width:345px;max-height:40vh;overflow-y:auto;overflow-x:hidden\n}\n.chat-message{display:-ms-flexbox;display:flex;padding:0.2em 0.5em\n}\n.chat-avatar img{height:24px;width:24px;border-radius:4px;border-radius:var(--avatarRadius, 4px);margin-right:0.5em;margin-top:0.25em\n}\n.chat-input{display:-ms-flexbox;display:flex\n}\n.chat-input textarea{-ms-flex:1;flex:1;margin:0.6em;min-height:3.5em;resize:none\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/chat_panel/chat_panel.vue","\n.timeline .timeline-heading{position:relative;display:-ms-flexbox;display:flex\n}\n.timeline .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:70%\n}\n.timeline .loadmore-button{position:absolute;right:0.6em;font-size:14px;min-width:6em;height:1.8em;line-height:100%\n}\n.timeline .loadmore-text{position:absolute;right:0.6em;font-size:14px;min-width:6em;font-family:sans-serif;text-align:center;padding:0 0.5em 0 0.5em;opacity:0.8;background-color:transparent;color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5))\n}\n.timeline .loadmore-error{position:absolute;right:0.6em;font-size:14px;min-width:6em;font-family:sans-serif;text-align:center;padding:0 0.25em 0 0.25em;margin:0;color:#b9b9ba;color:var(--fg, #b9b9ba)\n}\n.new-status-notification{position:relative;margin-top:-1px;font-size:1.1em;border-width:1px 0 0 0;border-style:solid;border-color:var(--border, #222);padding:10px;z-index:1;background-color:#182230;background-color:var(--btn, #182230)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/timeline/timeline.vue","\n.spacer{height:1em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/status_or_conversation/status_or_conversation.vue","\n.name-and-screen-name{margin-left:0.7em;margin-top:0.0em;text-align:left;width:100%\n}\n.follows-you{margin-left:2em;float:right\n}\n.card{display:-ms-flexbox;display:flex;-ms-flex:1 0;flex:1 0;padding-top:0.6em;padding-right:1em;padding-bottom:0.6em;padding-left:1em;border-bottom:1px solid;margin:0;border-bottom-color:#222;border-bottom-color:var(--border, #222)\n}\n.card .avatar{margin-top:0.2em;width:32px;height:32px;border-radius:10px;border-radius:var(--avatarAltRadius, 10px)\n}\n.usercard{width:-webkit-fill-available;width:-moz-available;width:fill-available;margin:0.2em 0 0.7em 0;border-radius:10px;border-radius:var(--panelRadius, 10px);border-style:solid;border-color:#222;border-color:var(--border, #222);border-width:1px;overflow:hidden\n}\n.usercard .panel-heading{background:transparent\n}\n.usercard p{margin-bottom:0\n}\n.approval button{width:100%;margin-bottom:0.5em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_card/user_card.vue","\n.user-profile{-ms-flex:2;flex:2;-ms-flex-preferred-size:500px;flex-basis:500px;padding-bottom:10px\n}\n.user-profile .panel-heading{background:transparent\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_profile/user_profile.vue","\n.setting-item{border-bottom:2px solid var(--btn, #182230);margin:1em 1em 1.4em;padding-bottom:1.4em\n}\n.setting-item textarea{width:100%;height:100px\n}\n.setting-item .old-avatar{width:128px;border-radius:4px;border-radius:var(--avatarRadius, 4px)\n}\n.setting-item .new-avatar{object-fit:cover;width:128px;height:128px;border-radius:4px;border-radius:var(--avatarRadius, 4px)\n}\n.setting-item .btn{margin-top:1em;min-height:28px;width:10em\n}\n.setting-list{list-style-type:none\n}\n.setting-list li{margin-bottom:0.5em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/settings/settings.vue","\n.style-switcher{margin-right:1em\n}\n.radius-container,.color-container{display:-ms-flexbox;display:flex\n}\n.radius-container p,.color-container p{margin-top:2em;margin-bottom:.5em\n}\n.radius-container{-ms-flex-direction:column;flex-direction:column\n}\n.color-container{-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between\n}\n.radius-item,.color-item{min-width:20em;display:-ms-flexbox;display:flex;-ms-flex:1 1 0px;flex:1 1 0;-ms-flex-align:baseline;align-items:baseline;margin:5px 6px 5px 0\n}\n.radius-item label,.color-item label{color:var(--faint, rgba(185,185,186,0.5))\n}\n.radius-item{-ms-flex-preferred-size:auto;flex-basis:auto\n}\n.theme-radius-rn,.theme-color-cl{border:0;box-shadow:none;background:transparent;color:var(--faint, rgba(185,185,186,0.5));-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch\n}\n.theme-color-cl,.theme-radius-in,.theme-color-in{margin-left:4px\n}\n.theme-color-in{min-width:4em\n}\n.theme-radius-in{min-width:1em\n}\n.theme-radius-in,.theme-color-in{max-width:7em;-ms-flex:1;flex:1\n}\n.theme-radius-lb,.theme-color-lb{-ms-flex:2;flex:2;min-width:7em\n}\n.theme-radius-lb{max-width:50em\n}\n.theme-color-lb{max-width:10em\n}\n.theme-color-cl{padding:1px;max-width:8em;height:100%;-ms-flex:0;flex:0;min-width:2em;cursor:pointer\n}\n.theme-preview-content{padding:20px\n}\n.dummy .avatar{background:linear-gradient(135deg, #b8e1fc 0%, #a9d2f3 10%, #90bae4 25%, #90bcea 37%, #90bff0 50%, #6ba8e5 51%, #a2daf5 83%, #bdf3fd 100%);color:black;text-align:center;height:48px;line-height:48px;width:48px;float:left;margin-right:1em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/style_switcher/style_switcher.vue","\n.registration-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:0.6em\n}\n.registration-form .container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row\n}\n.registration-form .terms-of-service{-ms-flex:0 1 50%;flex:0 1 50%;margin:0.8em\n}\n.registration-form .text-fields{margin-top:0.6em;-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column\n}\n.registration-form .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0.3em 0.0em 0.3em;line-height:24px\n}\n.registration-form form textarea{line-height:16px;resize:vertical\n}\n.registration-form .captcha{max-width:350px;margin-bottom:0.4em\n}\n.registration-form .btn{margin-top:0.6em;height:28px\n}\n.registration-form .error{text-align:center\n}\n@media all and (max-width: 959px){\n.registration-form .container{-ms-flex-direction:column-reverse;flex-direction:column-reverse\n}\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/registration/registration.vue","\n.profile-edit .bio{margin:0\n}\n.profile-edit input[type=file]{padding:5px;height:auto\n}\n.profile-edit .banner{max-width:400px\n}\n.profile-edit .uploading{font-size:1.5em;margin:0.25em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_settings/user_settings.vue"],"sourceRoot":""}
\ No newline at end of file
diff --git a/priv/static/static/css/app.5d0189b6f119febde070b703869bbd06.css b/priv/static/static/css/app.5d0189b6f119febde070b703869bbd06.css
deleted file mode 100644
index 9df919fca..000000000
Binary files a/priv/static/static/css/app.5d0189b6f119febde070b703869bbd06.css and /dev/null differ
diff --git a/priv/static/static/css/app.5d0189b6f119febde070b703869bbd06.css.map b/priv/static/static/css/app.5d0189b6f119febde070b703869bbd06.css.map
deleted file mode 100644
index 35cbec774..000000000
--- a/priv/static/static/css/app.5d0189b6f119febde070b703869bbd06.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["webpack:///webpack:///src/App.scss","webpack:///webpack:///src/components/user_panel/user_panel.vue","webpack:///webpack:///src/components/login_form/login_form.vue","webpack:///webpack:///src/components/post_status_form/post_status_form.vue","webpack:///webpack:///src/components/media_upload/media_upload.vue","webpack:///webpack:///src/components/user_card_content/user_card_content.vue","webpack:///webpack:///src/components/still-image/still-image.vue","webpack:///webpack:///src/components/nav_panel/nav_panel.vue","webpack:///webpack:///src/components/notifications/notifications.scss","webpack:///webpack:///src/components/status/status.vue","webpack:///webpack:///src/components/attachment/attachment.vue","webpack:///webpack:///src/components/favorite_button/favorite_button.vue","webpack:///webpack:///src/components/retweet_button/retweet_button.vue","webpack:///webpack:///src/components/delete_button/delete_button.vue","webpack:///webpack:///src/components/user_finder/user_finder.vue","webpack:///webpack:///src/components/who_to_follow_panel/who_to_follow_panel.vue","webpack:///webpack:///src/components/chat_panel/chat_panel.vue","webpack:///webpack:///src/components/timeline/timeline.vue","webpack:///webpack:///src/components/status_or_conversation/status_or_conversation.vue","webpack:///webpack:///src/components/user_card/user_card.vue","webpack:///webpack:///src/components/user_profile/user_profile.vue","webpack:///webpack:///src/components/settings/settings.vue","webpack:///webpack:///src/components/style_switcher/style_switcher.vue","webpack:///webpack:///src/components/registration/registration.vue","webpack:///webpack:///src/components/user_settings/user_settings.vue"],"names":[],"mappings":"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","file":"static/css/app.5d0189b6f119febde070b703869bbd06.css","sourcesContent":["\n#app{background-size:cover;background-attachment:fixed;background-repeat:no-repeat;background-position:0 50px;min-height:100vh;max-width:100%;overflow:hidden\n}\ni{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none\n}\nh4{margin:0\n}\n#content{box-sizing:border-box;padding-top:60px;margin:auto;min-height:100vh;max-width:980px;background-color:rgba(0,0,0,0.15);-ms-flex-line-pack:start;align-content:flex-start\n}\n.text-center{text-align:center\n}\nbody{font-family:sans-serif;font-size:14px;margin:0;color:#b9b9ba;color:var(--fg, #b9b9ba);max-width:100vw;overflow-x:hidden\n}\na{text-decoration:none;color:#d8a070;color:var(--link, #d8a070)\n}\nbutton{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#b9b9ba;color:var(--fg, #b9b9ba);background-color:#182230;background-color:var(--btn, #182230);border:none;border-radius:4px;border-radius:var(--btnRadius, 4px);cursor:pointer;border-top:1px solid rgba(255,255,255,0.2);border-bottom:1px solid rgba(0,0,0,0.2);box-shadow:0px 0px 2px black;font-size:14px;font-family:sans-serif\n}\nbutton:hover{box-shadow:0px 0px 4px rgba(255,255,255,0.3)\n}\nbutton:disabled{cursor:not-allowed;opacity:0.5\n}\nbutton.pressed{color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5));background-color:#121a24;background-color:var(--bg, #121a24)\n}\nlabel.select{padding:0\n}\ninput,textarea,.select{border:none;border-radius:4px;border-radius:var(--inputRadius, 4px);border-bottom:1px solid rgba(255,255,255,0.2);border-top:1px solid rgba(0,0,0,0.2);box-shadow:0px 0px 2px black inset;background-color:#182230;background-color:var(--input, #182230);color:#b9b9ba;color:var(--lightFg, #b9b9ba);font-family:sans-serif;font-size:14px;padding:8px 7px;box-sizing:border-box;display:inline-block;position:relative;height:29px;line-height:16px\n}\ninput .icon-down-open,textarea .icon-down-open,.select .icon-down-open{position:absolute;top:0;bottom:0;right:5px;height:100%;color:#b9b9ba;color:var(--fg, #b9b9ba);line-height:29px;z-index:0;pointer-events:none\n}\ninput select,textarea select,.select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:none;margin:0;color:#b9b9ba;color:var(--fg, #b9b9ba);padding:4px 2em 3px 3px;width:100%;z-index:1;height:29px;line-height:16px\n}\ninput[type=radio],input[type=checkbox],textarea[type=radio],textarea[type=checkbox],.select[type=radio],.select[type=checkbox]{display:none\n}\ninput[type=radio]:checked+label::before,input[type=checkbox]:checked+label::before,textarea[type=radio]:checked+label::before,textarea[type=checkbox]:checked+label::before,.select[type=radio]:checked+label::before,.select[type=checkbox]:checked+label::before{color:#b9b9ba;color:var(--fg, #b9b9ba)\n}\ninput[type=radio]+label::before,input[type=checkbox]+label::before,textarea[type=radio]+label::before,textarea[type=checkbox]+label::before,.select[type=radio]+label::before,.select[type=checkbox]+label::before{display:inline-block;content:'✔';transition:color 200ms;width:1.1em;height:1.1em;border-radius:2px;border-radius:var(--checkBoxRadius, 2px);border-bottom:1px solid rgba(255,255,255,0.2);border-top:1px solid rgba(0,0,0,0.2);box-shadow:0px 0px 2px black inset;margin-right:.5em;background-color:#182230;background-color:var(--input, #182230);vertical-align:top;text-align:center;line-height:1.1em;font-size:1.1em;box-sizing:border-box;color:transparent;overflow:hidden;box-sizing:border-box\n}\ni[class*=icon-]{color:#666;color:var(--icon, #666)\n}\n.container{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0 10px 0 10px\n}\n.gaps{margin:-1em 0 0 -1em\n}\n.item{-ms-flex:1;flex:1;line-height:50px;height:50px;overflow:hidden\n}\n.item .nav-icon{font-size:1.1em;margin-left:0.4em\n}\n.gaps>.item{padding:1em 0 0 1em\n}\n.auto-size{-ms-flex:1;flex:1\n}\nnav{width:100%;-ms-flex-align:center;align-items:center;position:fixed;height:50px\n}\nnav .inner-nav{padding-left:20px;padding-right:20px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-preferred-size:970px;flex-basis:970px;margin:auto;height:50px;background-repeat:no-repeat;background-position:center;background-size:auto 80%\n}\nnav .inner-nav a i{color:#d8a070;color:var(--link, #d8a070)\n}\nmain-router{-ms-flex:1;flex:1\n}\n.status.compact{color:rgba(0,0,0,0.42);font-weight:300\n}\n.status.compact p{margin:0;font-size:0.8em\n}\n.panel{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:0.5em;background-color:#121a24;background-color:var(--bg, #121a24);border-radius:10px;border-radius:var(--panelRadius, 10px);box-shadow:1px 1px 4px rgba(0,0,0,0.6)\n}\n.panel-body:empty::before{content:\"¯\\\\_(ツ)_/¯\";display:block;margin:1em;text-align:center\n}\n.panel-heading{border-radius:10px 10px 0 0;border-radius:var(--panelRadius, 10px) var(--panelRadius, 10px) 0 0;background-size:cover;padding:0.6em 1.0em;text-align:left;font-size:1.3em;line-height:24px;background-color:#182230;background-color:var(--btn, #182230)\n}\n.panel-heading.stub{border-radius:10px;border-radius:var(--panelRadius, 10px)\n}\n.panel-footer{border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius, 10px) var(--panelRadius, 10px)\n}\n.panel-body>p{line-height:18px;padding:1em;margin:0\n}\n.container>*{min-width:0px\n}\n.fa{color:grey\n}\nnav{z-index:1000;background-color:#182230;background-color:var(--btn, #182230);color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5));box-shadow:0px 0px 4px rgba(0,0,0,0.6)\n}\n.fade-enter-active,.fade-leave-active{transition:opacity .2s\n}\n.fade-enter,.fade-leave-active{opacity:0\n}\n.main{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1\n}\n.sidebar-bounds{-ms-flex:0;flex:0;-ms-flex-preferred-size:35%;flex-basis:35%\n}\n.sidebar-flexer{-ms-flex:1;flex:1;-ms-flex-preferred-size:345px;flex-basis:345px;width:365px\n}\n.mobile-shown{display:none\n}\n.panel-switcher{display:none;width:100%;height:46px\n}\n.panel-switcher button{display:block;-ms-flex:1;flex:1;max-height:32px;margin:0.5em;padding:0.5em\n}\n@media all and (min-width: 960px){\nbody{overflow-y:scroll\n}\n.sidebar-bounds{overflow:hidden;max-height:100vh;width:345px;position:fixed;margin-top:-10px\n}\n.sidebar-bounds .sidebar-scroller{height:96vh;width:365px;padding-top:10px;padding-right:50px;overflow-x:hidden;overflow-y:scroll\n}\n.sidebar-bounds .sidebar{width:345px\n}\n.sidebar-flexer{max-height:96vh;-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0\n}\n}\n.alert{margin:0.35em;padding:0.25em;border-radius:5px;border-radius:var(--tooltipRadius, 5px);color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5));min-height:28px;line-height:28px\n}\n.alert.error{background-color:rgba(211,16,20,0.5);background-color:var(--cAlertRed, rgba(211,16,20,0.5))\n}\n.faint{color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5))\n}\n@media all and (max-width: 959px){\n.mobile-hidden{display:none\n}\n.panel-switcher{display:-ms-flexbox;display:flex\n}\n.container{padding:0 0 0 0\n}\n.panel{margin:0.5em 0 0.5em 0\n}\n}\n.item.right{text-align:right;padding-right:20px\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/App.scss","\n.user-panel .profile-panel-background .panel-heading{background:transparent\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_panel/user_panel.vue","\n.login-form .btn{min-height:28px;width:10em\n}\n.login-form .error{text-align:center\n}\n.login-form .register{-ms-flex:1 1;flex:1 1\n}\n.login-form .login-bottom{margin-top:1.0em;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/login_form/login_form.vue","\n.tribute-container ul{padding:0px\n}\n.tribute-container ul li{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center\n}\n.tribute-container img{padding:3px;width:16px;height:16px;border-radius:10px;border-radius:var(--avatarAltRadius, 10px)\n}\n.post-status-form .visibility-tray{font-size:1.2em;padding:3px;cursor:pointer\n}\n.post-status-form .visibility-tray .selected{color:#b9b9ba;color:var(--lightFg, #b9b9ba)\n}\n.post-status-form .form-bottom,.login .form-bottom{display:-ms-flexbox;display:flex;padding:0.5em;height:32px\n}\n.post-status-form .form-bottom button,.login .form-bottom button{width:10em\n}\n.post-status-form .form-bottom p,.login .form-bottom p{margin:0.35em;padding:0.35em;display:-ms-flexbox;display:flex\n}\n.post-status-form .error,.login .error{text-align:center\n}\n.post-status-form .attachments,.login .attachments{padding:0 0.5em\n}\n.post-status-form .attachments .attachment,.login .attachments .attachment{position:relative;border:1px solid #222;border:1px solid var(--border, #222);margin:0.5em 0.8em 0.2em 0\n}\n.post-status-form .attachments i,.login .attachments i{position:absolute;margin:10px;padding:5px;background:rgba(230,230,230,0.6);border-radius:10px;border-radius:var(--attachmentRadius, 10px);font-weight:bold\n}\n.post-status-form .btn,.login .btn{cursor:pointer\n}\n.post-status-form .btn[disabled],.login .btn[disabled]{cursor:not-allowed\n}\n.post-status-form form,.login form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0.6em\n}\n.post-status-form .form-group,.login .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0.3em 0.5em 0.6em;line-height:24px\n}\n.post-status-form form textarea.form-cw,.login form textarea.form-cw{line-height:16px;resize:none;overflow:hidden;transition:min-height 200ms 100ms;min-height:1px\n}\n.post-status-form form textarea.form-control,.login form textarea.form-control{line-height:16px;resize:none;overflow:hidden;transition:min-height 200ms 100ms;min-height:1px;box-sizing:content-box\n}\n.post-status-form form textarea.form-control:focus,.login form textarea.form-control:focus{min-height:48px\n}\n.post-status-form .btn,.login .btn{cursor:pointer\n}\n.post-status-form .btn[disabled],.login .btn[disabled]{cursor:not-allowed\n}\n.post-status-form .icon-cancel,.login .icon-cancel{cursor:pointer;z-index:4\n}\n.post-status-form .autocomplete-panel,.login .autocomplete-panel{margin:0 0.5em 0 0.5em;border-radius:5px;border-radius:var(--tooltipRadius, 5px);position:absolute;z-index:1;box-shadow:1px 2px 4px rgba(0,0,0,0.5);min-width:75%;background:#121a24;background:var(--bg, #121a24);color:#b9b9ba;color:var(--lightFg, #b9b9ba)\n}\n.post-status-form .autocomplete,.login .autocomplete{cursor:pointer;padding:0.2em 0.4em 0.2em 0.4em;border-bottom:1px solid rgba(0,0,0,0.4);display:-ms-flexbox;display:flex\n}\n.post-status-form .autocomplete img,.login .autocomplete img{width:24px;height:24px;border-radius:4px;border-radius:var(--avatarRadius, 4px);object-fit:contain\n}\n.post-status-form .autocomplete span,.login .autocomplete span{line-height:24px;margin:0 0.1em 0 0.2em\n}\n.post-status-form .autocomplete small,.login .autocomplete small{margin-left:.5em;color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5))\n}\n.post-status-form .autocomplete.highlighted,.login .autocomplete.highlighted{background-color:#182230;background-color:var(--btn, #182230)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/post_status_form/post_status_form.vue","\n.media-upload {\n font-size: 26px;\n -ms-flex: 1;\n flex: 1;\n}\n.icon-upload {\n cursor: pointer;\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/media_upload/media_upload.vue","\n.profile-panel-background{background-size:cover;border-radius:10px;border-radius:var(--panelRadius, 10px)\n}\n.profile-panel-background .panel-heading{padding:0.6em 0em;text-align:center\n}\n.profile-panel-body{word-wrap:break-word;background:linear-gradient(to bottom, transparent, #121a24 80%);background:linear-gradient(to bottom, transparent, var(--bg, #121a24) 80%)\n}\n.user-info{color:#b9b9ba;color:var(--lightFg, #b9b9ba);padding:0 16px\n}\n.user-info .container{padding:16px 10px 6px 10px;display:-ms-flexbox;display:flex;max-height:56px;overflow:hidden\n}\n.user-info .container .avatar{border-radius:4px;border-radius:var(--avatarRadius, 4px);-ms-flex:1 0 100%;flex:1 0 100%;width:56px;height:56px;box-shadow:0px 1px 8px rgba(0,0,0,0.75);object-fit:cover\n}\n.user-info .container .avatar.animated::before{display:none\n}\n.user-info:hover .animated.avatar canvas{display:none\n}\n.user-info:hover .animated.avatar img{visibility:visible\n}\n.user-info .usersettings{color:#b9b9ba;color:var(--lightFg, #b9b9ba);opacity:.8\n}\n.user-info .name-and-screen-name{display:block;margin-left:0.6em;text-align:left;text-overflow:ellipsis;white-space:nowrap;-ms-flex:1 1 0px;flex:1 1 0\n}\n.user-info .user-name{text-overflow:ellipsis;overflow:hidden\n}\n.user-info .user-screen-name{color:#b9b9ba;color:var(--lightFg, #b9b9ba);display:inline-block;font-weight:light;font-size:15px;padding-right:0.1em\n}\n.user-info .user-interactions{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-pack:justify;justify-content:space-between\n}\n.user-info .user-interactions div{-ms-flex:1;flex:1\n}\n.user-info .user-interactions .following{font-size:14px;-ms-flex:0 0 100%;flex:0 0 100%;margin:0 0 .4em 0;padding-left:16px;text-align:left\n}\n.user-info .user-interactions .mute{max-width:220px;min-height:28px\n}\n.user-info .user-interactions .remote-follow{max-width:220px;min-height:28px\n}\n.user-info .user-interactions .follow{max-width:220px;min-height:28px\n}\n.user-info .user-interactions button{width:92%;height:100%\n}\n.user-info .user-interactions .remote-button{height:28px !important;width:92%\n}\n.user-info .user-interactions .pressed{border-bottom-color:rgba(255,255,255,0.2);border-top-color:rgba(0,0,0,0.2)\n}\n.user-counts{display:-ms-flexbox;display:flex;line-height:16px;padding:.5em 1.5em 0em 1.5em;text-align:center;-ms-flex-pack:justify;justify-content:space-between;color:#b9b9ba;color:var(--lightFg, #b9b9ba)\n}\n.user-counts.clickable .user-count{cursor:pointer\n}\n.user-counts.clickable .user-count:hover:not(.selected){transition:border-bottom 100ms;border-bottom:3px solid #d8a070;border-bottom:3px solid var(--link, #d8a070)\n}\n.user-count{-ms-flex:1;flex:1;padding:.5em 0 .5em 0;margin:0 .5em\n}\n.user-count.selected{transition:none;border-bottom:5px solid #d8a070;border-bottom:5px solid var(--link, #d8a070);border-radius:4px;border-radius:var(--btnRadius, 4px)\n}\n.user-count h5{font-size:1em;font-weight:bolder;margin:0 0 0.25em\n}\n.user-count a{text-decoration:none\n}\n.dailyAvg{margin-left:1em;font-size:0.7em;color:#CCC\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_card_content/user_card_content.vue","\n.still-image{position:relative;line-height:0;overflow:hidden;width:100%;height:100%\n}\n.still-image:hover canvas{display:none\n}\n.still-image img{width:100%;height:100%\n}\n.still-image.animated:hover::before,.still-image.animated img{visibility:hidden\n}\n.still-image.animated:hover img{visibility:visible\n}\n.still-image.animated::before{content:'gif';position:absolute;line-height:10px;font-size:10px;top:5px;left:5px;background:rgba(127,127,127,0.5);color:#FFF;display:block;padding:2px 4px;border-radius:5px;border-radius:var(--tooltipRadius, 5px);z-index:2\n}\n.still-image canvas{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/still-image/still-image.vue","\n.nav-panel .panel{overflow:hidden\n}\n.nav-panel ul{list-style:none;margin:0;padding:0\n}\n.nav-panel li{border-bottom:1px solid;border-color:#222;border-color:var(--border, #222);padding:0\n}\n.nav-panel li:first-child a{border-top-right-radius:10px;border-top-right-radius:var(--panelRadius, 10px);border-top-left-radius:10px;border-top-left-radius:var(--panelRadius, 10px)\n}\n.nav-panel li:last-child a{border-bottom-right-radius:10px;border-bottom-right-radius:var(--panelRadius, 10px);border-bottom-left-radius:10px;border-bottom-left-radius:var(--panelRadius, 10px)\n}\n.nav-panel li:last-child{border:none\n}\n.nav-panel a{display:block;padding:0.8em 0.85em\n}\n.nav-panel a:hover{background-color:#151e2a;background-color:var(--lightBg, #151e2a)\n}\n.nav-panel a.router-link-active{font-weight:bolder;background-color:#151e2a;background-color:var(--lightBg, #151e2a)\n}\n.nav-panel a.router-link-active:hover{text-decoration:underline\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/nav_panel/nav_panel.vue","\n.notifications{padding-bottom:15em\n}\n.notifications .panel{background:#121a24;background:var(--bg, #121a24)\n}\n.notifications .panel-body{border-color:#222;border-color:var(--border, #222)\n}\n.notifications .panel-heading{position:relative;background:#182230;background:var(--btn, #182230);color:#b9b9ba;color:var(--fg, #b9b9ba)\n}\n.notifications .panel-heading .read-button{position:absolute;right:0.7em;height:1.8em;line-height:100%\n}\n.notifications .unseen-count{display:inline-block;background-color:red;background-color:var(--cRed, red);text-shadow:0px 0px 3px rgba(0,0,0,0.5);min-width:1.3em;border-radius:1.3em;margin:0 0.2em 0 -0.4em;color:white;font-size:0.9em;text-align:center;line-height:1.3em\n}\n.notifications .unseen{border-left:4px solid red;border-left:4px solid var(--cRed, red);padding-left:0\n}\n.notification{box-sizing:border-box;display:-ms-flexbox;display:flex;border-bottom:1px solid;border-bottom-color:inherit;padding-left:4px\n}\n.notification .avatar-compact{width:32px;height:32px;border-radius:10px;border-radius:var(--avatarAltRadius, 10px);overflow:hidden;line-height:0\n}\n.notification .avatar-compact.animated::before{display:none\n}\n.notification:hover .animated.avatar canvas{display:none\n}\n.notification:hover .animated.avatar img{visibility:visible\n}\n.notification .notification-usercard{margin:0\n}\n.notification .non-mention{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:0.6em;min-width:0\n}\n.notification .non-mention .avatar-container{width:32px;height:32px\n}\n.notification .non-mention .status-el{padding:0\n}\n.notification .non-mention .status-el .status{padding:0.25em 0;color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5))\n}\n.notification .non-mention .status-el .media-body{margin:0\n}\n.notification .follow-text{padding:0.5em 0\n}\n.notification .status-el{-ms-flex:1;flex:1\n}\n.notification time{white-space:nowrap\n}\n.notification .notification-right{-ms-flex:1;flex:1;padding-left:0.8em;min-width:0\n}\n.notification .notification-details{min-width:0px;word-wrap:break-word;line-height:18px;position:relative;overflow:hidden;width:100%;-ms-flex:1 1 0px;flex:1 1 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap\n}\n.notification .notification-details .name-and-action{-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis\n}\n.notification .notification-details .username{font-weight:bolder;max-width:100%;text-overflow:ellipsis;white-space:nowrap\n}\n.notification .notification-details .timeago{float:right;font-size:12px\n}\n.notification .notification-details .icon-retweet.lit{color:#0fa00f;color:var(--cGreen, #0fa00f)\n}\n.notification .notification-details .icon-user-plus.lit{color:#0095ff;color:var(--cBlue, #0095ff)\n}\n.notification .notification-details .icon-reply.lit{color:#0095ff;color:var(--cBlue, #0095ff)\n}\n.notification .notification-details .icon-star.lit{color:orange;color:orange;color:var(--cOrange, orange)\n}\n.notification .notification-details .status-content{margin:0;max-height:300px\n}\n.notification .notification-details h1{word-break:break-all;margin:0 0 0.3em;padding:0;font-size:1em;line-height:20px\n}\n.notification .notification-details h1 small{font-weight:lighter\n}\n.notification .notification-details p{margin:0;margin-top:0;margin-bottom:0.3em\n}\n.notification:last-child{border-bottom:none;border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius, 10px) var(--panelRadius, 10px)\n}\n.notification:last-child .status-el{border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius, 10px) var(--panelRadius, 10px)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/notifications/notifications.scss","\n.status-body{-ms-flex:1;flex:1;min-width:0\n}\n.status-preview.status-el{border-style:solid;border-width:1px;border-color:#222;border-color:var(--border, #222)\n}\n.status-preview-container{position:relative;max-width:100%\n}\n.status-preview{position:absolute;max-width:95%;display:-ms-flexbox;display:flex;background-color:#121a24;background-color:var(--bg, #121a24);border-color:#222;border-color:var(--border, #222);border-style:solid;border-width:1px;border-radius:5px;border-radius:var(--tooltipRadius, 5px);box-shadow:2px 2px 3px rgba(0,0,0,0.5);margin-top:0.25em;margin-left:0.5em;z-index:50\n}\n.status-preview .status{-ms-flex:1;flex:1;border:0;min-width:15em\n}\n.status-preview-loading{display:block;min-width:15em;padding:1em;text-align:center;border-width:1px;border-style:solid\n}\n.status-preview-loading i{font-size:2em\n}\n.status-el{-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;border-left-width:0px;line-height:18px;min-width:0;border-color:#222;border-color:var(--border, #222);border-left:4px red;border-left:4px var(--cRed, red)\n}\n.status-el_focused{background-color:#151e2a;background-color:var(--lightBg, #151e2a)\n}\n.timeline .status-el{border-bottom-width:1px;border-bottom-style:solid\n}\n.status-el .media-body{-ms-flex:1;flex:1;padding:0;margin:0 0 0.25em 0.8em\n}\n.status-el .usercard{margin-bottom:.7em\n}\n.status-el .media-heading{-ms-flex-wrap:nowrap;flex-wrap:nowrap\n}\n.status-el .media-heading-left{padding:0;vertical-align:bottom;-ms-flex-preferred-size:100%;flex-basis:100%\n}\n.status-el .media-heading-left small{font-weight:lighter\n}\n.status-el .media-heading-left h4{white-space:nowrap;font-size:14px;margin-right:0.25em;overflow:hidden;text-overflow:ellipsis\n}\n.status-el .media-heading-left .name-and-links{padding:0;-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:center;align-content:center\n}\n.status-el .media-heading-left .links{display:-ms-flexbox;display:flex;padding-top:1px;margin-left:0.2em;font-size:12px;color:#d8a070;color:var(--link, #d8a070);max-width:100%\n}\n.status-el .media-heading-left .links a{max-width:100%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap\n}\n.status-el .media-heading-left .reply-info{display:-ms-flexbox;display:flex\n}\n.status-el .media-heading-left .replies{line-height:16px\n}\n.status-el .media-heading-left .reply-link{margin-right:0.2em\n}\n.status-el .media-heading-right{-ms-flex-negative:0;flex-shrink:0;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:1.5em;margin-left:0.25em\n}\n.status-el .media-heading-right .timeago{margin-right:0.2em;font-size:12px;padding-top:1px\n}\n.status-el .media-heading-right i{margin-left:0.2em\n}\n.status-el a{display:inline-block;word-break:break-all\n}\n.status-el .tall-status{position:relative;height:220px;overflow-x:hidden;overflow-y:hidden\n}\n.status-el .tall-status-hider{position:absolute;height:70px;margin-top:150px;width:100%;text-align:center;line-height:110px;background:linear-gradient(to bottom, transparent, #121a24 80%);background:linear-gradient(to bottom, transparent, var(--bg, #121a24) 80%)\n}\n.status-el .tall-status-hider_focused{background:linear-gradient(to bottom, transparent, #151e2a 80%);background:linear-gradient(to bottom, transparent, var(--lightBg, #151e2a) 80%)\n}\n.status-el .tall-status-unhider{width:100%;text-align:center\n}\n.status-el .status-content{margin-right:0.5em\n}\n.status-el .status-content img,.status-el .status-content video{max-width:100%;max-height:400px;vertical-align:middle;object-fit:contain\n}\n.status-el .status-content blockquote{margin:0.2em 0 0.2em 2em;font-style:italic\n}\n.status-el .status-content p{margin:0;margin-top:0.2em;margin-bottom:0.5em\n}\n.status-el .retweet-info{padding:0.4em 0.6em 0 0.6em;margin:0 0 -0.5em 0\n}\n.status-el .retweet-info .avatar{border-radius:10px;border-radius:var(--avatarAltRadius, 10px);margin-left:28px;width:20px;height:20px\n}\n.status-el .retweet-info .media-body{font-size:1em;line-height:22px;display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap\n}\n.status-el .retweet-info .media-body i{padding:0 0.2em\n}\n.status-el .retweet-info .media-body a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\n}\n.status-fadein{animation-duration:0.4s;animation-name:fadein\n}\n@keyframes fadein{\nfrom{opacity:0\n}\nto{opacity:1\n}\n}\n.greentext{color:green\n}\n.status-conversation{border-left-style:solid\n}\n.status-actions{width:100%;display:-ms-flexbox;display:flex\n}\n.status-actions div,.status-actions favorite-button{padding-top:0.25em;max-width:6em;-ms-flex:1;flex:1\n}\n.icon-reply:hover{color:#0095ff;color:var(--cBlue, #0095ff)\n}\n.icon-reply.icon-reply-active{color:#0095ff;color:var(--cBlue, #0095ff)\n}\n.status .avatar-compact{width:32px;height:32px;border-radius:10px;border-radius:var(--avatarAltRadius, 10px)\n}\n.avatar{width:48px;height:48px;border-radius:4px;border-radius:var(--avatarRadius, 4px);overflow:hidden;position:relative\n}\n.avatar img{width:100%;height:100%\n}\n.avatar.animated::before{display:none\n}\n.status:hover .animated.avatar canvas{display:none\n}\n.status:hover .animated.avatar img{visibility:visible\n}\n.status{display:-ms-flexbox;display:flex;padding:0.6em\n}\n.status-conversation:last-child{border-bottom:none\n}\n.muted{padding:0.25em 0.5em\n}\n.muted button{margin-left:auto\n}\n.muted .muteWords{margin-left:10px\n}\na.unmute{display:block;margin-left:auto\n}\n.reply-left{-ms-flex:0;flex:0;min-width:48px\n}\n.reply-body{-ms-flex:1;flex:1\n}\n.timeline>.status-el:last-child{border-bottom-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius, 10px) var(--panelRadius, 10px)\n}\n@media all and (max-width: 960px){\n.status-el .retweet-info .avatar{margin-left:20px\n}\n.status{max-width:100%\n}\n.status .avatar{width:40px;height:40px\n}\n.status .avatar-compact{width:32px;height:32px\n}\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/status/status.vue","\n.attachments{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-0.7em\n}\n.attachments .attachment.media-upload-container{-ms-flex:0 0 auto;flex:0 0 auto;max-height:300px;max-width:100%\n}\n.attachments .placeholder{margin-right:0.5em\n}\n.attachments .small-attachment{max-height:100px\n}\n.attachments .small-attachment.image,.attachments .small-attachment.video{max-width:35%\n}\n.attachments .attachment{-ms-flex:1 0 30%;flex:1 0 30%;margin:0.5em 0.7em 0.6em 0.0em;-ms-flex-item-align:start;align-self:flex-start;line-height:0;border-style:solid;border-width:1px;border-radius:10px;border-radius:var(--attachmentRadius, 10px);border-color:#222;border-color:var(--border, #222);overflow:hidden\n}\n.attachments .fullwidth{-ms-flex-preferred-size:100%;flex-basis:100%\n}\n.attachments.video{line-height:0\n}\n.attachments.html{-ms-flex-preferred-size:90%;flex-basis:90%;width:100%;display:-ms-flexbox;display:flex\n}\n.attachments.loading{cursor:progress\n}\n.attachments .hider{position:absolute;margin:10px;padding:5px;background:rgba(230,230,230,0.6);font-weight:bold;z-index:4;line-height:1;border-radius:5px;border-radius:var(--tooltipRadius, 5px)\n}\n.attachments .small{max-height:100px\n}\n.attachments video{max-height:500px;height:100%;width:100%;z-index:0\n}\n.attachments audio{width:100%\n}\n.attachments img.media-upload{line-height:0;max-height:300px;max-width:100%\n}\n.attachments .oembed{line-height:1.2em;-ms-flex:1 0 100%;flex:1 0 100%;width:100%;margin-right:15px;display:-ms-flexbox;display:flex\n}\n.attachments .oembed img{width:100%\n}\n.attachments .oembed .image{-ms-flex:1;flex:1\n}\n.attachments .oembed .image img{border:0px;border-radius:5px;height:100%;object-fit:cover\n}\n.attachments .oembed .text{-ms-flex:2;flex:2;margin:8px;word-break:break-all\n}\n.attachments .oembed .text h1{font-size:14px;margin:0px\n}\n.attachments .image-attachment{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1\n}\n.attachments .image-attachment .still-image{width:100%;height:100%\n}\n.attachments .image-attachment .small img{max-height:100px\n}\n.attachments .image-attachment img{object-fit:contain;width:100%;height:100%;max-height:500px;image-orientation:from-image\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/attachment/attachment.vue","\n.fav-active{cursor:pointer;animation-duration:0.6s\n}\n.fav-active:hover{color:orange;color:var(--cOrange, orange)\n}\n.favorite-button.icon-star{color:orange;color:var(--cOrange, orange)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/favorite_button/favorite_button.vue","\n.rt-active{cursor:pointer;animation-duration:0.6s\n}\n.rt-active:hover{color:#0fa00f;color:var(--cGreen, #0fa00f)\n}\n.icon-retweet.retweeted{color:#0fa00f;color:var(--cGreen, #0fa00f)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/retweet_button/retweet_button.vue","\n.icon-cancel,.delete-status{cursor:pointer\n}\n.icon-cancel:hover,.delete-status:hover{color:var(--cRed, red);color:red\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/delete_button/delete_button.vue","\n.user-finder-container{height:29px;max-width:100%\n}\n.user-finder-input{max-width:80%;vertical-align:middle\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_finder/user_finder.vue","\n.who-to-follow *{vertical-align:middle\n}\n.who-to-follow img{width:32px;height:32px\n}\n.who-to-follow p{line-height:40px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/who_to_follow_panel/who_to_follow_panel.vue","\n.floating-chat{position:fixed;right:0px;bottom:0px;z-index:1000\n}\n.chat-heading{cursor:pointer\n}\n.chat-heading .icon-comment-empty{color:#b9b9ba;color:var(--fg, #b9b9ba)\n}\n.chat-window{width:345px;max-height:40vh;overflow-y:auto;overflow-x:hidden\n}\n.chat-message{display:-ms-flexbox;display:flex;padding:0.2em 0.5em\n}\n.chat-avatar img{height:24px;width:24px;border-radius:4px;border-radius:var(--avatarRadius, 4px);margin-right:0.5em;margin-top:0.25em\n}\n.chat-input{display:-ms-flexbox;display:flex\n}\n.chat-input textarea{-ms-flex:1;flex:1;margin:0.6em;min-height:3.5em;resize:none\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/chat_panel/chat_panel.vue","\n.timeline .timeline-heading{position:relative;display:-ms-flexbox;display:flex\n}\n.timeline .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:70%\n}\n.timeline .loadmore-button{position:absolute;right:0.6em;font-size:14px;min-width:6em;height:1.8em;line-height:100%\n}\n.timeline .loadmore-text{position:absolute;right:0.6em;font-size:14px;min-width:6em;font-family:sans-serif;text-align:center;padding:0 0.5em 0 0.5em;opacity:0.8;background-color:transparent;color:rgba(185,185,186,0.5);color:var(--faint, rgba(185,185,186,0.5))\n}\n.timeline .loadmore-error{position:absolute;right:0.6em;font-size:14px;min-width:6em;font-family:sans-serif;text-align:center;padding:0 0.25em 0 0.25em;margin:0;color:#b9b9ba;color:var(--fg, #b9b9ba)\n}\n.new-status-notification{position:relative;margin-top:-1px;font-size:1.1em;border-width:1px 0 0 0;border-style:solid;border-color:var(--border, #222);padding:10px;z-index:1;background-color:#182230;background-color:var(--btn, #182230)\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/timeline/timeline.vue","\n.spacer{height:1em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/status_or_conversation/status_or_conversation.vue","\n.name-and-screen-name{margin-left:0.7em;margin-top:0.0em;text-align:left;width:100%\n}\n.follows-you{margin-left:2em;float:right\n}\n.card{display:-ms-flexbox;display:flex;-ms-flex:1 0;flex:1 0;padding-top:0.6em;padding-right:1em;padding-bottom:0.6em;padding-left:1em;border-bottom:1px solid;margin:0;border-bottom-color:#222;border-bottom-color:var(--border, #222)\n}\n.card .avatar{margin-top:0.2em;width:32px;height:32px;border-radius:10px;border-radius:var(--avatarAltRadius, 10px)\n}\n.usercard{width:-webkit-fill-available;width:-moz-available;width:fill-available;margin:0.2em 0 0.7em 0;border-radius:10px;border-radius:var(--panelRadius, 10px);border-style:solid;border-color:#222;border-color:var(--border, #222);border-width:1px;overflow:hidden\n}\n.usercard .panel-heading{background:transparent\n}\n.usercard p{margin-bottom:0\n}\n.approval button{width:100%;margin-bottom:0.5em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_card/user_card.vue","\n.user-profile{-ms-flex:2;flex:2;-ms-flex-preferred-size:500px;flex-basis:500px;padding-bottom:10px\n}\n.user-profile .panel-heading{background:transparent\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_profile/user_profile.vue","\n.setting-item{border-bottom:2px solid var(--btn, #182230);margin:1em 1em 1.4em;padding-bottom:1.4em\n}\n.setting-item textarea{width:100%;height:100px\n}\n.setting-item .old-avatar{width:128px;border-radius:4px;border-radius:var(--avatarRadius, 4px)\n}\n.setting-item .new-avatar{object-fit:cover;width:128px;height:128px;border-radius:4px;border-radius:var(--avatarRadius, 4px)\n}\n.setting-item .btn{margin-top:1em;min-height:28px;width:10em\n}\n.setting-list{list-style-type:none\n}\n.setting-list li{margin-bottom:0.5em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/settings/settings.vue","\n.style-switcher{margin-right:1em\n}\n.radius-container,.color-container{display:-ms-flexbox;display:flex\n}\n.radius-container p,.color-container p{margin-top:2em;margin-bottom:.5em\n}\n.radius-container{-ms-flex-direction:column;flex-direction:column\n}\n.color-container{-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between\n}\n.radius-item,.color-item{min-width:20em;display:-ms-flexbox;display:flex;-ms-flex:1 1 0px;flex:1 1 0;-ms-flex-align:baseline;align-items:baseline;margin:5px 6px 5px 0\n}\n.radius-item label,.color-item label{color:var(--faint, rgba(185,185,186,0.5))\n}\n.radius-item{-ms-flex-preferred-size:auto;flex-basis:auto\n}\n.theme-radius-rn,.theme-color-cl{border:0;box-shadow:none;background:transparent;color:var(--faint, rgba(185,185,186,0.5));-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch\n}\n.theme-color-cl,.theme-radius-in,.theme-color-in{margin-left:4px\n}\n.theme-color-in{min-width:4em\n}\n.theme-radius-in{min-width:1em\n}\n.theme-radius-in,.theme-color-in{max-width:7em;-ms-flex:1;flex:1\n}\n.theme-radius-lb,.theme-color-lb{-ms-flex:2;flex:2;min-width:7em\n}\n.theme-radius-lb{max-width:50em\n}\n.theme-color-lb{max-width:10em\n}\n.theme-color-cl{padding:1px;max-width:8em;height:100%;-ms-flex:0;flex:0;min-width:2em;cursor:pointer\n}\n.theme-preview-content{padding:20px\n}\n.dummy .avatar{background:linear-gradient(135deg, #b8e1fc 0%, #a9d2f3 10%, #90bae4 25%, #90bcea 37%, #90bff0 50%, #6ba8e5 51%, #a2daf5 83%, #bdf3fd 100%);color:black;text-align:center;height:48px;line-height:48px;width:48px;float:left;margin-right:1em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/style_switcher/style_switcher.vue","\n.registration-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:0.6em\n}\n.registration-form .container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row\n}\n.registration-form .terms-of-service{-ms-flex:0 1 50%;flex:0 1 50%;margin:0.8em\n}\n.registration-form .text-fields{margin-top:0.6em;-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column\n}\n.registration-form .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0.3em 0.0em 0.3em;line-height:24px\n}\n.registration-form form textarea{line-height:16px;resize:vertical\n}\n.registration-form .captcha{max-width:350px;margin-bottom:0.4em\n}\n.registration-form .btn{margin-top:0.6em;height:28px\n}\n.registration-form .error{text-align:center\n}\n@media all and (max-width: 959px){\n.registration-form .container{-ms-flex-direction:column-reverse;flex-direction:column-reverse\n}\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/registration/registration.vue","\n.profile-edit .bio{margin:0\n}\n.profile-edit input[type=file]{padding:5px;height:auto\n}\n.profile-edit .banner{max-width:400px\n}\n.profile-edit .uploading{font-size:1.5em;margin:0.25em\n}\n\n\n\n// WEBPACK FOOTER //\n// webpack:///src/components/user_settings/user_settings.vue"],"sourceRoot":""}
\ No newline at end of file
diff --git a/priv/static/static/font/LICENSE.txt b/priv/static/static/font/LICENSE.txt
index c26be3848..95966f00e 100644
--- a/priv/static/static/font/LICENSE.txt
+++ b/priv/static/static/font/LICENSE.txt
@@ -19,6 +19,15 @@ Font license info
Homepage: http://www.entypo.com
+## Iconic
+
+ Copyright (C) 2012 by P.J. Onori
+
+ Author: P.J. Onori
+ License: SIL (http://scripts.sil.org/OFL)
+ Homepage: http://somerandomdude.com/work/iconic/
+
+
## Fontelico
Copyright (C) 2012 by Fontello project
diff --git a/priv/static/static/font/config.json b/priv/static/static/font/config.json
index fec1f9889..536447741 100644
--- a/priv/static/static/font/config.json
+++ b/priv/static/static/font/config.json
@@ -179,6 +179,12 @@
"css": "globe",
"code": 59410,
"src": "fontawesome"
+ },
+ {
+ "uid": "b3a9e2dab4d19ea3b2f628242c926bfe",
+ "css": "brush",
+ "code": 59411,
+ "src": "iconic"
}
]
}
\ No newline at end of file
diff --git a/priv/static/static/font/css/fontello-codes.css b/priv/static/static/font/css/fontello-codes.css
index b94470914..5cd365cda 100644
Binary files a/priv/static/static/font/css/fontello-codes.css and b/priv/static/static/font/css/fontello-codes.css differ
diff --git a/priv/static/static/font/css/fontello-embedded.css b/priv/static/static/font/css/fontello-embedded.css
index deee4990d..e63696d4f 100644
Binary files a/priv/static/static/font/css/fontello-embedded.css and b/priv/static/static/font/css/fontello-embedded.css differ
diff --git a/priv/static/static/font/css/fontello-ie7-codes.css b/priv/static/static/font/css/fontello-ie7-codes.css
index ad83b705f..56d7ebc13 100644
Binary files a/priv/static/static/font/css/fontello-ie7-codes.css and b/priv/static/static/font/css/fontello-ie7-codes.css differ
diff --git a/priv/static/static/font/css/fontello-ie7.css b/priv/static/static/font/css/fontello-ie7.css
index 1aa9f5c2e..e955fac59 100644
Binary files a/priv/static/static/font/css/fontello-ie7.css and b/priv/static/static/font/css/fontello-ie7.css differ
diff --git a/priv/static/static/font/css/fontello.css b/priv/static/static/font/css/fontello.css
index 0bb5eb926..05e6e66c3 100644
Binary files a/priv/static/static/font/css/fontello.css and b/priv/static/static/font/css/fontello.css differ
diff --git a/priv/static/static/font/demo.html b/priv/static/static/font/demo.html
index 801480226..8fd5992fd 100644
--- a/priv/static/static/font/demo.html
+++ b/priv/static/static/font/demo.html
@@ -229,11 +229,11 @@ body {
}
@font-face {
font-family: 'fontello';
- src: url('./font/fontello.eot?48963108');
- src: url('./font/fontello.eot?48963108#iefix') format('embedded-opentype'),
- url('./font/fontello.woff?48963108') format('woff'),
- url('./font/fontello.ttf?48963108') format('truetype'),
- url('./font/fontello.svg?48963108#fontello') format('svg');
+ src: url('./font/fontello.eot?31375268');
+ src: url('./font/fontello.eot?31375268#iefix') format('embedded-opentype'),
+ url('./font/fontello.woff?31375268') format('woff'),
+ url('./font/fontello.ttf?31375268') format('truetype'),
+ url('./font/fontello.svg?31375268#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -325,21 +325,22 @@ body {
icon-bell 0xe810
icon-lock 0xe811
icon-globe 0xe812
- icon-spin3 0xe832
+ icon-brush 0xe813
+
icon-spin3 0xe832
icon-spin4 0xe834
icon-link-ext 0xf08e
icon-menu 0xf0c9
-
icon-mail-alt 0xf0e0
+
icon-mail-alt 0xf0e0
icon-comment-empty 0xf0e5
icon-reply 0xf112
icon-lock-open-alt 0xf13e
-
icon-binoculars 0xf1e5
+
icon-binoculars 0xf1e5
icon-user-plus 0xf234
diff --git a/priv/static/static/font/font/fontello.eot b/priv/static/static/font/font/fontello.eot
index aa6bb542d..29c48e4c5 100644
Binary files a/priv/static/static/font/font/fontello.eot and b/priv/static/static/font/font/fontello.eot differ
diff --git a/priv/static/static/font/font/fontello.svg b/priv/static/static/font/font/fontello.svg
index 0862d2773..01d203da7 100644
--- a/priv/static/static/font/font/fontello.svg
+++ b/priv/static/static/font/font/fontello.svg
@@ -44,6 +44,8 @@
+
+
diff --git a/priv/static/static/font/font/fontello.ttf b/priv/static/static/font/font/fontello.ttf
index c9a50e1a5..78b51e97a 100644
Binary files a/priv/static/static/font/font/fontello.ttf and b/priv/static/static/font/font/fontello.ttf differ
diff --git a/priv/static/static/font/font/fontello.woff b/priv/static/static/font/font/fontello.woff
index 5accf9073..81c810f80 100644
Binary files a/priv/static/static/font/font/fontello.woff and b/priv/static/static/font/font/fontello.woff differ
diff --git a/priv/static/static/font/font/fontello.woff2 b/priv/static/static/font/font/fontello.woff2
index 1cdb8a640..6c3428a82 100644
Binary files a/priv/static/static/font/font/fontello.woff2 and b/priv/static/static/font/font/fontello.woff2 differ
diff --git a/priv/static/static/js/app.9d52d5cd0ef719b7db59.js b/priv/static/static/js/app.9d52d5cd0ef719b7db59.js
new file mode 100644
index 000000000..05c42de22
Binary files /dev/null and b/priv/static/static/js/app.9d52d5cd0ef719b7db59.js differ
diff --git a/priv/static/static/js/app.9d52d5cd0ef719b7db59.js.map b/priv/static/static/js/app.9d52d5cd0ef719b7db59.js.map
new file mode 100644
index 000000000..1f7d4e750
Binary files /dev/null and b/priv/static/static/js/app.9d52d5cd0ef719b7db59.js.map differ
diff --git a/priv/static/static/js/app.de965bb2a0a8bffbeafa.js b/priv/static/static/js/app.de965bb2a0a8bffbeafa.js
deleted file mode 100644
index c9bc901d2..000000000
Binary files a/priv/static/static/js/app.de965bb2a0a8bffbeafa.js and /dev/null differ
diff --git a/priv/static/static/js/app.de965bb2a0a8bffbeafa.js.map b/priv/static/static/js/app.de965bb2a0a8bffbeafa.js.map
deleted file mode 100644
index c6af67cc7..000000000
Binary files a/priv/static/static/js/app.de965bb2a0a8bffbeafa.js.map and /dev/null differ
diff --git a/priv/static/static/js/manifest.212bbb8f66cdc9a7eebf.js b/priv/static/static/js/manifest.212bbb8f66cdc9a7eebf.js
new file mode 100644
index 000000000..e40630e50
Binary files /dev/null and b/priv/static/static/js/manifest.212bbb8f66cdc9a7eebf.js differ
diff --git a/priv/static/static/js/manifest.f2341edd686e54ee9b4a.js.map b/priv/static/static/js/manifest.212bbb8f66cdc9a7eebf.js.map
similarity index 92%
rename from priv/static/static/js/manifest.f2341edd686e54ee9b4a.js.map
rename to priv/static/static/js/manifest.212bbb8f66cdc9a7eebf.js.map
index df6a9e737..1dca80383 100644
Binary files a/priv/static/static/js/manifest.f2341edd686e54ee9b4a.js.map and b/priv/static/static/js/manifest.212bbb8f66cdc9a7eebf.js.map differ
diff --git a/priv/static/static/js/manifest.f2341edd686e54ee9b4a.js b/priv/static/static/js/manifest.f2341edd686e54ee9b4a.js
deleted file mode 100644
index 1200d77b5..000000000
Binary files a/priv/static/static/js/manifest.f2341edd686e54ee9b4a.js and /dev/null differ
diff --git a/priv/static/static/js/vendor.a93310d51acbd9480094.js.map b/priv/static/static/js/vendor.a93310d51acbd9480094.js.map
deleted file mode 100644
index 8bcfffd0b..000000000
Binary files a/priv/static/static/js/vendor.a93310d51acbd9480094.js.map and /dev/null differ
diff --git a/priv/static/static/js/vendor.a93310d51acbd9480094.js b/priv/static/static/js/vendor.da712c56a19114013b34.js
similarity index 84%
rename from priv/static/static/js/vendor.a93310d51acbd9480094.js
rename to priv/static/static/js/vendor.da712c56a19114013b34.js
index 1882d9b64..09c9e8d3b 100644
Binary files a/priv/static/static/js/vendor.a93310d51acbd9480094.js and b/priv/static/static/js/vendor.da712c56a19114013b34.js differ
diff --git a/priv/static/static/js/vendor.da712c56a19114013b34.js.map b/priv/static/static/js/vendor.da712c56a19114013b34.js.map
new file mode 100644
index 000000000..fa1fe356f
Binary files /dev/null and b/priv/static/static/js/vendor.da712c56a19114013b34.js.map differ
diff --git a/priv/static/sw.js b/priv/static/sw.js
index 4162457a3..084d2e55f 100644
Binary files a/priv/static/sw.js and b/priv/static/sw.js differ
diff --git a/test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json b/test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json
new file mode 100644
index 000000000..3f3f0f4fb
--- /dev/null
+++ b/test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json
@@ -0,0 +1 @@
+{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"Emoji":"toot:Emoji","Hashtag":"as:Hashtag","atomUri":"ostatus:atomUri","conversation":"ostatus:conversation","featured":"toot:featured","focalPoint":{"@container":"@list","@id":"toot:focalPoint"},"inReplyToAtomUri":"ostatus:inReplyToAtomUri","manuallyApprovesFollowers":"as:manuallyApprovesFollowers","movedTo":"as:movedTo","ostatus":"http://ostatus.org#","sensitive":"as:sensitive","toot":"http://joinmastodon.org/ns#"}],"attributedTo":["https://baptiste.gelez.xyz/@/BaptisteGelez"],"cc":[],"content":"It has been one month since the last \"This Month in Plume\" article, so it is time for another edition of our monthly changelog!
\nBug Fixes and Security \nLet's start with the hidden, but still (very) important changes: bug fixes and security patches.
\nFirst of all, @Trinity protected us against two major security flaws, called XSS and CSRF . The first one allows the attacker to run malicious code if you visit a Plume page where some of their personal data is present. The second one lets them post data with your Plume account by visiting one of their own website. It is two very common attack, and it is great we are now protected against them!
\nThe other big change in this area, is that we are now validating the data you are sending before doing anything with it. It means that, for instance, you will no longer be able to register with an empty username and to break everything.
\nOn the federation side, many issues were reported by @kaniini and redmatrix (respectively contributing to Pleroma and Hubzilla). By fixing some of them, we made it possible to federate Plume articles to Pleroma !
\n@Trinity hopefully noticed that there was a bug in our password check code: we were not checking that your password was correct, but only that the verification process went without errors. Concretely, it means that you could login to any account with any password. I wrote this part of the code when I was still the only contributor to the project, so nobody could review my work. We will now be trying to check every change, especially when it deals with critical parts of Plume, to avoid similar issues in the future, and we I'm really sorry this happened (even if I think nobody exploited it).
\nZanfib and stephenburgess8 also commited some small bugfixes, improving the general experience.
\nNew Features \nLet's now talk about the features that we introduced during this month.
\nOne of the most easy to spot is the redesign of Plume, made by @Madeorsk. I personaly love what he did, it really improved the readability and gave Plume a bit more of identity than the previous design. And he is still improving it .
\nWe also enabled Mardown in comment, to let you write more structured and nicely formatted responses.
\nAs you may have noticed, I have used mentions in this post. Indeed, it is now possible to mention someone in your articles or in comments. It works exactly the same way as in other apps, and you should receive a notification if someone mentionned you.
\nA dashboard to manage your blogs has also been introduced. In the future it may be used to manage your drafts, and eventually to show some statistics. The goal is to have a more specific homepage for authors.
\nThe federation with other ActivityPub softwares, like Mastodon or Pleroma is starting to work quite well, but the federation between Plume instances is far from being complete. However, we started to work on it, and it is now possible to view a distant user profile or blog from your instance, even if only basic informations are fetched yet (the articles are not loaded for instance).
\nAnother new feature that may not be visible for everyone, is the new NodeInfo endpoint. NodeInfo is a protocol allowing to get informations about a specific federated instance (whatever software it runs). It means that Plume instances can now be listed on sites like fediverse.network .
\nMaybe you wanted to host a Plume instance, but you don't like long install process during which you are just copy/pasting commands that you don't really understand from the documentation. That's why we introduced a setup script: the first you'll launch Plume, it will ask you a few questions and automatically setup your instance in a few minutes. We hope that this feature will help to host small instances, run by non-professional adminsys. You can see a demo of this tool on asciinema .
\nLast but not least, Plume is now translatable! It is already available in English, French, Polish (thanks to @m4sk1n) ) and German (thanks to bitkeks ). If your browser is configured to display pages in these languages, you should normally see the interface in your language. And if your language is not present yet, feel free to add your translation .
\nOther Changes \nWe also improved the code a lot. We tried to separate each part as much as possible, making it easier to re-use for other projects. For instance, our database code is now isolated from the rest of the app, which means it will be easier to make import tools from other blogging engines. Some parts of the code are even shared with another project, Aardwolf a federated Facebook alternative. For instance, both of our projects use the same internationalization code, and once Aardwolf will implement federation, this part of the code will probably be shared too. Since the WebFinger module (used to find new users and blogs) and the CSRF protection code (see the \"Bug fixes and Security\" section) have been isolated in their own modules, they may be shared by both projects too.
\nWe also worked a lot on documentation. We now have articles explaining how to setup your Plume instance on various operating systems, but also documenting the translation process. I want to thank BanjoFox (who imported some documentation from their project, Aardwolf, as the setup is quite similar), Kushal and @gled@plume.mastodon.host for working on this.
\nAs you can see, there were many changes this month, but there still a lot to do. Your help will of course be welcome. If you want to contribute to the code, translate Plume in your language, write some documentation, or anything else (or even if you're just curious about the project), feel free to join our Matrix room: #plume:disroot.org . Otherwise, as BanjoFox said on the Aardwolf Team Mastodon account , talking about the project around you is one of the easiest way to help.
\n","id":"https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/","likes":null,"name":"This Month in Plume: June 2018","published":"2018-07-10T20:16:24.087622Z","shares":null,"source":null,"tag":[{"href":"https://baptiste.gelez.xyz/@/Trinity","name":"@Trinity","type":"Mention"},{"href":"https://baptiste.gelez.xyz/@/kaniini/","name":"@kaniini","type":"Mention"},{"href":"https://baptiste.gelez.xyz/@/Trinity","name":"@Trinity","type":"Mention"}],"to":["https://unixcorn.xyz/users/Bat","https://mastodon.host/users/federationbot","https://social.tcit.fr/users/tcit","https://framapiaf.org/users/qwerty","https://mastodon.social/users/lthms","https://eldritch.cafe/users/Nausicaa","https://imaginair.es/users/Elanndelh","https://framapiaf.org/users/Drulac","https://mastodon.partipirate.org/users/NicolasConstant","https://aleph.land/users/Madeorsk","https://maly.io/users/Troll","https://hostux.social/users/superjey","https://mamot.fr/users/Phigger","https://mastodon.social/users/wakest","https://social.coop/users/wakest","https://unixcorn.xyz/users/Ce_lo","https://social.art-software.fr/users/Electron","https://framapiaf.org/users/Quenti","https://toot.plus.yt/users/Djyp","https://mastodon.social/users/brainblasted","https://social.mochi.academy/users/Ambraven","https://social.hacktivis.me/users/lanodan","https://mastodon.eliotberriot.com/users/eliotberriot","https://edolas.world/users/0x1C3B00DA","https://toot.cafe/users/zack","https://manowar.social/users/zatnosk","https://eldritch.cafe/users/fluffy","https://mastodon.social/users/david_ross","https://kosmos.social/users/xiroux","https://mastodon.art/users/EmergencyBattle","https://mastodon.social/users/trwnh","https://octodon.social/users/pybyte","https://anticapitalist.party/users/Trinity","https://mstdn.mx/users/xavavu","https://baptiste.gelez.xyz/@/m4sk1n","https://eldritch.cafe/users/milia","https://mastodon.zaclys.com/users/arx","https://toot.cafe/users/sivy","https://mastodon.social/users/ortegacmanuel","https://mastodon.observer/users/stephen","https://octodon.social/users/chloe","https://unixcorn.xyz/users/AmauryPi","https://cybre.space/users/rick_777","https://mastodon.social/users/wezm","https://baptiste.gelez.xyz/@/idlesong","https://mamot.fr/users/dr4Ke","https://imaginair.es/users/Phigger","https://mamot.fr/users/dlink","https://anticapitalist.party/users/a000d4f7a91939d0e71df1646d7a48","https://framapiaf.org/users/PhieLaidMignon","https://mastodon.social/users/y6nH","https://crazynoisybizarre.town/users/FederationBot","https://social.weho.st/users/dvn","https://mastodon.art/users/Wolthera","https://diaspodon.fr/users/dada","https://pachyder.me/users/Lanza","https://mastodon.xyz/users/ag","https://aleph.land/users/yahananxie","https://mstdn.io/users/chablis_social","https://mastodon.gougere.fr/users/fabien","https://functional.cafe/users/otini","https://social.coop/users/bhaugen","https://octodon.social/users/donblanco","https://chaos.social/users/astro","https://pachyder.me/users/sibear","https://mamot.fr/users/yohann","https://social.wxcafe.net/users/Bat","https://mastodon.social/users/dansup","https://chaos.social/users/juh","https://scifi.fyi/users/paeneultima","https://hostux.social/users/Deuchnord","https://mstdn.fr/users/taziden","https://mamot.fr/users/PifyZ","https://mastodon.social/users/plantabaja","https://mastodon.social/users/gitzgrog","https://mastodon.social/users/Syluban","https://masto.pt/users/eloisa","https://pleroma.soykaf.com/users/notclacke","https://mastodon.social/users/SiegfriedEhret","https://writing.exchange/users/write_as","https://mstdn.io/users/shellkr","https://mastodon.uy/users/jorge","https://mastodon.technology/users/bobstechsite","https://mastodon.social/users/hinterwaeldler","https://mastodon.xyz/users/mgdelacroix","https://mastodon.cloud/users/jjatria","https://baptiste.gelez.xyz/@/Jade/","https://edolas.world/users/pfm","https://mstdn.io/users/jort","https://mastodon.social/users/andreipetcu","https://mastodon.technology/users/0xf00fc7c8","https://mastodon.social/users/khanate","https://mastodon.technology/users/francois","https://mastodon.social/users/glherrmann","https://mastodon.host/users/gled","https://social.holdmybeer.solutions/users/kemonine","https://scholar.social/users/bgcarlisle","https://mastodon.social/users/oldgun","https://baptiste.gelez.xyz/@/snoe/","https://mastodon.at/users/switchingsocial","https://scifi.fyi/users/BrokenBiscuit","https://dev.glitch.social/users/hoodie","https://todon.nl/users/paulfree14","https://mastodon.social/users/aadilayub","https://social.fsck.club/users/anarchosaurus","https://mastodonten.de/users/GiantG","https://mastodon.technology/users/cj","https://cybre.space/users/sam","https://layer8.space/users/silkevicious","https://mastodon.xyz/users/Jimmyrwx","https://fosstodon.org/users/danyspin97","https://mstdn.io/users/cristhyano","https://mastodon.social/users/vanyok","https://hulvr.com/users/rook","https://niu.moe/users/Lucifer","https://mamot.fr/users/Thibaut","https://mastodont.cat/users/bgta","https://mstdn.io/users/hontoni","https://niu.moe/users/lionirdeadman","https://functional.cafe/users/phoe","https://mastodon.social/users/toontoet","https://mastodon.social/users/danipozo","https://scholar.social/users/robertson","https://mastodon.social/users/aldatsa","https://elekk.xyz/users/maloki","https://kitty.town/users/nursemchurt","https://neigh.horse/users/commagray","https://mastodon.social/users/hirojin","https://mastodon.xyz/users/mareklach","https://chaos.social/users/benthor","https://mastodon.social/users/djperreault","https://mastodon.art/users/eylul","https://mastodon.opportunis.me/users/bob","https://tootplanet.space/users/Shutsumon","https://toot.cat/users/woozle","https://mastodon.social/users/StephenLB","https://sleeping.town/users/oct2pus","https://mastodon.indie.host/users/stragu","https://social.coop/users/gilscottfitzgerald","https://icosahedron.website/users/joeld","https://mastodon.social/users/hellion","https://cybre.space/users/cooler_ranch","https://mastodon.social/users/kelsonv","https://mastodon.lat/users/scalpol","https://writing.exchange/users/hnb","https://hex.bz/users/Horst","https://mastodon.social/users/weddle","https://maly.io/users/sonya","https://social.coop/users/medusa","https://mastodon.social/users/DystopianK","https://mstdn.io/users/d_io","https://fosstodon.org/users/brandon","https://fosstodon.org/users/Cando","https://mastodon.host/users/panina","https://floss.social/users/tuxether","https://social.tchncs.de/users/suitbertmonz","https://mastodon.social/users/jrt","https://mastodon.social/users/sirikon","https://mstdn.io/users/yabirgb","https://mastodon.cloud/users/FerdiZ","https://mastodon.social/users/carlchenet","https://social.polonkai.eu/users/calendar_social","https://social.polonkai.eu/users/gergely","https://mastodon.social/users/Jelv","https://mastodon.social/users/srinicame","https://cybre.space/users/mastoabed","https://mastodon.social/users/tagomago","https://lgbt.io/users/bootblackCub","https://niu.moe/users/Nopplyy","https://mastodon.social/users/bpugh","https://www.w3.org/ns/activitystreams#Public"],"type":"Article","uploadMedia":null,"url":"https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/"}
\ No newline at end of file
diff --git a/test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json b/test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json
new file mode 100644
index 000000000..b226204ba
--- /dev/null
+++ b/test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json
@@ -0,0 +1 @@
+{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"Emoji":"toot:Emoji","Hashtag":"as:Hashtag","atomUri":"ostatus:atomUri","conversation":"ostatus:conversation","featured":"toot:featured","focalPoint":{"@container":"@list","@id":"toot:focalPoint"},"inReplyToAtomUri":"ostatus:inReplyToAtomUri","manuallyApprovesFollowers":"as:manuallyApprovesFollowers","movedTo":"as:movedTo","ostatus":"http://ostatus.org#","sensitive":"as:sensitive","toot":"http://joinmastodon.org/ns#"}],"endpoints":{"oauthAuthorizationEndpoint":null,"oauthTokenEndpoint":null,"provideClientKey":null,"proxyUrl":null,"sharedInbox":"https://baptiste.gelez.xyz/inbox/","signClientKey":null},"followers":null,"following":null,"id":"https://baptiste.gelez.xyz/@/BaptisteGelez","inbox":"https://baptiste.gelez.xyz/@/BaptisteGelez/inbox","liked":null,"likes":null,"name":"Baptiste Gelez","outbox":"https://baptiste.gelez.xyz/@/BaptisteGelez/outbox","preferredUsername":"BaptisteGelez","publicKey":{"id":"https://baptiste.gelez.xyz/@/BaptisteGelez#main-key","owner":"https://baptiste.gelez.xyz/@/BaptisteGelez","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA56vPlCAyxZDDy8hNiT1p\n0cdFKnUK/51LiP4nTAxGf5Eb8NmsB2ftDgiDWZfg3LiHkjNcfTDpmN0aZyRxnTg9\nZ4JiQagfynVEbMkcOQhO64OFZpB47GpLtxrb49IcUes/p4ngp/Wkp+arYZSpoSs6\n3I995mZp3ZJ78pNQf1/lV0VIdDe6SqvRj1GmBDXXcecxF0O7rN/WYNO7Jag4i/XA\nU1ToDAMeUFeijRioSNoD3CHkMIu7AN+gqAWzZ21H/ZUvmfxh3WqQi/MDNcUhhA+0\nXv7/dv4S20EGnHadtE7OrBC1IwiHEuRM41zZq0ze9cKpoXg3VK2fiSNrCHlYrA18\n2wIDAQAB\n-----END PUBLIC KEY-----\n"},"shares":null,"source":null,"streams":null,"summary":"Main Plume developer","type":"Person","uploadMedia":null,"url":"https://baptiste.gelez.xyz/@/BaptisteGelez"}
\ No newline at end of file
diff --git a/test/fixtures/httpoison_mock/puckipedia.com.json b/test/fixtures/httpoison_mock/puckipedia.com.json
new file mode 100644
index 000000000..d18dfbae7
--- /dev/null
+++ b/test/fixtures/httpoison_mock/puckipedia.com.json
@@ -0,0 +1 @@
+{"@context":["https://www.w3.org/ns/activitystreams","https://puckipedia.com/-/context"],"endpoints":"https://puckipedia.com/#endpoints","followers":"https://puckipedia.com/followers","following":"https://puckipedia.com/following","icon":{"mediaType":"image/png","type":"Image","url":"https://puckipedia.com/images/avatar.png"},"id":"https://puckipedia.com/","inbox":"https://puckipedia.com/inbox","kroeg:blocks":{"id":"https://puckipedia.com/blocks"},"liked":"https://puckipedia.com/liked","manuallyApprovesFollowers":false,"name":"HACKER TEEN PUCKIPEDIA 👩💻","outbox":"https://puckipedia.com/outbox","preferredUsername":"puckipedia","publicKey":{"id":"https://puckipedia.com/#key","owner":"https://puckipedia.com/","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvN05xIcFE0Qgany7Rht4\n0ZI5wu++IT7K5iSqRimBYkpoeHbVcT9RFlW+aWH/QJJW/YgZ7+LMr8AMCrKrwSpS\nCndyrpx4O4lZ3FNRLu7tbklh01rGZfE6R1SFfYBpvMvImc9nYT6iezYDbv6NkHku\no3aVhjql216XlA0OhIrqQme9sAdrLbjbMrTUS8douCTkDOX+JFj1ghHCqdYEMZJI\nOY9kovtgnqyxFLm0RsPGsO1+g/OVojqG+VqHz6O2lceaTVQLlnZ4gOhLVG1tVsA2\nRfXQK+R/VgXncYE+BlQVd/tcdGAz7CDL7PP3rP65gmARnafhGR96cCOi/KzlAXSO\nMwIDAQAB\n-----END PUBLIC KEY-----","type":[]},"summary":"federated hacker teen \n[she /they ]
","type":"Person","updated":"2017-12-19T16:56:29.7576707+00:00"}
\ No newline at end of file
diff --git a/test/fixtures/kroeg-post-activity.json b/test/fixtures/kroeg-post-activity.json
new file mode 100644
index 000000000..32dabd947
--- /dev/null
+++ b/test/fixtures/kroeg-post-activity.json
@@ -0,0 +1,50 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://puckipedia.com/-/context"
+ ],
+ "actor": {
+ "endpoints": "https://puckipedia.com/#endpoints",
+ "followers": "https://puckipedia.com/followers",
+ "following": "https://puckipedia.com/following",
+ "icon": {
+ "mediaType": "image/png",
+ "type": "Image",
+ "url": "https://puckipedia.com/images/avatar.png"
+ },
+ "id": "https://puckipedia.com/",
+ "inbox": "https://puckipedia.com/inbox",
+ "kroeg:blocks": {
+ "id": "https://puckipedia.com/blocks"
+ },
+ "liked": "https://puckipedia.com/liked",
+ "manuallyApprovesFollowers": false,
+ "name": "HACKER TEEN PUCKIPEDIA \ud83d\udc69\u200d\ud83d\udcbb",
+ "outbox": "https://puckipedia.com/outbox",
+ "preferredUsername": "puckipedia",
+ "publicKey": {
+ "id": "https://puckipedia.com/#key",
+ "owner": "https://puckipedia.com/",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvN05xIcFE0Qgany7Rht4\n0ZI5wu++IT7K5iSqRimBYkpoeHbVcT9RFlW+aWH/QJJW/YgZ7+LMr8AMCrKrwSpS\nCndyrpx4O4lZ3FNRLu7tbklh01rGZfE6R1SFfYBpvMvImc9nYT6iezYDbv6NkHku\no3aVhjql216XlA0OhIrqQme9sAdrLbjbMrTUS8douCTkDOX+JFj1ghHCqdYEMZJI\nOY9kovtgnqyxFLm0RsPGsO1+g/OVojqG+VqHz6O2lceaTVQLlnZ4gOhLVG1tVsA2\nRfXQK+R/VgXncYE+BlQVd/tcdGAz7CDL7PP3rP65gmARnafhGR96cCOi/KzlAXSO\nMwIDAQAB\n-----END PUBLIC KEY-----",
+ "type": []
+ },
+ "summary": "federated hacker teen \n[she /they ]
",
+ "type": "Person",
+ "updated": "2017-12-19T16:56:29.7576707+00:00"
+ },
+ "cc": "https://puckipedia.com/followers",
+ "id": "https://puckipedia.com/ae4ee4e8be/activity",
+ "object": {
+ "attributedTo": "https://puckipedia.com/",
+ "cc": "https://puckipedia.com/followers",
+ "content": "henlo from my Psion netBook
message sent from my Psion netBook
",
+ "id": "https://puckipedia.com/ae4ee4e8be",
+ "likes": "https://puckipedia.com/ae4ee4e8be/likes",
+ "replies": "https://puckipedia.com/ae4ee4e8be/replies",
+ "shares": "https://puckipedia.com/ae4ee4e8be/shares",
+ "to": "https://www.w3.org/ns/activitystreams#Public",
+ "type": "Note"
+ },
+ "to": "https://www.w3.org/ns/activitystreams#Public",
+ "type": "Create"
+}
diff --git a/test/fixtures/test.txt b/test/fixtures/test.txt
new file mode 100644
index 000000000..e9ea42a12
--- /dev/null
+++ b/test/fixtures/test.txt
@@ -0,0 +1 @@
+this is a text file
diff --git a/test/support/factory.ex b/test/support/factory.ex
index 6c48d390f..4f5060abf 100644
--- a/test/support/factory.ex
+++ b/test/support/factory.ex
@@ -92,6 +92,26 @@ def note_activity_factory do
}
end
+ def announce_activity_factory do
+ note_activity = insert(:note_activity)
+ user = insert(:user)
+
+ data = %{
+ "type" => "Announce",
+ "actor" => note_activity.actor,
+ "object" => note_activity.data["id"],
+ "to" => [user.follower_address, note_activity.data["actor"]],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Public"],
+ "context" => note_activity.data["context"]
+ }
+
+ %Pleroma.Activity{
+ data: data,
+ actor: user.ap_id,
+ recipients: data["to"]
+ }
+ end
+
def like_activity_factory do
note_activity = insert(:note_activity)
user = insert(:user)
diff --git a/test/support/httpoison_mock.ex b/test/support/httpoison_mock.ex
index befebad8a..527c2e1f7 100644
--- a/test/support/httpoison_mock.ex
+++ b/test/support/httpoison_mock.ex
@@ -3,6 +3,14 @@ defmodule HTTPoisonMock do
def get(url, body \\ [], headers \\ [])
+ def get("https://puckipedia.com/", [Accept: "application/activity+json"], _) do
+ {:ok,
+ %Response{
+ status_code: 200,
+ body: File.read!("test/fixtures/httpoison_mock/puckipedia.com.json")
+ }}
+ end
+
def get(
"https://gerzilla.de/.well-known/webfinger?resource=acct:kaniini@gerzilla.de",
[Accept: "application/xrd+xml,application/jrd+json"],
@@ -736,6 +744,22 @@ def get("https://shitposter.club/api/statuses/show/7369654.atom", _body, _header
}}
end
+ def get("https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/", _, _) do
+ {:ok,
+ %Response{
+ status_code: 200,
+ body: File.read!("test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json")
+ }}
+ end
+
+ def get("https://baptiste.gelez.xyz/@/BaptisteGelez", _, _) do
+ {:ok,
+ %Response{
+ status_code: 200,
+ body: File.read!("test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json")
+ }}
+ end
+
def get(url, body, headers) do
{:error,
"Not implemented the mock response for get #{inspect(url)}, #{inspect(body)}, #{
diff --git a/test/upload_test.exs b/test/upload_test.exs
index 09aa5e068..d273ea5f6 100644
--- a/test/upload_test.exs
+++ b/test/upload_test.exs
@@ -56,5 +56,31 @@ test "adds missing extension" do
data = Upload.store(file, false)
assert data["name"] == "an [image.jpg"
end
+
+ test "fixes incorrect file extension" do
+ File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
+
+ file = %Plug.Upload{
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image_tmp.jpg"),
+ filename: "an [image.blah"
+ }
+
+ data = Upload.store(file, false)
+ assert data["name"] == "an [image.jpg"
+ end
+
+ test "don't modify filename of an unknown type" do
+ File.cp("test/fixtures/test.txt", "test/fixtures/test_tmp.txt")
+
+ file = %Plug.Upload{
+ content_type: "text/plain",
+ path: Path.absname("test/fixtures/test_tmp.txt"),
+ filename: "test.txt"
+ }
+
+ data = Upload.store(file, false)
+ assert data["name"] == "test.txt"
+ end
end
end
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs
index bbf89136b..3ed7be402 100644
--- a/test/web/activity_pub/activity_pub_controller_test.exs
+++ b/test/web/activity_pub/activity_pub_controller_test.exs
@@ -62,6 +62,32 @@ test "it inserts an incoming activity into the database", %{conn: conn} do
end
end
+ describe "/users/:nickname/outbox" do
+ test "it returns a note activity in a collection", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ user = User.get_cached_by_ap_id(note_activity.data["actor"])
+
+ conn =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/users/#{user.nickname}/outbox")
+
+ assert response(conn, 200) =~ note_activity.data["object"]["content"]
+ end
+
+ test "it returns an announce activity in a collection", %{conn: conn} do
+ announce_activity = insert(:announce_activity)
+ user = User.get_cached_by_ap_id(announce_activity.data["actor"])
+
+ conn =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/users/#{user.nickname}/outbox")
+
+ assert response(conn, 200) =~ announce_activity.data["object"]
+ end
+ end
+
describe "/users/:nickname/followers" do
test "it returns the followers in a collection", %{conn: conn} do
user = insert(:user)
diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs
index bc33b4dfc..90c0bd768 100644
--- a/test/web/activity_pub/activity_pub_test.exs
+++ b/test/web/activity_pub/activity_pub_test.exs
@@ -476,6 +476,15 @@ test "it creates a delete activity and deletes the original object" do
end
end
+ test "it can fetch plume articles" do
+ {:ok, object} =
+ ActivityPub.fetch_object_from_id(
+ "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/"
+ )
+
+ assert object
+ end
+
describe "update" do
test "it creates an update activity with the new user data" do
user = insert(:user)
diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs
index 838ae169d..e455da39f 100644
--- a/test/web/activity_pub/transmogrifier_test.exs
+++ b/test/web/activity_pub/transmogrifier_test.exs
@@ -112,6 +112,15 @@ test "it works for incoming notices with contentMap" do
"@lain
"
end
+ test "it works for incoming notices with to/cc not being an array (kroeg)" do
+ data = File.read!("test/fixtures/kroeg-post-activity.json") |> Poison.decode!()
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+
+ assert data["object"]["content"] ==
+ "henlo from my Psion netBook
message sent from my Psion netBook
"
+ end
+
test "it works for incoming follow requests" do
user = insert(:user)
diff --git a/test/web/activity_pub/views/user_view_test.exs b/test/web/activity_pub/views/user_view_test.exs
index 0c64e62c3..7fc870e96 100644
--- a/test/web/activity_pub/views/user_view_test.exs
+++ b/test/web/activity_pub/views/user_view_test.exs
@@ -13,6 +13,6 @@ test "Renders a user, including the public key" do
assert result["id"] == user.ap_id
assert result["preferredUsername"] == user.nickname
- assert String.contains?(result["publicKey"]["publicKeyPem"], "BEGIN RSA PUBLIC KEY")
+ assert String.contains?(result["publicKey"]["publicKeyPem"], "BEGIN PUBLIC KEY")
end
end
diff --git a/test/web/mastodon_api/account_view_test.exs b/test/web/mastodon_api/account_view_test.exs
index b93418b3f..8bf194e6b 100644
--- a/test/web/mastodon_api/account_view_test.exs
+++ b/test/web/mastodon_api/account_view_test.exs
@@ -5,10 +5,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
alias Pleroma.User
test "Represent a user account" do
+ source_data = %{
+ "tag" => [
+ %{
+ "type" => "Emoji",
+ "icon" => %{"url" => "/file.png"},
+ "name" => ":karjalanpiirakka:"
+ }
+ ]
+ }
+
user =
insert(:user, %{
- info: %{"note_count" => 5, "follower_count" => 3},
+ info: %{"note_count" => 5, "follower_count" => 3, "source_data" => source_data},
nickname: "shp@shitposter.club",
+ name: ":karjalanpiirakka: shp",
inserted_at: ~N[2017-08-15 15:47:06.597036]
})
@@ -28,7 +39,14 @@ test "Represent a user account" do
avatar_static: "http://localhost:4001/images/avi.png",
header: "http://localhost:4001/images/banner.png",
header_static: "http://localhost:4001/images/banner.png",
- emojis: [],
+ emojis: [
+ %{
+ "static_url" => "/file.png",
+ "url" => "/file.png",
+ "shortcode" => "karjalanpiirakka",
+ "visible_in_picker" => false
+ }
+ ],
fields: [],
source: %{
note: "",
diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs
index d1812457d..9e33c1d04 100644
--- a/test/web/mastodon_api/mastodon_api_controller_test.exs
+++ b/test/web/mastodon_api/mastodon_api_controller_test.exs
@@ -736,16 +736,19 @@ test "media upload", %{conn: conn} do
filename: "an_image.jpg"
}
+ desc = "Description of the image"
+
user = insert(:user)
conn =
conn
|> assign(:user, user)
- |> post("/api/v1/media", %{"file" => file})
+ |> post("/api/v1/media", %{"file" => file, "description" => desc})
assert media = json_response(conn, 200)
assert media["type"] == "image"
+ assert media["description"] == desc
end
test "hashtag timeline", %{conn: conn} do
diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs
index d28c3cbad..03c798bef 100644
--- a/test/web/mastodon_api/status_view_test.exs
+++ b/test/web/mastodon_api/status_view_test.exs
@@ -102,7 +102,8 @@ test "attachments" do
url: "someurl",
remote_url: "someurl",
preview_url: "someurl",
- text_url: "someurl"
+ text_url: "someurl",
+ description: nil
}
assert expected == StatusView.render("attachment.json", %{attachment: object})
diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs
index d5adf3bf3..c23b175e8 100644
--- a/test/web/ostatus/ostatus_controller_test.exs
+++ b/test/web/ostatus/ostatus_controller_test.exs
@@ -155,6 +155,31 @@ test "gets a notice", %{conn: conn} do
assert response(conn, 200)
end
+ test "gets a notice in AS2 format", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ url = "/notice/#{note_activity.id}"
+
+ conn =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get(url)
+
+ assert json_response(conn, 200)
+ end
+
+ test "gets an activity in AS2 format", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))
+ url = "/activities/#{uuid}"
+
+ conn =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get(url)
+
+ assert json_response(conn, 200)
+ end
+
test "404s a private notice", %{conn: conn} do
note_activity = insert(:direct_note_activity)
url = "/notice/#{note_activity.id}"
diff --git a/test/web/twitter_api/representers/activity_representer_test.exs b/test/web/twitter_api/representers/activity_representer_test.exs
index 16c6e7b0d..3f85e028b 100644
--- a/test/web/twitter_api/representers/activity_representer_test.exs
+++ b/test/web/twitter_api/representers/activity_representer_test.exs
@@ -126,7 +126,7 @@ test "an activity" do
}
expected_html =
- "2hu alert('YAY')Some content mentioning 2hualert('YAY')Some content mentioning @shp "
@@ -155,7 +155,8 @@ test "an activity" do
"activity_type" => "post",
"possibly_sensitive" => true,
"uri" => activity.data["object"]["id"],
- "visibility" => "direct"
+ "visibility" => "direct",
+ "summary" => "2hu"
}
assert ActivityRepresenter.to_map(activity, %{
diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs
index 06c1ba6ec..6486540f8 100644
--- a/test/web/twitter_api/twitter_api_test.exs
+++ b/test/web/twitter_api/twitter_api_test.exs
@@ -2,7 +2,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
use Pleroma.DataCase
alias Pleroma.Builders.UserBuilder
alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView}
- alias Pleroma.{Activity, User, Object, Repo}
+ alias Pleroma.{Activity, User, Object, Repo, UserInviteToken}
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.TwitterAPI.ActivityView
@@ -257,6 +257,70 @@ test "it registers a new user and returns the user." do
UserView.render("show.json", %{user: fetched_user})
end
+ @moduletag skip: "needs 'registrations_open: false' in config"
+ test "it registers a new user via invite token and returns the user." do
+ {:ok, token} = UserInviteToken.create_token()
+
+ data = %{
+ "nickname" => "vinny",
+ "email" => "pasta@pizza.vs",
+ "fullname" => "Vinny Vinesauce",
+ "bio" => "streamer",
+ "password" => "hiptofbees",
+ "confirm" => "hiptofbees",
+ "token" => token.token
+ }
+
+ {:ok, user} = TwitterAPI.register_user(data)
+
+ fetched_user = Repo.get_by(User, nickname: "vinny")
+ token = Repo.get_by(UserInviteToken, token: token.token)
+
+ assert token.used == true
+
+ assert UserView.render("show.json", %{user: user}) ==
+ UserView.render("show.json", %{user: fetched_user})
+ end
+
+ @moduletag skip: "needs 'registrations_open: false' in config"
+ test "it returns an error if invalid token submitted" do
+ data = %{
+ "nickname" => "GrimReaper",
+ "email" => "death@reapers.afterlife",
+ "fullname" => "Reaper Grim",
+ "bio" => "Your time has come",
+ "password" => "scythe",
+ "confirm" => "scythe",
+ "token" => "DudeLetMeInImAFairy"
+ }
+
+ {:error, msg} = TwitterAPI.register_user(data)
+
+ assert msg == "Invalid token"
+ refute Repo.get_by(User, nickname: "GrimReaper")
+ end
+
+ @moduletag skip: "needs 'registrations_open: false' in config"
+ test "it returns an error if expired token submitted" do
+ {:ok, token} = UserInviteToken.create_token()
+ UserInviteToken.mark_as_used(token.token)
+
+ data = %{
+ "nickname" => "GrimReaper",
+ "email" => "death@reapers.afterlife",
+ "fullname" => "Reaper Grim",
+ "bio" => "Your time has come",
+ "password" => "scythe",
+ "confirm" => "scythe",
+ "token" => token.token
+ }
+
+ {:error, msg} = TwitterAPI.register_user(data)
+
+ assert msg == "Expired token"
+ refute Repo.get_by(User, nickname: "GrimReaper")
+ end
+
test "it returns the error on registration problems" do
data = %{
"nickname" => "lain",
diff --git a/test/web/twitter_api/views/activity_view_test.exs b/test/web/twitter_api/views/activity_view_test.exs
index 5b2a7466b..a101e4ae8 100644
--- a/test/web/twitter_api/views/activity_view_test.exs
+++ b/test/web/twitter_api/views/activity_view_test.exs
@@ -48,7 +48,8 @@ test "a create activity with a note" do
"text" => "Hey @shp!",
"uri" => activity.data["object"]["id"],
"user" => UserView.render("show.json", %{user: user}),
- "visibility" => "direct"
+ "visibility" => "direct",
+ "summary" => nil
}
assert result == expected
diff --git a/test/web/twitter_api/views/user_view_test.exs b/test/web/twitter_api/views/user_view_test.exs
index eea743b32..fefb6bdcc 100644
--- a/test/web/twitter_api/views/user_view_test.exs
+++ b/test/web/twitter_api/views/user_view_test.exs
@@ -20,6 +20,30 @@ test "A user with an avatar object", %{user: user} do
assert represented["profile_image_url"] == image
end
+ test "A user with emoji in username", %{user: user} do
+ expected =
+ " man"
+
+ user = %{
+ user
+ | info: %{
+ "source_data" => %{
+ "tag" => [
+ %{
+ "type" => "Emoji",
+ "icon" => %{"url" => "/file.png"},
+ "name" => ":karjalanpiirakka:"
+ }
+ ]
+ }
+ }
+ }
+
+ user = %{user | name: ":karjalanpiirakka: man"}
+ represented = UserView.render("show.json", %{user: user})
+ assert represented["name_html"] == expected
+ end
+
test "A user" do
note_activity = insert(:note_activity)
user = User.get_cached_by_ap_id(note_activity.data["actor"])
@@ -40,7 +64,9 @@ test "A user" do
"id" => user.id,
"name" => user.name,
"screen_name" => user.nickname,
+ "name_html" => user.name,
"description" => HtmlSanitizeEx.strip_tags(user.bio),
+ "description_html" => HtmlSanitizeEx.strip_tags(user.bio),
"created_at" => user.inserted_at |> Utils.format_naive_asctime(),
"favourites_count" => 0,
"statuses_count" => 1,
@@ -60,7 +86,8 @@ test "A user" do
"cover_photo" => banner,
"background_image" => nil,
"is_local" => true,
- "locked" => false
+ "locked" => false,
+ "default_scope" => "public"
}
assert represented == UserView.render("show.json", %{user: user})
@@ -76,7 +103,9 @@ test "A user for a given other follower", %{user: user} do
"id" => user.id,
"name" => user.name,
"screen_name" => user.nickname,
+ "name_html" => user.name,
"description" => HtmlSanitizeEx.strip_tags(user.bio),
+ "description_html" => HtmlSanitizeEx.strip_tags(user.bio),
"created_at" => user.inserted_at |> Utils.format_naive_asctime(),
"favourites_count" => 0,
"statuses_count" => 0,
@@ -96,7 +125,8 @@ test "A user for a given other follower", %{user: user} do
"cover_photo" => banner,
"background_image" => nil,
"is_local" => true,
- "locked" => false
+ "locked" => false,
+ "default_scope" => "public"
}
assert represented == UserView.render("show.json", %{user: user, for: follower})
@@ -113,7 +143,9 @@ test "A user that follows you", %{user: user} do
"id" => follower.id,
"name" => follower.name,
"screen_name" => follower.nickname,
+ "name_html" => follower.name,
"description" => HtmlSanitizeEx.strip_tags(follower.bio),
+ "description_html" => HtmlSanitizeEx.strip_tags(follower.bio),
"created_at" => follower.inserted_at |> Utils.format_naive_asctime(),
"favourites_count" => 0,
"statuses_count" => 0,
@@ -133,7 +165,8 @@ test "A user that follows you", %{user: user} do
"cover_photo" => banner,
"background_image" => nil,
"is_local" => true,
- "locked" => false
+ "locked" => false,
+ "default_scope" => "public"
}
assert represented == UserView.render("show.json", %{user: follower, for: user})
@@ -157,7 +190,9 @@ test "A blocked user for the blocker" do
"id" => user.id,
"name" => user.name,
"screen_name" => user.nickname,
+ "name_html" => user.name,
"description" => HtmlSanitizeEx.strip_tags(user.bio),
+ "description_html" => HtmlSanitizeEx.strip_tags(user.bio),
"created_at" => user.inserted_at |> Utils.format_naive_asctime(),
"favourites_count" => 0,
"statuses_count" => 0,
@@ -177,7 +212,8 @@ test "A blocked user for the blocker" do
"cover_photo" => banner,
"background_image" => nil,
"is_local" => true,
- "locked" => false
+ "locked" => false,
+ "default_scope" => "public"
}
blocker = Repo.get(User, blocker.id)