From 8f285a787f7af0436de18ac140712801a69eff05 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 21 Jun 2024 13:24:47 -0400 Subject: [PATCH 01/74] Refactor backups to be fully controlled by Oban --- changelog.d/backups-refactor.change | 1 + config/test.exs | 2 + lib/pleroma/ecto_enums.ex | 8 - lib/pleroma/emails/user_email.ex | 35 +- lib/pleroma/user/backup.ex | 366 ++++++++---------- .../controllers/admin_api_controller.ex | 5 +- .../operations/pleroma_backup_operation.ex | 10 +- .../controllers/backup_controller.ex | 2 +- .../web/pleroma_api/views/backup_view.ex | 10 - lib/pleroma/workers/backup_worker.ex | 47 +-- .../20240622175346_backup_refactor.exs | 19 + 11 files changed, 209 insertions(+), 296 deletions(-) create mode 100644 changelog.d/backups-refactor.change create mode 100644 priv/repo/migrations/20240622175346_backup_refactor.exs diff --git a/changelog.d/backups-refactor.change b/changelog.d/backups-refactor.change new file mode 100644 index 000000000..47fc74138 --- /dev/null +++ b/changelog.d/backups-refactor.change @@ -0,0 +1 @@ +Refactor the user backups code and improve test coverage diff --git a/config/test.exs b/config/test.exs index 410b9bbab..2a007a22d 100644 --- a/config/test.exs +++ b/config/test.exs @@ -187,6 +187,8 @@ config :pleroma, Pleroma.Emoji.Loader, test_emoji: true config :pleroma, Pleroma.Web.RichMedia.Backfill, stream_out: Pleroma.Web.ActivityPub.ActivityPubMock +config :pleroma, Pleroma.User.Backup, tempdir: "test/tmp" + if File.exists?("./config/test.secret.exs") do import_config "test.secret.exs" else diff --git a/lib/pleroma/ecto_enums.ex b/lib/pleroma/ecto_enums.ex index b346b39d6..a4890b489 100644 --- a/lib/pleroma/ecto_enums.ex +++ b/lib/pleroma/ecto_enums.ex @@ -27,11 +27,3 @@ defenum(Pleroma.DataMigration.State, failed: 4, manual: 5 ) - -defenum(Pleroma.User.Backup.State, - pending: 1, - running: 2, - complete: 3, - failed: 4, - invalid: 5 -) diff --git a/lib/pleroma/emails/user_email.ex b/lib/pleroma/emails/user_email.ex index 95b963764..10d89d2f3 100644 --- a/lib/pleroma/emails/user_email.ex +++ b/lib/pleroma/emails/user_email.ex @@ -345,37 +345,22 @@ defmodule Pleroma.Emails.UserEmail do Router.Helpers.subscription_url(Endpoint, :unsubscribe, token) end - def backup_is_ready_email(backup, admin_user_id \\ nil) do + def backup_is_ready_email(backup) do %{user: user} = Pleroma.Repo.preload(backup, :user) Gettext.with_locale_or_default user.language do download_url = Pleroma.Web.PleromaAPI.BackupView.download_url(backup) html_body = - if is_nil(admin_user_id) do - Gettext.dpgettext( - "static_pages", - "account archive email body - self-requested", - """ -

You requested a full backup of your Pleroma account. It's ready for download:

-

%{download_url}

- """, - download_url: download_url - ) - else - admin = Pleroma.Repo.get(User, admin_user_id) - - Gettext.dpgettext( - "static_pages", - "account archive email body - admin requested", - """ -

Admin @%{admin_nickname} requested a full backup of your Pleroma account. It's ready for download:

-

%{download_url}

- """, - admin_nickname: admin.nickname, - download_url: download_url - ) - end + Gettext.dpgettext( + "static_pages", + "account archive email body", + """ +

A full backup of your Pleroma account was requested. It's ready for download:

+

%{download_url}

+ """, + download_url: download_url + ) new() |> to(recipient(user)) diff --git a/lib/pleroma/user/backup.ex b/lib/pleroma/user/backup.ex index 1821de667..2568089a4 100644 --- a/lib/pleroma/user/backup.ex +++ b/lib/pleroma/user/backup.ex @@ -14,9 +14,10 @@ defmodule Pleroma.User.Backup do alias Pleroma.Activity alias Pleroma.Bookmark + alias Pleroma.Config alias Pleroma.Repo + alias Pleroma.Uploaders.Uploader alias Pleroma.User - alias Pleroma.User.Backup.State alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Transmogrifier alias Pleroma.Web.ActivityPub.UserView @@ -29,71 +30,111 @@ defmodule Pleroma.User.Backup do field(:file_name, :string) field(:file_size, :integer, default: 0) field(:processed, :boolean, default: false) - field(:state, State, default: :invalid) - field(:processed_number, :integer, default: 0) + field(:tempdir, :string) belongs_to(:user, User, type: FlakeId.Ecto.CompatType) timestamps() end - @config_impl Application.compile_env(:pleroma, [__MODULE__, :config_impl], Pleroma.Config) + @doc """ + Schedules a job to backup a user if the number of backup requests has not exceeded the limit. - def create(user, admin_id \\ nil) do - with :ok <- validate_limit(user, admin_id), - {:ok, backup} <- user |> new() |> Repo.insert() do - BackupWorker.process(backup, admin_id) + Admins can directly call new/1 and schedule_backup/1 to bypass the limit. + """ + @spec user(User.t()) :: {:ok, t()} | {:error, any()} + def user(user) do + days = Config.get([__MODULE__, :limit_days]) + + with true <- permitted?(user), + %__MODULE__{} = backup <- new(user), + {:ok, inserted_backup} <- Repo.insert(backup), + {:ok, %Oban.Job{}} <- schedule_backup(inserted_backup) do + {:ok, inserted_backup} + else + false -> + {:error, + dngettext( + "errors", + "Last export was less than a day ago", + "Last export was less than %{days} days ago", + days, + days: days + )} + + e -> + {:error, e} end end + @doc "Generates a %Backup{} for a user with a random file name" + @spec new(User.t()) :: t() def new(user) do rand_str = :crypto.strong_rand_bytes(32) |> Base.url_encode64(padding: false) datetime = Calendar.NaiveDateTime.Format.iso8601_basic(NaiveDateTime.utc_now()) name = "archive-#{user.nickname}-#{datetime}-#{rand_str}.zip" %__MODULE__{ - user_id: user.id, content_type: "application/zip", file_name: name, - state: :pending + tempdir: tempdir(), + user: user } end - def delete(backup) do - uploader = Pleroma.Config.get([Pleroma.Upload, :uploader]) + @doc "Schedules the execution of the provided backup" + @spec schedule_backup(t()) :: {:ok, Oban.Job.t()} | {:error, any()} + def schedule_backup(backup) do + with false <- is_nil(backup.id) do + %{"op" => "process", "backup_id" => backup.id} + |> BackupWorker.new() + |> Oban.insert() + else + true -> + {:error, "Backup is missing id. Please insert it into the Repo first."} + + e -> + {:error, e} + end + end + + @doc "Deletes the backup archive file and removes the database record" + @spec delete_archive(t()) :: {:ok, Ecto.Schema.t()} | {:error, Ecto.Changeset.t()} + def delete_archive(backup) do + uploader = Config.get([Pleroma.Upload, :uploader]) with :ok <- uploader.delete_file(Path.join("backups", backup.file_name)) do Repo.delete(backup) end end - defp validate_limit(_user, admin_id) when is_binary(admin_id), do: :ok + @doc "Schedules a job to delete the backup archive" + @spec schedule_delete(t()) :: {:ok, Oban.Job.t()} | {:error, any()} + def schedule_delete(backup) do + days = Config.get([__MODULE__, :purge_after_days]) + time = 60 * 60 * 24 * days + scheduled_at = Calendar.NaiveDateTime.add!(backup.inserted_at, time) - defp validate_limit(user, nil) do - case get_last(user.id) do - %__MODULE__{inserted_at: inserted_at} -> - days = Pleroma.Config.get([__MODULE__, :limit_days]) - diff = Timex.diff(NaiveDateTime.utc_now(), inserted_at, :days) + %{"op" => "delete", "backup_id" => backup.id} + |> BackupWorker.new(scheduled_at: scheduled_at) + |> Oban.insert() + end - if diff > days do - :ok - else - {:error, - dngettext( - "errors", - "Last export was less than a day ago", - "Last export was less than %{days} days ago", - days, - days: days - )} - end - - nil -> - :ok + defp permitted?(user) do + with {_, %__MODULE__{inserted_at: inserted_at}} <- {:last, get_last(user)}, + days = Config.get([__MODULE__, :limit_days]), + diff = Timex.diff(NaiveDateTime.utc_now(), inserted_at, :days), + {_, true} <- {:diff, diff > days} do + true + else + {:last, nil} -> true + {:diff, false} -> false end end - def get_last(user_id) do + @doc "Returns last backup for the provided user" + @spec get_last(User.t()) :: t() + def get_last(%User{id: user_id}) do __MODULE__ |> where(user_id: ^user_id) |> order_by(desc: :id) @@ -101,6 +142,8 @@ defmodule Pleroma.User.Backup do |> Repo.one() end + @doc "Lists all existing backups for a user" + @spec list(User.t()) :: [Ecto.Schema.t() | term()] def list(%User{id: user_id}) do __MODULE__ |> where(user_id: ^user_id) @@ -108,94 +151,37 @@ defmodule Pleroma.User.Backup do |> Repo.all() end - def remove_outdated(%__MODULE__{id: latest_id, user_id: user_id}) do - __MODULE__ - |> where(user_id: ^user_id) - |> where([b], b.id != ^latest_id) - |> Repo.all() - |> Enum.each(&BackupWorker.delete/1) - end - - def get(id), do: Repo.get(__MODULE__, id) - - defp set_state(backup, state, processed_number \\ nil) do - struct = - %{state: state} - |> Pleroma.Maps.put_if_present(:processed_number, processed_number) - - backup - |> cast(struct, [:state, :processed_number]) - |> Repo.update() - end - - def process( - %__MODULE__{} = backup, - processor_module \\ __MODULE__.Processor - ) do - set_state(backup, :running, 0) - - current_pid = self() - - task = - Task.Supervisor.async_nolink( - Pleroma.TaskSupervisor, - processor_module, - :do_process, - [backup, current_pid] - ) - - wait_backup(backup, backup.processed_number, task) - end - - defp wait_backup(backup, current_processed, task) do - wait_time = @config_impl.get([__MODULE__, :process_wait_time]) - - receive do - {:progress, new_processed} -> - total_processed = current_processed + new_processed - - set_state(backup, :running, total_processed) - wait_backup(backup, total_processed, task) - - {:DOWN, _ref, _proc, _pid, reason} -> - backup = get(backup.id) - - if reason != :normal do - Logger.error("Backup #{backup.id} process ended abnormally: #{inspect(reason)}") - - {:ok, backup} = set_state(backup, :failed) - - cleanup(backup) - - {:error, - %{ - backup: backup, - reason: :exit, - details: reason - }} - else - {:ok, backup} - end - after - wait_time -> - Logger.error( - "Backup #{backup.id} timed out after no response for #{wait_time}ms, terminating" - ) - - Task.Supervisor.terminate_child(Pleroma.TaskSupervisor, task.pid) - - {:ok, backup} = set_state(backup, :failed) - - cleanup(backup) - - {:error, - %{ - backup: backup, - reason: :timeout - }} + @doc "Schedules deletion of all but the the most recent backup" + @spec remove_outdated(User.t()) :: :ok + def remove_outdated(user) do + with %__MODULE__{} = latest_backup <- get_last(user) do + __MODULE__ + |> where(user_id: ^user.id) + |> where([b], b.id != ^latest_backup.id) + |> Repo.all() + |> Enum.each(&schedule_delete/1) + else + _ -> :ok end end + def get_by_id(id), do: Repo.get(__MODULE__, id) + + @doc "Generates changeset for %Pleroma.User.Backup{}" + @spec changeset(%__MODULE__{}, map()) :: %Ecto.Changeset{} + def changeset(backup \\ %__MODULE__{}, attrs) do + backup + |> cast(attrs, [:content_type, :file_name, :file_size, :processed, :tempdir]) + end + + @doc "Updates the backup record" + @spec update_record(%__MODULE__{}, map()) :: {:ok, %__MODULE__{}} | {:error, %Ecto.Changeset{}} + def update_record(%__MODULE__{} = backup, attrs) do + backup + |> changeset(attrs) + |> Repo.update() + end + @files [ ~c"actor.json", ~c"outbox.json", @@ -204,53 +190,66 @@ defmodule Pleroma.User.Backup do ~c"followers.json", ~c"following.json" ] - @spec export(Pleroma.User.Backup.t(), pid()) :: {:ok, String.t()} | :error - def export(%__MODULE__{} = backup, caller_pid) do - backup = Repo.preload(backup, :user) - dir = backup_tempdir(backup) - with :ok <- File.mkdir(dir), - :ok <- actor(dir, backup.user, caller_pid), - :ok <- statuses(dir, backup.user, caller_pid), - :ok <- likes(dir, backup.user, caller_pid), - :ok <- bookmarks(dir, backup.user, caller_pid), - :ok <- followers(dir, backup.user, caller_pid), - :ok <- following(dir, backup.user, caller_pid), - {:ok, zip_path} <- :zip.create(backup.file_name, @files, cwd: dir), - {:ok, _} <- File.rm_rf(dir) do - {:ok, zip_path} + @spec run(t()) :: {:ok, t()} | {:error, :failed} + def run(%__MODULE__{} = backup) do + backup = Repo.preload(backup, :user) + tempfile = Path.join([backup.tempdir, backup.file_name]) + + with {_, :ok} <- {:mkdir, File.mkdir_p(backup.tempdir)}, + {_, :ok} <- {:actor, actor(backup.tempdir, backup.user)}, + {_, :ok} <- {:statuses, statuses(backup.tempdir, backup.user)}, + {_, :ok} <- {:likes, likes(backup.tempdir, backup.user)}, + {_, :ok} <- {:bookmarks, bookmarks(backup.tempdir, backup.user)}, + {_, :ok} <- {:followers, followers(backup.tempdir, backup.user)}, + {_, :ok} <- {:following, following(backup.tempdir, backup.user)}, + {_, {:ok, _zip_path}} <- + {:zip, :zip.create(to_charlist(tempfile), @files, cwd: to_charlist(backup.tempdir))}, + {_, {:ok, %File.Stat{size: zip_size}}} <- {:filestat, File.stat(tempfile)}, + {:ok, updated_backup} <- update_record(backup, %{file_size: zip_size}) do + {:ok, updated_backup} else - _ -> :error + _ -> + File.rm_rf(backup.tempdir) + {:error, :failed} end end - def dir(name) do - dir = Pleroma.Config.get([__MODULE__, :dir]) || System.tmp_dir!() - Path.join(dir, name) + defp tempdir do + case Config.get([__MODULE__, :tempdir]) do + nil -> + System.tmp_dir!() + + path -> + rand = :crypto.strong_rand_bytes(8) |> Base.url_encode64(padding: false) + Path.join([path, rand]) + end end - def upload(%__MODULE__{} = backup, zip_path) do - uploader = Pleroma.Config.get([Pleroma.Upload, :uploader]) + @doc "Uploads the completed backup and marks it as processed" + @spec upload(t()) :: {:ok, t()} + def upload(%__MODULE__{tempdir: tempdir} = backup) when is_binary(tempdir) do + uploader = Config.get([Pleroma.Upload, :uploader]) upload = %Pleroma.Upload{ name: backup.file_name, - tempfile: zip_path, + tempfile: Path.join([tempdir, backup.file_name]), content_type: backup.content_type, path: Path.join("backups", backup.file_name) } - with {:ok, _} <- Pleroma.Uploaders.Uploader.put_file(uploader, upload), - :ok <- File.rm(zip_path) do - {:ok, upload} + with {:ok, _} <- Uploader.put_file(uploader, upload), + {:ok, uploaded_backup} <- update_record(backup, %{processed: true}), + {:ok, _} <- File.rm_rf(tempdir) do + {:ok, uploaded_backup} end end - defp actor(dir, user, caller_pid) do + defp actor(dir, user) do with {:ok, json} <- UserView.render("user.json", %{user: user}) |> Map.merge(%{"likes" => "likes.json", "bookmarks" => "bookmarks.json"}) |> Jason.encode() do - send(caller_pid, {:progress, 1}) File.write(Path.join(dir, "actor.json"), json) end end @@ -269,22 +268,10 @@ defmodule Pleroma.User.Backup do ) end - defp should_report?(num, chunk_size), do: rem(num, chunk_size) == 0 - - defp backup_tempdir(backup) do - name = String.trim_trailing(backup.file_name, ".zip") - dir(name) - end - - defp cleanup(backup) do - dir = backup_tempdir(backup) - File.rm_rf(dir) - end - - defp write(query, dir, name, fun, caller_pid) do + defp write(query, dir, name, fun) do path = Path.join(dir, "#{name}.json") - chunk_size = Pleroma.Config.get([__MODULE__, :process_chunk_size]) + chunk_size = Config.get([__MODULE__, :process_chunk_size]) with {:ok, file} <- File.open(path, [:write, :utf8]), :ok <- write_header(file, name) do @@ -300,10 +287,6 @@ defmodule Pleroma.User.Backup do end), {:ok, str} <- Jason.encode(data), :ok <- IO.write(file, str <> ",\n") do - if should_report?(acc + 1, chunk_size) do - send(caller_pid, {:progress, chunk_size}) - end - acc + 1 else {:error, e} -> @@ -318,31 +301,29 @@ defmodule Pleroma.User.Backup do end end) - send(caller_pid, {:progress, rem(total, chunk_size)}) - with :ok <- :file.pwrite(file, {:eof, -2}, "\n],\n \"totalItems\": #{total}}") do File.close(file) end end end - defp bookmarks(dir, %{id: user_id} = _user, caller_pid) do + defp bookmarks(dir, %{id: user_id} = _user) do Bookmark |> where(user_id: ^user_id) |> join(:inner, [b], activity in assoc(b, :activity)) |> select([b, a], %{id: b.id, object: fragment("(?)->>'object'", a.data)}) - |> write(dir, "bookmarks", fn a -> {:ok, a.object} end, caller_pid) + |> write(dir, "bookmarks", fn a -> {:ok, a.object} end) end - defp likes(dir, user, caller_pid) do + defp likes(dir, user) do user.ap_id |> Activity.Queries.by_actor() |> Activity.Queries.by_type("Like") |> select([like], %{id: like.id, object: fragment("(?)->>'object'", like.data)}) - |> write(dir, "likes", fn a -> {:ok, a.object} end, caller_pid) + |> write(dir, "likes", fn a -> {:ok, a.object} end) end - defp statuses(dir, user, caller_pid) do + defp statuses(dir, user) do opts = %{} |> Map.put(:type, ["Create", "Announce"]) @@ -362,52 +343,17 @@ defmodule Pleroma.User.Backup do with {:ok, activity} <- Transmogrifier.prepare_outgoing(a.data) do {:ok, Map.delete(activity, "@context")} end - end, - caller_pid + end ) end - defp followers(dir, user, caller_pid) do + defp followers(dir, user) do User.get_followers_query(user) - |> write(dir, "followers", fn a -> {:ok, a.ap_id} end, caller_pid) + |> write(dir, "followers", fn a -> {:ok, a.ap_id} end) end - defp following(dir, user, caller_pid) do + defp following(dir, user) do User.get_friends_query(user) - |> write(dir, "following", fn a -> {:ok, a.ap_id} end, caller_pid) - end -end - -defmodule Pleroma.User.Backup.ProcessorAPI do - @callback do_process(%Pleroma.User.Backup{}, pid()) :: - {:ok, %Pleroma.User.Backup{}} | {:error, any()} -end - -defmodule Pleroma.User.Backup.Processor do - @behaviour Pleroma.User.Backup.ProcessorAPI - - alias Pleroma.Repo - alias Pleroma.User.Backup - - import Ecto.Changeset - - @impl true - def do_process(backup, current_pid) do - with {:ok, zip_file} <- Backup.export(backup, current_pid), - {:ok, %{size: size}} <- File.stat(zip_file), - {:ok, _upload} <- Backup.upload(backup, zip_file) do - backup - |> cast( - %{ - file_size: size, - processed: true, - state: :complete - }, - [:file_size, :processed, :state] - ) - |> Repo.update() - else - e -> {:error, e} - end + |> write(dir, "following", fn a -> {:ok, a.ap_id} end) end end diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 1894000ff..0f22dd538 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do alias Pleroma.ModerationLog alias Pleroma.Stats alias Pleroma.User + alias Pleroma.User.Backup alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.AdminAPI alias Pleroma.Web.AdminAPI.AccountView @@ -429,7 +430,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do def create_backup(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname}) do with %User{} = user <- User.get_by_nickname(nickname), - {:ok, _} <- Pleroma.User.Backup.create(user, admin.id) do + %Backup{} = backup <- Backup.new(user), + {:ok, inserted_backup} <- Pleroma.Repo.insert(backup), + {:ok, %Oban.Job{}} <- Backup.schedule_backup(inserted_backup) do ModerationLog.insert_log(%{actor: admin, subject: user, action: "create_backup"}) json(conn, "") diff --git a/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex index 400f3825d..86f709515 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex @@ -65,12 +65,7 @@ defmodule Pleroma.Web.ApiSpec.PleromaBackupOperation do file_name: %Schema{type: :string}, file_size: %Schema{type: :integer}, processed: %Schema{type: :boolean, description: "whether this backup has succeeded"}, - state: %Schema{ - type: :string, - description: "the state of the backup", - enum: ["pending", "running", "complete", "failed"] - }, - processed_number: %Schema{type: :integer, description: "the number of records processed"} + tempdir: %Schema{type: :string} }, example: %{ "content_type" => "application/zip", @@ -79,8 +74,7 @@ defmodule Pleroma.Web.ApiSpec.PleromaBackupOperation do "file_size" => 4105, "inserted_at" => "2020-09-08T16:42:07.000Z", "processed" => true, - "state" => "complete", - "processed_number" => 20 + "tempdir" => "/tmp/PZIMw40vmpM" } } end diff --git a/lib/pleroma/web/pleroma_api/controllers/backup_controller.ex b/lib/pleroma/web/pleroma_api/controllers/backup_controller.ex index b9daed22b..0115ec645 100644 --- a/lib/pleroma/web/pleroma_api/controllers/backup_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/backup_controller.ex @@ -20,7 +20,7 @@ defmodule Pleroma.Web.PleromaAPI.BackupController do end def create(%{assigns: %{user: user}} = conn, _params) do - with {:ok, _} <- Backup.create(user) do + with {:ok, _} <- Backup.user(user) do backups = Backup.list(user) render(conn, "index.json", backups: backups) end diff --git a/lib/pleroma/web/pleroma_api/views/backup_view.ex b/lib/pleroma/web/pleroma_api/views/backup_view.ex index 20403aeee..d778590f0 100644 --- a/lib/pleroma/web/pleroma_api/views/backup_view.ex +++ b/lib/pleroma/web/pleroma_api/views/backup_view.ex @@ -9,22 +9,12 @@ defmodule Pleroma.Web.PleromaAPI.BackupView do alias Pleroma.Web.CommonAPI.Utils def render("show.json", %{backup: %Backup{} = backup}) do - # To deal with records before the migration - state = - if backup.state == :invalid do - if backup.processed, do: :complete, else: :failed - else - backup.state - end - %{ id: backup.id, content_type: backup.content_type, url: download_url(backup), file_size: backup.file_size, processed: backup.processed, - state: to_string(state), - processed_number: backup.processed_number, inserted_at: Utils.to_masto_date(backup.inserted_at) } end diff --git a/lib/pleroma/workers/backup_worker.ex b/lib/pleroma/workers/backup_worker.ex index 54ac31a3c..41f404e69 100644 --- a/lib/pleroma/workers/backup_worker.ex +++ b/lib/pleroma/workers/backup_worker.ex @@ -8,44 +8,25 @@ defmodule Pleroma.Workers.BackupWorker do alias Oban.Job alias Pleroma.User.Backup - def process(backup, admin_user_id \\ nil) do - %{"op" => "process", "backup_id" => backup.id, "admin_user_id" => admin_user_id} - |> new() - |> Oban.insert() - end - - def schedule_deletion(backup) do - days = Pleroma.Config.get([Backup, :purge_after_days]) - time = 60 * 60 * 24 * days - scheduled_at = Calendar.NaiveDateTime.add!(backup.inserted_at, time) - - %{"op" => "delete", "backup_id" => backup.id} - |> new(scheduled_at: scheduled_at) - |> Oban.insert() - end - - def delete(backup) do - %{"op" => "delete", "backup_id" => backup.id} - |> new() - |> Oban.insert() - end - @impl Oban.Worker def perform(%Job{ - args: %{"op" => "process", "backup_id" => backup_id, "admin_user_id" => admin_user_id} + args: %{"op" => "process", "backup_id" => backup_id} }) do - with {:ok, %Backup{} = backup} <- - backup_id |> Backup.get() |> Backup.process(), - {:ok, _job} <- schedule_deletion(backup), - :ok <- Backup.remove_outdated(backup), - :ok <- maybe_deliver_email(backup, admin_user_id) do - {:ok, backup} + with {_, %Backup{} = backup} <- {:get, Backup.get_by_id(backup_id)}, + {_, {:ok, updated_backup}} <- {:run, Backup.run(backup)}, + {_, {:ok, uploaded_backup}} <- {:upload, Backup.upload(updated_backup)}, + {_, {:ok, _job}} <- {:delete, Backup.schedule_delete(uploaded_backup)}, + {_, :ok} <- {:outdated, Backup.remove_outdated(uploaded_backup.user)}, + {_, :ok} <- {:email, maybe_deliver_email(uploaded_backup)} do + {:ok, uploaded_backup} + else + e -> {:error, e} end end def perform(%Job{args: %{"op" => "delete", "backup_id" => backup_id}}) do - case Backup.get(backup_id) do - %Backup{} = backup -> Backup.delete(backup) + case Backup.get_by_id(backup_id) do + %Backup{} = backup -> Backup.delete_archive(backup) nil -> :ok end end @@ -57,13 +38,13 @@ defmodule Pleroma.Workers.BackupWorker do not is_nil(user.email) and user.email != "" end - defp maybe_deliver_email(backup, admin_user_id) do + defp maybe_deliver_email(backup) do has_mailer = Pleroma.Config.get([Pleroma.Emails.Mailer, :enabled]) backup = backup |> Pleroma.Repo.preload(:user) if has_email?(backup.user) and has_mailer do backup - |> Pleroma.Emails.UserEmail.backup_is_ready_email(admin_user_id) + |> Pleroma.Emails.UserEmail.backup_is_ready_email() |> Pleroma.Emails.Mailer.deliver() :ok diff --git a/priv/repo/migrations/20240622175346_backup_refactor.exs b/priv/repo/migrations/20240622175346_backup_refactor.exs new file mode 100644 index 000000000..5dfc55789 --- /dev/null +++ b/priv/repo/migrations/20240622175346_backup_refactor.exs @@ -0,0 +1,19 @@ +defmodule Pleroma.Repo.Migrations.BackupRefactor do + use Ecto.Migration + + def up do + alter table("backups") do + remove(:state) + remove(:processed_number) + add(:tempdir, :string) + end + end + + def down do + alter table("backups") do + add(:state, :integer, default: 5) + add(:processed_number, :integer, default: 0) + remove(:tempdir) + end + end +end From e5a738d465fa3cb16a5737b03561523059ed727c Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 24 Jun 2024 10:10:53 -0400 Subject: [PATCH 02/74] Refactor tests for Backups --- test/pleroma/user/backup_async_test.exs | 49 ----- test/pleroma/user/backup_test.exs | 175 +++++++----------- .../controllers/admin_api_controller_test.exs | 8 +- .../controllers/backup_controller_test.exs | 4 +- .../pleroma_api/views/backup_view_test.exs | 35 +--- test/support/mocks.ex | 2 - 6 files changed, 80 insertions(+), 193 deletions(-) delete mode 100644 test/pleroma/user/backup_async_test.exs diff --git a/test/pleroma/user/backup_async_test.exs b/test/pleroma/user/backup_async_test.exs deleted file mode 100644 index b0e9413be..000000000 --- a/test/pleroma/user/backup_async_test.exs +++ /dev/null @@ -1,49 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2023 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.User.BackupAsyncTest do - use Pleroma.DataCase, async: true - - import Pleroma.Factory - import Mox - - alias Pleroma.UnstubbedConfigMock, as: ConfigMock - alias Pleroma.User.Backup - alias Pleroma.User.Backup.ProcessorMock - - setup do - user = insert(:user, %{nickname: "cofe", name: "Cofe", ap_id: "http://cofe.io/users/cofe"}) - - {:ok, backup} = user |> Backup.new() |> Repo.insert() - %{backup: backup} - end - - test "it handles unrecoverable exceptions", %{backup: backup} do - ProcessorMock - |> expect(:do_process, fn _, _ -> - raise "mock exception" - end) - - ConfigMock - |> stub_with(Pleroma.Config) - - {:error, %{backup: backup, reason: :exit}} = Backup.process(backup, ProcessorMock) - - assert backup.state == :failed - end - - test "it handles timeouts", %{backup: backup} do - ProcessorMock - |> expect(:do_process, fn _, _ -> - Process.sleep(:timer.seconds(4)) - end) - - ConfigMock - |> expect(:get, fn [Pleroma.User.Backup, :process_wait_time] -> :timer.seconds(2) end) - - {:error, %{backup: backup, reason: :timeout}} = Backup.process(backup, ProcessorMock) - - assert backup.state == :failed - end -end diff --git a/test/pleroma/user/backup_test.exs b/test/pleroma/user/backup_test.exs index d82d1719b..24fe09f7e 100644 --- a/test/pleroma/user/backup_test.exs +++ b/test/pleroma/user/backup_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.User.BackupTest do use Oban.Testing, repo: Pleroma.Repo use Pleroma.DataCase - import Mock import Pleroma.Factory import Swoosh.TestAssertions import Mox @@ -16,7 +15,6 @@ defmodule Pleroma.User.BackupTest do alias Pleroma.UnstubbedConfigMock, as: ConfigMock alias Pleroma.Uploaders.S3.ExAwsMock alias Pleroma.User.Backup - alias Pleroma.User.Backup.ProcessorMock alias Pleroma.Web.CommonAPI alias Pleroma.Workers.BackupWorker @@ -28,79 +26,56 @@ defmodule Pleroma.User.BackupTest do ConfigMock |> stub_with(Pleroma.Config) - ProcessorMock - |> stub_with(Pleroma.User.Backup.Processor) - :ok end test "it does not requrie enabled email" do clear_config([Pleroma.Emails.Mailer, :enabled], false) user = insert(:user) - assert {:ok, _} = Backup.create(user) + assert {:ok, _} = Backup.user(user) end test "it does not require user's email" do user = insert(:user, %{email: nil}) - assert {:ok, _} = Backup.create(user) + assert {:ok, _} = Backup.user(user) end test "it creates a backup record and an Oban job" do - %{id: user_id} = user = insert(:user) - assert {:ok, %Oban.Job{args: args}} = Backup.create(user) + user = insert(:user) + assert {:ok, %Backup{} = backup} = Backup.user(user) + assert {:ok, %Oban.Job{args: args}} = Backup.schedule_backup(backup) assert_enqueued(worker: BackupWorker, args: args) - backup = Backup.get(args["backup_id"]) - assert %Backup{user_id: ^user_id, processed: false, file_size: 0, state: :pending} = backup + backup = Backup.get_by_id(args["backup_id"]) + assert %Backup{processed: false, file_size: 0} = backup end test "it return an error if the export limit is over" do - %{id: user_id} = user = insert(:user) + user = insert(:user) limit_days = Pleroma.Config.get([Backup, :limit_days]) - assert {:ok, %Oban.Job{args: args}} = Backup.create(user) - backup = Backup.get(args["backup_id"]) - assert %Backup{user_id: ^user_id, processed: false, file_size: 0} = backup + {:ok, first_backup} = Backup.user(user) + {:ok, _run_backup} = Backup.run(first_backup) - assert Backup.create(user) == {:error, "Last export was less than #{limit_days} days ago"} + assert Backup.user(user) == {:error, "Last export was less than #{limit_days} days ago"} end test "it process a backup record" do clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) %{id: user_id} = user = insert(:user) - assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user) - assert {:ok, backup} = perform_job(BackupWorker, args) + assert {:ok, %Backup{id: backup_id}} = Backup.user(user) + + oban_args = %{"op" => "process", "backup_id" => backup_id} + + assert {:ok, backup} = perform_job(BackupWorker, oban_args) assert backup.file_size > 0 - assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id, state: :complete} = backup + assert match?(%Backup{id: ^backup_id, processed: true, user_id: ^user_id}, backup) delete_job_args = %{"op" => "delete", "backup_id" => backup_id} assert_enqueued(worker: BackupWorker, args: delete_job_args) assert {:ok, backup} = perform_job(BackupWorker, delete_job_args) - refute Backup.get(backup_id) - - email = Pleroma.Emails.UserEmail.backup_is_ready_email(backup) - - assert_email_sent( - to: {user.name, user.email}, - html_body: email.html_body - ) - end - - test "it updates states of the backup" do - clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) - %{id: user_id} = user = insert(:user) - - assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user) - assert {:ok, backup} = perform_job(BackupWorker, args) - assert backup.file_size > 0 - assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id, state: :complete} = backup - - delete_job_args = %{"op" => "delete", "backup_id" => backup_id} - - assert_enqueued(worker: BackupWorker, args: delete_job_args) - assert {:ok, backup} = perform_job(BackupWorker, delete_job_args) - refute Backup.get(backup_id) + refute Backup.get_by_id(backup_id) email = Pleroma.Emails.UserEmail.backup_is_ready_email(backup) @@ -114,10 +89,15 @@ defmodule Pleroma.User.BackupTest do clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) %{id: user_id} = user = insert(:user, %{email: nil}) - assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user) - assert {:ok, backup} = perform_job(BackupWorker, args) - assert backup.file_size > 0 - assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id} = backup + assert {:ok, %Backup{} = backup} = Backup.user(user) + + expected_args = %{"op" => "process", "backup_id" => backup.id} + + assert_enqueued(worker: BackupWorker, args: %{"backup_id" => backup.id}) + assert {:ok, completed_backup} = perform_job(BackupWorker, expected_args) + assert completed_backup.file_size > 0 + assert completed_backup.processed + assert completed_backup.user_id == user_id assert_no_email_sent() end @@ -127,10 +107,13 @@ defmodule Pleroma.User.BackupTest do clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) %{id: user_id} = user = insert(:user) - assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user) - assert {:ok, backup} = perform_job(BackupWorker, args) + assert {:ok, %Backup{id: backup_id}} = Backup.user(user) + + oban_args = %{"op" => "process", "backup_id" => backup_id} + + assert {:ok, backup} = perform_job(BackupWorker, oban_args) assert backup.file_size > 0 - assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id} = backup + assert match?(%Backup{id: ^backup_id, processed: true, user_id: ^user_id}, backup) assert_no_email_sent() end @@ -139,10 +122,15 @@ defmodule Pleroma.User.BackupTest do clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) %{id: user_id} = user = insert(:user, %{email: ""}) - assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user) - assert {:ok, backup} = perform_job(BackupWorker, args) + assert {:ok, %Backup{id: backup_id} = backup} = Backup.user(user) + + expected_args = %{"op" => "process", "backup_id" => backup.id} + + assert_enqueued(worker: BackupWorker, args: expected_args) + + assert {:ok, backup} = perform_job(BackupWorker, expected_args) assert backup.file_size > 0 - assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id} = backup + assert match?(%Backup{id: ^backup_id, processed: true, user_id: ^user_id}, backup) assert_no_email_sent() end @@ -152,16 +140,13 @@ defmodule Pleroma.User.BackupTest do clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) user = insert(:user) - assert {:ok, job1} = Backup.create(user) - - assert {:ok, %Backup{}} = ObanHelpers.perform(job1) - assert {:ok, job2} = Backup.create(user) - assert Pleroma.Repo.aggregate(Backup, :count) == 2 - assert {:ok, backup2} = ObanHelpers.perform(job2) + assert {:ok, %{id: backup_one_id}} = Backup.user(user) + assert {:ok, %{id: _backup_two_id}} = Backup.user(user) + # Run the backups ObanHelpers.perform_all() - assert [^backup2] = Pleroma.Repo.all(Backup) + assert_enqueued(worker: BackupWorker, args: %{"op" => "delete", "backup_id" => backup_one_id}) end test "it creates a zip archive with user data" do @@ -185,9 +170,12 @@ defmodule Pleroma.User.BackupTest do CommonAPI.follow(other_user, user) - assert {:ok, backup} = user |> Backup.new() |> Repo.insert() - assert {:ok, path} = Backup.export(backup, self()) - assert {:ok, zipfile} = :zip.zip_open(String.to_charlist(path), [:memory]) + assert {:ok, backup} = Backup.user(user) + assert {:ok, run_backup} = Backup.run(backup) + + tempfile = Path.join([run_backup.tempdir, run_backup.file_name]) + + assert {:ok, zipfile} = :zip.zip_open(String.to_charlist(tempfile), [:memory]) assert {:ok, {~c"actor.json", json}} = :zip.zip_get(~c"actor.json", zipfile) assert %{ @@ -275,10 +263,10 @@ defmodule Pleroma.User.BackupTest do } = Jason.decode!(json) :zip.zip_close(zipfile) - File.rm!(path) + File.rm_rf!(run_backup.tempdir) end - test "it counts the correct number processed" do + test "correct number processed" do user = insert(:user, %{nickname: "cofe", name: "Cofe", ap_id: "http://cofe.io/users/cofe"}) Enum.map(1..120, fn i -> @@ -288,43 +276,21 @@ defmodule Pleroma.User.BackupTest do end) assert {:ok, backup} = user |> Backup.new() |> Repo.insert() - {:ok, backup} = Backup.process(backup) + {:ok, backup} = Backup.run(backup) - assert backup.processed_number == 1 + 120 + 120 + 120 + zip_path = Path.join([backup.tempdir, backup.file_name]) - Backup.delete(backup) - end + assert {:ok, zipfile} = :zip.zip_open(String.to_charlist(zip_path), [:memory]) - test "it handles errors" do - user = insert(:user, %{nickname: "cofe", name: "Cofe", ap_id: "http://cofe.io/users/cofe"}) + backup_parts = [~c"likes.json", ~c"bookmarks.json", ~c"outbox.json"] - Enum.map(1..120, fn i -> - {:ok, _status} = CommonAPI.post(user, %{status: "status #{i}"}) + Enum.each(backup_parts, fn part -> + assert {:ok, {_part, part_json}} = :zip.zip_get(part, zipfile) + {:ok, decoded_part} = Jason.decode(part_json) + assert decoded_part["totalItems"] == 120 end) - assert {:ok, backup} = user |> Backup.new() |> Repo.insert() - - with_mock Pleroma.Web.ActivityPub.Transmogrifier, - [:passthrough], - prepare_outgoing: fn data -> - object = - data["object"] - |> Pleroma.Object.normalize(fetch: false) - |> Map.get(:data) - - data = data |> Map.put("object", object) - - if String.contains?(data["object"]["content"], "119"), - do: raise(%Postgrex.Error{}), - else: {:ok, data} - end do - {:ok, backup} = Backup.process(backup) - assert backup.processed - assert backup.state == :complete - assert backup.processed_number == 1 + 119 - - Backup.delete(backup) - end + Backup.delete_archive(backup) end describe "it uploads and deletes a backup archive" do @@ -343,12 +309,11 @@ defmodule Pleroma.User.BackupTest do Bookmark.create(user.id, status3.id) assert {:ok, backup} = user |> Backup.new() |> Repo.insert() - assert {:ok, path} = Backup.export(backup, self()) - [path: path, backup: backup] + [backup: backup] end - test "S3", %{path: path, backup: backup} do + test "S3", %{backup: backup} do clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.S3) clear_config([Pleroma.Uploaders.S3, :streaming_enabled], false) @@ -358,15 +323,17 @@ defmodule Pleroma.User.BackupTest do %{http_method: :delete} -> {:ok, %{status_code: 204}} end) - assert {:ok, %Pleroma.Upload{}} = Backup.upload(backup, path) - assert {:ok, _backup} = Backup.delete(backup) + assert {:ok, backup} = Backup.run(backup) + assert {:ok, %Backup{processed: true}} = Backup.upload(backup) + assert {:ok, _backup} = Backup.delete_archive(backup) end - test "Local", %{path: path, backup: backup} do + test "Local", %{backup: backup} do clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) - assert {:ok, %Pleroma.Upload{}} = Backup.upload(backup, path) - assert {:ok, _backup} = Backup.delete(backup) + assert {:ok, backup} = Backup.run(backup) + assert {:ok, %Backup{processed: true}} = Backup.upload(backup) + assert {:ok, _backup} = Backup.delete_archive(backup) end end end diff --git a/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs b/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs index a7ee8359d..6614d1409 100644 --- a/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs @@ -1096,9 +1096,13 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do ObanHelpers.perform_all() - email = Pleroma.Emails.UserEmail.backup_is_ready_email(backup, admin.id) + email = Pleroma.Emails.UserEmail.backup_is_ready_email(backup) + + assert String.contains?( + email.html_body, + "A full backup of your Pleroma account was requested" + ) - assert String.contains?(email.html_body, "Admin @#{admin.nickname} requested a full backup") assert_email_sent(to: {user.name, user.email}, html_body: email.html_body) log_message = "@#{admin_nickname} requested account backup for @#{user_nickname}" diff --git a/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs index 21e619fa4..1e056adb5 100644 --- a/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs @@ -20,9 +20,7 @@ defmodule Pleroma.Web.PleromaAPI.BackupControllerTest do end test "GET /api/v1/pleroma/backups", %{user: user, conn: conn} do - assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id}}} = Backup.create(user) - - backup = Backup.get(backup_id) + assert {:ok, %Backup{} = backup} = Backup.user(user) response = conn diff --git a/test/pleroma/web/pleroma_api/views/backup_view_test.exs b/test/pleroma/web/pleroma_api/views/backup_view_test.exs index b125b8872..303547f3b 100644 --- a/test/pleroma/web/pleroma_api/views/backup_view_test.exs +++ b/test/pleroma/web/pleroma_api/views/backup_view_test.exs @@ -27,42 +27,11 @@ defmodule Pleroma.Web.PleromaAPI.BackupViewTest do assert result.id == backup.id end - test "it renders the state and processed_number" do + test "it renders the processed state" do user = insert(:user) backup = Backup.new(user) result = BackupView.render("show.json", backup: backup) - assert result.state == to_string(backup.state) - assert result.processed_number == backup.processed_number - end - - test "it renders failed state with legacy records" do - backup = %Backup{ - id: 0, - content_type: "application/zip", - file_name: "dummy", - file_size: 1, - state: :invalid, - processed: true, - processed_number: 1, - inserted_at: NaiveDateTime.utc_now() - } - - result = BackupView.render("show.json", backup: backup) - assert result.state == "complete" - - backup = %Backup{ - id: 0, - content_type: "application/zip", - file_name: "dummy", - file_size: 1, - state: :invalid, - processed: false, - processed_number: 1, - inserted_at: NaiveDateTime.utc_now() - } - - result = BackupView.render("show.json", backup: backup) - assert result.state == "failed" + refute result.processed end end diff --git a/test/support/mocks.ex b/test/support/mocks.ex index 63cbc49ab..d84958e15 100644 --- a/test/support/mocks.ex +++ b/test/support/mocks.ex @@ -32,6 +32,4 @@ Mox.defmock(Pleroma.StubbedHTTPSignaturesMock, for: Pleroma.HTTPSignaturesAPI) Mox.defmock(Pleroma.LoggerMock, for: Pleroma.Logging) -Mox.defmock(Pleroma.User.Backup.ProcessorMock, for: Pleroma.User.Backup.ProcessorAPI) - Mox.defmock(Pleroma.Uploaders.S3.ExAwsMock, for: Pleroma.Uploaders.S3.ExAwsAPI) From ece063586b5e2c2e8c4eb6e92e50b3dcc09d2836 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 24 Jun 2024 16:36:43 -0400 Subject: [PATCH 03/74] Limit backup jobs to 5 minutes --- lib/pleroma/workers/backup_worker.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/workers/backup_worker.ex b/lib/pleroma/workers/backup_worker.ex index 41f404e69..fb366de4a 100644 --- a/lib/pleroma/workers/backup_worker.ex +++ b/lib/pleroma/workers/backup_worker.ex @@ -32,7 +32,7 @@ defmodule Pleroma.Workers.BackupWorker do end @impl Oban.Worker - def timeout(_job), do: :infinity + def timeout(_job), do: :timer.minutes(5) defp has_email?(user) do not is_nil(user.email) and user.email != "" From 3f60d7bf644fc38e8e5d9f525a1675526ade0037 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 24 Jun 2024 22:52:21 -0400 Subject: [PATCH 04/74] Better random tempdir format --- lib/pleroma/user/backup.ex | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/user/backup.ex b/lib/pleroma/user/backup.ex index 2568089a4..7feaa22bf 100644 --- a/lib/pleroma/user/backup.ex +++ b/lib/pleroma/user/backup.ex @@ -216,13 +216,15 @@ defmodule Pleroma.User.Backup do end defp tempdir do + rand = :crypto.strong_rand_bytes(8) |> Base.url_encode64(padding: false) + subdir = "backup-#{rand}" + case Config.get([__MODULE__, :tempdir]) do nil -> - System.tmp_dir!() + Path.join([System.tmp_dir!(), subdir]) path -> - rand = :crypto.strong_rand_bytes(8) |> Base.url_encode64(padding: false) - Path.join([path, rand]) + Path.join([path, subdir]) end end From e5cbbaf3f0385492580b27a624b936c1d74757a1 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 24 Jun 2024 22:58:38 -0400 Subject: [PATCH 05/74] Extend the backup job time limit to 30 minutes --- lib/pleroma/workers/backup_worker.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/workers/backup_worker.ex b/lib/pleroma/workers/backup_worker.ex index fb366de4a..1791c558d 100644 --- a/lib/pleroma/workers/backup_worker.ex +++ b/lib/pleroma/workers/backup_worker.ex @@ -32,7 +32,7 @@ defmodule Pleroma.Workers.BackupWorker do end @impl Oban.Worker - def timeout(_job), do: :timer.minutes(5) + def timeout(_job), do: :timer.minutes(30) defp has_email?(user) do not is_nil(user.email) and user.email != "" From 187897874bddc27ef23606730e79522e3583ec43 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 22 Jul 2024 14:00:54 -0400 Subject: [PATCH 06/74] Make backup timeout configurable --- config/config.exs | 4 ++-- config/description.exs | 15 +++++++-------- docs/configuration/cheatsheet.md | 1 + lib/pleroma/workers/backup_worker.ex | 3 ++- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/config/config.exs b/config/config.exs index 044f951f6..3058160ea 100644 --- a/config/config.exs +++ b/config/config.exs @@ -908,8 +908,8 @@ config :pleroma, Pleroma.User.Backup, purge_after_days: 30, limit_days: 7, dir: nil, - process_wait_time: 30_000, - process_chunk_size: 100 + process_chunk_size: 100, + timeout: :timer.minutes(30) config :pleroma, ConcurrentLimiter, [ {Pleroma.Search, [max_running: 30, max_waiting: 50]} diff --git a/config/description.exs b/config/description.exs index b7d86dc63..179eea3f7 100644 --- a/config/description.exs +++ b/config/description.exs @@ -3355,20 +3355,19 @@ config :pleroma, :config_description, [ description: "Limit user to export not more often than once per N days", suggestions: [7] }, - %{ - key: :process_wait_time, - type: :integer, - label: "Process Wait Time", - description: - "The amount of time to wait for backup to report progress, in milliseconds. If no progress is received from the backup job for that much time, terminate it and deem it failed.", - suggestions: [30_000] - }, %{ key: :process_chunk_size, type: :integer, label: "Process Chunk Size", description: "The number of activities to fetch in the backup job for each chunk.", suggestions: [100] + }, + %{ + key: :timeout, + type: :integer, + label: "Timeout", + description: "The amount of time to wait for backup to complete in seconds.", + suggestions: [1_800] } ] }, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 9c5659988..5689d3be5 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -1171,6 +1171,7 @@ Control favicons for instances. 3. the directory named by the TMP environment variable 4. C:\TMP on Windows or /tmp on Unix-like operating systems 5. as a last resort, the current working directory +* `:timeout` an integer representing seconds ## Frontend management diff --git a/lib/pleroma/workers/backup_worker.ex b/lib/pleroma/workers/backup_worker.ex index 1791c558d..d1b6fcdad 100644 --- a/lib/pleroma/workers/backup_worker.ex +++ b/lib/pleroma/workers/backup_worker.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Workers.BackupWorker do use Oban.Worker, queue: :slow, max_attempts: 1 alias Oban.Job + alias Pleroma.Config.Getting, as: Config alias Pleroma.User.Backup @impl Oban.Worker @@ -32,7 +33,7 @@ defmodule Pleroma.Workers.BackupWorker do end @impl Oban.Worker - def timeout(_job), do: :timer.minutes(30) + def timeout(_job), do: Config.get([Backup, :timeout], :timer.minutes(30)) defp has_email?(user) do not is_nil(user.email) and user.email != "" From 59309a9eff5c2e61b2195945eca21c5126eb3f5f Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Sun, 28 Jul 2024 20:41:21 -0400 Subject: [PATCH 07/74] Publisher job simplification Publisher jobs now store the the activity id instead of inserting duplicate JSON data in the Oban queue for each delivery. --- changelog.d/publisher.change | 1 + lib/pleroma/web/activity_pub/publisher.ex | 41 ++++++++++--------- .../web/activity_pub/publisher_test.exs | 40 +++++++++++------- 3 files changed, 48 insertions(+), 34 deletions(-) create mode 100644 changelog.d/publisher.change diff --git a/changelog.d/publisher.change b/changelog.d/publisher.change new file mode 100644 index 000000000..0d26d7b00 --- /dev/null +++ b/changelog.d/publisher.change @@ -0,0 +1 @@ +Publisher jobs now store the the activity id instead of inserting duplicate JSON data in the Oban queue for each delivery. diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index c8bdf2250..cb436e8d8 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -80,13 +80,26 @@ defmodule Pleroma.Web.ActivityPub.Publisher do parameters set: * `inbox`: the inbox to publish to - * `json`: the JSON message body representing the ActivityPub message * `actor`: the actor which is signing the message - * `id`: the ActivityStreams URI of the message + * `activity_id`: the internal activity id + * `cc`: the cc recipients relevant to this inbox (optional) """ - def publish_one(%{inbox: inbox, json: json, actor: %User{} = actor, id: id} = params) do - Logger.debug("Federating #{id} to #{inbox}") + def publish_one(%{inbox: inbox, actor: %User{} = actor, activity_id: activity_id} = params) do + activity = Activity.get_by_id(activity_id) + + ap_id = activity.data["id"] + Logger.debug("Federating #{ap_id} to #{inbox}") uri = %{path: path} = URI.parse(inbox) + + {:ok, data} = Transmogrifier.prepare_outgoing(activity.data) + + cc = Map.get(params, :cc) + + json = + data + |> Map.put("cc", cc) + |> Jason.encode!() + digest = "SHA-256=" <> (:crypto.hash(:sha256, json) |> Base.encode64()) date = Pleroma.Signature.signed_date() @@ -119,7 +132,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do else {_post_result, %{status: code} = response} = e -> unless params[:unreachable_since], do: Instances.set_unreachable(inbox) - Logger.metadata(activity: id, inbox: inbox, status: code) + Logger.metadata(id: activity_id, inbox: inbox, status: code) Logger.error("Publisher failed to inbox #{inbox} with status #{code}") case response do @@ -136,7 +149,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do e -> unless params[:unreachable_since], do: Instances.set_unreachable(inbox) - Logger.metadata(activity: id, inbox: inbox) + Logger.metadata(activity: activity_id, inbox: inbox) Logger.error("Publisher failed to inbox #{inbox} #{inspect(e)}") {:error, e} end @@ -251,7 +264,6 @@ defmodule Pleroma.Web.ActivityPub.Publisher do def publish(%User{} = actor, %{data: %{"bcc" => bcc}} = activity) when is_list(bcc) and bcc != [] do public = public?(activity) - {:ok, data} = Transmogrifier.prepare_outgoing(activity.data) [priority_recipients, recipients] = recipients(actor, activity) @@ -276,16 +288,11 @@ defmodule Pleroma.Web.ActivityPub.Publisher do # instance would only accept a first message for the first recipient and ignore the rest. cc = get_cc_ap_ids(ap_id, recipients) - json = - data - |> Map.put("cc", cc) - |> Jason.encode!() - __MODULE__.enqueue_one(%{ inbox: inbox, - json: json, + cc: cc, actor_id: actor.id, - id: activity.data["id"], + activity_id: activity.id, unreachable_since: unreachable_since }) end) @@ -302,9 +309,6 @@ defmodule Pleroma.Web.ActivityPub.Publisher do Relay.publish(activity) end - {:ok, data} = Transmogrifier.prepare_outgoing(activity.data) - json = Jason.encode!(data) - [priority_inboxes, inboxes] = recipients(actor, activity) |> Enum.map(fn recipients -> @@ -326,9 +330,8 @@ defmodule Pleroma.Web.ActivityPub.Publisher do __MODULE__.enqueue_one( %{ inbox: inbox, - json: json, actor_id: actor.id, - id: activity.data["id"], + activity_id: activity.id, unreachable_since: unreachable_since }, priority: priority diff --git a/test/pleroma/web/activity_pub/publisher_test.exs b/test/pleroma/web/activity_pub/publisher_test.exs index 6f48a0227..15f29a386 100644 --- a/test/pleroma/web/activity_pub/publisher_test.exs +++ b/test/pleroma/web/activity_pub/publisher_test.exs @@ -137,6 +137,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do test "publish to url with with different ports" do inbox80 = "http://42.site/users/nick1/inbox" inbox42 = "http://42.site:42/users/nick1/inbox" + activity = insert(:note_activity) mock(fn %{method: :post, url: "http://42.site:42/users/nick1/inbox"} -> @@ -151,18 +152,16 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do assert {:ok, %{body: "port 42"}} = Publisher.publish_one(%{ inbox: inbox42, - json: "{}", actor: actor, - id: 1, + activity_id: activity.id, unreachable_since: true }) assert {:ok, %{body: "port 80"}} = Publisher.publish_one(%{ inbox: inbox80, - json: "{}", actor: actor, - id: 1, + activity_id: activity.id, unreachable_since: true }) end @@ -173,8 +172,11 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do [] do actor = insert(:user) inbox = "http://200.site/users/nick1/inbox" + activity = insert(:note_activity) + + assert {:ok, _} = + Publisher.publish_one(%{inbox: inbox, actor: actor, activity_id: activity.id}) - assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) assert called(Instances.set_reachable(inbox)) end @@ -184,13 +186,13 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do [] do actor = insert(:user) inbox = "http://200.site/users/nick1/inbox" + activity = insert(:note_activity) assert {:ok, _} = Publisher.publish_one(%{ inbox: inbox, - json: "{}", actor: actor, - id: 1, + activity_id: activity.id, unreachable_since: NaiveDateTime.utc_now() }) @@ -203,13 +205,13 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do [] do actor = insert(:user) inbox = "http://200.site/users/nick1/inbox" + activity = insert(:note_activity) assert {:ok, _} = Publisher.publish_one(%{ inbox: inbox, - json: "{}", actor: actor, - id: 1, + activity_id: activity.id, unreachable_since: nil }) @@ -222,9 +224,10 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do [] do actor = insert(:user) inbox = "http://404.site/users/nick1/inbox" + activity = insert(:note_activity) assert {:cancel, _} = - Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) + Publisher.publish_one(%{inbox: inbox, actor: actor, activity_id: activity.id}) assert called(Instances.set_unreachable(inbox)) end @@ -235,10 +238,15 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do [] do actor = insert(:user) inbox = "http://connrefused.site/users/nick1/inbox" + activity = insert(:note_activity) assert capture_log(fn -> assert {:error, _} = - Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) + Publisher.publish_one(%{ + inbox: inbox, + actor: actor, + activity_id: activity.id + }) end) =~ "connrefused" assert called(Instances.set_unreachable(inbox)) @@ -250,8 +258,10 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do [] do actor = insert(:user) inbox = "http://200.site/users/nick1/inbox" + activity = insert(:note_activity) - assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) + assert {:ok, _} = + Publisher.publish_one(%{inbox: inbox, actor: actor, activity_id: activity.id}) refute called(Instances.set_unreachable(inbox)) end @@ -262,14 +272,14 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do [] do actor = insert(:user) inbox = "http://connrefused.site/users/nick1/inbox" + activity = insert(:note_activity) assert capture_log(fn -> assert {:error, _} = Publisher.publish_one(%{ inbox: inbox, - json: "{}", actor: actor, - id: 1, + activity_id: activity.id, unreachable_since: NaiveDateTime.utc_now() }) end) =~ "connrefused" @@ -406,7 +416,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Publisher.enqueue_one(%{ inbox: "https://domain.com/users/nick1/inbox", actor_id: actor.id, - id: note_activity.data["id"] + activity_id: note_activity.id }) ) end From 74072622e08dd1efdc7bf69c3278250ea1efb22e Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 29 Jul 2024 09:52:13 -0400 Subject: [PATCH 08/74] Remove actor and actor_id from the job as it can be inferred by the activity --- lib/pleroma/web/activity_pub/publisher.ex | 17 ++----- .../web/activity_pub/publisher_test.exs | 44 +++++++------------ 2 files changed, 19 insertions(+), 42 deletions(-) diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index cb436e8d8..373bf6e41 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -80,12 +80,12 @@ defmodule Pleroma.Web.ActivityPub.Publisher do parameters set: * `inbox`: the inbox to publish to - * `actor`: the actor which is signing the message * `activity_id`: the internal activity id * `cc`: the cc recipients relevant to this inbox (optional) """ - def publish_one(%{inbox: inbox, actor: %User{} = actor, activity_id: activity_id} = params) do - activity = Activity.get_by_id(activity_id) + def publish_one(%{inbox: inbox, activity_id: activity_id} = params) do + activity = Activity.get_by_id_with_user_actor(activity_id) + actor = activity.user_actor ap_id = activity.data["id"] Logger.debug("Federating #{ap_id} to #{inbox}") @@ -155,15 +155,6 @@ defmodule Pleroma.Web.ActivityPub.Publisher do end end - def publish_one(%{actor_id: actor_id} = params) do - actor = User.get_cached_by_id(actor_id) - - params - |> Map.delete(:actor_id) - |> Map.put(:actor, actor) - |> publish_one() - end - defp signature_host(%URI{port: port, scheme: scheme, host: host}) do if port == URI.default_port(scheme) do host @@ -291,7 +282,6 @@ defmodule Pleroma.Web.ActivityPub.Publisher do __MODULE__.enqueue_one(%{ inbox: inbox, cc: cc, - actor_id: actor.id, activity_id: activity.id, unreachable_since: unreachable_since }) @@ -330,7 +320,6 @@ defmodule Pleroma.Web.ActivityPub.Publisher do __MODULE__.enqueue_one( %{ inbox: inbox, - actor_id: actor.id, activity_id: activity.id, unreachable_since: unreachable_since }, diff --git a/test/pleroma/web/activity_pub/publisher_test.exs b/test/pleroma/web/activity_pub/publisher_test.exs index 15f29a386..569b6af1a 100644 --- a/test/pleroma/web/activity_pub/publisher_test.exs +++ b/test/pleroma/web/activity_pub/publisher_test.exs @@ -147,12 +147,11 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do {:ok, %Tesla.Env{status: 200, body: "port 80"}} end) - actor = insert(:user) + _actor = insert(:user) assert {:ok, %{body: "port 42"}} = Publisher.publish_one(%{ inbox: inbox42, - actor: actor, activity_id: activity.id, unreachable_since: true }) @@ -160,7 +159,6 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do assert {:ok, %{body: "port 80"}} = Publisher.publish_one(%{ inbox: inbox80, - actor: actor, activity_id: activity.id, unreachable_since: true }) @@ -170,12 +168,12 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Instances, [:passthrough], [] do - actor = insert(:user) + _actor = insert(:user) inbox = "http://200.site/users/nick1/inbox" activity = insert(:note_activity) assert {:ok, _} = - Publisher.publish_one(%{inbox: inbox, actor: actor, activity_id: activity.id}) + Publisher.publish_one(%{inbox: inbox, activity_id: activity.id}) assert called(Instances.set_reachable(inbox)) end @@ -184,14 +182,13 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Instances, [:passthrough], [] do - actor = insert(:user) + _actor = insert(:user) inbox = "http://200.site/users/nick1/inbox" activity = insert(:note_activity) assert {:ok, _} = Publisher.publish_one(%{ inbox: inbox, - actor: actor, activity_id: activity.id, unreachable_since: NaiveDateTime.utc_now() }) @@ -203,14 +200,13 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Instances, [:passthrough], [] do - actor = insert(:user) + _actor = insert(:user) inbox = "http://200.site/users/nick1/inbox" activity = insert(:note_activity) assert {:ok, _} = Publisher.publish_one(%{ inbox: inbox, - actor: actor, activity_id: activity.id, unreachable_since: nil }) @@ -222,12 +218,12 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Instances, [:passthrough], [] do - actor = insert(:user) + _actor = insert(:user) inbox = "http://404.site/users/nick1/inbox" activity = insert(:note_activity) assert {:cancel, _} = - Publisher.publish_one(%{inbox: inbox, actor: actor, activity_id: activity.id}) + Publisher.publish_one(%{inbox: inbox, activity_id: activity.id}) assert called(Instances.set_unreachable(inbox)) end @@ -236,7 +232,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Instances, [:passthrough], [] do - actor = insert(:user) + _actor = insert(:user) inbox = "http://connrefused.site/users/nick1/inbox" activity = insert(:note_activity) @@ -244,7 +240,6 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do assert {:error, _} = Publisher.publish_one(%{ inbox: inbox, - actor: actor, activity_id: activity.id }) end) =~ "connrefused" @@ -256,12 +251,12 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Instances, [:passthrough], [] do - actor = insert(:user) + _actor = insert(:user) inbox = "http://200.site/users/nick1/inbox" activity = insert(:note_activity) assert {:ok, _} = - Publisher.publish_one(%{inbox: inbox, actor: actor, activity_id: activity.id}) + Publisher.publish_one(%{inbox: inbox, activity_id: activity.id}) refute called(Instances.set_unreachable(inbox)) end @@ -270,7 +265,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Instances, [:passthrough], [] do - actor = insert(:user) + _actor = insert(:user) inbox = "http://connrefused.site/users/nick1/inbox" activity = insert(:note_activity) @@ -278,7 +273,6 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do assert {:error, _} = Publisher.publish_one(%{ inbox: inbox, - actor: actor, activity_id: activity.id, unreachable_since: NaiveDateTime.utc_now() }) @@ -319,8 +313,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do assert not called( Publisher.enqueue_one(%{ inbox: "https://domain.com/users/nick1/inbox", - actor_id: actor.id, - id: note_activity.data["id"] + activity_id: note_activity.id }) ) end @@ -356,8 +349,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Publisher.enqueue_one( %{ inbox: "https://domain.com/users/nick1/inbox", - actor_id: actor.id, - id: note_activity.data["id"] + activity_id: note_activity.id }, priority: 1 ) @@ -380,8 +372,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Publisher.enqueue_one( %{ inbox: :_, - actor_id: actor.id, - id: note_activity.data["id"] + activity_id: note_activity.id }, priority: 0 ) @@ -415,7 +406,6 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do assert called( Publisher.enqueue_one(%{ inbox: "https://domain.com/users/nick1/inbox", - actor_id: actor.id, activity_id: note_activity.id }) ) @@ -466,8 +456,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Publisher.enqueue_one( %{ inbox: "https://domain.com/users/nick1/inbox", - actor_id: actor.id, - id: delete.data["id"] + activity_id: delete.id }, priority: 1 ) @@ -477,8 +466,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do Publisher.enqueue_one( %{ inbox: "https://domain2.com/users/nick1/inbox", - actor_id: actor.id, - id: delete.data["id"] + activity_id: delete.id }, priority: 1 ) From 8893ad98997197bd89e98f7dd18825dcb1206aa4 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 29 Jul 2024 09:59:35 -0400 Subject: [PATCH 09/74] Fix cancelling jobs --- lib/pleroma/web/common_api.ex | 4 ++-- test/pleroma/web/common_api_test.exs | 32 ++++++++++++++-------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/lib/pleroma/web/common_api.ex b/lib/pleroma/web/common_api.ex index 06faf845e..b90b6a6d9 100644 --- a/lib/pleroma/web/common_api.ex +++ b/lib/pleroma/web/common_api.ex @@ -714,11 +714,11 @@ defmodule Pleroma.Web.CommonAPI do end end - defp maybe_cancel_jobs(%Activity{data: %{"id" => ap_id}}) do + defp maybe_cancel_jobs(%Activity{id: activity_id}) do Oban.Job |> where([j], j.worker == "Pleroma.Workers.PublisherWorker") |> where([j], j.args["op"] == "publish_one") - |> where([j], j.args["params"]["id"] == ^ap_id) + |> where([j], j.args["params"]["activity_id"] == ^activity_id) |> Oban.cancel_all_jobs() end diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs index b6fba6999..4cdd3cffa 100644 --- a/test/pleroma/web/common_api_test.exs +++ b/test/pleroma/web/common_api_test.exs @@ -1957,7 +1957,7 @@ defmodule Pleroma.Web.CommonAPITest do {:ok, _, _} = Pleroma.User.follow(remote_one, local_user) {:ok, _, _} = Pleroma.User.follow(remote_two, local_user) - {:ok, %{data: %{"id" => ap_id}} = activity} = + {:ok, %{id: activity_id} = _activity} = CommonAPI.post(local_user, %{status: "Happy Friday everyone!"}) # Generate the publish_one jobs @@ -1971,7 +1971,7 @@ defmodule Pleroma.Web.CommonAPITest do state: "available", queue: "federator_outgoing", worker: "Pleroma.Workers.PublisherWorker", - args: %{"op" => "publish_one", "params" => %{"id" => ^ap_id}} + args: %{"op" => "publish_one", "params" => %{"activity_id" => ^activity_id}} }, job ) @@ -1980,7 +1980,7 @@ defmodule Pleroma.Web.CommonAPITest do assert length(publish_one_jobs) == 2 # The delete should have triggered cancelling the publish_one jobs - assert {:ok, _delete} = CommonAPI.delete(activity.id, local_user) + assert {:ok, _delete} = CommonAPI.delete(activity_id, local_user) # all_enqueued/1 will not return cancelled jobs cancelled_jobs = @@ -1988,7 +1988,7 @@ defmodule Pleroma.Web.CommonAPITest do |> where([j], j.worker == "Pleroma.Workers.PublisherWorker") |> where([j], j.state == "cancelled") |> where([j], j.args["op"] == "publish_one") - |> where([j], j.args["params"]["id"] == ^ap_id) + |> where([j], j.args["params"]["activity_id"] == ^activity_id) |> Pleroma.Repo.all() assert length(cancelled_jobs) == 2 @@ -2001,7 +2001,7 @@ defmodule Pleroma.Web.CommonAPITest do {:ok, activity} = CommonAPI.post(remote_user, %{status: "I like turtles!"}) - {:ok, %{data: %{"id" => ap_id}} = _favorite} = + {:ok, %{id: favorite_id} = _favorite} = CommonAPI.favorite(activity.id, local_user) # Generate the publish_one jobs @@ -2015,7 +2015,7 @@ defmodule Pleroma.Web.CommonAPITest do state: "available", queue: "federator_outgoing", worker: "Pleroma.Workers.PublisherWorker", - args: %{"op" => "publish_one", "params" => %{"id" => ^ap_id}} + args: %{"op" => "publish_one", "params" => %{"activity_id" => ^favorite_id}} }, job ) @@ -2032,7 +2032,7 @@ defmodule Pleroma.Web.CommonAPITest do |> where([j], j.worker == "Pleroma.Workers.PublisherWorker") |> where([j], j.state == "cancelled") |> where([j], j.args["op"] == "publish_one") - |> where([j], j.args["params"]["id"] == ^ap_id) + |> where([j], j.args["params"]["activity_id"] == ^favorite_id) |> Pleroma.Repo.all() assert length(cancelled_jobs) == 1 @@ -2049,7 +2049,7 @@ defmodule Pleroma.Web.CommonAPITest do {:ok, activity} = CommonAPI.post(remote_one, %{status: "This is an unpleasant post"}) - {:ok, %{data: %{"id" => ap_id}} = _repeat} = + {:ok, %{id: repeat_id} = _repeat} = CommonAPI.repeat(activity.id, local_user) # Generate the publish_one jobs @@ -2063,7 +2063,7 @@ defmodule Pleroma.Web.CommonAPITest do state: "available", queue: "federator_outgoing", worker: "Pleroma.Workers.PublisherWorker", - args: %{"op" => "publish_one", "params" => %{"id" => ^ap_id}} + args: %{"op" => "publish_one", "params" => %{"activity_id" => ^repeat_id}} }, job ) @@ -2080,7 +2080,7 @@ defmodule Pleroma.Web.CommonAPITest do |> where([j], j.worker == "Pleroma.Workers.PublisherWorker") |> where([j], j.state == "cancelled") |> where([j], j.args["op"] == "publish_one") - |> where([j], j.args["params"]["id"] == ^ap_id) + |> where([j], j.args["params"]["activity_id"] == ^repeat_id) |> Pleroma.Repo.all() assert length(cancelled_jobs) == 2 @@ -2094,11 +2094,11 @@ defmodule Pleroma.Web.CommonAPITest do {:ok, _, _} = Pleroma.User.follow(remote_one, local_user) {:ok, _, _} = Pleroma.User.follow(remote_two, local_user) - {:ok, activity} = + {:ok, %{id: activity_id}} = CommonAPI.post(remote_one, %{status: "Gang gang!!!!"}) - {:ok, %{data: %{"id" => ap_id}} = _react} = - CommonAPI.react_with_emoji(activity.id, local_user, "👍") + {:ok, %{id: react_id} = _react} = + CommonAPI.react_with_emoji(activity_id, local_user, "👍") # Generate the publish_one jobs ObanHelpers.perform_all() @@ -2111,7 +2111,7 @@ defmodule Pleroma.Web.CommonAPITest do state: "available", queue: "federator_outgoing", worker: "Pleroma.Workers.PublisherWorker", - args: %{"op" => "publish_one", "params" => %{"id" => ^ap_id}} + args: %{"op" => "publish_one", "params" => %{"activity_id" => ^react_id}} }, job ) @@ -2120,7 +2120,7 @@ defmodule Pleroma.Web.CommonAPITest do assert length(publish_one_jobs) == 2 # The unreact should have triggered cancelling the publish_one jobs - assert {:ok, _unreact} = CommonAPI.unreact_with_emoji(activity.id, local_user, "👍") + assert {:ok, _unreact} = CommonAPI.unreact_with_emoji(activity_id, local_user, "👍") # all_enqueued/1 will not return cancelled jobs cancelled_jobs = @@ -2128,7 +2128,7 @@ defmodule Pleroma.Web.CommonAPITest do |> where([j], j.worker == "Pleroma.Workers.PublisherWorker") |> where([j], j.state == "cancelled") |> where([j], j.args["op"] == "publish_one") - |> where([j], j.args["params"]["id"] == ^ap_id) + |> where([j], j.args["params"]["activity_id"] == ^react_id) |> Pleroma.Repo.all() assert length(cancelled_jobs) == 2 From b48fd89a41ad766b79a7a2336737196216cede22 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 29 Jul 2024 10:03:22 -0400 Subject: [PATCH 10/74] Revert unintended change to the Logger metadata tag name --- lib/pleroma/web/activity_pub/publisher.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index 373bf6e41..e040753dc 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -132,7 +132,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do else {_post_result, %{status: code} = response} = e -> unless params[:unreachable_since], do: Instances.set_unreachable(inbox) - Logger.metadata(id: activity_id, inbox: inbox, status: code) + Logger.metadata(activity: activity_id, inbox: inbox, status: code) Logger.error("Publisher failed to inbox #{inbox} with status #{code}") case response do From 05d4989795b79683933aa602cd427c57ded10e2f Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 29 Jul 2024 13:54:26 -0400 Subject: [PATCH 11/74] Insert replacement jobs in the new format if any remain undelivered The old jobs remain and will fail gracefully --- .../20240729163838_publisher_job_change.exs | 27 ++++++++++++ .../publisher_migration_change_test.exs | 43 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 priv/repo/migrations/20240729163838_publisher_job_change.exs create mode 100644 test/pleroma/repo/migrations/publisher_migration_change_test.exs diff --git a/priv/repo/migrations/20240729163838_publisher_job_change.exs b/priv/repo/migrations/20240729163838_publisher_job_change.exs new file mode 100644 index 000000000..08d73b5ad --- /dev/null +++ b/priv/repo/migrations/20240729163838_publisher_job_change.exs @@ -0,0 +1,27 @@ +defmodule Pleroma.Repo.Migrations.PublisherJobChange do + use Ecto.Migration + + alias Pleroma.Activity + import Ecto.Query + + def up do + query = + from(j in Oban.Job, + where: j.worker == "Pleroma.Workers.PublisherWorker", + where: j.state in ["available", "retryable"] + ) + + jobs = + Oban |> Oban.config() |> Oban.Repo.all(query) + + Enum.each(jobs, fn job -> + args = job.args + activity = Activity.get_by_ap_id(args["id"]) + + updated_args = Map.put(args, "activity_id", activity.id) + + Pleroma.Workers.PublisherWorker.new(updated_args) + |> Oban.insert() + end) + end +end diff --git a/test/pleroma/repo/migrations/publisher_migration_change_test.exs b/test/pleroma/repo/migrations/publisher_migration_change_test.exs new file mode 100644 index 000000000..9c035e604 --- /dev/null +++ b/test/pleroma/repo/migrations/publisher_migration_change_test.exs @@ -0,0 +1,43 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2022 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Repo.Migrations.PublisherMigrationChangeTest do + use Oban.Testing, repo: Pleroma.Repo + use Pleroma.DataCase + import Pleroma.Factory + import Pleroma.Tests.Helpers + + alias Pleroma.Activity + alias Pleroma.Workers.PublisherWorker + + setup_all do: require_migration("20240729163838_publisher_job_change") + + describe "up/0" do + test "migrates publisher jobs to new format", %{migration: migration} do + user = insert(:user) + + %Activity{id: activity_id, data: %{"id" => ap_id}} = + insert(:note_activity, user: user) + + {:ok, %{id: job_id}} = + PublisherWorker.new(%{ + "actor_id" => user.id, + "json" => "{}", + "id" => ap_id, + "inbox" => "https://example.com/inbox", + "unreachable_since" => nil + }) + |> Oban.insert() + + assert [%{id: ^job_id, args: %{"id" => ^ap_id}}] = all_enqueued(worker: PublisherWorker) + + assert migration.up() == :ok + + assert_enqueued( + worker: PublisherWorker, + args: %{"id" => ap_id, "activity_id" => activity_id} + ) + end + end +end From 66649e1dcd95035ba3eb04c59f359c2ee4b965dc Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 30 Jul 2024 09:49:09 -0400 Subject: [PATCH 12/74] Remove unused Oban queue --- changelog.d/oban-transmogrifier.skip | 0 config/config.exs | 1 - 2 files changed, 1 deletion(-) create mode 100644 changelog.d/oban-transmogrifier.skip diff --git a/changelog.d/oban-transmogrifier.skip b/changelog.d/oban-transmogrifier.skip new file mode 100644 index 000000000..e69de29bb diff --git a/config/config.exs b/config/config.exs index 2f0d9d7d2..4780892f7 100644 --- a/config/config.exs +++ b/config/config.exs @@ -590,7 +590,6 @@ config :pleroma, Oban, federator_incoming: 5, federator_outgoing: 5, web_push: 50, - transmogrifier: 20, background: 20, search_indexing: [limit: 10, paused: true], slow: 5 From 1bce582f0de896b2a84cc2ef44f82646276dc255 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 30 Jul 2024 10:48:06 -0400 Subject: [PATCH 13/74] Fix migration crashing due to Oban not running We can use Pleroma.Repo to fetch the jobs --- priv/repo/migrations/20240729163838_publisher_job_change.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/priv/repo/migrations/20240729163838_publisher_job_change.exs b/priv/repo/migrations/20240729163838_publisher_job_change.exs index 08d73b5ad..3449e3b3b 100644 --- a/priv/repo/migrations/20240729163838_publisher_job_change.exs +++ b/priv/repo/migrations/20240729163838_publisher_job_change.exs @@ -2,6 +2,7 @@ defmodule Pleroma.Repo.Migrations.PublisherJobChange do use Ecto.Migration alias Pleroma.Activity + alias Pleroma.Repo import Ecto.Query def up do @@ -11,8 +12,7 @@ defmodule Pleroma.Repo.Migrations.PublisherJobChange do where: j.state in ["available", "retryable"] ) - jobs = - Oban |> Oban.config() |> Oban.Repo.all(query) + jobs = Repo.all(query) Enum.each(jobs, fn job -> args = job.args From a6119210b73aab7071c57f8b6500fe3237ade720 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 30 Jul 2024 11:06:55 -0400 Subject: [PATCH 14/74] Increase federator outgoing job parallelism --- changelog.d/federator_outgoing_increase.change | 1 + config/config.exs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/federator_outgoing_increase.change diff --git a/changelog.d/federator_outgoing_increase.change b/changelog.d/federator_outgoing_increase.change new file mode 100644 index 000000000..7e68a79bc --- /dev/null +++ b/changelog.d/federator_outgoing_increase.change @@ -0,0 +1 @@ +Increase outgoing federation parallelism diff --git a/config/config.exs b/config/config.exs index 4780892f7..226d73df4 100644 --- a/config/config.exs +++ b/config/config.exs @@ -588,7 +588,7 @@ config :pleroma, Oban, queues: [ activity_expiration: 10, federator_incoming: 5, - federator_outgoing: 5, + federator_outgoing: 25, web_push: 50, background: 20, search_indexing: [limit: 10, paused: true], From 49f46220ff670c68363da43db135c5d35229cc5d Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 30 Jul 2024 11:11:30 -0400 Subject: [PATCH 15/74] Align Hackney and Gun connection pool timeouts --- changelog.d/hackney-pool-timeouts.change | 1 + config/config.exs | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 changelog.d/hackney-pool-timeouts.change diff --git a/changelog.d/hackney-pool-timeouts.change b/changelog.d/hackney-pool-timeouts.change new file mode 100644 index 000000000..d763fe602 --- /dev/null +++ b/changelog.d/hackney-pool-timeouts.change @@ -0,0 +1 @@ +Change Hackney connection pool timeouts to align with the values Gun uses diff --git a/config/config.exs b/config/config.exs index 4780892f7..d9754d9c8 100644 --- a/config/config.exs +++ b/config/config.exs @@ -858,19 +858,19 @@ config :pleroma, :pools, config :pleroma, :hackney_pools, federation: [ max_connections: 50, - timeout: 150_000 + timeout: 10_000 ], media: [ max_connections: 50, - timeout: 150_000 + timeout: 15_000 ], rich_media: [ max_connections: 50, - timeout: 150_000 + timeout: 15_000 ], upload: [ max_connections: 25, - timeout: 300_000 + timeout: 15_000 ] config :pleroma, :majic_pool, size: 2 From 52e9bec15655dd3ba75c133b85266a1ea65a8eef Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 28 Jun 2024 11:47:31 -0400 Subject: [PATCH 16/74] Remove WorkerHelper --- changelog.d/workerhelper.skip | 0 config/config.exs | 7 --- lib/mix/tasks/pleroma/database.ex | 10 ++-- lib/pleroma/emails/mailer.ex | 3 +- lib/pleroma/filter.ex | 11 +++-- lib/pleroma/instances/instance.ex | 3 +- lib/pleroma/mfa/token.ex | 13 +++-- lib/pleroma/object.ex | 3 +- lib/pleroma/search.ex | 6 ++- lib/pleroma/user.ex | 19 +++++--- lib/pleroma/user/import.ex | 30 +++++++----- lib/pleroma/web/activity_pub/activity_pub.ex | 18 ++++--- lib/pleroma/web/activity_pub/publisher.ex | 6 +-- lib/pleroma/web/activity_pub/side_effects.ex | 14 ++++-- lib/pleroma/web/common_api.ex | 6 +-- lib/pleroma/web/federator.ex | 27 +++++++---- lib/pleroma/web/o_auth/token.ex | 9 ++-- lib/pleroma/web/push.ex | 2 +- .../workers/attachments_cleanup_worker.ex | 6 +-- lib/pleroma/workers/background_worker.ex | 8 ++-- lib/pleroma/workers/backup_worker.ex | 4 +- .../workers/cron/digest_emails_worker.ex | 4 +- .../workers/cron/new_users_digest_worker.ex | 6 +-- lib/pleroma/workers/delete_worker.ex | 7 ++- lib/pleroma/workers/mailer_worker.ex | 6 +-- lib/pleroma/workers/mute_expire_worker.ex | 6 +-- lib/pleroma/workers/poll_worker.ex | 6 +-- lib/pleroma/workers/publisher_worker.ex | 22 ++++++--- lib/pleroma/workers/purge_expired_activity.ex | 11 ++--- lib/pleroma/workers/purge_expired_filter.ex | 2 +- lib/pleroma/workers/purge_expired_token.ex | 12 +---- lib/pleroma/workers/receiver_worker.ex | 6 +-- lib/pleroma/workers/remote_fetcher_worker.ex | 6 +-- lib/pleroma/workers/rich_media_worker.ex | 4 +- .../workers/scheduled_activity_worker.ex | 6 +-- lib/pleroma/workers/search_indexing_worker.ex | 6 +-- lib/pleroma/workers/user_refresh_worker.ex | 2 +- lib/pleroma/workers/web_pusher_worker.ex | 6 +-- lib/pleroma/workers/worker_helper.ex | 48 ------------------- test/mix/tasks/pleroma/database_test.exs | 10 ++-- .../workers/purge_expired_activity_test.exs | 30 +++++++----- 41 files changed, 200 insertions(+), 211 deletions(-) create mode 100644 changelog.d/workerhelper.skip delete mode 100644 lib/pleroma/workers/worker_helper.ex diff --git a/changelog.d/workerhelper.skip b/changelog.d/workerhelper.skip new file mode 100644 index 000000000..e69de29bb diff --git a/config/config.exs b/config/config.exs index 4780892f7..b835a7c80 100644 --- a/config/config.exs +++ b/config/config.exs @@ -600,13 +600,6 @@ config :pleroma, Oban, {"0 0 * * *", Pleroma.Workers.Cron.NewUsersDigestWorker} ] -config :pleroma, :workers, - retries: [ - federator_incoming: 5, - federator_outgoing: 5, - search_indexing: 2 - ] - config :pleroma, Pleroma.Formatter, class: false, rel: "ugc", diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index b82d1f079..e52b5e0a7 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -295,10 +295,12 @@ defmodule Mix.Tasks.Pleroma.Database do |> DateTime.from_naive!("Etc/UTC") |> Timex.shift(days: days) - Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ - activity_id: activity.id, - expires_at: expires_at - }) + Pleroma.Workers.PurgeExpiredActivity.enqueue( + %{ + activity_id: activity.id + }, + scheduled_at: expires_at + ) end) end) |> Stream.run() diff --git a/lib/pleroma/emails/mailer.ex b/lib/pleroma/emails/mailer.ex index 101442130..2a80f8547 100644 --- a/lib/pleroma/emails/mailer.ex +++ b/lib/pleroma/emails/mailer.ex @@ -25,7 +25,8 @@ defmodule Pleroma.Emails.Mailer do |> :erlang.term_to_binary() |> Base.encode64() - MailerWorker.enqueue("email", %{"encoded_email" => encoded_email, "config" => config}) + MailerWorker.new(%{"op" => "email", "encoded_email" => encoded_email, "config" => config}) + |> Oban.insert() end @doc "callback to perform send email from queue" diff --git a/lib/pleroma/filter.ex b/lib/pleroma/filter.ex index e827d3cbc..77ed64d4f 100644 --- a/lib/pleroma/filter.ex +++ b/lib/pleroma/filter.ex @@ -133,10 +133,13 @@ defmodule Pleroma.Filter do defp maybe_add_expires_at(changeset, _), do: changeset defp maybe_add_expiration_job(%{expires_at: %NaiveDateTime{} = expires_at} = filter) do - Pleroma.Workers.PurgeExpiredFilter.enqueue(%{ - filter_id: filter.id, - expires_at: DateTime.from_naive!(expires_at, "Etc/UTC") - }) + Pleroma.Workers.PurgeExpiredFilter.new( + %{ + filter_id: filter.id + }, + scheduled_at: DateTime.from_naive!(expires_at, "Etc/UTC") + ) + |> Oban.insert() end defp maybe_add_expiration_job(_), do: {:ok, nil} diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex index 288555146..33f1229d0 100644 --- a/lib/pleroma/instances/instance.ex +++ b/lib/pleroma/instances/instance.ex @@ -297,7 +297,8 @@ defmodule Pleroma.Instances.Instance do all of those users' activities and notifications. """ def delete_users_and_activities(host) when is_binary(host) do - DeleteWorker.enqueue("delete_instance", %{"host" => host}) + DeleteWorker.new(%{"op" => "delete_instance", "host" => host}) + |> Oban.insert() end def perform(:delete_instance, host) when is_binary(host) do diff --git a/lib/pleroma/mfa/token.ex b/lib/pleroma/mfa/token.ex index 57bc11ed5..b53e1c7d0 100644 --- a/lib/pleroma/mfa/token.ex +++ b/lib/pleroma/mfa/token.ex @@ -52,11 +52,14 @@ defmodule Pleroma.MFA.Token do @spec create(User.t(), Authorization.t() | nil) :: {:ok, t()} | {:error, Ecto.Changeset.t()} def create(user, authorization \\ nil) do with {:ok, token} <- do_create(user, authorization) do - Pleroma.Workers.PurgeExpiredToken.enqueue(%{ - token_id: token.id, - valid_until: DateTime.from_naive!(token.valid_until, "Etc/UTC"), - mod: __MODULE__ - }) + Pleroma.Workers.PurgeExpiredToken.new( + %{ + token_id: token.id, + mod: __MODULE__ + }, + scheduled_at: DateTime.from_naive!(token.valid_until, "Etc/UTC") + ) + |> Oban.insert() {:ok, token} end diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index eb44b3855..748f18e6c 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -255,7 +255,8 @@ defmodule Pleroma.Object do @spec cleanup_attachments(boolean(), Object.t()) :: {:ok, Oban.Job.t() | nil} def cleanup_attachments(true, %Object{} = object) do - AttachmentsCleanupWorker.enqueue("cleanup_attachments", %{"object" => object}) + AttachmentsCleanupWorker.new(%{"op" => "cleanup_attachments", "object" => object}) + |> Oban.insert() end def cleanup_attachments(_, _), do: {:ok, nil} diff --git a/lib/pleroma/search.ex b/lib/pleroma/search.ex index b9d2a0188..30b3ba958 100644 --- a/lib/pleroma/search.ex +++ b/lib/pleroma/search.ex @@ -2,11 +2,13 @@ defmodule Pleroma.Search do alias Pleroma.Workers.SearchIndexingWorker def add_to_index(%Pleroma.Activity{id: activity_id}) do - SearchIndexingWorker.enqueue("add_to_index", %{"activity" => activity_id}) + SearchIndexingWorker.new(%{"op" => "add_to_index", "activity" => activity_id}) + |> Oban.insert() end def remove_from_index(%Pleroma.Object{id: object_id}) do - SearchIndexingWorker.enqueue("remove_from_index", %{"object" => object_id}) + SearchIndexingWorker.new(%{"op" => "remove_from_index", "object" => object_id}) + |> Oban.insert() end def search(query, options) do diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index e28d76a7c..0e9d70831 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -736,7 +736,8 @@ defmodule Pleroma.User do end def force_password_reset_async(user) do - BackgroundWorker.enqueue("force_password_reset", %{"user_id" => user.id}) + BackgroundWorker.new(%{"op" => "force_password_reset", "user_id" => user.id}) + |> Oban.insert() end @spec force_password_reset(User.t()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} @@ -1218,7 +1219,8 @@ defmodule Pleroma.User do def update_and_set_cache(changeset) do with {:ok, user} <- Repo.update(changeset, stale_error_field: :id) do if get_change(changeset, :raw_fields) do - BackgroundWorker.enqueue("verify_fields_links", %{"user_id" => user.id}) + BackgroundWorker.new(%{"op" => "verify_fields_links", "user_id" => user.id}) + |> Oban.insert() end set_cache(user) @@ -1589,11 +1591,11 @@ defmodule Pleroma.User do )) || {:ok, nil} do if duration > 0 do - Pleroma.Workers.MuteExpireWorker.enqueue( - "unmute_user", - %{"muter_id" => muter.id, "mutee_id" => mutee.id}, + Pleroma.Workers.MuteExpireWorker.new( + %{"op" => "unmute_user", "muter_id" => muter.id, "mutee_id" => mutee.id}, scheduled_at: expires_at ) + |> Oban.insert() end @cachex.del(:user_cache, "muted_users_ap_ids:#{muter.ap_id}") @@ -1836,7 +1838,8 @@ defmodule Pleroma.User do defp maybe_filter_on_ap_id(query, _ap_ids), do: query def set_activation_async(user, status \\ true) do - BackgroundWorker.enqueue("user_activation", %{"user_id" => user.id, "status" => status}) + BackgroundWorker.new(%{"op" => "user_activation", "user_id" => user.id, "status" => status}) + |> Oban.insert() end @spec set_activation([User.t()], boolean()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} @@ -1983,7 +1986,9 @@ defmodule Pleroma.User do def delete(%User{} = user) do # Purge the user immediately purge(user) - DeleteWorker.enqueue("delete_user", %{"user_id" => user.id}) + + DeleteWorker.new(%{"op" => "delete_user", "user_id" => user.id}) + |> Oban.insert() end # *Actually* delete the user from the DB diff --git a/lib/pleroma/user/import.ex b/lib/pleroma/user/import.ex index 53ffd1ab3..11905237c 100644 --- a/lib/pleroma/user/import.ex +++ b/lib/pleroma/user/import.ex @@ -63,23 +63,29 @@ defmodule Pleroma.User.Import do end def blocks_import(%User{} = blocker, [_ | _] = identifiers) do - BackgroundWorker.enqueue( - "blocks_import", - %{"user_id" => blocker.id, "identifiers" => identifiers} - ) + BackgroundWorker.new(%{ + "op" => "blocks_import", + "user_id" => blocker.id, + "identifiers" => identifiers + }) + |> Oban.insert() end def follow_import(%User{} = follower, [_ | _] = identifiers) do - BackgroundWorker.enqueue( - "follow_import", - %{"user_id" => follower.id, "identifiers" => identifiers} - ) + BackgroundWorker.new(%{ + "op" => "follow_import", + "user_id" => follower.id, + "identifiers" => identifiers + }) + |> Oban.insert() end def mutes_import(%User{} = user, [_ | _] = identifiers) do - BackgroundWorker.enqueue( - "mutes_import", - %{"user_id" => user.id, "identifiers" => identifiers} - ) + BackgroundWorker.new(%{ + "op" => "mutes_import", + "user_id" => user.id, + "identifiers" => identifiers + }) + |> Oban.insert() end end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index b30b0cabe..a2a94a0ff 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -222,10 +222,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do %{data: %{"expires_at" => %DateTime{} = expires_at}} = activity ) do with {:ok, _job} <- - Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ - activity_id: activity.id, - expires_at: expires_at - }) do + Pleroma.Workers.PurgeExpiredActivity.enqueue( + %{ + activity_id: activity.id + }, + scheduled_at: expires_at + ) do {:ok, activity} end end @@ -446,10 +448,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do _ <- notify_and_stream(activity) do maybe_federate(activity) - BackgroundWorker.enqueue("move_following", %{ + BackgroundWorker.new(%{ + "op" => "move_following", "origin_id" => origin.id, "target_id" => target.id }) + |> Oban.insert() {:ok, activity} else @@ -1797,10 +1801,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do # enqueue a task to fetch all pinned objects Enum.each(pins, fn {ap_id, _} -> if is_nil(Object.get_cached_by_ap_id(ap_id)) do - Pleroma.Workers.RemoteFetcherWorker.enqueue("fetch_remote", %{ + Pleroma.Workers.RemoteFetcherWorker.new(%{ + "op" => "fetch_remote", "id" => ap_id, "depth" => 1 }) + |> Oban.insert() end end) end diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index e040753dc..f71652cb7 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -30,11 +30,11 @@ defmodule Pleroma.Web.ActivityPub.Publisher do """ @spec enqueue_one(map(), Keyword.t()) :: {:ok, %Oban.Job{}} def enqueue_one(%{} = params, worker_args \\ []) do - PublisherWorker.enqueue( - "publish_one", - %{"params" => params}, + PublisherWorker.new( + %{"op" => "publish_one", "params" => params}, worker_args ) + |> Oban.insert() end @doc """ diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index cc1c7a0af..d6d403671 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -223,10 +223,12 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do if Pleroma.Web.Federator.allowed_thread_distance?(reply_depth) and object.data["replies"] != nil do for reply_id <- object.data["replies"] do - Pleroma.Workers.RemoteFetcherWorker.enqueue("fetch_remote", %{ + Pleroma.Workers.RemoteFetcherWorker.new(%{ + "op" => "fetch_remote", "id" => reply_id, "depth" => reply_depth }) + |> Oban.insert() end end @@ -410,10 +412,12 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do {:ok, expires_at} = Pleroma.EctoType.ActivityPub.ObjectValidators.DateTime.cast(meta[:expires_at]) - Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ - activity_id: meta[:activity_id], - expires_at: expires_at - }) + Pleroma.Workers.PurgeExpiredActivity.enqueue( + %{ + activity_id: meta[:activity_id] + }, + scheduled_at: expires_at + ) end {:ok, object, meta} diff --git a/lib/pleroma/web/common_api.ex b/lib/pleroma/web/common_api.ex index b90b6a6d9..1ed905d6c 100644 --- a/lib/pleroma/web/common_api.ex +++ b/lib/pleroma/web/common_api.ex @@ -559,11 +559,11 @@ defmodule Pleroma.Web.CommonAPI do with {:ok, _} <- ThreadMute.add_mute(user.id, activity.data["context"]), _ <- Pleroma.Notification.mark_context_as_read(user, activity.data["context"]) do if expires_in > 0 do - Pleroma.Workers.MuteExpireWorker.enqueue( - "unmute_conversation", - %{"user_id" => user.id, "activity_id" => activity.id}, + Pleroma.Workers.MuteExpireWorker.new( + %{"op" => "unmute_conversation", "user_id" => user.id, "activity_id" => activity.id}, schedule_in: expires_in ) + |> Oban.insert() end {:ok, activity} diff --git a/lib/pleroma/web/federator.ex b/lib/pleroma/web/federator.ex index 3d3101d61..c740fc85f 100644 --- a/lib/pleroma/web/federator.ex +++ b/lib/pleroma/web/federator.ex @@ -35,22 +35,30 @@ defmodule Pleroma.Web.Federator do end # Client API - def incoming_ap_doc(%{params: _params, req_headers: _req_headers} = args) do - job_args = Enum.into(args, %{}, fn {k, v} -> {Atom.to_string(k), v} end) - - ReceiverWorker.enqueue( - "incoming_ap_doc", - Map.put(job_args, "timeout", :timer.seconds(20)), + def incoming_ap_doc(%{params: params, req_headers: req_headers}) do + ReceiverWorker.new( + %{ + "op" => "incoming_ap_doc", + "req_headers" => req_headers, + "params" => params, + "timeout" => :timer.seconds(20) + }, priority: 2 ) + |> Oban.insert() end def incoming_ap_doc(%{"type" => "Delete"} = params) do - ReceiverWorker.enqueue("incoming_ap_doc", %{"params" => params}, priority: 3, queue: :slow) + ReceiverWorker.new(%{"op" => "incoming_ap_doc", "params" => params}, + priority: 3, + queue: :slow + ) + |> Oban.insert() end def incoming_ap_doc(params) do - ReceiverWorker.enqueue("incoming_ap_doc", %{"params" => params}) + ReceiverWorker.new(%{"op" => "incoming_ap_doc", "params" => params}) + |> Oban.insert() end @impl true @@ -60,9 +68,10 @@ defmodule Pleroma.Web.Federator do @impl true def publish(%Pleroma.Activity{data: %{"type" => type}} = activity) do - PublisherWorker.enqueue("publish", %{"activity_id" => activity.id}, + PublisherWorker.new(%{"op" => "publish", "activity_id" => activity.id}, priority: publish_priority(type) ) + |> Oban.insert() end defp publish_priority("Delete"), do: 3 diff --git a/lib/pleroma/web/o_auth/token.ex b/lib/pleroma/web/o_auth/token.ex index 9b1198b42..d96425094 100644 --- a/lib/pleroma/web/o_auth/token.ex +++ b/lib/pleroma/web/o_auth/token.ex @@ -100,11 +100,10 @@ defmodule Pleroma.Web.OAuth.Token do def create(%App{} = app, %User{} = user, attrs \\ %{}) do with {:ok, token} <- do_create(app, user, attrs) do if Pleroma.Config.get([:oauth2, :clean_expired_tokens]) do - Pleroma.Workers.PurgeExpiredToken.enqueue(%{ - token_id: token.id, - valid_until: DateTime.from_naive!(token.valid_until, "Etc/UTC"), - mod: __MODULE__ - }) + Pleroma.Workers.PurgeExpiredToken.new(%{token_id: token.id, mod: __MODULE__}, + scheduled_at: DateTime.from_naive!(token.valid_until, "Etc/UTC") + ) + |> Oban.insert() end {:ok, token} diff --git a/lib/pleroma/web/push.ex b/lib/pleroma/web/push.ex index d4693f63e..d783f776a 100644 --- a/lib/pleroma/web/push.ex +++ b/lib/pleroma/web/push.ex @@ -28,6 +28,6 @@ defmodule Pleroma.Web.Push do @spec send(Pleroma.Notification.t()) :: {:ok, Oban.Job.t()} | {:error, Oban.Job.changeset() | term()} def send(notification) do - WebPusherWorker.enqueue("web_push", %{"notification_id" => notification.id}) + WebPusherWorker.new(%{"op" => "web_push", "notification_id" => notification.id}) end end diff --git a/lib/pleroma/workers/attachments_cleanup_worker.ex b/lib/pleroma/workers/attachments_cleanup_worker.ex index 0b570b70b..e2f92b1fd 100644 --- a/lib/pleroma/workers/attachments_cleanup_worker.ex +++ b/lib/pleroma/workers/attachments_cleanup_worker.ex @@ -8,9 +8,9 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do alias Pleroma.Object alias Pleroma.Repo - use Pleroma.Workers.WorkerHelper, queue: "slow" + use Oban.Worker, queue: :slow - @impl Oban.Worker + @impl true def perform(%Job{ args: %{ "op" => "cleanup_attachments", @@ -31,7 +31,7 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do def perform(%Job{args: %{"op" => "cleanup_attachments", "object" => _object}}), do: {:ok, :skip} - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(900) defp do_clean({object_ids, attachment_urls}) do diff --git a/lib/pleroma/workers/background_worker.ex b/lib/pleroma/workers/background_worker.ex index 870aef3c6..60da2d5ca 100644 --- a/lib/pleroma/workers/background_worker.ex +++ b/lib/pleroma/workers/background_worker.ex @@ -5,9 +5,9 @@ defmodule Pleroma.Workers.BackgroundWorker do alias Pleroma.User - use Pleroma.Workers.WorkerHelper, queue: "background" + use Oban.Worker, queue: :background - @impl Oban.Worker + @impl true def perform(%Job{args: %{"op" => "user_activation", "user_id" => user_id, "status" => status}}) do user = User.get_cached_by_id(user_id) @@ -39,6 +39,6 @@ defmodule Pleroma.Workers.BackgroundWorker do User.perform(:verify_fields_links, user) end - @impl Oban.Worker - def timeout(_job), do: :timer.seconds(15) + @impl true + def timeout(_job), do: :timer.seconds(900) end diff --git a/lib/pleroma/workers/backup_worker.ex b/lib/pleroma/workers/backup_worker.ex index d1b6fcdad..6466d8d73 100644 --- a/lib/pleroma/workers/backup_worker.ex +++ b/lib/pleroma/workers/backup_worker.ex @@ -9,7 +9,7 @@ defmodule Pleroma.Workers.BackupWorker do alias Pleroma.Config.Getting, as: Config alias Pleroma.User.Backup - @impl Oban.Worker + @impl true def perform(%Job{ args: %{"op" => "process", "backup_id" => backup_id} }) do @@ -32,7 +32,7 @@ defmodule Pleroma.Workers.BackupWorker do end end - @impl Oban.Worker + @impl true def timeout(_job), do: Config.get([Backup, :timeout], :timer.minutes(30)) defp has_email?(user) do diff --git a/lib/pleroma/workers/cron/digest_emails_worker.ex b/lib/pleroma/workers/cron/digest_emails_worker.ex index 17e92d10b..b50b52a7b 100644 --- a/lib/pleroma/workers/cron/digest_emails_worker.ex +++ b/lib/pleroma/workers/cron/digest_emails_worker.ex @@ -18,7 +18,7 @@ defmodule Pleroma.Workers.Cron.DigestEmailsWorker do require Logger - @impl Oban.Worker + @impl true def perform(_job) do config = Config.get([:email_notifications, :digest]) @@ -59,6 +59,6 @@ defmodule Pleroma.Workers.Cron.DigestEmailsWorker do User.touch_last_digest_emailed_at(user) end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) end diff --git a/lib/pleroma/workers/cron/new_users_digest_worker.ex b/lib/pleroma/workers/cron/new_users_digest_worker.ex index 1f57aad4a..787649983 100644 --- a/lib/pleroma/workers/cron/new_users_digest_worker.ex +++ b/lib/pleroma/workers/cron/new_users_digest_worker.ex @@ -9,9 +9,9 @@ defmodule Pleroma.Workers.Cron.NewUsersDigestWorker do import Ecto.Query - use Pleroma.Workers.WorkerHelper, queue: "background" + use Oban.Worker, queue: :background - @impl Oban.Worker + @impl true def perform(_job) do if Pleroma.Config.get([Pleroma.Emails.NewUsersDigestEmail, :enabled]) do today = NaiveDateTime.utc_now() |> Timex.beginning_of_day() @@ -61,6 +61,6 @@ defmodule Pleroma.Workers.Cron.NewUsersDigestWorker do :ok end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) end diff --git a/lib/pleroma/workers/delete_worker.ex b/lib/pleroma/workers/delete_worker.ex index 97003fb69..6a1c7bb38 100644 --- a/lib/pleroma/workers/delete_worker.ex +++ b/lib/pleroma/workers/delete_worker.ex @@ -6,10 +6,9 @@ defmodule Pleroma.Workers.DeleteWorker do alias Pleroma.Instances.Instance alias Pleroma.User - use Pleroma.Workers.WorkerHelper, queue: "slow" - - @impl Oban.Worker + use Oban.Worker, queue: :slow + @impl true def perform(%Job{args: %{"op" => "delete_user", "user_id" => user_id}}) do user = User.get_cached_by_id(user_id) User.perform(:delete, user) @@ -19,6 +18,6 @@ defmodule Pleroma.Workers.DeleteWorker do Instance.perform(:delete_instance, host) end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(900) end diff --git a/lib/pleroma/workers/mailer_worker.ex b/lib/pleroma/workers/mailer_worker.ex index 652bf77e0..b0259b191 100644 --- a/lib/pleroma/workers/mailer_worker.ex +++ b/lib/pleroma/workers/mailer_worker.ex @@ -3,9 +3,9 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Workers.MailerWorker do - use Pleroma.Workers.WorkerHelper, queue: "background" + use Oban.Worker, queue: :background - @impl Oban.Worker + @impl true def perform(%Job{args: %{"op" => "email", "encoded_email" => encoded_email, "config" => config}}) do encoded_email |> Base.decode64!() @@ -13,6 +13,6 @@ defmodule Pleroma.Workers.MailerWorker do |> Pleroma.Emails.Mailer.deliver(config) end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) end diff --git a/lib/pleroma/workers/mute_expire_worker.ex b/lib/pleroma/workers/mute_expire_worker.ex index a7ab5883a..8356a775d 100644 --- a/lib/pleroma/workers/mute_expire_worker.ex +++ b/lib/pleroma/workers/mute_expire_worker.ex @@ -3,9 +3,9 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Workers.MuteExpireWorker do - use Pleroma.Workers.WorkerHelper, queue: "background" + use Oban.Worker, queue: :background - @impl Oban.Worker + @impl true def perform(%Job{args: %{"op" => "unmute_user", "muter_id" => muter_id, "mutee_id" => mutee_id}}) do Pleroma.User.unmute(muter_id, mutee_id) :ok @@ -18,6 +18,6 @@ defmodule Pleroma.Workers.MuteExpireWorker do :ok end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) end diff --git a/lib/pleroma/workers/poll_worker.ex b/lib/pleroma/workers/poll_worker.ex index af8997e70..d263aa1b9 100644 --- a/lib/pleroma/workers/poll_worker.ex +++ b/lib/pleroma/workers/poll_worker.ex @@ -6,13 +6,13 @@ defmodule Pleroma.Workers.PollWorker do @moduledoc """ Generates notifications when a poll ends. """ - use Pleroma.Workers.WorkerHelper, queue: "background" + use Oban.Worker, queue: :background alias Pleroma.Activity alias Pleroma.Notification alias Pleroma.Object - @impl Oban.Worker + @impl true def perform(%Job{args: %{"op" => "poll_end", "activity_id" => activity_id}}) do with %Activity{} = activity <- find_poll_activity(activity_id), {:ok, notifications} <- Notification.create_poll_notifications(activity) do @@ -23,7 +23,7 @@ defmodule Pleroma.Workers.PollWorker do end end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) defp find_poll_activity(activity_id) do diff --git a/lib/pleroma/workers/publisher_worker.ex b/lib/pleroma/workers/publisher_worker.ex index 63fcf4ac2..7d9b022de 100644 --- a/lib/pleroma/workers/publisher_worker.ex +++ b/lib/pleroma/workers/publisher_worker.ex @@ -6,13 +6,9 @@ defmodule Pleroma.Workers.PublisherWorker do alias Pleroma.Activity alias Pleroma.Web.Federator - use Pleroma.Workers.WorkerHelper, queue: "federator_outgoing" + use Oban.Worker, queue: :federator_outgoing, max_attempts: 5 - def backoff(%Job{attempt: attempt}) when is_integer(attempt) do - Pleroma.Workers.WorkerHelper.sidekiq_backoff(attempt, 5) - end - - @impl Oban.Worker + @impl true def perform(%Job{args: %{"op" => "publish", "activity_id" => activity_id}}) do activity = Activity.get_by_id(activity_id) Federator.perform(:publish, activity) @@ -23,6 +19,18 @@ defmodule Pleroma.Workers.PublisherWorker do Federator.perform(:publish_one, params) end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(10) + + @base_backoff 15 + @pow 5 + @impl true + def backoff(%Job{attempt: attempt}) when is_integer(attempt) do + backoff = + :math.pow(attempt, @pow) + + @base_backoff + + :rand.uniform(2 * @base_backoff) * attempt + + trunc(backoff) + end end diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex index f48e34042..f05e75f46 100644 --- a/lib/pleroma/workers/purge_expired_activity.ex +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -13,16 +13,13 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do alias Pleroma.Activity - @spec enqueue(map()) :: + @spec enqueue(map(), list()) :: {:ok, Oban.Job.t()} | {:error, :expired_activities_disabled} | {:error, :expiration_too_close} - def enqueue(args) do + def enqueue(params, worker_args) do with true <- enabled?() do - {scheduled_at, args} = Map.pop(args, :expires_at) - - args - |> new(scheduled_at: scheduled_at) + new(params, worker_args) |> Oban.insert() end end @@ -35,7 +32,7 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do end end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) defp enabled? do diff --git a/lib/pleroma/workers/purge_expired_filter.ex b/lib/pleroma/workers/purge_expired_filter.ex index 1f6931e4c..0405f6684 100644 --- a/lib/pleroma/workers/purge_expired_filter.ex +++ b/lib/pleroma/workers/purge_expired_filter.ex @@ -31,7 +31,7 @@ defmodule Pleroma.Workers.PurgeExpiredFilter do |> Repo.delete() end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) @spec get_expiration(pos_integer()) :: Job.t() | nil diff --git a/lib/pleroma/workers/purge_expired_token.ex b/lib/pleroma/workers/purge_expired_token.ex index 1854bf561..ff962f21b 100644 --- a/lib/pleroma/workers/purge_expired_token.ex +++ b/lib/pleroma/workers/purge_expired_token.ex @@ -9,16 +9,6 @@ defmodule Pleroma.Workers.PurgeExpiredToken do use Oban.Worker, queue: :background, max_attempts: 1 - @spec enqueue(%{token_id: integer(), valid_until: DateTime.t(), mod: module()}) :: - {:ok, Oban.Job.t()} | {:error, Ecto.Changeset.t()} - def enqueue(args) do - {scheduled_at, args} = Map.pop(args, :valid_until) - - args - |> __MODULE__.new(scheduled_at: scheduled_at) - |> Oban.insert() - end - @impl true def perform(%Oban.Job{args: %{"token_id" => id, "mod" => module}}) do module @@ -27,6 +17,6 @@ defmodule Pleroma.Workers.PurgeExpiredToken do |> Pleroma.Repo.delete() end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) end diff --git a/lib/pleroma/workers/receiver_worker.ex b/lib/pleroma/workers/receiver_worker.ex index fd5c13fca..d4db97b63 100644 --- a/lib/pleroma/workers/receiver_worker.ex +++ b/lib/pleroma/workers/receiver_worker.ex @@ -7,9 +7,9 @@ defmodule Pleroma.Workers.ReceiverWorker do alias Pleroma.User alias Pleroma.Web.Federator - use Pleroma.Workers.WorkerHelper, queue: "federator_incoming" + use Oban.Worker, queue: :federator_incoming, max_attempts: 5 - @impl Oban.Worker + @impl true def perform(%Job{ args: %{ @@ -51,7 +51,7 @@ defmodule Pleroma.Workers.ReceiverWorker do end end - @impl Oban.Worker + @impl true def timeout(%_{args: %{"timeout" => timeout}}), do: timeout def timeout(_job), do: :timer.seconds(5) diff --git a/lib/pleroma/workers/remote_fetcher_worker.ex b/lib/pleroma/workers/remote_fetcher_worker.ex index 60096e14b..e43765733 100644 --- a/lib/pleroma/workers/remote_fetcher_worker.ex +++ b/lib/pleroma/workers/remote_fetcher_worker.ex @@ -5,9 +5,9 @@ defmodule Pleroma.Workers.RemoteFetcherWorker do alias Pleroma.Object.Fetcher - use Pleroma.Workers.WorkerHelper, queue: "background" + use Oban.Worker, queue: :background - @impl Oban.Worker + @impl true def perform(%Job{args: %{"op" => "fetch_remote", "id" => id} = args}) do case Fetcher.fetch_object_from_id(id, depth: args["depth"]) do {:ok, _object} -> @@ -30,6 +30,6 @@ defmodule Pleroma.Workers.RemoteFetcherWorker do end end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(15) end diff --git a/lib/pleroma/workers/rich_media_worker.ex b/lib/pleroma/workers/rich_media_worker.ex index 2ebf42d4f..d5ba7b63e 100644 --- a/lib/pleroma/workers/rich_media_worker.ex +++ b/lib/pleroma/workers/rich_media_worker.ex @@ -9,7 +9,7 @@ defmodule Pleroma.Workers.RichMediaWorker do use Oban.Worker, queue: :background, max_attempts: 3, unique: [period: 300] - @impl Oban.Worker + @impl true def perform(%Job{args: %{"op" => "expire", "url" => url} = _args}) do Card.delete(url) end @@ -33,7 +33,7 @@ defmodule Pleroma.Workers.RichMediaWorker do # a slow/infinite data stream and insert a negative cache entry for the URL # We pad it by 2 seconds to be certain a slow connection is detected and we # can inject a negative cache entry for the URL - @impl Oban.Worker + @impl true def timeout(_job) do Config.get!([:rich_media, :timeout]) + :timer.seconds(2) end diff --git a/lib/pleroma/workers/scheduled_activity_worker.ex b/lib/pleroma/workers/scheduled_activity_worker.ex index ab62686f4..da386e0c3 100644 --- a/lib/pleroma/workers/scheduled_activity_worker.ex +++ b/lib/pleroma/workers/scheduled_activity_worker.ex @@ -7,7 +7,7 @@ defmodule Pleroma.Workers.ScheduledActivityWorker do The worker to post scheduled activity. """ - use Pleroma.Workers.WorkerHelper, queue: "federator_outgoing" + use Oban.Worker, queue: :federator_outgoing, max_attempts: 5 alias Pleroma.Repo alias Pleroma.ScheduledActivity @@ -15,7 +15,7 @@ defmodule Pleroma.Workers.ScheduledActivityWorker do require Logger - @impl Oban.Worker + @impl true def perform(%Job{args: %{"activity_id" => activity_id}}) do with %ScheduledActivity{} = scheduled_activity <- find_scheduled_activity(activity_id), %User{} = user <- find_user(scheduled_activity.user_id) do @@ -37,7 +37,7 @@ defmodule Pleroma.Workers.ScheduledActivityWorker do end end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) defp find_scheduled_activity(id) do diff --git a/lib/pleroma/workers/search_indexing_worker.ex b/lib/pleroma/workers/search_indexing_worker.ex index 8969ae378..001f5254d 100644 --- a/lib/pleroma/workers/search_indexing_worker.ex +++ b/lib/pleroma/workers/search_indexing_worker.ex @@ -1,7 +1,7 @@ defmodule Pleroma.Workers.SearchIndexingWorker do - use Pleroma.Workers.WorkerHelper, queue: "search_indexing" + use Oban.Worker, queue: :search_indexing, max_attempts: 2 - @impl Oban.Worker + @impl true alias Pleroma.Config.Getting, as: Config @@ -21,6 +21,6 @@ defmodule Pleroma.Workers.SearchIndexingWorker do search_module.remove_from_index(object) end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) end diff --git a/lib/pleroma/workers/user_refresh_worker.ex b/lib/pleroma/workers/user_refresh_worker.ex index fb90e9c9c..222a4a8f7 100644 --- a/lib/pleroma/workers/user_refresh_worker.ex +++ b/lib/pleroma/workers/user_refresh_worker.ex @@ -12,6 +12,6 @@ defmodule Pleroma.Workers.UserRefreshWorker do User.fetch_by_ap_id(ap_id) end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(15) end diff --git a/lib/pleroma/workers/web_pusher_worker.ex b/lib/pleroma/workers/web_pusher_worker.ex index c549d3cd6..f4232d02a 100644 --- a/lib/pleroma/workers/web_pusher_worker.ex +++ b/lib/pleroma/workers/web_pusher_worker.ex @@ -7,9 +7,9 @@ defmodule Pleroma.Workers.WebPusherWorker do alias Pleroma.Repo alias Pleroma.Web.Push.Impl - use Pleroma.Workers.WorkerHelper, queue: "web_push" + use Oban.Worker, queue: :web_push - @impl Oban.Worker + @impl true def perform(%Job{args: %{"op" => "web_push", "notification_id" => notification_id}}) do notification = Notification @@ -20,6 +20,6 @@ defmodule Pleroma.Workers.WebPusherWorker do |> Enum.each(&Impl.deliver(&1)) end - @impl Oban.Worker + @impl true def timeout(_job), do: :timer.seconds(5) end diff --git a/lib/pleroma/workers/worker_helper.ex b/lib/pleroma/workers/worker_helper.ex deleted file mode 100644 index 1d20cbd89..000000000 --- a/lib/pleroma/workers/worker_helper.ex +++ /dev/null @@ -1,48 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2022 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Workers.WorkerHelper do - alias Pleroma.Config - alias Pleroma.Workers.WorkerHelper - - def worker_args(queue) do - case Config.get([:workers, :retries, queue]) do - nil -> [] - max_attempts -> [max_attempts: max_attempts] - end - end - - def sidekiq_backoff(attempt, pow \\ 4, base_backoff \\ 15) do - backoff = - :math.pow(attempt, pow) + - base_backoff + - :rand.uniform(2 * base_backoff) * attempt - - trunc(backoff) - end - - defmacro __using__(opts) do - caller_module = __CALLER__.module - queue = Keyword.fetch!(opts, :queue) - - quote do - # Note: `max_attempts` is intended to be overridden in `new/2` call - use Oban.Worker, - queue: unquote(queue), - max_attempts: 1 - - alias Oban.Job - - def enqueue(op, params, worker_args \\ []) do - params = Map.merge(%{"op" => op}, params) - queue_atom = String.to_atom(unquote(queue)) - worker_args = worker_args ++ WorkerHelper.worker_args(queue_atom) - - unquote(caller_module) - |> apply(:new, [params, worker_args]) - |> Oban.insert() - end - end - end -end diff --git a/test/mix/tasks/pleroma/database_test.exs b/test/mix/tasks/pleroma/database_test.exs index a51a3bf3d..96a925528 100644 --- a/test/mix/tasks/pleroma/database_test.exs +++ b/test/mix/tasks/pleroma/database_test.exs @@ -623,10 +623,12 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do expires_at = DateTime.add(DateTime.utc_now(), 60 * 61) - Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ - activity_id: activity_id3, - expires_at: expires_at - }) + Pleroma.Workers.PurgeExpiredActivity.enqueue( + %{ + activity_id: activity_id3 + }, + scheduled_at: expires_at + ) Mix.Tasks.Pleroma.Database.run(["ensure_expiration"]) diff --git a/test/pleroma/workers/purge_expired_activity_test.exs b/test/pleroma/workers/purge_expired_activity_test.exs index 040ff6a51..ea563d3d3 100644 --- a/test/pleroma/workers/purge_expired_activity_test.exs +++ b/test/pleroma/workers/purge_expired_activity_test.exs @@ -14,10 +14,12 @@ defmodule Pleroma.Workers.PurgeExpiredActivityTest do activity = insert(:note_activity) assert {:ok, _} = - PurgeExpiredActivity.enqueue(%{ - activity_id: activity.id, - expires_at: DateTime.add(DateTime.utc_now(), 3601) - }) + PurgeExpiredActivity.enqueue( + %{ + activity_id: activity.id + }, + scheduled_at: DateTime.add(DateTime.utc_now(), 3601) + ) assert_enqueued( worker: Pleroma.Workers.PurgeExpiredActivity, @@ -34,10 +36,12 @@ defmodule Pleroma.Workers.PurgeExpiredActivityTest do activity = insert(:note_activity) assert {:ok, _} = - PurgeExpiredActivity.enqueue(%{ - activity_id: activity.id, - expires_at: DateTime.add(DateTime.utc_now(), 3601) - }) + PurgeExpiredActivity.enqueue( + %{ + activity_id: activity.id + }, + scheduled_at: DateTime.add(DateTime.utc_now(), 3601) + ) user = Pleroma.User.get_by_ap_id(activity.actor) Pleroma.Repo.delete(user) @@ -48,10 +52,12 @@ defmodule Pleroma.Workers.PurgeExpiredActivityTest do test "error if actiivity was not found" do assert {:ok, _} = - PurgeExpiredActivity.enqueue(%{ - activity_id: "some_id", - expires_at: DateTime.add(DateTime.utc_now(), 3601) - }) + PurgeExpiredActivity.enqueue( + %{ + activity_id: "some_id" + }, + scheduled_at: DateTime.add(DateTime.utc_now(), 3601) + ) assert {:cancel, :activity_not_found} = perform_job(Pleroma.Workers.PurgeExpiredActivity, %{activity_id: "some_if"}) From 1d3a92be1101b04d1b69b8b3fd030d5d06f4dbea Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 28 Jun 2024 12:06:43 -0400 Subject: [PATCH 17/74] Remove :workers config from ConfigDB --- config/description.exs | 17 ----------------- ...240628160536_deprecate_config_db_workers.exs | 7 +++++++ 2 files changed, 7 insertions(+), 17 deletions(-) create mode 100644 priv/repo/migrations/20240628160536_deprecate_config_db_workers.exs diff --git a/config/description.exs b/config/description.exs index 2809e9130..15faecb38 100644 --- a/config/description.exs +++ b/config/description.exs @@ -2013,23 +2013,6 @@ config :pleroma, :config_description, [ } ] }, - %{ - group: :pleroma, - key: :workers, - type: :group, - description: "Includes custom worker options not interpretable directly by `Oban`", - children: [ - %{ - key: :retries, - type: {:keyword, :integer}, - description: "Max retry attempts for failed jobs, per `Oban` queue", - suggestions: [ - federator_incoming: 5, - federator_outgoing: 5 - ] - } - ] - }, %{ group: :pleroma, key: Pleroma.Web.Metadata, diff --git a/priv/repo/migrations/20240628160536_deprecate_config_db_workers.exs b/priv/repo/migrations/20240628160536_deprecate_config_db_workers.exs new file mode 100644 index 000000000..549dd22e9 --- /dev/null +++ b/priv/repo/migrations/20240628160536_deprecate_config_db_workers.exs @@ -0,0 +1,7 @@ +defmodule Pleroma.Repo.Migrations.DeprecateConfigDBWorkers do + use Ecto.Migration + + def change do + execute("DELETE FROM config WHERE config.group = ':workers'") + end +end From d56b889cf1f530364ecd10836f8bd11b67eccb47 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 28 Jun 2024 12:21:27 -0400 Subject: [PATCH 18/74] Update changelog --- changelog.d/workerhelper.change | 1 + changelog.d/workerhelper.skip | 0 2 files changed, 1 insertion(+) create mode 100644 changelog.d/workerhelper.change delete mode 100644 changelog.d/workerhelper.skip diff --git a/changelog.d/workerhelper.change b/changelog.d/workerhelper.change new file mode 100644 index 000000000..7a20c4af8 --- /dev/null +++ b/changelog.d/workerhelper.change @@ -0,0 +1 @@ +Worker configuration is no longer available. This only affects custom max_retries values for Oban queues. diff --git a/changelog.d/workerhelper.skip b/changelog.d/workerhelper.skip deleted file mode 100644 index e69de29bb..000000000 From b50261262ebc90739b8868ca588d3a8d6ed43b7d Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 30 Jul 2024 11:48:10 -0400 Subject: [PATCH 19/74] Fix publisher job migration error --- changelog.d/fix-migration.skip | 0 .../20240729163838_publisher_job_change.exs | 13 +++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 changelog.d/fix-migration.skip diff --git a/changelog.d/fix-migration.skip b/changelog.d/fix-migration.skip new file mode 100644 index 000000000..e69de29bb diff --git a/priv/repo/migrations/20240729163838_publisher_job_change.exs b/priv/repo/migrations/20240729163838_publisher_job_change.exs index 3449e3b3b..cbea18205 100644 --- a/priv/repo/migrations/20240729163838_publisher_job_change.exs +++ b/priv/repo/migrations/20240729163838_publisher_job_change.exs @@ -16,12 +16,17 @@ defmodule Pleroma.Repo.Migrations.PublisherJobChange do Enum.each(jobs, fn job -> args = job.args - activity = Activity.get_by_ap_id(args["id"]) - updated_args = Map.put(args, "activity_id", activity.id) + case Activity.get_by_ap_id(args["id"]) do + nil -> + :ok - Pleroma.Workers.PublisherWorker.new(updated_args) - |> Oban.insert() + %Activity{id: activity_id} -> + updated_args = Map.put(args, "activity_id", activity_id) + + Pleroma.Workers.PublisherWorker.new(updated_args) + |> Oban.insert() + end end) end end From e6951e7e409471a5fa68bd2387a758d6abb1f728 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 31 Jul 2024 14:14:31 -0400 Subject: [PATCH 20/74] Fix User.disclose_client never working correctly Our test environment cheats by constructing a conn with a custom oauth_access/2 function. This assigns a :token to the conn but due to the way it is constructed it has the :user preloaded. When the OAuth Plug fetches a token it does not preload the user, so the check for user.disclose_client was always nil and assumed to be false. Preloading the :user ensures the test environment matches reality. --- changelog.d/disclose_client.fix | 1 + lib/pleroma/web/plugs/o_auth_plug.ex | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/disclose_client.fix diff --git a/changelog.d/disclose_client.fix b/changelog.d/disclose_client.fix new file mode 100644 index 000000000..938abc930 --- /dev/null +++ b/changelog.d/disclose_client.fix @@ -0,0 +1 @@ +Client application data was always missing from the status diff --git a/lib/pleroma/web/plugs/o_auth_plug.ex b/lib/pleroma/web/plugs/o_auth_plug.ex index b59ac9d3e..488968691 100644 --- a/lib/pleroma/web/plugs/o_auth_plug.ex +++ b/lib/pleroma/web/plugs/o_auth_plug.ex @@ -52,7 +52,7 @@ defmodule Pleroma.Web.Plugs.OAuthPlug do where: t.token == ^token ) - with %Token{user_id: user_id} = token_record <- Repo.one(token_query), + with %Token{user_id: user_id} = token_record <- Repo.one(token_query) |> Repo.preload(:user), false <- is_nil(user_id), %User{} = user <- User.get_cached_by_id(user_id) do {:ok, user, token_record} From 2e6ddc49910419590470902d9c36b84cf5a0b895 Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Thu, 1 Aug 2024 11:43:44 +0400 Subject: [PATCH 21/74] Prepare changelog --- CHANGELOG.md | 153 ++++++++++++++++++ changelog.d/2.6.0-mergeback.skip | 0 changelog.d/2.6.1-mergeback.skip | 0 changelog.d/3280-fix-emoji-ids.fix | 1 - changelog.d/3900.change | 1 - changelog.d/3904.security | 1 - changelog.d/3907.skip | 0 changelog.d/3987.fix | 1 - changelog.d/4167-strip-gps-info-in-png.fix | 1 - changelog.d/account-rendering-auth-check.fix | 1 - changelog.d/add-ipfs-upload.add | 1 - changelog.d/add-nsfw-mrf.add | 1 - changelog.d/add-outbox.fix | 1 - changelog.d/add-rbl-mrf.add | 1 - changelog.d/adminfe-logger.change | 1 - changelog.d/akkoma-prune-options.add | 1 - changelog.d/anonymous-exception-else.fix | 1 - changelog.d/anti-mentionspam-mrf.add | 1 - changelog.d/api-docs-2.skip | 0 changelog.d/api-docs.skip | 0 changelog.d/atom-leak.skip | 0 changelog.d/auth-fetch-exception.add | 1 - changelog.d/authorize-interaction.add | 1 - changelog.d/authorized-fetch-rejections.add | 1 - changelog.d/backups-follows.add | 1 - changelog.d/backups-refactor.change | 1 - changelog.d/bad_inbox_request.change | 1 - changelog.d/bandit.change | 1 - changelog.d/bandit_update_1.5.2.change | 1 - changelog.d/bare_uri_test.skip | 0 changelog.d/benchee.skip | 0 changelog.d/blurhash.change | 1 - changelog.d/bookmark-folders.add | 1 - changelog.d/bookmark-folders.skip | 0 changelog.d/bugfix-ccworks.fix | 1 - .../build-release-with-local-libvips.skip | 0 changelog.d/bump-elixir.change | 1 - changelog.d/card-endpoint.remove | 1 - changelog.d/card-image-description.add | 1 - changelog.d/chat-attachment-empty-array.fix | 1 - changelog.d/ci-cache.skip | 0 changelog.d/ci-elixir-1.16.skip | 0 changelog.d/ci-elixir-1.17.skip | 0 changelog.d/ci-erratic.skip | 0 changelog.d/ci-otp-update.skip | 0 changelog.d/cleanup.skip | 0 changelog.d/commonapi-reordering.skip | 0 changelog.d/config-stat-symlink.fix | 1 - changelog.d/content-length.fix | 1 - changelog.d/cowboy-stream-chunked.fix | 1 - changelog.d/debug-logs.skip | 0 changelog.d/deprecations.skip | 1 - changelog.d/deprecations2.skip | 0 changelog.d/deps-bump-2024-01-25.skip | 0 changelog.d/deps-bump-2024-06-07.skip | 2 - changelog.d/deps-poison-test-only.skip | 0 changelog.d/description-meilisearch-type.skip | 0 changelog.d/dialyzer.skip | 0 changelog.d/dialyzer2.skip | 0 changelog.d/dialyzer3.skip | 0 changelog.d/dialyzer4.skip | 0 changelog.d/dialyzer5.skip | 0 changelog.d/digest_emails.fix | 1 - changelog.d/disclose_client.fix | 1 - changelog.d/doc-fix.skip | 0 changelog.d/docs-max-elixir-erlang.change | 1 - changelog.d/docs-netbsd-update.change | 1 - changelog.d/elixir-1.15.fix | 1 - changelog.d/emoji-download-paginate.fix | 1 - changelog.d/emoji-use-v1.fix | 1 - changelog.d/exile-bsds.skip | 0 changelog.d/exile-freebsd.skip | 0 changelog.d/exile-macos.skip | 0 changelog.d/exile.skip | 0 changelog.d/familiar-followers.add | 1 - changelog.d/favicon.add | 1 - changelog.d/federation_status-access.change | 1 - changelog.d/federator-modules.remove | 1 - changelog.d/federator.skip | 0 .../federator_outgoing_increase.change | 1 - changelog.d/fep-2c59.add | 1 - changelog.d/ffmpeg-limiter.add | 1 - changelog.d/finch_redirects.fix | 1 - changelog.d/fix-bookmark-folder-tests.skip | 0 changelog.d/fix-dockerfile.skip | 0 .../fix-duplicate-inbox-deliveries.fix | 0 changelog.d/fix-migration.skip | 0 changelog.d/fix-mrfs.add | 1 - changelog.d/fix-otp-comparison.skip | 0 changelog.d/fix-tests.skip | 0 changelog.d/fix-webfinger-spoofing.security | 1 - changelog.d/force-mention-mrf.add | 1 - changelog.d/framegrabs.fix | 1 - changelog.d/frontend-management.add | 1 - .../generate-unset-user-keys-migration.skip | 0 changelog.d/group-actor.add | 1 - changelog.d/group-repeats.fix | 1 - changelog.d/gun-logs-debug.skip | 0 changelog.d/gun-logs.skip | 0 changelog.d/gun_pool.fix | 1 - changelog.d/gun_pool2.fix | 1 - changelog.d/gun_pool3.skip | 0 changelog.d/gun_pool4.fix | 1 - changelog.d/hackney-pool-timeouts.change | 1 - .../handle-non-validate-delete-errors.change | 1 - .../handle_object_fetch_failures.change | 1 - changelog.d/healthcheck-disabled-error.fix | 1 - changelog.d/ingestion-queue.skip | 0 changelog.d/instance-contact-account.add | 1 - changelog.d/instance-defdelegates.skip | 0 changelog.d/instance-rules.add | 1 - changelog.d/instance-v2.add | 1 - changelog.d/instance-v2.skip | 0 changelog.d/ipfs-dialyzer.skip | 1 - changelog.d/issue-3241.fix | 1 - changelog.d/last_status_at.change | 1 - changelog.d/ldap-error-logging.change | 1 - changelog.d/ldap.fix | 1 - changelog.d/link-verification.add | 1 - changelog.d/loading-order-test-fix.skip | 0 changelog.d/local-webfinger.fix | 1 - changelog.d/logger-metadata.add | 1 - changelog.d/mark-read.fix | 1 - changelog.d/mastodon_api_v2.add | 1 - changelog.d/mastodon_directory.fix | 1 - changelog.d/mediaproxy-http.fix | 1 - changelog.d/meilisearch.add | 1 - changelog.d/memleak.fix | 1 - changelog.d/mergeback-2.6.2.skip | 0 changelog.d/metadata-provider-empty-post.fix | 1 - changelog.d/migration-fix.skip | 1 - changelog.d/missing-fks.add | 1 - changelog.d/missing-mrfs.add | 1 - changelog.d/mix-indexer.add | 1 - changelog.d/mrf-nsfw-otp25.skip | 1 - changelog.d/mrf-regex-error.fix | 1 - changelog.d/mrf-steal-emoji-extname.fix | 1 - changelog.d/mrf_hashtags.fix | 1 - changelog.d/nil-content-map.fix | 1 - changelog.d/no-async-with-clear-config.skip | 0 changelog.d/notification-spex.skip | 0 changelog.d/notifications-index.fix | 1 - changelog.d/notifications.fix | 1 - changelog.d/oauth-nickname.skip | 1 - changelog.d/oban-cancel-badreq.change | 1 - changelog.d/oban-cancel-federation.add | 1 - changelog.d/oban-cancel-poll-result.change | 1 - changelog.d/oban-cancel-receiverworker.change | 1 - changelog.d/oban-cancel.change | 1 - changelog.d/oban-deprecated-discards.skip | 0 changelog.d/oban-fetcher-rejected.change | 1 - changelog.d/oban-live_dashboard.add | 1 - changelog.d/oban-queues.change | 1 - changelog.d/oban-rich-media-errors.fix | 1 - changelog.d/oban-timeouts.change | 1 - changelog.d/oban-timeouts.skip | 0 changelog.d/oban-transmogrifier.skip | 0 changelog.d/oban-user-refresh-unique.fix | 1 - changelog.d/opengraph-rich-media-proxy.add | 1 - changelog.d/optimistic-inbox-sigs.fix | 1 - changelog.d/optimistic-inbox.change | 1 - changelog.d/otp26.add | 1 - changelog.d/pinned-collection-fetch.security | 1 - changelog.d/pools.change | 1 - changelog.d/postgres-jit.change | 1 - changelog.d/prioritize-direct-recipients.add | 1 - changelog.d/prometheus-docs.change | 1 - changelog.d/promex.change | 1 - changelog.d/promexdocs.add | 1 - changelog.d/public-polls.add | 1 - changelog.d/publisher.change | 1 - changelog.d/publisher_discard.change | 1 - changelog.d/publisher_log.change | 1 - changelog.d/qdrant_search.add | 1 - changelog.d/qtfaststart.fix | 1 - changelog.d/quotes-count.skip | 0 changelog.d/reachability.change | 1 - changelog.d/realpath-over-readlink.fix | 1 - changelog.d/receiverworker-error-handling.fix | 1 - changelog.d/remote-fetcher-error.skip | 0 changelog.d/reply-to-deleted.change | 1 - changelog.d/rich-media-hardening.fix | 1 - changelog.d/rich_media.fix | 1 - changelog.d/rich_media_backfill.change | 1 - changelog.d/rich_media_config.skip | 0 changelog.d/rich_media_oban.skip | 0 changelog.d/rich_media_refactor.change | 1 - changelog.d/rich_media_stream_test.skip | 0 changelog.d/rich_media_tests.skip | 0 changelog.d/richmediattl.fix | 1 - changelog.d/scrobble-url.add | 1 - changelog.d/scrubbers-html4-GtS.add | 1 - changelog.d/search-healthcheck.add | 1 - changelog.d/show-reposter-replies.add | 1 - changelog.d/spex-error-log.skip | 0 changelog.d/status-notification-type.add | 1 - changelog.d/stream-end-poll.fix | 1 - changelog.d/support-honk-image-summaries.add | 1 - changelog.d/system-cflags.fix | 1 - changelog.d/tesla.deps | 1 - changelog.d/test-improvements.skip | 0 changelog.d/testsecrets.skip | 0 .../transient-validators-defaults.change | 1 - changelog.d/typo.skip | 0 changelog.d/user-refresh-rework.skip | 0 changelog.d/user-refresh.change | 1 - changelog.d/video-thumbs.fix | 1 - changelog.d/vips.change | 1 - changelog.d/web_push.fix | 1 - changelog.d/web_push_actor_regression.skip | 0 changelog.d/web_push_filtered.fix | 1 - changelog.d/webfinger-validation.fix | 1 - changelog.d/webpush-polls.change | 1 - changelog.d/websocket-refactor.change | 1 - 214 files changed, 153 insertions(+), 149 deletions(-) delete mode 100644 changelog.d/2.6.0-mergeback.skip delete mode 100644 changelog.d/2.6.1-mergeback.skip delete mode 100644 changelog.d/3280-fix-emoji-ids.fix delete mode 100644 changelog.d/3900.change delete mode 100644 changelog.d/3904.security delete mode 100644 changelog.d/3907.skip delete mode 100644 changelog.d/3987.fix delete mode 100644 changelog.d/4167-strip-gps-info-in-png.fix delete mode 100644 changelog.d/account-rendering-auth-check.fix delete mode 100644 changelog.d/add-ipfs-upload.add delete mode 100644 changelog.d/add-nsfw-mrf.add delete mode 100644 changelog.d/add-outbox.fix delete mode 100644 changelog.d/add-rbl-mrf.add delete mode 100644 changelog.d/adminfe-logger.change delete mode 100644 changelog.d/akkoma-prune-options.add delete mode 100644 changelog.d/anonymous-exception-else.fix delete mode 100644 changelog.d/anti-mentionspam-mrf.add delete mode 100644 changelog.d/api-docs-2.skip delete mode 100644 changelog.d/api-docs.skip delete mode 100644 changelog.d/atom-leak.skip delete mode 100644 changelog.d/auth-fetch-exception.add delete mode 100644 changelog.d/authorize-interaction.add delete mode 100644 changelog.d/authorized-fetch-rejections.add delete mode 100644 changelog.d/backups-follows.add delete mode 100644 changelog.d/backups-refactor.change delete mode 100644 changelog.d/bad_inbox_request.change delete mode 100644 changelog.d/bandit.change delete mode 100644 changelog.d/bandit_update_1.5.2.change delete mode 100644 changelog.d/bare_uri_test.skip delete mode 100644 changelog.d/benchee.skip delete mode 100644 changelog.d/blurhash.change delete mode 100644 changelog.d/bookmark-folders.add delete mode 100644 changelog.d/bookmark-folders.skip delete mode 100644 changelog.d/bugfix-ccworks.fix delete mode 100644 changelog.d/build-release-with-local-libvips.skip delete mode 100644 changelog.d/bump-elixir.change delete mode 100644 changelog.d/card-endpoint.remove delete mode 100644 changelog.d/card-image-description.add delete mode 100644 changelog.d/chat-attachment-empty-array.fix delete mode 100644 changelog.d/ci-cache.skip delete mode 100644 changelog.d/ci-elixir-1.16.skip delete mode 100644 changelog.d/ci-elixir-1.17.skip delete mode 100644 changelog.d/ci-erratic.skip delete mode 100644 changelog.d/ci-otp-update.skip delete mode 100644 changelog.d/cleanup.skip delete mode 100644 changelog.d/commonapi-reordering.skip delete mode 100644 changelog.d/config-stat-symlink.fix delete mode 100644 changelog.d/content-length.fix delete mode 100644 changelog.d/cowboy-stream-chunked.fix delete mode 100644 changelog.d/debug-logs.skip delete mode 100644 changelog.d/deprecations.skip delete mode 100644 changelog.d/deprecations2.skip delete mode 100644 changelog.d/deps-bump-2024-01-25.skip delete mode 100644 changelog.d/deps-bump-2024-06-07.skip delete mode 100644 changelog.d/deps-poison-test-only.skip delete mode 100644 changelog.d/description-meilisearch-type.skip delete mode 100644 changelog.d/dialyzer.skip delete mode 100644 changelog.d/dialyzer2.skip delete mode 100644 changelog.d/dialyzer3.skip delete mode 100644 changelog.d/dialyzer4.skip delete mode 100644 changelog.d/dialyzer5.skip delete mode 100644 changelog.d/digest_emails.fix delete mode 100644 changelog.d/disclose_client.fix delete mode 100644 changelog.d/doc-fix.skip delete mode 100644 changelog.d/docs-max-elixir-erlang.change delete mode 100644 changelog.d/docs-netbsd-update.change delete mode 100644 changelog.d/elixir-1.15.fix delete mode 100644 changelog.d/emoji-download-paginate.fix delete mode 100644 changelog.d/emoji-use-v1.fix delete mode 100644 changelog.d/exile-bsds.skip delete mode 100644 changelog.d/exile-freebsd.skip delete mode 100644 changelog.d/exile-macos.skip delete mode 100644 changelog.d/exile.skip delete mode 100644 changelog.d/familiar-followers.add delete mode 100644 changelog.d/favicon.add delete mode 100644 changelog.d/federation_status-access.change delete mode 100644 changelog.d/federator-modules.remove delete mode 100644 changelog.d/federator.skip delete mode 100644 changelog.d/federator_outgoing_increase.change delete mode 100644 changelog.d/fep-2c59.add delete mode 100644 changelog.d/ffmpeg-limiter.add delete mode 100644 changelog.d/finch_redirects.fix delete mode 100644 changelog.d/fix-bookmark-folder-tests.skip delete mode 100644 changelog.d/fix-dockerfile.skip delete mode 100644 changelog.d/fix-duplicate-inbox-deliveries.fix delete mode 100644 changelog.d/fix-migration.skip delete mode 100644 changelog.d/fix-mrfs.add delete mode 100644 changelog.d/fix-otp-comparison.skip delete mode 100644 changelog.d/fix-tests.skip delete mode 100644 changelog.d/fix-webfinger-spoofing.security delete mode 100644 changelog.d/force-mention-mrf.add delete mode 100644 changelog.d/framegrabs.fix delete mode 100644 changelog.d/frontend-management.add delete mode 100644 changelog.d/generate-unset-user-keys-migration.skip delete mode 100644 changelog.d/group-actor.add delete mode 100644 changelog.d/group-repeats.fix delete mode 100644 changelog.d/gun-logs-debug.skip delete mode 100644 changelog.d/gun-logs.skip delete mode 100644 changelog.d/gun_pool.fix delete mode 100644 changelog.d/gun_pool2.fix delete mode 100644 changelog.d/gun_pool3.skip delete mode 100644 changelog.d/gun_pool4.fix delete mode 100644 changelog.d/hackney-pool-timeouts.change delete mode 100644 changelog.d/handle-non-validate-delete-errors.change delete mode 100644 changelog.d/handle_object_fetch_failures.change delete mode 100644 changelog.d/healthcheck-disabled-error.fix delete mode 100644 changelog.d/ingestion-queue.skip delete mode 100644 changelog.d/instance-contact-account.add delete mode 100644 changelog.d/instance-defdelegates.skip delete mode 100644 changelog.d/instance-rules.add delete mode 100644 changelog.d/instance-v2.add delete mode 100644 changelog.d/instance-v2.skip delete mode 100644 changelog.d/ipfs-dialyzer.skip delete mode 100644 changelog.d/issue-3241.fix delete mode 100644 changelog.d/last_status_at.change delete mode 100644 changelog.d/ldap-error-logging.change delete mode 100644 changelog.d/ldap.fix delete mode 100644 changelog.d/link-verification.add delete mode 100644 changelog.d/loading-order-test-fix.skip delete mode 100644 changelog.d/local-webfinger.fix delete mode 100644 changelog.d/logger-metadata.add delete mode 100644 changelog.d/mark-read.fix delete mode 100644 changelog.d/mastodon_api_v2.add delete mode 100644 changelog.d/mastodon_directory.fix delete mode 100644 changelog.d/mediaproxy-http.fix delete mode 100644 changelog.d/meilisearch.add delete mode 100644 changelog.d/memleak.fix delete mode 100644 changelog.d/mergeback-2.6.2.skip delete mode 100644 changelog.d/metadata-provider-empty-post.fix delete mode 100644 changelog.d/migration-fix.skip delete mode 100644 changelog.d/missing-fks.add delete mode 100644 changelog.d/missing-mrfs.add delete mode 100644 changelog.d/mix-indexer.add delete mode 100644 changelog.d/mrf-nsfw-otp25.skip delete mode 100644 changelog.d/mrf-regex-error.fix delete mode 100644 changelog.d/mrf-steal-emoji-extname.fix delete mode 100644 changelog.d/mrf_hashtags.fix delete mode 100644 changelog.d/nil-content-map.fix delete mode 100644 changelog.d/no-async-with-clear-config.skip delete mode 100644 changelog.d/notification-spex.skip delete mode 100644 changelog.d/notifications-index.fix delete mode 100644 changelog.d/notifications.fix delete mode 100644 changelog.d/oauth-nickname.skip delete mode 100644 changelog.d/oban-cancel-badreq.change delete mode 100644 changelog.d/oban-cancel-federation.add delete mode 100644 changelog.d/oban-cancel-poll-result.change delete mode 100644 changelog.d/oban-cancel-receiverworker.change delete mode 100644 changelog.d/oban-cancel.change delete mode 100644 changelog.d/oban-deprecated-discards.skip delete mode 100644 changelog.d/oban-fetcher-rejected.change delete mode 100644 changelog.d/oban-live_dashboard.add delete mode 100644 changelog.d/oban-queues.change delete mode 100644 changelog.d/oban-rich-media-errors.fix delete mode 100644 changelog.d/oban-timeouts.change delete mode 100644 changelog.d/oban-timeouts.skip delete mode 100644 changelog.d/oban-transmogrifier.skip delete mode 100644 changelog.d/oban-user-refresh-unique.fix delete mode 100644 changelog.d/opengraph-rich-media-proxy.add delete mode 100644 changelog.d/optimistic-inbox-sigs.fix delete mode 100644 changelog.d/optimistic-inbox.change delete mode 100644 changelog.d/otp26.add delete mode 100644 changelog.d/pinned-collection-fetch.security delete mode 100644 changelog.d/pools.change delete mode 100644 changelog.d/postgres-jit.change delete mode 100644 changelog.d/prioritize-direct-recipients.add delete mode 100644 changelog.d/prometheus-docs.change delete mode 100644 changelog.d/promex.change delete mode 100644 changelog.d/promexdocs.add delete mode 100644 changelog.d/public-polls.add delete mode 100644 changelog.d/publisher.change delete mode 100644 changelog.d/publisher_discard.change delete mode 100644 changelog.d/publisher_log.change delete mode 100644 changelog.d/qdrant_search.add delete mode 100644 changelog.d/qtfaststart.fix delete mode 100644 changelog.d/quotes-count.skip delete mode 100644 changelog.d/reachability.change delete mode 100644 changelog.d/realpath-over-readlink.fix delete mode 100644 changelog.d/receiverworker-error-handling.fix delete mode 100644 changelog.d/remote-fetcher-error.skip delete mode 100644 changelog.d/reply-to-deleted.change delete mode 100644 changelog.d/rich-media-hardening.fix delete mode 100644 changelog.d/rich_media.fix delete mode 100644 changelog.d/rich_media_backfill.change delete mode 100644 changelog.d/rich_media_config.skip delete mode 100644 changelog.d/rich_media_oban.skip delete mode 100644 changelog.d/rich_media_refactor.change delete mode 100644 changelog.d/rich_media_stream_test.skip delete mode 100644 changelog.d/rich_media_tests.skip delete mode 100644 changelog.d/richmediattl.fix delete mode 100644 changelog.d/scrobble-url.add delete mode 100644 changelog.d/scrubbers-html4-GtS.add delete mode 100644 changelog.d/search-healthcheck.add delete mode 100644 changelog.d/show-reposter-replies.add delete mode 100644 changelog.d/spex-error-log.skip delete mode 100644 changelog.d/status-notification-type.add delete mode 100644 changelog.d/stream-end-poll.fix delete mode 100644 changelog.d/support-honk-image-summaries.add delete mode 100644 changelog.d/system-cflags.fix delete mode 100644 changelog.d/tesla.deps delete mode 100644 changelog.d/test-improvements.skip delete mode 100644 changelog.d/testsecrets.skip delete mode 100644 changelog.d/transient-validators-defaults.change delete mode 100644 changelog.d/typo.skip delete mode 100644 changelog.d/user-refresh-rework.skip delete mode 100644 changelog.d/user-refresh.change delete mode 100644 changelog.d/video-thumbs.fix delete mode 100644 changelog.d/vips.change delete mode 100644 changelog.d/web_push.fix delete mode 100644 changelog.d/web_push_actor_regression.skip delete mode 100644 changelog.d/web_push_filtered.fix delete mode 100644 changelog.d/webfinger-validation.fix delete mode 100644 changelog.d/webpush-polls.change delete mode 100644 changelog.d/websocket-refactor.change diff --git a/CHANGELOG.md b/CHANGELOG.md index 063d51d4c..61bb2ab54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,159 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 2.7.0 + +### Security +- HTTP Security: By default, don't allow unsafe-eval. The setting needs to be changed to allow Flash emulation. +- Fix webfinger spoofing. +- Use proper workers for fetching pins instead of an ad-hoc task, fixing a potential fetch loop + +### Changed +- Update to Phoenix 1.7 +- Elixir Logger configuration is now longer permitted through AdminFE and ConfigDB +- Refactor the user backups code and improve test coverage +- Invalid activities delivered to the inbox will be rejected with a 400 Bad Request +- Support Bandit as an alternative to Cowboy for the HTTP server. +- Update Bandit to 1.5.2 +- Replace eblurhash with rinpatch_blurhash. This also removes a dependency on ImageMagick. +- Elixir 1.13 is the minimum required version. +- Document maximum supported version of Erlang & Elixir +- Update and extend NetBSD installation docs +- Make `/api/v1/pleroma/federation_status` publicly available +- Increase outgoing federation parallelism +- Change Hackney connection pool timeouts to align with the values Gun uses +- Transmogrifier: handle non-validate errors on incoming Delete activities +- Remote object fetch failures will prevent the object fetch job from retrying if the object request returns 401, 403, 404, 410, or exceeds the maximum thread depth. +- - Change AccountView `last_status_at` from a datetime to a date (as done in Mastodon 3.1.0) +- Improve error logging when LDAP authentication fails. +- Publisher jobs will not retry if the error received is a 400 +- PollWorker jobs will not retry if the activity no longer exists. +- Improved detecting unrecoverable errors for incoming federation jobs +- Changed some jobs to return :cancel on unrecoverable errors that should not be retried +- Discard Remote Fetcher jobs which errored due to an MRF rejection. +- Oban queues have refactored to simplify the queue design +- Ensure all Oban jobs have timeouts defined +- Optimistic Inbox reduces the processing overhead of incoming activities without instantly verifiable signatures. +- HTTP connection pool adjustments +- Disable jit by default for PostgreSQL +- Update the documentation for configuring Prometheus metrics. +- Change the prometheus library to PromEx. +- Publisher jobs now store the the activity id instead of inserting duplicate JSON data in the Oban queue for each delivery. +- Activity publishing failures will prevent the job from retrying if the publishing request returns a 403 or 410 +- Publisher errors will now emit logs indicating the inbox that was not available for delivery. +- Reduce the reachability timestamp update to a single upsert query +- A 422 error is returned when attempting to reply to a deleted status +- Rich Media backfilling is now an Oban job +- Refactored Rich Media to cache the content in the database. Fetching operations that could block status rendering have been eliminated. +- Set default values on validators for transient objects (attachment, poll options) +- User profile refreshes are now asynchronous +- Change mediaproxy previews to use vips to generate thumbnails instead of ImageMagick +- Render nice web push notifications for polls +- Refactor the Mastodon /api/v1/streaming websocket handler to use Phoenix.Socket.Transport + +### Added +- Uploader: Add support for uploading attachments using IPFS +- Add NSFW-detecting MRF +- Add DNSRBL MRF +- Add options to the mix prune_objects task +- Add Anti-mention Spam MRF backported from Rebased +- HTTPSignaturePlug: Add :authorized_fetch_mode_exceptions configuration +- Support /authorize-interaction route used by Mastodon +- Add an option to reject certain domains when authorized fetch is enabled. +- Include following/followers in backups +- Allow to group bookmarks in folders +- Include image description in status media cards +- Implement `/api/v1/accounts/familiar_followers` +- Add support for configuring favicon, embed favicon and PWA manifest in server-generated meta +- Implement FEP-2c59, add "webfinger" to user actor +- Framegrabs with ffmpeg will execute with a 5 second timeout and cache the URLs of failures with a TTL of 15 minutes to prevent excessive retries. +- Added a Mix task "pleroma.config fix_mrf_policies" which will remove erroneous MRF policies from ConfigDB. +- Add ForceMention MRF +- [docs] add frontends management documentation +- Implement group actors +- Add contact account to InstanceView +- Add instance rules +- Implement /api/v2/instance route +- Verify profile link ownership with rel="me" +- Logger metadata is now attached to some logs to help with troubleshooting and analysis +- Add new parameters to /api/v2/instance: configuration[accounts][max_pinned_statuses] and configuration[statuses][characters_reserved_per_url] +- Add meilisearch, make search engines pluggable +- Add missing indexes on foreign key relationships +- Startup detection for configured MRF modules that are missing or incorrectly defined +- Permit passing --chunk and --step values to the Pleroma.Search.Indexer Mix task +- Deleting, Unfavoriting, Unrepeating, or Unreacting will cancel undelivered publishing jobs for the original activity. +- Oban jobs can now be viewed in the Live Dashboard +- Add media proxy to opengraph rich media cards +- Support for Erlang OTP 26 +- Prioritize mentioned recipients (i.e., those that are not just followers) when federating. +- PromEx documentation +- Expose nonAnonymous field from Smithereen polls +- Add Qdrant/OpenAI embedding search +- Adds the capability to add a URL to a scrobble (optional field) +- scrubbers/default: Add more formatting elements from HTML4 / GoToSocial (acronym, bdo, big, cite, dfn, ins, kbd, q, samp, s, tt, var, wbr) +- Monitoring of search backend health to control the processing of jobs in the search indexing Oban queue +- Display reposted replies with exclude_replies: true +- Add "status" notification type +- Support honk-style attachment summaries as alt-text. + +### Fixed +- Fix Emoji object IDs not always being valid +- Remove checking ImageMagick's commands for Pleroma.Upload.Filter.AnalyzeMetadata +- Ensure that StripLocation actually removes everything resembling GPS data from PNGs +- Fix authentication check on account rendering when bio is defined +- ap userview: add outbox field. +- Fix #strip_report_status_data +- Fix federation with Convergence AP Bridge +- ChatMessage: Tolerate attachment field set to an empty array +- Config: Check the permissions of the linked file instead of the symlink +- MediaProxy was setting the content-length header which is not permitted by RFC9112§6.2 when we are chunking the reply as it conflicts with the existence of the transfer-encoding header. +- Restore Cowboy's ability to stream MediaProxy responses without Chunked encoding. +- Fix the processing of email digest jobs. +- Client application data was always missing from the status +- Elixir 1.15 compatibility +- When downloading remote emojis packs, account for pagination +- Make remote emoji packs API use specifically the V1 URL. Akkoma does not understand it without V1, and it works either way with normal pleroma, so no reason to not do this +- Following HTTP Redirects when the HTTP Adapter is Finch +- Video framegrabs were not working correctly after the change to use Exile to execute ffmpeg +- Deactivated groups would still try to repeat a post. +- Fix logic error in Gun connection pooling which prevented retries even when the worker was launched with retry = true +- Connection pool errors when publishing an activity is a soft-error that will be retried shortly. +- Gun Connection Pool was not retrying to acquire a connection if the pool was full and stale connections were reclaimed +- TwitterAPI: Return proper error when healthcheck is disabled +- Handle cases when users.inbox is nil. +- Fix LDAP support +- Use correct domain for fqn and InstanceView +- The query for marking notifications as read has been simplified +- Mastodon API /api/v1/directory: Fix listing directory contents when not authenticated +- Ensure MediaProxy HTTP requests obey all the defined connection settings +- Fix a memory leak caused by Websocket connections that would not enter a state where a full garbage collection run could be triggered. +- Fix OpenGraph and Twitter metadata providers when parsing objects with no content or summary fields. +- MRF: Log sensible error for subdomains_regex +- MRF.StealEmojiPolicy: Properly add fallback extension to filenames missing one +- Federated timeline removal of hashtags via MRF HashtagPolicy +- Support objects with a null contentMap (firefish) +- Fix notifications query which was not using the index properly +- Notifications: improve performance by filtering on users table instead of activities table +- Prevent Rich Media backfill jobs from retrying in cases where it is likely they will fail again. +- Oban Jobs for refreshing users were not respecting the uniqueness setting +- Fix Optimistic Inbox for failed signatures +- MediaProxy Preview failures prevented when encountering certain video files +- pleroma_ctl: Use realpath(1) instead of readlink(1) +- ReceiverWorker: Make sure non-{:ok, _} is returned as {:error, …} +- Harden Rich Media parsing against very slow or malicious URLs +- Rich Media Preview cache eviction when the activity is updated. +- Parsing of RichMedia TTLs for Amazon URLs when query parameters are nil +- End of poll notifications were not streamed over websockets or web push +- Fix eblurhash and elixir-captcha not using system cflags +- Video thumbnails were not being generated due to a negative cache lookup logic error +- Fix web push notifications not successfully delivering +- Web Push notifications are no longer generated for muted/blocked threads and users. +- Fix validate_webfinger when running a different domain for Webfinger + +### Removed +- Mastodon API: Remove deprecated GET /api/v1/statuses/:id/card endpoint https://github.com/mastodon/mastodon/pull/11213 +- Removed support for multiple federator modules as we only support ActivityPub + ## 2.6.2 ### Security diff --git a/changelog.d/2.6.0-mergeback.skip b/changelog.d/2.6.0-mergeback.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/2.6.1-mergeback.skip b/changelog.d/2.6.1-mergeback.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/3280-fix-emoji-ids.fix b/changelog.d/3280-fix-emoji-ids.fix deleted file mode 100644 index 1bce5b653..000000000 --- a/changelog.d/3280-fix-emoji-ids.fix +++ /dev/null @@ -1 +0,0 @@ -Fix Emoji object IDs not always being valid diff --git a/changelog.d/3900.change b/changelog.d/3900.change deleted file mode 100644 index fe0cc2fbf..000000000 --- a/changelog.d/3900.change +++ /dev/null @@ -1 +0,0 @@ -Update to Phoenix 1.7 diff --git a/changelog.d/3904.security b/changelog.d/3904.security deleted file mode 100644 index 04836d4e8..000000000 --- a/changelog.d/3904.security +++ /dev/null @@ -1 +0,0 @@ -HTTP Security: By default, don't allow unsafe-eval. The setting needs to be changed to allow Flash emulation. diff --git a/changelog.d/3907.skip b/changelog.d/3907.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/3987.fix b/changelog.d/3987.fix deleted file mode 100644 index 5d578cc09..000000000 --- a/changelog.d/3987.fix +++ /dev/null @@ -1 +0,0 @@ -Remove checking ImageMagick's commands for Pleroma.Upload.Filter.AnalyzeMetadata diff --git a/changelog.d/4167-strip-gps-info-in-png.fix b/changelog.d/4167-strip-gps-info-in-png.fix deleted file mode 100644 index e8d5c2908..000000000 --- a/changelog.d/4167-strip-gps-info-in-png.fix +++ /dev/null @@ -1 +0,0 @@ -Ensure that StripLocation actually removes everything resembling GPS data from PNGs diff --git a/changelog.d/account-rendering-auth-check.fix b/changelog.d/account-rendering-auth-check.fix deleted file mode 100644 index 12f68e454..000000000 --- a/changelog.d/account-rendering-auth-check.fix +++ /dev/null @@ -1 +0,0 @@ -Fix authentication check on account rendering when bio is defined diff --git a/changelog.d/add-ipfs-upload.add b/changelog.d/add-ipfs-upload.add deleted file mode 100644 index 0cd1f2858..000000000 --- a/changelog.d/add-ipfs-upload.add +++ /dev/null @@ -1 +0,0 @@ -Uploader: Add support for uploading attachments using IPFS diff --git a/changelog.d/add-nsfw-mrf.add b/changelog.d/add-nsfw-mrf.add deleted file mode 100644 index ce62c7ed0..000000000 --- a/changelog.d/add-nsfw-mrf.add +++ /dev/null @@ -1 +0,0 @@ -Add NSFW-detecting MRF diff --git a/changelog.d/add-outbox.fix b/changelog.d/add-outbox.fix deleted file mode 100644 index f3de5338d..000000000 --- a/changelog.d/add-outbox.fix +++ /dev/null @@ -1 +0,0 @@ -ap userview: add outbox field. diff --git a/changelog.d/add-rbl-mrf.add b/changelog.d/add-rbl-mrf.add deleted file mode 100644 index 363270fb9..000000000 --- a/changelog.d/add-rbl-mrf.add +++ /dev/null @@ -1 +0,0 @@ -Add DNSRBL MRF diff --git a/changelog.d/adminfe-logger.change b/changelog.d/adminfe-logger.change deleted file mode 100644 index e1a5fc454..000000000 --- a/changelog.d/adminfe-logger.change +++ /dev/null @@ -1 +0,0 @@ -Elixir Logger configuration is now longer permitted through AdminFE and ConfigDB diff --git a/changelog.d/akkoma-prune-options.add b/changelog.d/akkoma-prune-options.add deleted file mode 100644 index 6bc5e7f92..000000000 --- a/changelog.d/akkoma-prune-options.add +++ /dev/null @@ -1 +0,0 @@ -Add options to the mix prune_objects task diff --git a/changelog.d/anonymous-exception-else.fix b/changelog.d/anonymous-exception-else.fix deleted file mode 100644 index 38d5d1be5..000000000 --- a/changelog.d/anonymous-exception-else.fix +++ /dev/null @@ -1 +0,0 @@ -Fix #strip_report_status_data diff --git a/changelog.d/anti-mentionspam-mrf.add b/changelog.d/anti-mentionspam-mrf.add deleted file mode 100644 index 9466f85f4..000000000 --- a/changelog.d/anti-mentionspam-mrf.add +++ /dev/null @@ -1 +0,0 @@ -Add Anti-mention Spam MRF backported from Rebased diff --git a/changelog.d/api-docs-2.skip b/changelog.d/api-docs-2.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/api-docs.skip b/changelog.d/api-docs.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/atom-leak.skip b/changelog.d/atom-leak.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/auth-fetch-exception.add b/changelog.d/auth-fetch-exception.add deleted file mode 100644 index 98efb903e..000000000 --- a/changelog.d/auth-fetch-exception.add +++ /dev/null @@ -1 +0,0 @@ -HTTPSignaturePlug: Add :authorized_fetch_mode_exceptions configuration \ No newline at end of file diff --git a/changelog.d/authorize-interaction.add b/changelog.d/authorize-interaction.add deleted file mode 100644 index 8692209e1..000000000 --- a/changelog.d/authorize-interaction.add +++ /dev/null @@ -1 +0,0 @@ -Support /authorize-interaction route used by Mastodon \ No newline at end of file diff --git a/changelog.d/authorized-fetch-rejections.add b/changelog.d/authorized-fetch-rejections.add deleted file mode 100644 index 66e15a979..000000000 --- a/changelog.d/authorized-fetch-rejections.add +++ /dev/null @@ -1 +0,0 @@ -Add an option to reject certain domains when authorized fetch is enabled. diff --git a/changelog.d/backups-follows.add b/changelog.d/backups-follows.add deleted file mode 100644 index a55c436f6..000000000 --- a/changelog.d/backups-follows.add +++ /dev/null @@ -1 +0,0 @@ -Include following/followers in backups \ No newline at end of file diff --git a/changelog.d/backups-refactor.change b/changelog.d/backups-refactor.change deleted file mode 100644 index 47fc74138..000000000 --- a/changelog.d/backups-refactor.change +++ /dev/null @@ -1 +0,0 @@ -Refactor the user backups code and improve test coverage diff --git a/changelog.d/bad_inbox_request.change b/changelog.d/bad_inbox_request.change deleted file mode 100644 index b81f60638..000000000 --- a/changelog.d/bad_inbox_request.change +++ /dev/null @@ -1 +0,0 @@ -Invalid activities delivered to the inbox will be rejected with a 400 Bad Request diff --git a/changelog.d/bandit.change b/changelog.d/bandit.change deleted file mode 100644 index 7a1104314..000000000 --- a/changelog.d/bandit.change +++ /dev/null @@ -1 +0,0 @@ -Support Bandit as an alternative to Cowboy for the HTTP server. diff --git a/changelog.d/bandit_update_1.5.2.change b/changelog.d/bandit_update_1.5.2.change deleted file mode 100644 index c4aae1636..000000000 --- a/changelog.d/bandit_update_1.5.2.change +++ /dev/null @@ -1 +0,0 @@ -Update Bandit to 1.5.2 diff --git a/changelog.d/bare_uri_test.skip b/changelog.d/bare_uri_test.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/benchee.skip b/changelog.d/benchee.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/blurhash.change b/changelog.d/blurhash.change deleted file mode 100644 index 4276eb164..000000000 --- a/changelog.d/blurhash.change +++ /dev/null @@ -1 +0,0 @@ -Replace eblurhash with rinpatch_blurhash. This also removes a dependency on ImageMagick. diff --git a/changelog.d/bookmark-folders.add b/changelog.d/bookmark-folders.add deleted file mode 100644 index d9b03cecc..000000000 --- a/changelog.d/bookmark-folders.add +++ /dev/null @@ -1 +0,0 @@ -Allow to group bookmarks in folders \ No newline at end of file diff --git a/changelog.d/bookmark-folders.skip b/changelog.d/bookmark-folders.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/bugfix-ccworks.fix b/changelog.d/bugfix-ccworks.fix deleted file mode 100644 index 658e27b86..000000000 --- a/changelog.d/bugfix-ccworks.fix +++ /dev/null @@ -1 +0,0 @@ -Fix federation with Convergence AP Bridge \ No newline at end of file diff --git a/changelog.d/build-release-with-local-libvips.skip b/changelog.d/build-release-with-local-libvips.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/bump-elixir.change b/changelog.d/bump-elixir.change deleted file mode 100644 index afb25d4e7..000000000 --- a/changelog.d/bump-elixir.change +++ /dev/null @@ -1 +0,0 @@ -Elixir 1.13 is the minimum required version. diff --git a/changelog.d/card-endpoint.remove b/changelog.d/card-endpoint.remove deleted file mode 100644 index e09a24cf7..000000000 --- a/changelog.d/card-endpoint.remove +++ /dev/null @@ -1 +0,0 @@ -Mastodon API: Remove deprecated GET /api/v1/statuses/:id/card endpoint https://github.com/mastodon/mastodon/pull/11213 diff --git a/changelog.d/card-image-description.add b/changelog.d/card-image-description.add deleted file mode 100644 index bf423ebb8..000000000 --- a/changelog.d/card-image-description.add +++ /dev/null @@ -1 +0,0 @@ -Include image description in status media cards \ No newline at end of file diff --git a/changelog.d/chat-attachment-empty-array.fix b/changelog.d/chat-attachment-empty-array.fix deleted file mode 100644 index 7d98c9dd2..000000000 --- a/changelog.d/chat-attachment-empty-array.fix +++ /dev/null @@ -1 +0,0 @@ -ChatMessage: Tolerate attachment field set to an empty array diff --git a/changelog.d/ci-cache.skip b/changelog.d/ci-cache.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/ci-elixir-1.16.skip b/changelog.d/ci-elixir-1.16.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/ci-elixir-1.17.skip b/changelog.d/ci-elixir-1.17.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/ci-erratic.skip b/changelog.d/ci-erratic.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/ci-otp-update.skip b/changelog.d/ci-otp-update.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/cleanup.skip b/changelog.d/cleanup.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/commonapi-reordering.skip b/changelog.d/commonapi-reordering.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/config-stat-symlink.fix b/changelog.d/config-stat-symlink.fix deleted file mode 100644 index c8b98225d..000000000 --- a/changelog.d/config-stat-symlink.fix +++ /dev/null @@ -1 +0,0 @@ -- Config: Check the permissions of the linked file instead of the symlink diff --git a/changelog.d/content-length.fix b/changelog.d/content-length.fix deleted file mode 100644 index dee906a9d..000000000 --- a/changelog.d/content-length.fix +++ /dev/null @@ -1 +0,0 @@ -MediaProxy was setting the content-length header which is not permitted by RFC9112§6.2 when we are chunking the reply as it conflicts with the existence of the transfer-encoding header. diff --git a/changelog.d/cowboy-stream-chunked.fix b/changelog.d/cowboy-stream-chunked.fix deleted file mode 100644 index 07211bf18..000000000 --- a/changelog.d/cowboy-stream-chunked.fix +++ /dev/null @@ -1 +0,0 @@ -Restore Cowboy's ability to stream MediaProxy responses without Chunked encoding. diff --git a/changelog.d/debug-logs.skip b/changelog.d/debug-logs.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/deprecations.skip b/changelog.d/deprecations.skip deleted file mode 100644 index 8b1378917..000000000 --- a/changelog.d/deprecations.skip +++ /dev/null @@ -1 +0,0 @@ - diff --git a/changelog.d/deprecations2.skip b/changelog.d/deprecations2.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/deps-bump-2024-01-25.skip b/changelog.d/deps-bump-2024-01-25.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/deps-bump-2024-06-07.skip b/changelog.d/deps-bump-2024-06-07.skip deleted file mode 100644 index 4f377a4d7..000000000 --- a/changelog.d/deps-bump-2024-06-07.skip +++ /dev/null @@ -1,2 +0,0 @@ -Update dependencies held back due to old Elixir version - diff --git a/changelog.d/deps-poison-test-only.skip b/changelog.d/deps-poison-test-only.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/description-meilisearch-type.skip b/changelog.d/description-meilisearch-type.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/dialyzer.skip b/changelog.d/dialyzer.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/dialyzer2.skip b/changelog.d/dialyzer2.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/dialyzer3.skip b/changelog.d/dialyzer3.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/dialyzer4.skip b/changelog.d/dialyzer4.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/dialyzer5.skip b/changelog.d/dialyzer5.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/digest_emails.fix b/changelog.d/digest_emails.fix deleted file mode 100644 index 335a24464..000000000 --- a/changelog.d/digest_emails.fix +++ /dev/null @@ -1 +0,0 @@ -Fix the processing of email digest jobs. diff --git a/changelog.d/disclose_client.fix b/changelog.d/disclose_client.fix deleted file mode 100644 index 938abc930..000000000 --- a/changelog.d/disclose_client.fix +++ /dev/null @@ -1 +0,0 @@ -Client application data was always missing from the status diff --git a/changelog.d/doc-fix.skip b/changelog.d/doc-fix.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/docs-max-elixir-erlang.change b/changelog.d/docs-max-elixir-erlang.change deleted file mode 100644 index a58b7fc17..000000000 --- a/changelog.d/docs-max-elixir-erlang.change +++ /dev/null @@ -1 +0,0 @@ -- Document maximum supported version of Erlang & Elixir diff --git a/changelog.d/docs-netbsd-update.change b/changelog.d/docs-netbsd-update.change deleted file mode 100644 index 29599e8f2..000000000 --- a/changelog.d/docs-netbsd-update.change +++ /dev/null @@ -1 +0,0 @@ -Update and extend NetBSD installation docs diff --git a/changelog.d/elixir-1.15.fix b/changelog.d/elixir-1.15.fix deleted file mode 100644 index d446aaabc..000000000 --- a/changelog.d/elixir-1.15.fix +++ /dev/null @@ -1 +0,0 @@ -Elixir 1.15 compatibility diff --git a/changelog.d/emoji-download-paginate.fix b/changelog.d/emoji-download-paginate.fix deleted file mode 100644 index e31a63380..000000000 --- a/changelog.d/emoji-download-paginate.fix +++ /dev/null @@ -1 +0,0 @@ -When downloading remote emojis packs, account for pagination \ No newline at end of file diff --git a/changelog.d/emoji-use-v1.fix b/changelog.d/emoji-use-v1.fix deleted file mode 100644 index ccc96b377..000000000 --- a/changelog.d/emoji-use-v1.fix +++ /dev/null @@ -1 +0,0 @@ -Make remote emoji packs API use specifically the V1 URL. Akkoma does not understand it without V1, and it works either way with normal pleroma, so no reason to not do this \ No newline at end of file diff --git a/changelog.d/exile-bsds.skip b/changelog.d/exile-bsds.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/exile-freebsd.skip b/changelog.d/exile-freebsd.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/exile-macos.skip b/changelog.d/exile-macos.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/exile.skip b/changelog.d/exile.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/familiar-followers.add b/changelog.d/familiar-followers.add deleted file mode 100644 index 6e7ec9d25..000000000 --- a/changelog.d/familiar-followers.add +++ /dev/null @@ -1 +0,0 @@ -Implement `/api/v1/accounts/familiar_followers` \ No newline at end of file diff --git a/changelog.d/favicon.add b/changelog.d/favicon.add deleted file mode 100644 index cf12395e7..000000000 --- a/changelog.d/favicon.add +++ /dev/null @@ -1 +0,0 @@ -Add support for configuring favicon, embed favicon and PWA manifest in server-generated meta diff --git a/changelog.d/federation_status-access.change b/changelog.d/federation_status-access.change deleted file mode 100644 index 952254476..000000000 --- a/changelog.d/federation_status-access.change +++ /dev/null @@ -1 +0,0 @@ -- Make `/api/v1/pleroma/federation_status` publicly available diff --git a/changelog.d/federator-modules.remove b/changelog.d/federator-modules.remove deleted file mode 100644 index 6ff71d107..000000000 --- a/changelog.d/federator-modules.remove +++ /dev/null @@ -1 +0,0 @@ -Removed support for multiple federator modules as we only support ActivityPub diff --git a/changelog.d/federator.skip b/changelog.d/federator.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/federator_outgoing_increase.change b/changelog.d/federator_outgoing_increase.change deleted file mode 100644 index 7e68a79bc..000000000 --- a/changelog.d/federator_outgoing_increase.change +++ /dev/null @@ -1 +0,0 @@ -Increase outgoing federation parallelism diff --git a/changelog.d/fep-2c59.add b/changelog.d/fep-2c59.add deleted file mode 100644 index 03e33cbd8..000000000 --- a/changelog.d/fep-2c59.add +++ /dev/null @@ -1 +0,0 @@ -Implement FEP-2c59, add "webfinger" to user actor \ No newline at end of file diff --git a/changelog.d/ffmpeg-limiter.add b/changelog.d/ffmpeg-limiter.add deleted file mode 100644 index e4a5ef196..000000000 --- a/changelog.d/ffmpeg-limiter.add +++ /dev/null @@ -1 +0,0 @@ -Framegrabs with ffmpeg will execute with a 5 second timeout and cache the URLs of failures with a TTL of 15 minutes to prevent excessive retries. diff --git a/changelog.d/finch_redirects.fix b/changelog.d/finch_redirects.fix deleted file mode 100644 index c25beaba4..000000000 --- a/changelog.d/finch_redirects.fix +++ /dev/null @@ -1 +0,0 @@ -Following HTTP Redirects when the HTTP Adapter is Finch diff --git a/changelog.d/fix-bookmark-folder-tests.skip b/changelog.d/fix-bookmark-folder-tests.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/fix-dockerfile.skip b/changelog.d/fix-dockerfile.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/fix-duplicate-inbox-deliveries.fix b/changelog.d/fix-duplicate-inbox-deliveries.fix deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/fix-migration.skip b/changelog.d/fix-migration.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/fix-mrfs.add b/changelog.d/fix-mrfs.add deleted file mode 100644 index 2a0fb0768..000000000 --- a/changelog.d/fix-mrfs.add +++ /dev/null @@ -1 +0,0 @@ -Added a Mix task "pleroma.config fix_mrf_policies" which will remove erroneous MRF policies from ConfigDB. diff --git a/changelog.d/fix-otp-comparison.skip b/changelog.d/fix-otp-comparison.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/fix-tests.skip b/changelog.d/fix-tests.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/fix-webfinger-spoofing.security b/changelog.d/fix-webfinger-spoofing.security deleted file mode 100644 index 7b3c9490a..000000000 --- a/changelog.d/fix-webfinger-spoofing.security +++ /dev/null @@ -1 +0,0 @@ -Fix webfinger spoofing. diff --git a/changelog.d/force-mention-mrf.add b/changelog.d/force-mention-mrf.add deleted file mode 100644 index 46ac14244..000000000 --- a/changelog.d/force-mention-mrf.add +++ /dev/null @@ -1 +0,0 @@ -Add ForceMention MRF \ No newline at end of file diff --git a/changelog.d/framegrabs.fix b/changelog.d/framegrabs.fix deleted file mode 100644 index dc0466f1b..000000000 --- a/changelog.d/framegrabs.fix +++ /dev/null @@ -1 +0,0 @@ -Video framegrabs were not working correctly after the change to use Exile to execute ffmpeg diff --git a/changelog.d/frontend-management.add b/changelog.d/frontend-management.add deleted file mode 100644 index b85cddd96..000000000 --- a/changelog.d/frontend-management.add +++ /dev/null @@ -1 +0,0 @@ -[docs] add frontends management documentation diff --git a/changelog.d/generate-unset-user-keys-migration.skip b/changelog.d/generate-unset-user-keys-migration.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/group-actor.add b/changelog.d/group-actor.add deleted file mode 100644 index 2f614b3d8..000000000 --- a/changelog.d/group-actor.add +++ /dev/null @@ -1 +0,0 @@ -Implement group actors diff --git a/changelog.d/group-repeats.fix b/changelog.d/group-repeats.fix deleted file mode 100644 index d465122dd..000000000 --- a/changelog.d/group-repeats.fix +++ /dev/null @@ -1 +0,0 @@ -Deactivated groups would still try to repeat a post. diff --git a/changelog.d/gun-logs-debug.skip b/changelog.d/gun-logs-debug.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/gun-logs.skip b/changelog.d/gun-logs.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/gun_pool.fix b/changelog.d/gun_pool.fix deleted file mode 100644 index 94ec9103d..000000000 --- a/changelog.d/gun_pool.fix +++ /dev/null @@ -1 +0,0 @@ -Fix logic error in Gun connection pooling which prevented retries even when the worker was launched with retry = true diff --git a/changelog.d/gun_pool2.fix b/changelog.d/gun_pool2.fix deleted file mode 100644 index a1f98b49c..000000000 --- a/changelog.d/gun_pool2.fix +++ /dev/null @@ -1 +0,0 @@ -Connection pool errors when publishing an activity is a soft-error that will be retried shortly. diff --git a/changelog.d/gun_pool3.skip b/changelog.d/gun_pool3.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/gun_pool4.fix b/changelog.d/gun_pool4.fix deleted file mode 100644 index f68c1c970..000000000 --- a/changelog.d/gun_pool4.fix +++ /dev/null @@ -1 +0,0 @@ -Gun Connection Pool was not retrying to acquire a connection if the pool was full and stale connections were reclaimed diff --git a/changelog.d/hackney-pool-timeouts.change b/changelog.d/hackney-pool-timeouts.change deleted file mode 100644 index d763fe602..000000000 --- a/changelog.d/hackney-pool-timeouts.change +++ /dev/null @@ -1 +0,0 @@ -Change Hackney connection pool timeouts to align with the values Gun uses diff --git a/changelog.d/handle-non-validate-delete-errors.change b/changelog.d/handle-non-validate-delete-errors.change deleted file mode 100644 index 94adb0e98..000000000 --- a/changelog.d/handle-non-validate-delete-errors.change +++ /dev/null @@ -1 +0,0 @@ -Transmogrifier: handle non-validate errors on incoming Delete activities diff --git a/changelog.d/handle_object_fetch_failures.change b/changelog.d/handle_object_fetch_failures.change deleted file mode 100644 index ae44e6f4b..000000000 --- a/changelog.d/handle_object_fetch_failures.change +++ /dev/null @@ -1 +0,0 @@ -Remote object fetch failures will prevent the object fetch job from retrying if the object request returns 401, 403, 404, 410, or exceeds the maximum thread depth. diff --git a/changelog.d/healthcheck-disabled-error.fix b/changelog.d/healthcheck-disabled-error.fix deleted file mode 100644 index 984384a52..000000000 --- a/changelog.d/healthcheck-disabled-error.fix +++ /dev/null @@ -1 +0,0 @@ -TwitterAPI: Return proper error when healthcheck is disabled diff --git a/changelog.d/ingestion-queue.skip b/changelog.d/ingestion-queue.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/instance-contact-account.add b/changelog.d/instance-contact-account.add deleted file mode 100644 index e119446d2..000000000 --- a/changelog.d/instance-contact-account.add +++ /dev/null @@ -1 +0,0 @@ -Add contact account to InstanceView \ No newline at end of file diff --git a/changelog.d/instance-defdelegates.skip b/changelog.d/instance-defdelegates.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/instance-rules.add b/changelog.d/instance-rules.add deleted file mode 100644 index 42f3cbfa1..000000000 --- a/changelog.d/instance-rules.add +++ /dev/null @@ -1 +0,0 @@ -Add instance rules \ No newline at end of file diff --git a/changelog.d/instance-v2.add b/changelog.d/instance-v2.add deleted file mode 100644 index 4dd7ce8c0..000000000 --- a/changelog.d/instance-v2.add +++ /dev/null @@ -1 +0,0 @@ -Implement /api/v2/instance route \ No newline at end of file diff --git a/changelog.d/instance-v2.skip b/changelog.d/instance-v2.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/ipfs-dialyzer.skip b/changelog.d/ipfs-dialyzer.skip deleted file mode 100644 index b3e74cd19..000000000 --- a/changelog.d/ipfs-dialyzer.skip +++ /dev/null @@ -1 +0,0 @@ -no comment diff --git a/changelog.d/issue-3241.fix b/changelog.d/issue-3241.fix deleted file mode 100644 index d46db9805..000000000 --- a/changelog.d/issue-3241.fix +++ /dev/null @@ -1 +0,0 @@ -Handle cases when users.inbox is nil. diff --git a/changelog.d/last_status_at.change b/changelog.d/last_status_at.change deleted file mode 100644 index 5417aff30..000000000 --- a/changelog.d/last_status_at.change +++ /dev/null @@ -1 +0,0 @@ -- Change AccountView `last_status_at` from a datetime to a date (as done in Mastodon 3.1.0) \ No newline at end of file diff --git a/changelog.d/ldap-error-logging.change b/changelog.d/ldap-error-logging.change deleted file mode 100644 index 56f0e7fc3..000000000 --- a/changelog.d/ldap-error-logging.change +++ /dev/null @@ -1 +0,0 @@ -Improve error logging when LDAP authentication fails. diff --git a/changelog.d/ldap.fix b/changelog.d/ldap.fix deleted file mode 100644 index 9ca697287..000000000 --- a/changelog.d/ldap.fix +++ /dev/null @@ -1 +0,0 @@ -Fix LDAP support diff --git a/changelog.d/link-verification.add b/changelog.d/link-verification.add deleted file mode 100644 index d8b11ebbc..000000000 --- a/changelog.d/link-verification.add +++ /dev/null @@ -1 +0,0 @@ -Verify profile link ownership with rel="me" \ No newline at end of file diff --git a/changelog.d/loading-order-test-fix.skip b/changelog.d/loading-order-test-fix.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/local-webfinger.fix b/changelog.d/local-webfinger.fix deleted file mode 100644 index d99056efd..000000000 --- a/changelog.d/local-webfinger.fix +++ /dev/null @@ -1 +0,0 @@ -Use correct domain for fqn and InstanceView \ No newline at end of file diff --git a/changelog.d/logger-metadata.add b/changelog.d/logger-metadata.add deleted file mode 100644 index 6c627a972..000000000 --- a/changelog.d/logger-metadata.add +++ /dev/null @@ -1 +0,0 @@ -Logger metadata is now attached to some logs to help with troubleshooting and analysis diff --git a/changelog.d/mark-read.fix b/changelog.d/mark-read.fix deleted file mode 100644 index 346eb19e2..000000000 --- a/changelog.d/mark-read.fix +++ /dev/null @@ -1 +0,0 @@ -The query for marking notifications as read has been simplified diff --git a/changelog.d/mastodon_api_v2.add b/changelog.d/mastodon_api_v2.add deleted file mode 100644 index d53aa35c4..000000000 --- a/changelog.d/mastodon_api_v2.add +++ /dev/null @@ -1 +0,0 @@ -Add new parameters to /api/v2/instance: configuration[accounts][max_pinned_statuses] and configuration[statuses][characters_reserved_per_url] diff --git a/changelog.d/mastodon_directory.fix b/changelog.d/mastodon_directory.fix deleted file mode 100644 index 937c8f864..000000000 --- a/changelog.d/mastodon_directory.fix +++ /dev/null @@ -1 +0,0 @@ -Mastodon API /api/v1/directory: Fix listing directory contents when not authenticated diff --git a/changelog.d/mediaproxy-http.fix b/changelog.d/mediaproxy-http.fix deleted file mode 100644 index 4ff6430e0..000000000 --- a/changelog.d/mediaproxy-http.fix +++ /dev/null @@ -1 +0,0 @@ -Ensure MediaProxy HTTP requests obey all the defined connection settings diff --git a/changelog.d/meilisearch.add b/changelog.d/meilisearch.add deleted file mode 100644 index 4856eea2e..000000000 --- a/changelog.d/meilisearch.add +++ /dev/null @@ -1 +0,0 @@ -Add meilisearch, make search engines pluggable diff --git a/changelog.d/memleak.fix b/changelog.d/memleak.fix deleted file mode 100644 index 2465921c0..000000000 --- a/changelog.d/memleak.fix +++ /dev/null @@ -1 +0,0 @@ -Fix a memory leak caused by Websocket connections that would not enter a state where a full garbage collection run could be triggered. diff --git a/changelog.d/mergeback-2.6.2.skip b/changelog.d/mergeback-2.6.2.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/metadata-provider-empty-post.fix b/changelog.d/metadata-provider-empty-post.fix deleted file mode 100644 index 8d6341c6c..000000000 --- a/changelog.d/metadata-provider-empty-post.fix +++ /dev/null @@ -1 +0,0 @@ -Fix OpenGraph and Twitter metadata providers when parsing objects with no content or summary fields. diff --git a/changelog.d/migration-fix.skip b/changelog.d/migration-fix.skip deleted file mode 100644 index 8b1378917..000000000 --- a/changelog.d/migration-fix.skip +++ /dev/null @@ -1 +0,0 @@ - diff --git a/changelog.d/missing-fks.add b/changelog.d/missing-fks.add deleted file mode 100644 index cf74de03b..000000000 --- a/changelog.d/missing-fks.add +++ /dev/null @@ -1 +0,0 @@ -Add missing indexes on foreign key relationships diff --git a/changelog.d/missing-mrfs.add b/changelog.d/missing-mrfs.add deleted file mode 100644 index 6a17f9e1a..000000000 --- a/changelog.d/missing-mrfs.add +++ /dev/null @@ -1 +0,0 @@ -Startup detection for configured MRF modules that are missing or incorrectly defined diff --git a/changelog.d/mix-indexer.add b/changelog.d/mix-indexer.add deleted file mode 100644 index 6effb959b..000000000 --- a/changelog.d/mix-indexer.add +++ /dev/null @@ -1 +0,0 @@ -Permit passing --chunk and --step values to the Pleroma.Search.Indexer Mix task diff --git a/changelog.d/mrf-nsfw-otp25.skip b/changelog.d/mrf-nsfw-otp25.skip deleted file mode 100644 index e804f19a0..000000000 --- a/changelog.d/mrf-nsfw-otp25.skip +++ /dev/null @@ -1 +0,0 @@ -noop diff --git a/changelog.d/mrf-regex-error.fix b/changelog.d/mrf-regex-error.fix deleted file mode 100644 index 2c43bc04a..000000000 --- a/changelog.d/mrf-regex-error.fix +++ /dev/null @@ -1 +0,0 @@ -MRF: Log sensible error for subdomains_regex diff --git a/changelog.d/mrf-steal-emoji-extname.fix b/changelog.d/mrf-steal-emoji-extname.fix deleted file mode 100644 index 197aa9b9e..000000000 --- a/changelog.d/mrf-steal-emoji-extname.fix +++ /dev/null @@ -1 +0,0 @@ -MRF.StealEmojiPolicy: Properly add fallback extension to filenames missing one diff --git a/changelog.d/mrf_hashtags.fix b/changelog.d/mrf_hashtags.fix deleted file mode 100644 index c44c2376b..000000000 --- a/changelog.d/mrf_hashtags.fix +++ /dev/null @@ -1 +0,0 @@ -Federated timeline removal of hashtags via MRF HashtagPolicy diff --git a/changelog.d/nil-content-map.fix b/changelog.d/nil-content-map.fix deleted file mode 100644 index d4943bf74..000000000 --- a/changelog.d/nil-content-map.fix +++ /dev/null @@ -1 +0,0 @@ -Support objects with a null contentMap (firefish) diff --git a/changelog.d/no-async-with-clear-config.skip b/changelog.d/no-async-with-clear-config.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/notification-spex.skip b/changelog.d/notification-spex.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/notifications-index.fix b/changelog.d/notifications-index.fix deleted file mode 100644 index 4617cbec0..000000000 --- a/changelog.d/notifications-index.fix +++ /dev/null @@ -1 +0,0 @@ -Fix notifications query which was not using the index properly diff --git a/changelog.d/notifications.fix b/changelog.d/notifications.fix deleted file mode 100644 index a2d2eaea9..000000000 --- a/changelog.d/notifications.fix +++ /dev/null @@ -1 +0,0 @@ -Notifications: improve performance by filtering on users table instead of activities table \ No newline at end of file diff --git a/changelog.d/oauth-nickname.skip b/changelog.d/oauth-nickname.skip deleted file mode 100644 index 02f16e06c..000000000 --- a/changelog.d/oauth-nickname.skip +++ /dev/null @@ -1 +0,0 @@ -Use User.full_nickname/1 in oauth html template \ No newline at end of file diff --git a/changelog.d/oban-cancel-badreq.change b/changelog.d/oban-cancel-badreq.change deleted file mode 100644 index c7951735c..000000000 --- a/changelog.d/oban-cancel-badreq.change +++ /dev/null @@ -1 +0,0 @@ -Publisher jobs will not retry if the error received is a 400 diff --git a/changelog.d/oban-cancel-federation.add b/changelog.d/oban-cancel-federation.add deleted file mode 100644 index 148193680..000000000 --- a/changelog.d/oban-cancel-federation.add +++ /dev/null @@ -1 +0,0 @@ -Deleting, Unfavoriting, Unrepeating, or Unreacting will cancel undelivered publishing jobs for the original activity. diff --git a/changelog.d/oban-cancel-poll-result.change b/changelog.d/oban-cancel-poll-result.change deleted file mode 100644 index b51c460a7..000000000 --- a/changelog.d/oban-cancel-poll-result.change +++ /dev/null @@ -1 +0,0 @@ -PollWorker jobs will not retry if the activity no longer exists. diff --git a/changelog.d/oban-cancel-receiverworker.change b/changelog.d/oban-cancel-receiverworker.change deleted file mode 100644 index 70ad22d60..000000000 --- a/changelog.d/oban-cancel-receiverworker.change +++ /dev/null @@ -1 +0,0 @@ -Improved detecting unrecoverable errors for incoming federation jobs diff --git a/changelog.d/oban-cancel.change b/changelog.d/oban-cancel.change deleted file mode 100644 index e4512d3bb..000000000 --- a/changelog.d/oban-cancel.change +++ /dev/null @@ -1 +0,0 @@ -Changed some jobs to return :cancel on unrecoverable errors that should not be retried diff --git a/changelog.d/oban-deprecated-discards.skip b/changelog.d/oban-deprecated-discards.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/oban-fetcher-rejected.change b/changelog.d/oban-fetcher-rejected.change deleted file mode 100644 index 65f5c992d..000000000 --- a/changelog.d/oban-fetcher-rejected.change +++ /dev/null @@ -1 +0,0 @@ -Discard Remote Fetcher jobs which errored due to an MRF rejection. diff --git a/changelog.d/oban-live_dashboard.add b/changelog.d/oban-live_dashboard.add deleted file mode 100644 index b5b3e4f41..000000000 --- a/changelog.d/oban-live_dashboard.add +++ /dev/null @@ -1 +0,0 @@ -Oban jobs can now be viewed in the Live Dashboard diff --git a/changelog.d/oban-queues.change b/changelog.d/oban-queues.change deleted file mode 100644 index 16df6409a..000000000 --- a/changelog.d/oban-queues.change +++ /dev/null @@ -1 +0,0 @@ -Oban queues have refactored to simplify the queue design diff --git a/changelog.d/oban-rich-media-errors.fix b/changelog.d/oban-rich-media-errors.fix deleted file mode 100644 index b904108db..000000000 --- a/changelog.d/oban-rich-media-errors.fix +++ /dev/null @@ -1 +0,0 @@ -Prevent Rich Media backfill jobs from retrying in cases where it is likely they will fail again. diff --git a/changelog.d/oban-timeouts.change b/changelog.d/oban-timeouts.change deleted file mode 100644 index 33d017c5c..000000000 --- a/changelog.d/oban-timeouts.change +++ /dev/null @@ -1 +0,0 @@ -Ensure all Oban jobs have timeouts defined diff --git a/changelog.d/oban-timeouts.skip b/changelog.d/oban-timeouts.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/oban-transmogrifier.skip b/changelog.d/oban-transmogrifier.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/oban-user-refresh-unique.fix b/changelog.d/oban-user-refresh-unique.fix deleted file mode 100644 index 5e112c87f..000000000 --- a/changelog.d/oban-user-refresh-unique.fix +++ /dev/null @@ -1 +0,0 @@ -Oban Jobs for refreshing users were not respecting the uniqueness setting diff --git a/changelog.d/opengraph-rich-media-proxy.add b/changelog.d/opengraph-rich-media-proxy.add deleted file mode 100644 index 2b2fc657d..000000000 --- a/changelog.d/opengraph-rich-media-proxy.add +++ /dev/null @@ -1 +0,0 @@ -Add media proxy to opengraph rich media cards diff --git a/changelog.d/optimistic-inbox-sigs.fix b/changelog.d/optimistic-inbox-sigs.fix deleted file mode 100644 index 53ffe6b5b..000000000 --- a/changelog.d/optimistic-inbox-sigs.fix +++ /dev/null @@ -1 +0,0 @@ -Fix Optimistic Inbox for failed signatures diff --git a/changelog.d/optimistic-inbox.change b/changelog.d/optimistic-inbox.change deleted file mode 100644 index 2cf1ce92c..000000000 --- a/changelog.d/optimistic-inbox.change +++ /dev/null @@ -1 +0,0 @@ -Optimistic Inbox reduces the processing overhead of incoming activities without instantly verifiable signatures. diff --git a/changelog.d/otp26.add b/changelog.d/otp26.add deleted file mode 100644 index b019afdf3..000000000 --- a/changelog.d/otp26.add +++ /dev/null @@ -1 +0,0 @@ -Support for Erlang OTP 26 diff --git a/changelog.d/pinned-collection-fetch.security b/changelog.d/pinned-collection-fetch.security deleted file mode 100644 index 4e8746924..000000000 --- a/changelog.d/pinned-collection-fetch.security +++ /dev/null @@ -1 +0,0 @@ -Use proper workers for fetching pins instead of an ad-hoc task, fixing a potential fetch loop diff --git a/changelog.d/pools.change b/changelog.d/pools.change deleted file mode 100644 index 3c689195a..000000000 --- a/changelog.d/pools.change +++ /dev/null @@ -1 +0,0 @@ -HTTP connection pool adjustments diff --git a/changelog.d/postgres-jit.change b/changelog.d/postgres-jit.change deleted file mode 100644 index 38225b06b..000000000 --- a/changelog.d/postgres-jit.change +++ /dev/null @@ -1 +0,0 @@ -Disable jit by default for PostgreSQL diff --git a/changelog.d/prioritize-direct-recipients.add b/changelog.d/prioritize-direct-recipients.add deleted file mode 100644 index 4efc94c68..000000000 --- a/changelog.d/prioritize-direct-recipients.add +++ /dev/null @@ -1 +0,0 @@ -- Prioritize mentioned recipients (i.e., those that are not just followers) when federating. diff --git a/changelog.d/prometheus-docs.change b/changelog.d/prometheus-docs.change deleted file mode 100644 index a9bd1e2e9..000000000 --- a/changelog.d/prometheus-docs.change +++ /dev/null @@ -1 +0,0 @@ -Update the documentation for configuring Prometheus metrics. diff --git a/changelog.d/promex.change b/changelog.d/promex.change deleted file mode 100644 index 6c1571c54..000000000 --- a/changelog.d/promex.change +++ /dev/null @@ -1 +0,0 @@ -Change the prometheus library to PromEx. diff --git a/changelog.d/promexdocs.add b/changelog.d/promexdocs.add deleted file mode 100644 index dda972994..000000000 --- a/changelog.d/promexdocs.add +++ /dev/null @@ -1 +0,0 @@ -PromEx documentation diff --git a/changelog.d/public-polls.add b/changelog.d/public-polls.add deleted file mode 100644 index 0dae0c38e..000000000 --- a/changelog.d/public-polls.add +++ /dev/null @@ -1 +0,0 @@ -Expose nonAnonymous field from Smithereen polls \ No newline at end of file diff --git a/changelog.d/publisher.change b/changelog.d/publisher.change deleted file mode 100644 index 0d26d7b00..000000000 --- a/changelog.d/publisher.change +++ /dev/null @@ -1 +0,0 @@ -Publisher jobs now store the the activity id instead of inserting duplicate JSON data in the Oban queue for each delivery. diff --git a/changelog.d/publisher_discard.change b/changelog.d/publisher_discard.change deleted file mode 100644 index 85e530d8d..000000000 --- a/changelog.d/publisher_discard.change +++ /dev/null @@ -1 +0,0 @@ -Activity publishing failures will prevent the job from retrying if the publishing request returns a 403 or 410 diff --git a/changelog.d/publisher_log.change b/changelog.d/publisher_log.change deleted file mode 100644 index 3f85f5a1e..000000000 --- a/changelog.d/publisher_log.change +++ /dev/null @@ -1 +0,0 @@ -Publisher errors will now emit logs indicating the inbox that was not available for delivery. diff --git a/changelog.d/qdrant_search.add b/changelog.d/qdrant_search.add deleted file mode 100644 index 9801131d1..000000000 --- a/changelog.d/qdrant_search.add +++ /dev/null @@ -1 +0,0 @@ -Add Qdrant/OpenAI embedding search diff --git a/changelog.d/qtfaststart.fix b/changelog.d/qtfaststart.fix deleted file mode 100644 index 66d2569f2..000000000 --- a/changelog.d/qtfaststart.fix +++ /dev/null @@ -1 +0,0 @@ -MediaProxy Preview failures prevented when encountering certain video files diff --git a/changelog.d/quotes-count.skip b/changelog.d/quotes-count.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/reachability.change b/changelog.d/reachability.change deleted file mode 100644 index 06f63272b..000000000 --- a/changelog.d/reachability.change +++ /dev/null @@ -1 +0,0 @@ -Reduce the reachability timestamp update to a single upsert query diff --git a/changelog.d/realpath-over-readlink.fix b/changelog.d/realpath-over-readlink.fix deleted file mode 100644 index 479561b95..000000000 --- a/changelog.d/realpath-over-readlink.fix +++ /dev/null @@ -1 +0,0 @@ -pleroma_ctl: Use realpath(1) instead of readlink(1) diff --git a/changelog.d/receiverworker-error-handling.fix b/changelog.d/receiverworker-error-handling.fix deleted file mode 100644 index f017a2bba..000000000 --- a/changelog.d/receiverworker-error-handling.fix +++ /dev/null @@ -1 +0,0 @@ -ReceiverWorker: Make sure non-{:ok, _} is returned as {:error, …} \ No newline at end of file diff --git a/changelog.d/remote-fetcher-error.skip b/changelog.d/remote-fetcher-error.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/reply-to-deleted.change b/changelog.d/reply-to-deleted.change deleted file mode 100644 index 8b952ee7a..000000000 --- a/changelog.d/reply-to-deleted.change +++ /dev/null @@ -1 +0,0 @@ -A 422 error is returned when attempting to reply to a deleted status diff --git a/changelog.d/rich-media-hardening.fix b/changelog.d/rich-media-hardening.fix deleted file mode 100644 index ff3dc81f3..000000000 --- a/changelog.d/rich-media-hardening.fix +++ /dev/null @@ -1 +0,0 @@ -Harden Rich Media parsing against very slow or malicious URLs diff --git a/changelog.d/rich_media.fix b/changelog.d/rich_media.fix deleted file mode 100644 index 08f119550..000000000 --- a/changelog.d/rich_media.fix +++ /dev/null @@ -1 +0,0 @@ -Rich Media Preview cache eviction when the activity is updated. diff --git a/changelog.d/rich_media_backfill.change b/changelog.d/rich_media_backfill.change deleted file mode 100644 index d746ac8ce..000000000 --- a/changelog.d/rich_media_backfill.change +++ /dev/null @@ -1 +0,0 @@ -Rich Media backfilling is now an Oban job diff --git a/changelog.d/rich_media_config.skip b/changelog.d/rich_media_config.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/rich_media_oban.skip b/changelog.d/rich_media_oban.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/rich_media_refactor.change b/changelog.d/rich_media_refactor.change deleted file mode 100644 index c0d4e3b0a..000000000 --- a/changelog.d/rich_media_refactor.change +++ /dev/null @@ -1 +0,0 @@ -Refactored Rich Media to cache the content in the database. Fetching operations that could block status rendering have been eliminated. diff --git a/changelog.d/rich_media_stream_test.skip b/changelog.d/rich_media_stream_test.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/rich_media_tests.skip b/changelog.d/rich_media_tests.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/richmediattl.fix b/changelog.d/richmediattl.fix deleted file mode 100644 index 98de63015..000000000 --- a/changelog.d/richmediattl.fix +++ /dev/null @@ -1 +0,0 @@ -Parsing of RichMedia TTLs for Amazon URLs when query parameters are nil diff --git a/changelog.d/scrobble-url.add b/changelog.d/scrobble-url.add deleted file mode 100644 index 24bdeed89..000000000 --- a/changelog.d/scrobble-url.add +++ /dev/null @@ -1 +0,0 @@ -Adds the capability to add a URL to a scrobble (optional field) diff --git a/changelog.d/scrubbers-html4-GtS.add b/changelog.d/scrubbers-html4-GtS.add deleted file mode 100644 index 7f99dbb25..000000000 --- a/changelog.d/scrubbers-html4-GtS.add +++ /dev/null @@ -1 +0,0 @@ -- scrubbers/default: Add more formatting elements from HTML4 / GoToSocial (acronym, bdo, big, cite, dfn, ins, kbd, q, samp, s, tt, var, wbr) diff --git a/changelog.d/search-healthcheck.add b/changelog.d/search-healthcheck.add deleted file mode 100644 index 4974925e7..000000000 --- a/changelog.d/search-healthcheck.add +++ /dev/null @@ -1 +0,0 @@ -Monitoring of search backend health to control the processing of jobs in the search indexing Oban queue diff --git a/changelog.d/show-reposter-replies.add b/changelog.d/show-reposter-replies.add deleted file mode 100644 index 3b852ec3b..000000000 --- a/changelog.d/show-reposter-replies.add +++ /dev/null @@ -1 +0,0 @@ -Display reposted replies with exclude_replies: true \ No newline at end of file diff --git a/changelog.d/spex-error-log.skip b/changelog.d/spex-error-log.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/status-notification-type.add b/changelog.d/status-notification-type.add deleted file mode 100644 index a6e94fa87..000000000 --- a/changelog.d/status-notification-type.add +++ /dev/null @@ -1 +0,0 @@ -Add "status" notification type \ No newline at end of file diff --git a/changelog.d/stream-end-poll.fix b/changelog.d/stream-end-poll.fix deleted file mode 100644 index db513efdc..000000000 --- a/changelog.d/stream-end-poll.fix +++ /dev/null @@ -1 +0,0 @@ -End of poll notifications were not streamed over websockets or web push diff --git a/changelog.d/support-honk-image-summaries.add b/changelog.d/support-honk-image-summaries.add deleted file mode 100644 index 052c03f95..000000000 --- a/changelog.d/support-honk-image-summaries.add +++ /dev/null @@ -1 +0,0 @@ -Support honk-style attachment summaries as alt-text. diff --git a/changelog.d/system-cflags.fix b/changelog.d/system-cflags.fix deleted file mode 100644 index 84de5ad57..000000000 --- a/changelog.d/system-cflags.fix +++ /dev/null @@ -1 +0,0 @@ -- Fix eblurhash and elixir-captcha not using system cflags diff --git a/changelog.d/tesla.deps b/changelog.d/tesla.deps deleted file mode 100644 index 799bbc670..000000000 --- a/changelog.d/tesla.deps +++ /dev/null @@ -1 +0,0 @@ -Update Tesla HTTP client middleware to 1.8.0 diff --git a/changelog.d/test-improvements.skip b/changelog.d/test-improvements.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/testsecrets.skip b/changelog.d/testsecrets.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/transient-validators-defaults.change b/changelog.d/transient-validators-defaults.change deleted file mode 100644 index 225cf4d0c..000000000 --- a/changelog.d/transient-validators-defaults.change +++ /dev/null @@ -1 +0,0 @@ -Set default values on validators for transient objects (attachment, poll options) diff --git a/changelog.d/typo.skip b/changelog.d/typo.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/user-refresh-rework.skip b/changelog.d/user-refresh-rework.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/user-refresh.change b/changelog.d/user-refresh.change deleted file mode 100644 index b91169a9e..000000000 --- a/changelog.d/user-refresh.change +++ /dev/null @@ -1 +0,0 @@ -User profile refreshes are now asynchronous diff --git a/changelog.d/video-thumbs.fix b/changelog.d/video-thumbs.fix deleted file mode 100644 index 03e862f3d..000000000 --- a/changelog.d/video-thumbs.fix +++ /dev/null @@ -1 +0,0 @@ -Video thumbnails were not being generated due to a negative cache lookup logic error diff --git a/changelog.d/vips.change b/changelog.d/vips.change deleted file mode 100644 index ee18cd34b..000000000 --- a/changelog.d/vips.change +++ /dev/null @@ -1 +0,0 @@ -Change mediaproxy previews to use vips to generate thumbnails instead of ImageMagick diff --git a/changelog.d/web_push.fix b/changelog.d/web_push.fix deleted file mode 100644 index cf933e2d4..000000000 --- a/changelog.d/web_push.fix +++ /dev/null @@ -1 +0,0 @@ -Fix web push notifications not successfully delivering diff --git a/changelog.d/web_push_actor_regression.skip b/changelog.d/web_push_actor_regression.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/changelog.d/web_push_filtered.fix b/changelog.d/web_push_filtered.fix deleted file mode 100644 index b9159362a..000000000 --- a/changelog.d/web_push_filtered.fix +++ /dev/null @@ -1 +0,0 @@ -Web Push notifications are no longer generated for muted/blocked threads and users. diff --git a/changelog.d/webfinger-validation.fix b/changelog.d/webfinger-validation.fix deleted file mode 100644 index e64312666..000000000 --- a/changelog.d/webfinger-validation.fix +++ /dev/null @@ -1 +0,0 @@ -Fix validate_webfinger when running a different domain for Webfinger \ No newline at end of file diff --git a/changelog.d/webpush-polls.change b/changelog.d/webpush-polls.change deleted file mode 100644 index 5607d6bfc..000000000 --- a/changelog.d/webpush-polls.change +++ /dev/null @@ -1 +0,0 @@ -Render nice web push notifications for polls diff --git a/changelog.d/websocket-refactor.change b/changelog.d/websocket-refactor.change deleted file mode 100644 index 3c447832b..000000000 --- a/changelog.d/websocket-refactor.change +++ /dev/null @@ -1 +0,0 @@ -Refactor the Mastodon /api/v1/streaming websocket handler to use Phoenix.Socket.Transport From 574bc1fa5f9fd804d57311d25f36566b9e527322 Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Thu, 1 Aug 2024 11:49:36 +0400 Subject: [PATCH 22/74] Frontend: Update to 2.7.0 --- priv/static/index.html | 2 +- .../static/css/159.1d523a00378ebd68c5b3.css.map | 1 - ...378ebd68c5b3.css => 1597.a250eca8cf87418c7b3e.css} | 4 ++-- .../static/css/1597.a250eca8cf87418c7b3e.css.map | 1 + priv/static/static/css/5250.b9104f3df4166526b081.css | 2 ++ .../static/css/5250.b9104f3df4166526b081.css.map | 1 + priv/static/static/css/5292.035030cbb2311a7ddada.css | 11 +++++++++++ .../static/css/5292.035030cbb2311a7ddada.css.map | 1 + priv/static/static/css/6464.169260b661120cc50815.css | 2 -- .../static/css/6464.169260b661120cc50815.css.map | 1 - priv/static/static/css/6464.7845ee2ccc5e22628b2a.css | 2 ++ .../static/css/6464.7845ee2ccc5e22628b2a.css.map | 1 + priv/static/static/css/7586.0d43f70bc6240422f179.css | 2 -- .../static/css/7586.0d43f70bc6240422f179.css.map | 1 - priv/static/static/css/7594.a8030565c3ef463dc1de.css | 2 ++ .../static/css/7594.a8030565c3ef463dc1de.css.map | 1 + priv/static/static/css/7962.76663e78ad5ea0bb0b90.css | 11 ----------- .../static/css/7962.76663e78ad5ea0bb0b90.css.map | 1 - priv/static/static/css/8859.d26a3b0841a7beb8fd4a.css | 2 -- .../static/css/8859.d26a3b0841a7beb8fd4a.css.map | 1 - priv/static/static/css/app.75b043cffb8e922bc29e.css | 2 ++ .../static/css/app.75b043cffb8e922bc29e.css.map | 1 + priv/static/static/css/app.a7f63ee9107a77599942.css | 2 -- .../static/css/app.a7f63ee9107a77599942.css.map | 1 - priv/static/static/js/159.903e90c9de8ef6c67077.js | 2 -- priv/static/static/js/159.903e90c9de8ef6c67077.js.map | 1 - priv/static/static/js/1597.134341dec11e42dd5fae.js | 2 ++ .../static/static/js/1597.134341dec11e42dd5fae.js.map | 1 + priv/static/static/js/3733.7060d1e6bca813125a0c.js | 3 --- .../static/static/js/3733.7060d1e6bca813125a0c.js.map | 1 - priv/static/static/js/48.b5ecdbc517423af07ca4.js | 3 --- priv/static/static/js/48.b5ecdbc517423af07ca4.js.map | 1 - priv/static/static/js/48.f58874c23a9bf1c1f591.js | 3 +++ ...NSE.txt => 48.f58874c23a9bf1c1f591.js.LICENSE.txt} | 0 priv/static/static/js/48.f58874c23a9bf1c1f591.js.map | 1 + priv/static/static/js/5250.f0d4cfa412bbf8163d11.js | 2 ++ .../static/static/js/5250.f0d4cfa412bbf8163d11.js.map | 1 + priv/static/static/js/5292.125b85a896c810481068.js | 2 ++ .../static/static/js/5292.125b85a896c810481068.js.map | 1 + ...a1c948cde554e9.js => 6464.6f764a6d660917d88ca5.js} | 2 +- ...e554e9.js.map => 6464.6f764a6d660917d88ca5.js.map} | 2 +- priv/static/static/js/6561.24d12b4e33b21319845b.js | 3 +++ ...E.txt => 6561.24d12b4e33b21319845b.js.LICENSE.txt} | 8 ++++++++ .../static/static/js/6561.24d12b4e33b21319845b.js.map | 1 + priv/static/static/js/7586.628f729b9c8b2e6f4e1f.js | 2 -- .../static/static/js/7586.628f729b9c8b2e6f4e1f.js.map | 1 - priv/static/static/js/7594.f0ffca037eec090815d9.js | 2 ++ .../static/static/js/7594.f0ffca037eec090815d9.js.map | 1 + priv/static/static/js/7962.e25d40b042f8ee7389c3.js | 2 -- .../static/static/js/7962.e25d40b042f8ee7389c3.js.map | 1 - priv/static/static/js/8859.c76b0a0c3a4b5acbef11.js | 2 -- .../static/static/js/8859.c76b0a0c3a4b5acbef11.js.map | 1 - priv/static/static/js/9060.24271e167e0471a1a732.js | 2 -- .../static/static/js/9060.24271e167e0471a1a732.js.map | 1 - priv/static/static/js/9060.606ed1efce1ce3be713d.js | 2 ++ .../static/static/js/9060.606ed1efce1ce3be713d.js.map | 1 + priv/static/static/js/app.3fbb12e9679dc0e0aa33.js | 2 ++ priv/static/static/js/app.3fbb12e9679dc0e0aa33.js.map | 1 + priv/static/static/js/app.d42ab31e1d50a3265a82.js | 2 -- priv/static/static/js/app.d42ab31e1d50a3265a82.js.map | 1 - ...a6a2cce6246.js => af-json.260623f695510b34c146.js} | 0 ...7c18233fec3.js => am-json.fd30fc79a9ef9f40bcb3.js} | 0 ...49f2954d49b.js => ar-json.66fec1d991d30cf191ac.js} | 0 ...867070f0.js => ar_SA-json.89b9143ae611e2581b5b.js} | 0 ...1cecd195738.js => as-json.bd49b949563ed3872ea7.js} | 0 ...539c19a9b9.js => ast-json.b04ae8a41f30fcc498c6.js} | 0 ...d9c4d1f834c.js => az-json.fc8b49efe1bec779ad7c.js} | 0 ...873a4100c69.js => be-json.390af96d7085a650d098.js} | 0 ...2a7bf87e1db.js => bg-json.aada1abf5a5718a2785a.js} | 0 ...f36ad06c58d.js => bn-json.71061bf9106a3f1d06d9.js} | 0 ...8965ed10bae.js => br-json.623b25e4acdba3caea90.js} | 0 ...c7976cf083c.js => bs-json.895d6c19c442497a4542.js} | 0 ...b10b242c6a5.js => ca-json.4bf349a90cbee89b8a8f.js} | 0 ...e2b02291cb.js => ccp-json.915ed087d80fc6754272.js} | 0 ...8aa77ee395.js => ceb-json.d7c07bee01a6e04f3214.js} | 0 ...74167dec10.js => chr-json.037a46de1cb0ffa99c15.js} | 0 ...15aa76051a.js => ckb-json.3e534416e3850186a747.js} | 0 ...0dc9fe6b3dc.js => cs-json.606d434132759db14a54.js} | 0 ...5ad56530ead.js => cy-json.897b7ce472b1a390f392.js} | 0 ...f71edafc543.js => da-json.af3ed87176f973878b6e.js} | 0 ...191af1665e1.js => de-json.9592fc46ee6e2cc15606.js} | 0 ...8d616ec0.js => de_CH-json.c830189b2ad10099beec.js} | 0 ...b4e3da0bd1.js => doi-json.810d16be9637c3bc4d2d.js} | 0 ...8d62264466.js => dsb-json.b3e9991da8c100724645.js} | 0 ...a16d56c2314.js => el-json.4a78f601c28981142d91.js} | 0 ...49c3952084d.js => en-json.9049ee8252bf9c50468e.js} | 0 ...f59aa9f.js => en_001-json.6f674d7be8545f5249dd.js} | 0 ...273a34b1.js => en_AU-json.88f983885c5e77a522d2.js} | 0 ...8a5a4bb4.js => en_CA-json.481fa7a1009de1e09a52.js} | 0 ...facc81d1.js => en_GB-json.e12ddcfa4a9a2f213472.js} | 0 ...21928fca.js => en_IN-json.386a43a597b524565c01.js} | 0 ...367a9d7fb30.js => es-json.06f0b6d03919f378089e.js} | 0 ...6ed83bb.js => es_419-json.8424b58fe0295a7972dc.js} | 0 ...db1aeb33.js => es_MX-json.5e1160d486fdb5ee36e0.js} | 0 ...651d079a.js => es_US-json.c23781e2ed7aa713e880.js} | 0 ...a55ecb061cd.js => et-json.bc2b2889a512210a1537.js} | 0 ...fcc141549a5.js => eu-json.c01381c77dfb84017633.js} | 0 ...c8594ccf4fa.js => fa-json.a2458e1e0433704fc9d6.js} | 0 ...0faaba4abcc.js => fi-json.5f54dd17041a9e6fb818.js} | 0 ...8d1b889b69.js => fil-json.d057e86d94a109d9b786.js} | 0 ...9b3a8be4597.js => fo-json.5bc39548b737b814c5c3.js} | 0 ...a6622fe1c67.js => fr-json.26194bdddfdeb986269a.js} | 0 ...68707292.js => fr_CA-json.4e6a9b14341091c6742a.js} | 0 ...a8c445aea23.js => ga-json.2d53f85b5672fc5b9cd6.js} | 0 ...25be774ad81.js => gd-json.7b4f0937d99eaea7c15c.js} | 0 ...ae72224c994.js => gl-json.77123597a2fd634def06.js} | 0 ...cf260376905.js => gu-json.529b678e05ac5e6666f2.js} | 0 ...8925c10f970.js => ha-json.e2936eb1824633263448.js} | 0 ...fdd6ba57.js => ha_NE-json.5bb1461702b6b9a25a2a.js} | 0 ...2182b0955a2.js => he-json.b89324913e67b0cbef3a.js} | 0 ...c2169def97e.js => hi-json.caa9039c69fc619bb4d2.js} | 0 ...1f1908.js => hi_Latn-json.59c70483862a83131f1e.js} | 0 ...f18a60e513c.js => hr-json.7078f54504f4019e7019.js} | 0 ...4171bc6fc3.js => hsb-json.5752a21beca678ca22de.js} | 0 ...deda872b416.js => hu-json.0d93fa9c70bd2987942a.js} | 0 ...abfeba8457f.js => hy-json.7392cd8d62c85a8f3d55.js} | 0 ...f41779e2beb.js => ia-json.7abda2d4e5bb1ab9bb01.js} | 0 ...753b0b69330.js => id-json.be3d0b67868addd4d2ca.js} | 0 ...582463ba73c.js => ig-json.fec00094453b1024af11.js} | 0 ...215b034533d.js => is-json.f4f8eed224a9921d9d08.js} | 0 ...d3391f7f61a.js => it-json.da1cebce6afd4bb1ad5d.js} | 0 ...0c106355b0e.js => ja-json.98c56a5553477fcf8510.js} | 0 ...f22b46b6214.js => jv-json.9a579697582dd4da8515.js} | 0 ...d90a37003f3.js => ka-json.7ceb88c700f929fd1ba3.js} | 0 ...4ddc2b51dd.js => kab-json.a11ac7782cf683ba1fc4.js} | 0 ...bdfe99786ad.js => kk-json.e48b37a24122d49c3b21.js} | 0 ...4bdecd09faf.js => kl-json.92776bda19293c36a513.js} | 0 ...0faa64b4c53.js => km-json.49435b294880e56b2ad5.js} | 0 ...cb00991ba1e.js => kn-json.0fb5386110af3ba2c4ee.js} | 0 ...48f48ce87c8.js => ko-json.f819232d4ea91159bbb0.js} | 0 ...3bfb846233.js => kok-json.79368ff8ed458bbadc8a.js} | 0 ...8d7372ee209.js => ku-json.09d4b290940a5743f28b.js} | 0 ...c819eda9472.js => ky-json.a4d7bf8aa6b9fc268ee4.js} | 0 ...a653618ea9b.js => lb-json.ae00586748ab7e78fbcf.js} | 0 ...65a355b8157.js => lo-json.1e5d90a5f496ece86600.js} | 0 ...edc60127df6.js => lt-json.b30554764cd9dcab0ffb.js} | 0 ...d59fa0aa2e2.js => lv-json.9fe5ebef8867a98f5dcc.js} | 0 ...8f4d34f9c8.js => mai-json.b3eb2867f3dae2f0ca2e.js} | 0 ...ecd8987f80a.js => mi-json.5bf7d83b03a43d6b222e.js} | 0 ...570419cc426.js => mk-json.a58099730061ede27597.js} | 0 ...240faff1b48.js => ml-json.4029b72c11321ff49f04.js} | 0 ...68d0432640f.js => mn-json.1d71d86a284b090f309c.js} | 0 ...ce34e3683d.js => mni-json.b51930b659a2fbe92aee.js} | 0 ...abf8a52161d.js => mr-json.10d386d227d8eccd9f8c.js} | 0 ...aabc37015dd.js => ms-json.17cbe626b4520009e9b9.js} | 0 ...14adf90c500.js => mt-json.5bada7e5d0f89eec6a5f.js} | 0 ...813d15bba7e.js => my-json.e9c9074bcb0b7cf27297.js} | 0 ...096a101b8e8.js => ne-json.ace1f809ee53a942bf38.js} | 0 ...fa5e22cb585.js => nl-json.b500e4e202a9368e2834.js} | 0 ...205681cf48c.js => nn-json.d3b3cddc42dd89280d68.js} | 0 ...cc3c14ada58.js => no-json.3c3a1928a4ec2842457e.js} | 0 ...92dcc95efac.js => or-json.062e7bc0ce036e0869c2.js} | 0 ...2a108270669.js => pa-json.f1d90d460b83ede42498.js} | 0 ...6dd8a7.js => pa_Arab-json.7ecc921ea6ae7d5ad431.js} | 0 ...4b5b33289d.js => pcm-json.d34521c9683e5616db34.js} | 0 ...4dc6c169516.js => pl-json.6c4f3b09781d790d0db6.js} | 0 ...81bcad11e64.js => ps-json.88d6d49775d8f9c663c4.js} | 0 ...4291bdb2ae7.js => pt-json.e0210e062a8027ffb0f3.js} | 0 ...91b0e6b3.js => pt_PT-json.dbd8d4cf53226f886114.js} | 0 ...71076dbad9f.js => qu-json.c2d7991f40a4a3d8d5e7.js} | 0 ...386fd05a75c.js => rm-json.c77502e4c10101eb9113.js} | 0 ...78c94d1e813.js => ro-json.dccd74b28dd5784742c2.js} | 0 ...460837ccacc.js => ru-json.1f28233c5ea82e8b2e99.js} | 0 ...74676191131.js => rw-json.c0b7cbff0696430bc3f5.js} | 0 ...08c7469ccb4.js => sa-json.332142b117058f869a60.js} | 0 ...aaca8e021c.js => sat-json.e66e1ab5f51865665b62.js} | 0 ...2e104c43e4c.js => sc-json.8f7695808eb625453ecb.js} | 0 ...c3cf185f79d.js => sd-json.d7cc494d80b3e019846f.js} | 0 ...03623c10dbf.js => si-json.3660e3b9815e1b9589e6.js} | 0 ...a82655d0314.js => sk-json.3db034c6717655dfbbf6.js} | 0 ...a34fce6f1d0.js => sl-json.e64d6e5b433ff40babd2.js} | 0 ...37c8924c075.js => so-json.12a2621ada8dc497ef38.js} | 0 ...a6138aa089c.js => sq-json.a10b52fc261fdb767e0e.js} | 0 ...a708df0c6a8.js => sr-json.286656f6511ecef0620b.js} | 0 ...9f2.js => sr_Cyrl_BA-json.f2de1698d736be7cb7d3.js} | 0 ...fb8d70.js => sr_Latn-json.6d0e78c53a6c996f7148.js} | 0 ...754.js => sr_Latn_BA-json.9efe70d4f87053f148b5.js} | 0 ...020cbecea7d.js => su-json.b51522cc59d038be0544.js} | 0 ...a3a77519876.js => sv-json.8ac515e0f8396ddf6c08.js} | 0 ...b9cbcc0e126.js => sw-json.72684aa7dac892cb8cb9.js} | 0 ...158563d5.js => sw_KE-json.34b7da43677fa56e5e0d.js} | 0 ...07449d4a91b.js => ta-json.38b47dd7353471daf452.js} | 0 ...2cdf626244e.js => te-json.5f3edfe74048b3f9d552.js} | 0 ...4477d7d8e96.js => tg-json.4f1783c6c1da758319c0.js} | 2 +- ...23bb9d2587c.js => th-json.ba0ab95ab02ce2c939c6.js} | 0 ...bb960be805b.js => ti-json.4408ab975172165278bd.js} | 0 ...829921704ad.js => tk-json.5673e32b5abc49b2a251.js} | 0 ...1caaf592c94.js => to-json.360ff9ef00f0d1c7a57b.js} | 0 ...5006cf5b6cf.js => tr-json.713bfd260289f3323612.js} | 0 ...a9983ec8ef7.js => tt-json.249cbfc14263d519b9a9.js} | 0 ...e9ff02b0a8a.js => ug-json.51de5e5ba7bcb8576f82.js} | 0 ...f232638fc4d.js => uk-json.6a62f1a822def6f9226a.js} | 0 ...444c883a18f.js => ur-json.f9e844b4284c09a9fc7c.js} | 0 ...d4587324a20.js => uz-json.6f226c69bc9e3cdb2943.js} | 0 ...dd7f8c8bc67.js => vi-json.cb916206d909e482a501.js} | 0 ...cda0dd77e9a.js => wo-json.a2bdd903832fd3246da2.js} | 0 ...d3113dfc7f2.js => xh-json.5e356aaeaee395d041df.js} | 0 ...c360dd86f2e.js => yo-json.b92bb230b66b7d16a9b5.js} | 0 ...da92bad8.js => yo_BJ-json.67334e68952e79504647.js} | 0 ...df19bdfb4c.js => yue-json.a9b68824327da9c02318.js} | 0 ...d8207.js => yue_Hans-json.d0b0f7e7004b95cf59f7.js} | 0 ...d5c1aff6c85.js => zh-json.d4e08be048463f199b6d.js} | 0 ...3828a9.js => zh_Hant-json.fd2741548c8119e002d3.js} | 0 ...612.js => zh_Hant_HK-json.3eeb1788264aaa9730cb.js} | 0 ...90583fd0f6d.js => zu-json.0c4786052604b3d521bc.js} | 0 ...b64f59431137d.js => emoji.56150ad938e521d9ef81.js} | 0 ...47303aa65fe.js => ar-json.bb22e819fa0ea9299fa4.js} | 2 +- ...5fe.js.map => ar-json.bb22e819fa0ea9299fa4.js.map} | 2 +- ...1efa3c0627f.js => ca-json.f245d3f221094411dfcd.js} | 2 +- ...27f.js.map => ca-json.f245d3f221094411dfcd.js.map} | 2 +- .../static/js/i18n/cs-json.5eedbe9f7084c349fbe8.js | 2 -- .../js/i18n/cs-json.5eedbe9f7084c349fbe8.js.map | 1 - .../static/js/i18n/cs-json.8cb69392de1a430e9c3f.js | 2 ++ .../js/i18n/cs-json.8cb69392de1a430e9c3f.js.map | 1 + ...c92f87ff37a.js => de-json.74b1f546c884d17b819a.js} | 2 +- ...37a.js.map => de-json.74b1f546c884d17b819a.js.map} | 2 +- .../static/js/i18n/eo-json.1d790624b6ea3832617a.js | 2 ++ .../js/i18n/eo-json.1d790624b6ea3832617a.js.map | 1 + .../static/js/i18n/eo-json.6c62eef99e850912498b.js | 2 -- .../js/i18n/eo-json.6c62eef99e850912498b.js.map | 1 - ...65e1f67d8a2.js => es-json.16c8ca99bc2dee099ca0.js} | 2 +- ...8a2.js.map => es-json.16c8ca99bc2dee099ca0.js.map} | 2 +- ...bb83a8aee75.js => et-json.e6066512bb8a65a06f89.js} | 2 +- ...e75.js.map => et-json.e6066512bb8a65a06f89.js.map} | 2 +- ...427995fc314.js => eu-json.e519f9e06eed5ad3cf41.js} | 2 +- ...314.js.map => eu-json.e519f9e06eed5ad3cf41.js.map} | 2 +- ...5a9431e2adb.js => fa-json.95757c7acb6dff777d7d.js} | 2 +- ...adb.js.map => fa-json.95757c7acb6dff777d7d.js.map} | 2 +- ...12d80493ab1.js => fi-json.dcde7d5d3f4927b6667e.js} | 2 +- ...ab1.js.map => fi-json.dcde7d5d3f4927b6667e.js.map} | 2 +- .../static/js/i18n/fr-json.36ef21ccb1203d3e65ae.js | 2 -- .../js/i18n/fr-json.36ef21ccb1203d3e65ae.js.map | 1 - .../static/js/i18n/fr-json.7a64af58316da6ca86f0.js | 2 ++ .../js/i18n/fr-json.7a64af58316da6ca86f0.js.map | 1 + ...977a16f1d7e.js => ga-json.72cfdbaab827e141e497.js} | 2 +- ...d7e.js.map => ga-json.72cfdbaab827e141e497.js.map} | 2 +- ...4034de06e6f.js => he-json.25ae71e0ad9cdd21d447.js} | 2 +- ...e6f.js.map => he-json.25ae71e0ad9cdd21d447.js.map} | 2 +- ...7a7a8505ed8.js => hu-json.cc3c026f0ff445ebb4b6.js} | 2 +- ...ed8.js.map => hu-json.cc3c026f0ff445ebb4b6.js.map} | 2 +- ...155f88128b9.js => id-json.b00a413b6132632523e5.js} | 2 +- ...8b9.js.map => id-json.b00a413b6132632523e5.js.map} | 2 +- ...8376af17141.js => it-json.1b71f7623efed055d62b.js} | 2 +- ...141.js.map => it-json.1b71f7623efed055d62b.js.map} | 2 +- .../js/i18n/ja_easy-json.1d5ea7e755b066ac2cdd.js | 2 -- .../js/i18n/ja_easy-json.1d5ea7e755b066ac2cdd.js.map | 1 - .../js/i18n/ja_easy-json.b5f269a0a935c640f3b5.js | 2 ++ .../js/i18n/ja_easy-json.b5f269a0a935c640f3b5.js.map | 1 + .../js/i18n/ja_pedantic-json.7c472bf001679929edea.js | 2 ++ .../i18n/ja_pedantic-json.7c472bf001679929edea.js.map | 1 + .../js/i18n/ja_pedantic-json.b52fa70f0bf89ae01cfb.js | 2 -- .../i18n/ja_pedantic-json.b52fa70f0bf89ae01cfb.js.map | 1 - .../static/js/i18n/ko-json.51d23959bb9bae4f0ecf.js | 2 ++ .../js/i18n/ko-json.51d23959bb9bae4f0ecf.js.map | 1 + .../static/js/i18n/ko-json.9029d09084bb22d8b705.js | 2 -- .../js/i18n/ko-json.9029d09084bb22d8b705.js.map | 1 - .../js/i18n/nan-TW-json.7f2789d8a461e86d1734.js | 2 -- .../js/i18n/nan-TW-json.7f2789d8a461e86d1734.js.map | 1 - .../js/i18n/nan-TW-json.80c0071ebf383eea3b8f.js | 2 ++ .../js/i18n/nan-TW-json.80c0071ebf383eea3b8f.js.map | 1 + ...47d576ad4aa.js => nb-json.2dd01f0c6cca8f008ffd.js} | 2 +- ...4aa.js.map => nb-json.2dd01f0c6cca8f008ffd.js.map} | 2 +- ...0c29434b613.js => nl-json.2fe76cb30e2fced8d88a.js} | 2 +- ...613.js.map => nl-json.2fe76cb30e2fced8d88a.js.map} | 2 +- ...e3213acc33c.js => oc-json.7ebe52b8d626dbf54a5f.js} | 2 +- ...33c.js.map => oc-json.7ebe52b8d626dbf54a5f.js.map} | 2 +- ...2381b05579b.js => pl-json.d319c737d904c64d8eba.js} | 2 +- ...79b.js.map => pl-json.d319c737d904c64d8eba.js.map} | 2 +- .../static/js/i18n/pt-json.3fc5593e030268bcd291.js | 2 -- .../js/i18n/pt-json.3fc5593e030268bcd291.js.map | 1 - .../static/js/i18n/pt-json.d6ce04e3e4e5a0e908bf.js | 2 ++ .../js/i18n/pt-json.d6ce04e3e4e5a0e908bf.js.map | 1 + ...1c1413059ae.js => ro-json.3c4274351d849d5010b8.js} | 2 +- ...9ae.js.map => ro-json.3c4274351d849d5010b8.js.map} | 2 +- ...e9f0c642438.js => ru-json.1aaf6c712db167fede4d.js} | 2 +- ...438.js.map => ru-json.1aaf6c712db167fede4d.js.map} | 2 +- ...f94e6f55145.js => sk-json.47d5a2f34c7fdf53d2af.js} | 2 +- ...145.js.map => sk-json.47d5a2f34c7fdf53d2af.js.map} | 2 +- ...1b2f824064f.js => te-json.cb97beb999533eaae9ae.js} | 2 +- ...64f.js.map => te-json.cb97beb999533eaae9ae.js.map} | 2 +- .../static/js/i18n/uk-json.003908af9b15becdd382.js | 2 -- .../js/i18n/uk-json.003908af9b15becdd382.js.map | 1 - .../static/js/i18n/uk-json.b16cc51984a2c6585d41.js | 2 ++ .../js/i18n/uk-json.b16cc51984a2c6585d41.js.map | 1 + ...be6e857bbf3.js => vi-json.07aaea2428bb6b5a5fab.js} | 2 +- ...bf3.js.map => vi-json.07aaea2428bb6b5a5fab.js.map} | 2 +- .../static/js/i18n/zh-json.5b36950c3b87c209730d.js | 2 ++ .../js/i18n/zh-json.5b36950c3b87c209730d.js.map | 1 + .../static/js/i18n/zh-json.a0a26f6d62ddbe0b49cc.js | 2 -- .../js/i18n/zh-json.a0a26f6d62ddbe0b49cc.js.map | 1 - ...0d6396.js => zh_Hant-json.6b45d2e6967b35e56b44.js} | 2 +- ...s.map => zh_Hant-json.6b45d2e6967b35e56b44.js.map} | 2 +- .../static/ruffle/core.ruffle.61b3dd915983ae8a8b16.js | 2 +- .../static/ruffle/core.ruffle.848d766d6fc336164c2f.js | 2 +- priv/static/sw-pleroma.js | 4 ++-- priv/static/sw-pleroma.js.LICENSE.txt | 2 ++ priv/static/sw-pleroma.js.map | 2 +- 297 files changed, 148 insertions(+), 138 deletions(-) delete mode 100644 priv/static/static/css/159.1d523a00378ebd68c5b3.css.map rename priv/static/static/css/{159.1d523a00378ebd68c5b3.css => 1597.a250eca8cf87418c7b3e.css} (84%) create mode 100644 priv/static/static/css/1597.a250eca8cf87418c7b3e.css.map create mode 100644 priv/static/static/css/5250.b9104f3df4166526b081.css create mode 100644 priv/static/static/css/5250.b9104f3df4166526b081.css.map create mode 100644 priv/static/static/css/5292.035030cbb2311a7ddada.css create mode 100644 priv/static/static/css/5292.035030cbb2311a7ddada.css.map delete mode 100644 priv/static/static/css/6464.169260b661120cc50815.css delete mode 100644 priv/static/static/css/6464.169260b661120cc50815.css.map create mode 100644 priv/static/static/css/6464.7845ee2ccc5e22628b2a.css create mode 100644 priv/static/static/css/6464.7845ee2ccc5e22628b2a.css.map delete mode 100644 priv/static/static/css/7586.0d43f70bc6240422f179.css delete mode 100644 priv/static/static/css/7586.0d43f70bc6240422f179.css.map create mode 100644 priv/static/static/css/7594.a8030565c3ef463dc1de.css create mode 100644 priv/static/static/css/7594.a8030565c3ef463dc1de.css.map delete mode 100644 priv/static/static/css/7962.76663e78ad5ea0bb0b90.css delete mode 100644 priv/static/static/css/7962.76663e78ad5ea0bb0b90.css.map delete mode 100644 priv/static/static/css/8859.d26a3b0841a7beb8fd4a.css delete mode 100644 priv/static/static/css/8859.d26a3b0841a7beb8fd4a.css.map create mode 100644 priv/static/static/css/app.75b043cffb8e922bc29e.css create mode 100644 priv/static/static/css/app.75b043cffb8e922bc29e.css.map delete mode 100644 priv/static/static/css/app.a7f63ee9107a77599942.css delete mode 100644 priv/static/static/css/app.a7f63ee9107a77599942.css.map delete mode 100644 priv/static/static/js/159.903e90c9de8ef6c67077.js delete mode 100644 priv/static/static/js/159.903e90c9de8ef6c67077.js.map create mode 100644 priv/static/static/js/1597.134341dec11e42dd5fae.js create mode 100644 priv/static/static/js/1597.134341dec11e42dd5fae.js.map delete mode 100644 priv/static/static/js/3733.7060d1e6bca813125a0c.js delete mode 100644 priv/static/static/js/3733.7060d1e6bca813125a0c.js.map delete mode 100644 priv/static/static/js/48.b5ecdbc517423af07ca4.js delete mode 100644 priv/static/static/js/48.b5ecdbc517423af07ca4.js.map create mode 100644 priv/static/static/js/48.f58874c23a9bf1c1f591.js rename priv/static/static/js/{48.b5ecdbc517423af07ca4.js.LICENSE.txt => 48.f58874c23a9bf1c1f591.js.LICENSE.txt} (100%) create mode 100644 priv/static/static/js/48.f58874c23a9bf1c1f591.js.map create mode 100644 priv/static/static/js/5250.f0d4cfa412bbf8163d11.js create mode 100644 priv/static/static/js/5250.f0d4cfa412bbf8163d11.js.map create mode 100644 priv/static/static/js/5292.125b85a896c810481068.js create mode 100644 priv/static/static/js/5292.125b85a896c810481068.js.map rename priv/static/static/js/{6464.eb9c90a1c948cde554e9.js => 6464.6f764a6d660917d88ca5.js} (98%) rename priv/static/static/js/{6464.eb9c90a1c948cde554e9.js.map => 6464.6f764a6d660917d88ca5.js.map} (86%) create mode 100644 priv/static/static/js/6561.24d12b4e33b21319845b.js rename priv/static/static/js/{3733.7060d1e6bca813125a0c.js.LICENSE.txt => 6561.24d12b4e33b21319845b.js.LICENSE.txt} (84%) create mode 100644 priv/static/static/js/6561.24d12b4e33b21319845b.js.map delete mode 100644 priv/static/static/js/7586.628f729b9c8b2e6f4e1f.js delete mode 100644 priv/static/static/js/7586.628f729b9c8b2e6f4e1f.js.map create mode 100644 priv/static/static/js/7594.f0ffca037eec090815d9.js create mode 100644 priv/static/static/js/7594.f0ffca037eec090815d9.js.map delete mode 100644 priv/static/static/js/7962.e25d40b042f8ee7389c3.js delete mode 100644 priv/static/static/js/7962.e25d40b042f8ee7389c3.js.map delete mode 100644 priv/static/static/js/8859.c76b0a0c3a4b5acbef11.js delete mode 100644 priv/static/static/js/8859.c76b0a0c3a4b5acbef11.js.map delete mode 100644 priv/static/static/js/9060.24271e167e0471a1a732.js delete mode 100644 priv/static/static/js/9060.24271e167e0471a1a732.js.map create mode 100644 priv/static/static/js/9060.606ed1efce1ce3be713d.js create mode 100644 priv/static/static/js/9060.606ed1efce1ce3be713d.js.map create mode 100644 priv/static/static/js/app.3fbb12e9679dc0e0aa33.js create mode 100644 priv/static/static/js/app.3fbb12e9679dc0e0aa33.js.map delete mode 100644 priv/static/static/js/app.d42ab31e1d50a3265a82.js delete mode 100644 priv/static/static/js/app.d42ab31e1d50a3265a82.js.map rename priv/static/static/js/emoji-annotations/{af-json.96c988285a6a2cce6246.js => af-json.260623f695510b34c146.js} (100%) rename priv/static/static/js/emoji-annotations/{am-json.94388548f7c18233fec3.js => am-json.fd30fc79a9ef9f40bcb3.js} (100%) rename priv/static/static/js/emoji-annotations/{ar-json.5527466d349f2954d49b.js => ar-json.66fec1d991d30cf191ac.js} (100%) rename priv/static/static/js/emoji-annotations/{ar_SA-json.4a6f4402931a867070f0.js => ar_SA-json.89b9143ae611e2581b5b.js} (100%) rename priv/static/static/js/emoji-annotations/{as-json.34cf67edc1cecd195738.js => as-json.bd49b949563ed3872ea7.js} (100%) rename priv/static/static/js/emoji-annotations/{ast-json.7e4da8cb7e539c19a9b9.js => ast-json.b04ae8a41f30fcc498c6.js} (100%) rename priv/static/static/js/emoji-annotations/{az-json.9a32f2941d9c4d1f834c.js => az-json.fc8b49efe1bec779ad7c.js} (100%) rename priv/static/static/js/emoji-annotations/{be-json.f92f80669873a4100c69.js => be-json.390af96d7085a650d098.js} (100%) rename priv/static/static/js/emoji-annotations/{bg-json.7c69c52572a7bf87e1db.js => bg-json.aada1abf5a5718a2785a.js} (100%) rename priv/static/static/js/emoji-annotations/{bn-json.657aac057f36ad06c58d.js => bn-json.71061bf9106a3f1d06d9.js} (100%) rename priv/static/static/js/emoji-annotations/{br-json.c7175423d8965ed10bae.js => br-json.623b25e4acdba3caea90.js} (100%) rename priv/static/static/js/emoji-annotations/{bs-json.48ef42da1c7976cf083c.js => bs-json.895d6c19c442497a4542.js} (100%) rename priv/static/static/js/emoji-annotations/{ca-json.ce029e860b10b242c6a5.js => ca-json.4bf349a90cbee89b8a8f.js} (100%) rename priv/static/static/js/emoji-annotations/{ccp-json.02836537ffe2b02291cb.js => ccp-json.915ed087d80fc6754272.js} (100%) rename priv/static/static/js/emoji-annotations/{ceb-json.9db0336f168aa77ee395.js => ceb-json.d7c07bee01a6e04f3214.js} (100%) rename priv/static/static/js/emoji-annotations/{chr-json.e7e542ab5a74167dec10.js => chr-json.037a46de1cb0ffa99c15.js} (100%) rename priv/static/static/js/emoji-annotations/{ckb-json.13dc83db1e15aa76051a.js => ckb-json.3e534416e3850186a747.js} (100%) rename priv/static/static/js/emoji-annotations/{cs-json.48d8bba230dc9fe6b3dc.js => cs-json.606d434132759db14a54.js} (100%) rename priv/static/static/js/emoji-annotations/{cy-json.e09dd13da5ad56530ead.js => cy-json.897b7ce472b1a390f392.js} (100%) rename priv/static/static/js/emoji-annotations/{da-json.8d074e27df71edafc543.js => da-json.af3ed87176f973878b6e.js} (100%) rename priv/static/static/js/emoji-annotations/{de-json.e1443c01a191af1665e1.js => de-json.9592fc46ee6e2cc15606.js} (100%) rename priv/static/static/js/emoji-annotations/{de_CH-json.b4a5891ea2f38d616ec0.js => de_CH-json.c830189b2ad10099beec.js} (100%) rename priv/static/static/js/emoji-annotations/{doi-json.7841c3f3ceb4e3da0bd1.js => doi-json.810d16be9637c3bc4d2d.js} (100%) rename priv/static/static/js/emoji-annotations/{dsb-json.7635686ffd8d62264466.js => dsb-json.b3e9991da8c100724645.js} (100%) rename priv/static/static/js/emoji-annotations/{el-json.b36610f2ea16d56c2314.js => el-json.4a78f601c28981142d91.js} (100%) rename priv/static/static/js/emoji-annotations/{en-json.6c3947f7c49c3952084d.js => en-json.9049ee8252bf9c50468e.js} (100%) rename priv/static/static/js/emoji-annotations/{en_001-json.72d8c47269350f59aa9f.js => en_001-json.6f674d7be8545f5249dd.js} (100%) rename priv/static/static/js/emoji-annotations/{en_AU-json.33aac9bbd887273a34b1.js => en_AU-json.88f983885c5e77a522d2.js} (100%) rename priv/static/static/js/emoji-annotations/{en_CA-json.5de965778a6b8a5a4bb4.js => en_CA-json.481fa7a1009de1e09a52.js} (100%) rename priv/static/static/js/emoji-annotations/{en_GB-json.bd687f904492facc81d1.js => en_GB-json.e12ddcfa4a9a2f213472.js} (100%) rename priv/static/static/js/emoji-annotations/{en_IN-json.002faa48c09121928fca.js => en_IN-json.386a43a597b524565c01.js} (100%) rename priv/static/static/js/emoji-annotations/{es-json.f593b0dc2367a9d7fb30.js => es-json.06f0b6d03919f378089e.js} (100%) rename priv/static/static/js/emoji-annotations/{es_419-json.d81991295392b6ed83bb.js => es_419-json.8424b58fe0295a7972dc.js} (100%) rename priv/static/static/js/emoji-annotations/{es_MX-json.ee359d4b611fdb1aeb33.js => es_MX-json.5e1160d486fdb5ee36e0.js} (100%) rename priv/static/static/js/emoji-annotations/{es_US-json.280bdb036dfd651d079a.js => es_US-json.c23781e2ed7aa713e880.js} (100%) rename priv/static/static/js/emoji-annotations/{et-json.c42e3f186a55ecb061cd.js => et-json.bc2b2889a512210a1537.js} (100%) rename priv/static/static/js/emoji-annotations/{eu-json.931b429f5fcc141549a5.js => eu-json.c01381c77dfb84017633.js} (100%) rename priv/static/static/js/emoji-annotations/{fa-json.819c7f263c8594ccf4fa.js => fa-json.a2458e1e0433704fc9d6.js} (100%) rename priv/static/static/js/emoji-annotations/{fi-json.0f254bb4b0faaba4abcc.js => fi-json.5f54dd17041a9e6fb818.js} (100%) rename priv/static/static/js/emoji-annotations/{fil-json.4fca833f178d1b889b69.js => fil-json.d057e86d94a109d9b786.js} (100%) rename priv/static/static/js/emoji-annotations/{fo-json.9b060e8009b3a8be4597.js => fo-json.5bc39548b737b814c5c3.js} (100%) rename priv/static/static/js/emoji-annotations/{fr-json.da49ed0d1a6622fe1c67.js => fr-json.26194bdddfdeb986269a.js} (100%) rename priv/static/static/js/emoji-annotations/{fr_CA-json.59ed6b59e2ca68707292.js => fr_CA-json.4e6a9b14341091c6742a.js} (100%) rename priv/static/static/js/emoji-annotations/{ga-json.cb3f9e613a8c445aea23.js => ga-json.2d53f85b5672fc5b9cd6.js} (100%) rename priv/static/static/js/emoji-annotations/{gd-json.e3d0aea3725be774ad81.js => gd-json.7b4f0937d99eaea7c15c.js} (100%) rename priv/static/static/js/emoji-annotations/{gl-json.ce89036f0ae72224c994.js => gl-json.77123597a2fd634def06.js} (100%) rename priv/static/static/js/emoji-annotations/{gu-json.8a899f364cf260376905.js => gu-json.529b678e05ac5e6666f2.js} (100%) rename priv/static/static/js/emoji-annotations/{ha-json.2a08912b38925c10f970.js => ha-json.e2936eb1824633263448.js} (100%) rename priv/static/static/js/emoji-annotations/{ha_NE-json.e4855d92aaccfdd6ba57.js => ha_NE-json.5bb1461702b6b9a25a2a.js} (100%) rename priv/static/static/js/emoji-annotations/{he-json.a3d7631f32182b0955a2.js => he-json.b89324913e67b0cbef3a.js} (100%) rename priv/static/static/js/emoji-annotations/{hi-json.04bc5f73dc2169def97e.js => hi-json.caa9039c69fc619bb4d2.js} (100%) rename priv/static/static/js/emoji-annotations/{hi_Latn-json.3cb73c456f31261f1908.js => hi_Latn-json.59c70483862a83131f1e.js} (100%) rename priv/static/static/js/emoji-annotations/{hr-json.fe847ade1f18a60e513c.js => hr-json.7078f54504f4019e7019.js} (100%) rename priv/static/static/js/emoji-annotations/{hsb-json.438721731b4171bc6fc3.js => hsb-json.5752a21beca678ca22de.js} (100%) rename priv/static/static/js/emoji-annotations/{hu-json.1faf52040deda872b416.js => hu-json.0d93fa9c70bd2987942a.js} (100%) rename priv/static/static/js/emoji-annotations/{hy-json.2d819f7faabfeba8457f.js => hy-json.7392cd8d62c85a8f3d55.js} (100%) rename priv/static/static/js/emoji-annotations/{ia-json.8e8365e2bf41779e2beb.js => ia-json.7abda2d4e5bb1ab9bb01.js} (100%) rename priv/static/static/js/emoji-annotations/{id-json.55f83c46d753b0b69330.js => id-json.be3d0b67868addd4d2ca.js} (100%) rename priv/static/static/js/emoji-annotations/{ig-json.f19fa5fe3582463ba73c.js => ig-json.fec00094453b1024af11.js} (100%) rename priv/static/static/js/emoji-annotations/{is-json.62e220c65215b034533d.js => is-json.f4f8eed224a9921d9d08.js} (100%) rename priv/static/static/js/emoji-annotations/{it-json.9c1758f4fd3391f7f61a.js => it-json.da1cebce6afd4bb1ad5d.js} (100%) rename priv/static/static/js/emoji-annotations/{ja-json.0bd51f8c40c106355b0e.js => ja-json.98c56a5553477fcf8510.js} (100%) rename priv/static/static/js/emoji-annotations/{jv-json.1c8d5ffcff22b46b6214.js => jv-json.9a579697582dd4da8515.js} (100%) rename priv/static/static/js/emoji-annotations/{ka-json.567e7b051d90a37003f3.js => ka-json.7ceb88c700f929fd1ba3.js} (100%) rename priv/static/static/js/emoji-annotations/{kab-json.1a2de4774f4ddc2b51dd.js => kab-json.a11ac7782cf683ba1fc4.js} (100%) rename priv/static/static/js/emoji-annotations/{kk-json.a20b59d47bdfe99786ad.js => kk-json.e48b37a24122d49c3b21.js} (100%) rename priv/static/static/js/emoji-annotations/{kl-json.87ab8661b4bdecd09faf.js => kl-json.92776bda19293c36a513.js} (100%) rename priv/static/static/js/emoji-annotations/{km-json.9bc922b2e0faa64b4c53.js => km-json.49435b294880e56b2ad5.js} (100%) rename priv/static/static/js/emoji-annotations/{kn-json.efdac8ac0cb00991ba1e.js => kn-json.0fb5386110af3ba2c4ee.js} (100%) rename priv/static/static/js/emoji-annotations/{ko-json.d175900fe48f48ce87c8.js => ko-json.f819232d4ea91159bbb0.js} (100%) rename priv/static/static/js/emoji-annotations/{kok-json.116e4f72db3bfb846233.js => kok-json.79368ff8ed458bbadc8a.js} (100%) rename priv/static/static/js/emoji-annotations/{ku-json.2173ed87f8d7372ee209.js => ku-json.09d4b290940a5743f28b.js} (100%) rename priv/static/static/js/emoji-annotations/{ky-json.310bda579c819eda9472.js => ky-json.a4d7bf8aa6b9fc268ee4.js} (100%) rename priv/static/static/js/emoji-annotations/{lb-json.499c526f3a653618ea9b.js => lb-json.ae00586748ab7e78fbcf.js} (100%) rename priv/static/static/js/emoji-annotations/{lo-json.ecb06d61465a355b8157.js => lo-json.1e5d90a5f496ece86600.js} (100%) rename priv/static/static/js/emoji-annotations/{lt-json.ced4d5e70edc60127df6.js => lt-json.b30554764cd9dcab0ffb.js} (100%) rename priv/static/static/js/emoji-annotations/{lv-json.5600c2eb6d59fa0aa2e2.js => lv-json.9fe5ebef8867a98f5dcc.js} (100%) rename priv/static/static/js/emoji-annotations/{mai-json.302386b3358f4d34f9c8.js => mai-json.b3eb2867f3dae2f0ca2e.js} (100%) rename priv/static/static/js/emoji-annotations/{mi-json.9efe6f146ecd8987f80a.js => mi-json.5bf7d83b03a43d6b222e.js} (100%) rename priv/static/static/js/emoji-annotations/{mk-json.a254cabb8570419cc426.js => mk-json.a58099730061ede27597.js} (100%) rename priv/static/static/js/emoji-annotations/{ml-json.3f2902a84240faff1b48.js => ml-json.4029b72c11321ff49f04.js} (100%) rename priv/static/static/js/emoji-annotations/{mn-json.764169f1168d0432640f.js => mn-json.1d71d86a284b090f309c.js} (100%) rename priv/static/static/js/emoji-annotations/{mni-json.7db7f76ab1ce34e3683d.js => mni-json.b51930b659a2fbe92aee.js} (100%) rename priv/static/static/js/emoji-annotations/{mr-json.cb0a87d9aabf8a52161d.js => mr-json.10d386d227d8eccd9f8c.js} (100%) rename priv/static/static/js/emoji-annotations/{ms-json.272ee4735aabc37015dd.js => ms-json.17cbe626b4520009e9b9.js} (100%) rename priv/static/static/js/emoji-annotations/{mt-json.3ddf7dbc114adf90c500.js => mt-json.5bada7e5d0f89eec6a5f.js} (100%) rename priv/static/static/js/emoji-annotations/{my-json.8e7dd1485813d15bba7e.js => my-json.e9c9074bcb0b7cf27297.js} (100%) rename priv/static/static/js/emoji-annotations/{ne-json.a0118dca2096a101b8e8.js => ne-json.ace1f809ee53a942bf38.js} (100%) rename priv/static/static/js/emoji-annotations/{nl-json.52f4b93b8fa5e22cb585.js => nl-json.b500e4e202a9368e2834.js} (100%) rename priv/static/static/js/emoji-annotations/{nn-json.7293cd5d7205681cf48c.js => nn-json.d3b3cddc42dd89280d68.js} (100%) rename priv/static/static/js/emoji-annotations/{no-json.22bdbbc77cc3c14ada58.js => no-json.3c3a1928a4ec2842457e.js} (100%) rename priv/static/static/js/emoji-annotations/{or-json.b007c2f6f92dcc95efac.js => or-json.062e7bc0ce036e0869c2.js} (100%) rename priv/static/static/js/emoji-annotations/{pa-json.7d60d69762a108270669.js => pa-json.f1d90d460b83ede42498.js} (100%) rename priv/static/static/js/emoji-annotations/{pa_Arab-json.5ae021308b1c5f6dd8a7.js => pa_Arab-json.7ecc921ea6ae7d5ad431.js} (100%) rename priv/static/static/js/emoji-annotations/{pcm-json.eac3a5ad0b4b5b33289d.js => pcm-json.d34521c9683e5616db34.js} (100%) rename priv/static/static/js/emoji-annotations/{pl-json.e9e8f1ed84dc6c169516.js => pl-json.6c4f3b09781d790d0db6.js} (100%) rename priv/static/static/js/emoji-annotations/{ps-json.a0d9eea5b81bcad11e64.js => ps-json.88d6d49775d8f9c663c4.js} (100%) rename priv/static/static/js/emoji-annotations/{pt-json.2b2512ee44291bdb2ae7.js => pt-json.e0210e062a8027ffb0f3.js} (100%) rename priv/static/static/js/emoji-annotations/{pt_PT-json.c381b13e323f91b0e6b3.js => pt_PT-json.dbd8d4cf53226f886114.js} (100%) rename priv/static/static/js/emoji-annotations/{qu-json.55f4df57e71076dbad9f.js => qu-json.c2d7991f40a4a3d8d5e7.js} (100%) rename priv/static/static/js/emoji-annotations/{rm-json.985d4934f386fd05a75c.js => rm-json.c77502e4c10101eb9113.js} (100%) rename priv/static/static/js/emoji-annotations/{ro-json.cb62f86ce78c94d1e813.js => ro-json.dccd74b28dd5784742c2.js} (100%) rename priv/static/static/js/emoji-annotations/{ru-json.a81d0df34460837ccacc.js => ru-json.1f28233c5ea82e8b2e99.js} (100%) rename priv/static/static/js/emoji-annotations/{rw-json.031838c5374676191131.js => rw-json.c0b7cbff0696430bc3f5.js} (100%) rename priv/static/static/js/emoji-annotations/{sa-json.21b06234a08c7469ccb4.js => sa-json.332142b117058f869a60.js} (100%) rename priv/static/static/js/emoji-annotations/{sat-json.71e92700b2aaca8e021c.js => sat-json.e66e1ab5f51865665b62.js} (100%) rename priv/static/static/js/emoji-annotations/{sc-json.c84c9c47d2e104c43e4c.js => sc-json.8f7695808eb625453ecb.js} (100%) rename priv/static/static/js/emoji-annotations/{sd-json.8f2a6a06dc3cf185f79d.js => sd-json.d7cc494d80b3e019846f.js} (100%) rename priv/static/static/js/emoji-annotations/{si-json.841b356da03623c10dbf.js => si-json.3660e3b9815e1b9589e6.js} (100%) rename priv/static/static/js/emoji-annotations/{sk-json.5d96bdb4da82655d0314.js => sk-json.3db034c6717655dfbbf6.js} (100%) rename priv/static/static/js/emoji-annotations/{sl-json.a40c5548da34fce6f1d0.js => sl-json.e64d6e5b433ff40babd2.js} (100%) rename priv/static/static/js/emoji-annotations/{so-json.f75abd16637c8924c075.js => so-json.12a2621ada8dc497ef38.js} (100%) rename priv/static/static/js/emoji-annotations/{sq-json.bcf154ed8a6138aa089c.js => sq-json.a10b52fc261fdb767e0e.js} (100%) rename priv/static/static/js/emoji-annotations/{sr-json.e29a20e59a708df0c6a8.js => sr-json.286656f6511ecef0620b.js} (100%) rename priv/static/static/js/emoji-annotations/{sr_Cyrl_BA-json.83c7c64b9696ae2339f2.js => sr_Cyrl_BA-json.f2de1698d736be7cb7d3.js} (100%) rename priv/static/static/js/emoji-annotations/{sr_Latn-json.ff27d1f455bf2afb8d70.js => sr_Latn-json.6d0e78c53a6c996f7148.js} (100%) rename priv/static/static/js/emoji-annotations/{sr_Latn_BA-json.72933405032b81344754.js => sr_Latn_BA-json.9efe70d4f87053f148b5.js} (100%) rename priv/static/static/js/emoji-annotations/{su-json.daff15251020cbecea7d.js => su-json.b51522cc59d038be0544.js} (100%) rename priv/static/static/js/emoji-annotations/{sv-json.8b0374cbca3a77519876.js => sv-json.8ac515e0f8396ddf6c08.js} (100%) rename priv/static/static/js/emoji-annotations/{sw-json.d5f350641b9cbcc0e126.js => sw-json.72684aa7dac892cb8cb9.js} (100%) rename priv/static/static/js/emoji-annotations/{sw_KE-json.f3563cbeac1c158563d5.js => sw_KE-json.34b7da43677fa56e5e0d.js} (100%) rename priv/static/static/js/emoji-annotations/{ta-json.675cc6c7607449d4a91b.js => ta-json.38b47dd7353471daf452.js} (100%) rename priv/static/static/js/emoji-annotations/{te-json.8a69a10f62cdf626244e.js => te-json.5f3edfe74048b3f9d552.js} (100%) rename priv/static/static/js/emoji-annotations/{tg-json.9647f559a4477d7d8e96.js => tg-json.4f1783c6c1da758319c0.js} (99%) rename priv/static/static/js/emoji-annotations/{th-json.34709bae223bb9d2587c.js => th-json.ba0ab95ab02ce2c939c6.js} (100%) rename priv/static/static/js/emoji-annotations/{ti-json.5b173bd33bb960be805b.js => ti-json.4408ab975172165278bd.js} (100%) rename priv/static/static/js/emoji-annotations/{tk-json.23a9a6229829921704ad.js => tk-json.5673e32b5abc49b2a251.js} (100%) rename priv/static/static/js/emoji-annotations/{to-json.50ac37d101caaf592c94.js => to-json.360ff9ef00f0d1c7a57b.js} (100%) rename priv/static/static/js/emoji-annotations/{tr-json.6462e8cfd5006cf5b6cf.js => tr-json.713bfd260289f3323612.js} (100%) rename priv/static/static/js/emoji-annotations/{tt-json.4c089389ba9983ec8ef7.js => tt-json.249cbfc14263d519b9a9.js} (100%) rename priv/static/static/js/emoji-annotations/{ug-json.bf768bd32e9ff02b0a8a.js => ug-json.51de5e5ba7bcb8576f82.js} (100%) rename priv/static/static/js/emoji-annotations/{uk-json.af110c8eef232638fc4d.js => uk-json.6a62f1a822def6f9226a.js} (100%) rename priv/static/static/js/emoji-annotations/{ur-json.983c02109444c883a18f.js => ur-json.f9e844b4284c09a9fc7c.js} (100%) rename priv/static/static/js/emoji-annotations/{uz-json.ac43f4c54d4587324a20.js => uz-json.6f226c69bc9e3cdb2943.js} (100%) rename priv/static/static/js/emoji-annotations/{vi-json.f6a364b2add7f8c8bc67.js => vi-json.cb916206d909e482a501.js} (100%) rename priv/static/static/js/emoji-annotations/{wo-json.e0d689e22cda0dd77e9a.js => wo-json.a2bdd903832fd3246da2.js} (100%) rename priv/static/static/js/emoji-annotations/{xh-json.21e88c05ad3113dfc7f2.js => xh-json.5e356aaeaee395d041df.js} (100%) rename priv/static/static/js/emoji-annotations/{yo-json.ea1150d6bc360dd86f2e.js => yo-json.b92bb230b66b7d16a9b5.js} (100%) rename priv/static/static/js/emoji-annotations/{yo_BJ-json.650318c25fe4da92bad8.js => yo_BJ-json.67334e68952e79504647.js} (100%) rename priv/static/static/js/emoji-annotations/{yue-json.15102c0ddfdf19bdfb4c.js => yue-json.a9b68824327da9c02318.js} (100%) rename priv/static/static/js/emoji-annotations/{yue_Hans-json.cc60bb10d32fab3d8207.js => yue_Hans-json.d0b0f7e7004b95cf59f7.js} (100%) rename priv/static/static/js/emoji-annotations/{zh-json.e42a28127d5c1aff6c85.js => zh-json.d4e08be048463f199b6d.js} (100%) rename priv/static/static/js/emoji-annotations/{zh_Hant-json.9cbb765c181d443828a9.js => zh_Hant-json.fd2741548c8119e002d3.js} (100%) rename priv/static/static/js/emoji-annotations/{zh_Hant_HK-json.7eee03c705347a21c612.js => zh_Hant_HK-json.3eeb1788264aaa9730cb.js} (100%) rename priv/static/static/js/emoji-annotations/{zu-json.e0cb7cd3890583fd0f6d.js => zu-json.0c4786052604b3d521bc.js} (100%) rename priv/static/static/js/{emoji.33eab91b64f59431137d.js => emoji.56150ad938e521d9ef81.js} (100%) rename priv/static/static/js/i18n/{ar-json.4916f840147303aa65fe.js => ar-json.bb22e819fa0ea9299fa4.js} (99%) rename priv/static/static/js/i18n/{ar-json.4916f840147303aa65fe.js.map => ar-json.bb22e819fa0ea9299fa4.js.map} (99%) rename priv/static/static/js/i18n/{ca-json.1eb24bc001efa3c0627f.js => ca-json.f245d3f221094411dfcd.js} (99%) rename priv/static/static/js/i18n/{ca-json.1eb24bc001efa3c0627f.js.map => ca-json.f245d3f221094411dfcd.js.map} (99%) delete mode 100644 priv/static/static/js/i18n/cs-json.5eedbe9f7084c349fbe8.js delete mode 100644 priv/static/static/js/i18n/cs-json.5eedbe9f7084c349fbe8.js.map create mode 100644 priv/static/static/js/i18n/cs-json.8cb69392de1a430e9c3f.js create mode 100644 priv/static/static/js/i18n/cs-json.8cb69392de1a430e9c3f.js.map rename priv/static/static/js/i18n/{de-json.bfa48615ac92f87ff37a.js => de-json.74b1f546c884d17b819a.js} (99%) rename priv/static/static/js/i18n/{de-json.bfa48615ac92f87ff37a.js.map => de-json.74b1f546c884d17b819a.js.map} (99%) create mode 100644 priv/static/static/js/i18n/eo-json.1d790624b6ea3832617a.js create mode 100644 priv/static/static/js/i18n/eo-json.1d790624b6ea3832617a.js.map delete mode 100644 priv/static/static/js/i18n/eo-json.6c62eef99e850912498b.js delete mode 100644 priv/static/static/js/i18n/eo-json.6c62eef99e850912498b.js.map rename priv/static/static/js/i18n/{es-json.4a302899a65e1f67d8a2.js => es-json.16c8ca99bc2dee099ca0.js} (99%) rename priv/static/static/js/i18n/{es-json.4a302899a65e1f67d8a2.js.map => es-json.16c8ca99bc2dee099ca0.js.map} (99%) rename priv/static/static/js/i18n/{et-json.580b101d6bb83a8aee75.js => et-json.e6066512bb8a65a06f89.js} (99%) rename priv/static/static/js/i18n/{et-json.580b101d6bb83a8aee75.js.map => et-json.e6066512bb8a65a06f89.js.map} (99%) rename priv/static/static/js/i18n/{eu-json.d2eab39b0427995fc314.js => eu-json.e519f9e06eed5ad3cf41.js} (99%) rename priv/static/static/js/i18n/{eu-json.d2eab39b0427995fc314.js.map => eu-json.e519f9e06eed5ad3cf41.js.map} (99%) rename priv/static/static/js/i18n/{fa-json.a19100f6a5a9431e2adb.js => fa-json.95757c7acb6dff777d7d.js} (99%) rename priv/static/static/js/i18n/{fa-json.a19100f6a5a9431e2adb.js.map => fa-json.95757c7acb6dff777d7d.js.map} (99%) rename priv/static/static/js/i18n/{fi-json.d1934c18f12d80493ab1.js => fi-json.dcde7d5d3f4927b6667e.js} (99%) rename priv/static/static/js/i18n/{fi-json.d1934c18f12d80493ab1.js.map => fi-json.dcde7d5d3f4927b6667e.js.map} (99%) delete mode 100644 priv/static/static/js/i18n/fr-json.36ef21ccb1203d3e65ae.js delete mode 100644 priv/static/static/js/i18n/fr-json.36ef21ccb1203d3e65ae.js.map create mode 100644 priv/static/static/js/i18n/fr-json.7a64af58316da6ca86f0.js create mode 100644 priv/static/static/js/i18n/fr-json.7a64af58316da6ca86f0.js.map rename priv/static/static/js/i18n/{ga-json.3f1981817977a16f1d7e.js => ga-json.72cfdbaab827e141e497.js} (99%) rename priv/static/static/js/i18n/{ga-json.3f1981817977a16f1d7e.js.map => ga-json.72cfdbaab827e141e497.js.map} (99%) rename priv/static/static/js/i18n/{he-json.03c5d271a4034de06e6f.js => he-json.25ae71e0ad9cdd21d447.js} (99%) rename priv/static/static/js/i18n/{he-json.03c5d271a4034de06e6f.js.map => he-json.25ae71e0ad9cdd21d447.js.map} (99%) rename priv/static/static/js/i18n/{hu-json.0487899ca7a7a8505ed8.js => hu-json.cc3c026f0ff445ebb4b6.js} (98%) rename priv/static/static/js/i18n/{hu-json.0487899ca7a7a8505ed8.js.map => hu-json.cc3c026f0ff445ebb4b6.js.map} (98%) rename priv/static/static/js/i18n/{id-json.e5c9ee768155f88128b9.js => id-json.b00a413b6132632523e5.js} (99%) rename priv/static/static/js/i18n/{id-json.e5c9ee768155f88128b9.js.map => id-json.b00a413b6132632523e5.js.map} (99%) rename priv/static/static/js/i18n/{it-json.99a21d5c98376af17141.js => it-json.1b71f7623efed055d62b.js} (99%) rename priv/static/static/js/i18n/{it-json.99a21d5c98376af17141.js.map => it-json.1b71f7623efed055d62b.js.map} (99%) delete mode 100644 priv/static/static/js/i18n/ja_easy-json.1d5ea7e755b066ac2cdd.js delete mode 100644 priv/static/static/js/i18n/ja_easy-json.1d5ea7e755b066ac2cdd.js.map create mode 100644 priv/static/static/js/i18n/ja_easy-json.b5f269a0a935c640f3b5.js create mode 100644 priv/static/static/js/i18n/ja_easy-json.b5f269a0a935c640f3b5.js.map create mode 100644 priv/static/static/js/i18n/ja_pedantic-json.7c472bf001679929edea.js create mode 100644 priv/static/static/js/i18n/ja_pedantic-json.7c472bf001679929edea.js.map delete mode 100644 priv/static/static/js/i18n/ja_pedantic-json.b52fa70f0bf89ae01cfb.js delete mode 100644 priv/static/static/js/i18n/ja_pedantic-json.b52fa70f0bf89ae01cfb.js.map create mode 100644 priv/static/static/js/i18n/ko-json.51d23959bb9bae4f0ecf.js create mode 100644 priv/static/static/js/i18n/ko-json.51d23959bb9bae4f0ecf.js.map delete mode 100644 priv/static/static/js/i18n/ko-json.9029d09084bb22d8b705.js delete mode 100644 priv/static/static/js/i18n/ko-json.9029d09084bb22d8b705.js.map delete mode 100644 priv/static/static/js/i18n/nan-TW-json.7f2789d8a461e86d1734.js delete mode 100644 priv/static/static/js/i18n/nan-TW-json.7f2789d8a461e86d1734.js.map create mode 100644 priv/static/static/js/i18n/nan-TW-json.80c0071ebf383eea3b8f.js create mode 100644 priv/static/static/js/i18n/nan-TW-json.80c0071ebf383eea3b8f.js.map rename priv/static/static/js/i18n/{nb-json.a54af3b1f47d576ad4aa.js => nb-json.2dd01f0c6cca8f008ffd.js} (99%) rename priv/static/static/js/i18n/{nb-json.a54af3b1f47d576ad4aa.js.map => nb-json.2dd01f0c6cca8f008ffd.js.map} (99%) rename priv/static/static/js/i18n/{nl-json.3fb9758b10c29434b613.js => nl-json.2fe76cb30e2fced8d88a.js} (99%) rename priv/static/static/js/i18n/{nl-json.3fb9758b10c29434b613.js.map => nl-json.2fe76cb30e2fced8d88a.js.map} (99%) rename priv/static/static/js/i18n/{oc-json.4f52bf1b6e3213acc33c.js => oc-json.7ebe52b8d626dbf54a5f.js} (99%) rename priv/static/static/js/i18n/{oc-json.4f52bf1b6e3213acc33c.js.map => oc-json.7ebe52b8d626dbf54a5f.js.map} (99%) rename priv/static/static/js/i18n/{pl-json.c963247822381b05579b.js => pl-json.d319c737d904c64d8eba.js} (99%) rename priv/static/static/js/i18n/{pl-json.c963247822381b05579b.js.map => pl-json.d319c737d904c64d8eba.js.map} (99%) delete mode 100644 priv/static/static/js/i18n/pt-json.3fc5593e030268bcd291.js delete mode 100644 priv/static/static/js/i18n/pt-json.3fc5593e030268bcd291.js.map create mode 100644 priv/static/static/js/i18n/pt-json.d6ce04e3e4e5a0e908bf.js create mode 100644 priv/static/static/js/i18n/pt-json.d6ce04e3e4e5a0e908bf.js.map rename priv/static/static/js/i18n/{ro-json.3fd9977ed1c1413059ae.js => ro-json.3c4274351d849d5010b8.js} (98%) rename priv/static/static/js/i18n/{ro-json.3fd9977ed1c1413059ae.js.map => ro-json.3c4274351d849d5010b8.js.map} (98%) rename priv/static/static/js/i18n/{ru-json.b913eb7f7e9f0c642438.js => ru-json.1aaf6c712db167fede4d.js} (99%) rename priv/static/static/js/i18n/{ru-json.b913eb7f7e9f0c642438.js.map => ru-json.1aaf6c712db167fede4d.js.map} (99%) rename priv/static/static/js/i18n/{sk-json.d8d0eba80f94e6f55145.js => sk-json.47d5a2f34c7fdf53d2af.js} (99%) rename priv/static/static/js/i18n/{sk-json.d8d0eba80f94e6f55145.js.map => sk-json.47d5a2f34c7fdf53d2af.js.map} (99%) rename priv/static/static/js/i18n/{te-json.ce6db28261b2f824064f.js => te-json.cb97beb999533eaae9ae.js} (99%) rename priv/static/static/js/i18n/{te-json.ce6db28261b2f824064f.js.map => te-json.cb97beb999533eaae9ae.js.map} (99%) delete mode 100644 priv/static/static/js/i18n/uk-json.003908af9b15becdd382.js delete mode 100644 priv/static/static/js/i18n/uk-json.003908af9b15becdd382.js.map create mode 100644 priv/static/static/js/i18n/uk-json.b16cc51984a2c6585d41.js create mode 100644 priv/static/static/js/i18n/uk-json.b16cc51984a2c6585d41.js.map rename priv/static/static/js/i18n/{vi-json.703c1e731be6e857bbf3.js => vi-json.07aaea2428bb6b5a5fab.js} (99%) rename priv/static/static/js/i18n/{vi-json.703c1e731be6e857bbf3.js.map => vi-json.07aaea2428bb6b5a5fab.js.map} (99%) create mode 100644 priv/static/static/js/i18n/zh-json.5b36950c3b87c209730d.js create mode 100644 priv/static/static/js/i18n/zh-json.5b36950c3b87c209730d.js.map delete mode 100644 priv/static/static/js/i18n/zh-json.a0a26f6d62ddbe0b49cc.js delete mode 100644 priv/static/static/js/i18n/zh-json.a0a26f6d62ddbe0b49cc.js.map rename priv/static/static/js/i18n/{zh_Hant-json.f7e1d0f4b873c60d6396.js => zh_Hant-json.6b45d2e6967b35e56b44.js} (99%) rename priv/static/static/js/i18n/{zh_Hant-json.f7e1d0f4b873c60d6396.js.map => zh_Hant-json.6b45d2e6967b35e56b44.js.map} (99%) diff --git a/priv/static/index.html b/priv/static/index.html index 760a70fbe..eabc3ccf7 100644 --- a/priv/static/index.html +++ b/priv/static/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/priv/static/static/css/159.1d523a00378ebd68c5b3.css.map b/priv/static/static/css/159.1d523a00378ebd68c5b3.css.map deleted file mode 100644 index cb7151a69..000000000 --- a/priv/static/static/css/159.1d523a00378ebd68c5b3.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/css/159.1d523a00378ebd68c5b3.css","mappings":"AAGA,gBACE,WAEA,0BACE,iBAEA,kDACE,aACA,eACA,cAEA,2DACE,aACA,cAGA,YAFA,WACA,UACA,CAEA,+DACE,YAEA,qEACE","sources":["webpack://pleroma_fe/./src/components/sticker_picker/sticker_picker.vue"],"sourcesContent":["\n@import \"../../variables\";\n\n.sticker-picker {\n width: 100%;\n\n .contents {\n min-height: 250px;\n\n .sticker-picker-content {\n display: flex;\n flex-wrap: wrap;\n padding: 0 4px;\n\n .sticker {\n display: flex;\n flex: 1 1 auto;\n margin: 4px;\n width: 56px;\n height: 56px;\n\n img {\n height: 100%;\n\n &:hover {\n filter: drop-shadow(0 0 5px var(--accent, $fallback--link));\n }\n }\n }\n }\n }\n}\n\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/159.1d523a00378ebd68c5b3.css b/priv/static/static/css/1597.a250eca8cf87418c7b3e.css similarity index 84% rename from priv/static/static/css/159.1d523a00378ebd68c5b3.css rename to priv/static/static/css/1597.a250eca8cf87418c7b3e.css index 146838cff..e3b3fb414 100644 --- a/priv/static/static/css/159.1d523a00378ebd68c5b3.css +++ b/priv/static/static/css/1597.a250eca8cf87418c7b3e.css @@ -1,2 +1,2 @@ -.sticker-picker{width:100%}.sticker-picker .contents{min-height:250px}.sticker-picker .contents .sticker-picker-content{display:flex;flex-wrap:wrap;padding:0 4px}.sticker-picker .contents .sticker-picker-content .sticker{display:flex;flex:1 1 auto;height:56px;margin:4px;width:56px}.sticker-picker .contents .sticker-picker-content .sticker img{height:100%}.sticker-picker .contents .sticker-picker-content .sticker img:hover{filter:drop-shadow(0 0 5px var(--accent,#d8a070))} -/*# sourceMappingURL=159.1d523a00378ebd68c5b3.css.map*/ \ No newline at end of file +.sticker-picker{width:100%}.sticker-picker .contents{min-height:250px}.sticker-picker .contents .sticker-picker-content{display:flex;flex-wrap:wrap;padding:0 4px}.sticker-picker .contents .sticker-picker-content .sticker{display:flex;flex:1 1 auto;height:56px;margin:4px;width:56px}.sticker-picker .contents .sticker-picker-content .sticker img{height:100%}.sticker-picker .contents .sticker-picker-content .sticker img:hover{filter:drop-shadow(0 0 5px var(--accent))} +/*# sourceMappingURL=1597.a250eca8cf87418c7b3e.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/1597.a250eca8cf87418c7b3e.css.map b/priv/static/static/css/1597.a250eca8cf87418c7b3e.css.map new file mode 100644 index 000000000..697b3f4a4 --- /dev/null +++ b/priv/static/static/css/1597.a250eca8cf87418c7b3e.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/1597.a250eca8cf87418c7b3e.css","mappings":"AACA,gBACE,WAEA,0BACE,iBAEA,kDACE,aACA,eACA,cAEA,2DACE,aACA,cAGA,YAFA,WACA,UACA,CAEA,+DACE,YAEA,qEACE","sources":["webpack://pleroma_fe/./src/components/sticker_picker/sticker_picker.vue"],"sourcesContent":["\n.sticker-picker {\n width: 100%;\n\n .contents {\n min-height: 250px;\n\n .sticker-picker-content {\n display: flex;\n flex-wrap: wrap;\n padding: 0 4px;\n\n .sticker {\n display: flex;\n flex: 1 1 auto;\n margin: 4px;\n width: 56px;\n height: 56px;\n\n img {\n height: 100%;\n\n &:hover {\n filter: drop-shadow(0 0 5px var(--accent));\n }\n }\n }\n }\n }\n}\n\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/5250.b9104f3df4166526b081.css b/priv/static/static/css/5250.b9104f3df4166526b081.css new file mode 100644 index 000000000..e15ceebd6 --- /dev/null +++ b/priv/static/static/css/5250.b9104f3df4166526b081.css @@ -0,0 +1,2 @@ +.ModifiedIndicator{display:inline-block;position:relative}.modified-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.ProfileSettingIndicator{display:inline-block;position:relative}.profilesetting-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.DraftButtons{display:inline-block;position:relative}.DraftButtons .button-default{margin-left:.5em}.draft-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.AttachmentSetting .attachment{display:block;height:15em;margin-bottom:.5em;width:100%}.AttachmentSetting .attachment-input{display:flex;flex-direction:column;margin-left:1em;width:20em}.AttachmentSetting.-compact .attachment-input{align-items:flex-end;flex-direction:row}.AttachmentSetting.-compact .attachment{align-self:center;display:block;flex:0;height:4em;margin-bottom:0;min-width:4em;order:0}.AttachmentSetting.-compact .control-field{margin-left:.5em;min-width:12em;order:1}.AttachmentSetting.-compact .control-upload{min-width:12em;order:2;padding:0 .5em}.AttachmentSetting .controls{margin-bottom:.5em}.AttachmentSetting .controls button,.AttachmentSetting .controls input{width:100%}.frontends-tab .cards-list{padding:0}.frontends-tab .relative{position:relative}.frontends-tab .overlay{background:var(--bg);bottom:0;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:2}.frontends-tab dd{word-wrap:nowrap;max-width:10em;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.emoji-tab-edit-popover{padding-bottom:.5em;padding-left:.5em;padding-right:.5em}.emoji-tab-edit-popover .emoji{height:32px;width:32px}.emoji-tab .btn-group .btn:not(:first-child){margin-left:.5em}.emoji-tab .pack-info-wrapper{margin-top:1em}.emoji-tab .emoji-info-input{width:100%}.emoji-tab .emoji-data-input{margin-left:.5em;margin-right:.5em;width:40%}.emoji-tab .emoji{height:32px;width:32px}.emoji-tab .emoji-unsaved{box-shadow:0 3px 5px var(--cBlue)}.emoji-tab .emoji-list{display:flex;flex-wrap:wrap;gap:1em 1em}.emoji-tab-popover-button:not(:first-child){margin-left:.5em}.emoji-tab-popover-input{margin-bottom:.5em}.emoji-tab-popover-input label{display:block;margin-bottom:.5em}.emoji-tab-popover-input input{width:20em}.emoji-tab-popover-input .emoji-tab-popover-file{padding-top:3px}.emoji-tab-popover-input .warning{color:var(--cOrange)}.settings_tab-switcher{height:100%}.settings_tab-switcher .setting-item{border-bottom:2px solid var(--border);margin:1em 1em 1.4em;padding-bottom:1.4em}.settings_tab-switcher .setting-item>div,.settings_tab-switcher .setting-item>label{display:block;margin-bottom:.5em}.settings_tab-switcher .setting-item>div:last-child,.settings_tab-switcher .setting-item>label:last-child{margin-bottom:0}.settings_tab-switcher .setting-item .select-multiple{display:flex}.settings_tab-switcher .setting-item .select-multiple .option-list{margin:0;padding-left:.5em}.settings_tab-switcher .setting-item:last-child{border-bottom:none;margin-bottom:1em;padding-bottom:0}.settings_tab-switcher .setting-item textarea{height:100px;max-width:100%;width:100%}.settings_tab-switcher .setting-item .unavailable,.settings_tab-switcher .setting-item .unavailable svg{color:var(--cRed)} +/*# sourceMappingURL=5250.b9104f3df4166526b081.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/5250.b9104f3df4166526b081.css.map b/priv/static/static/css/5250.b9104f3df4166526b081.css.map new file mode 100644 index 000000000..b6acca608 --- /dev/null +++ b/priv/static/static/css/5250.b9104f3df4166526b081.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/5250.b9104f3df4166526b081.css","mappings":"AACA,mBACE,qBACA,kBAGF,kBACE,gBACA,eACA,kBCRF,yBACE,qBACA,kBAGF,wBACE,gBACA,eACA,kBCRF,cACE,qBACA,kBAEA,8BACE,iBAIJ,eACE,gBACA,eACA,kBCXA,+BACE,cAEA,YACA,mBAFA,UAEA,CAGF,qCAEE,aACA,sBAFA,gBAGA,WAIA,8CAEE,qBADA,kBACA,CAGF,wCAME,kBAHA,cAFA,OAIA,WAEA,eAAc,CAHd,cAFA,OAKA,CAGF,2CAGE,iBADA,eADA,OAEA,CAGF,4CAEE,eADA,QAEA,eAIJ,6BACE,mBAEA,uEAEE,WCjDJ,2BACE,UAGF,yBACE,kBAGF,wBAEE,qBAKA,SACA,OAHA,WAJA,kBAQA,OAAM,CAHN,MAFA,SAKA,CAGF,kBAEE,iBAGA,eADA,kBAHA,uBAEA,kBAEA,CCzBF,wBAGE,oBAFA,kBACA,kBACA,CAEA,+BAEE,YADA,UACA,CCPJ,6CACE,iBAGF,8BACE,eAGF,6BACE,WAGF,6BAEE,iBACA,kBAFA,SAEA,CAGF,kBAEE,YADA,UACA,CAGF,0BACE,kCAGF,uBACE,aACA,eACA,YAIJ,4CACE,iBAGF,yBACE,mBAEA,+BACE,cACA,mBAGF,+BACE,WAGF,iDACE,gBAGF,kCACE,qBCxDJ,uBACE,YAEA,qCACE,sCACA,qBACA,qBAEA,oFAEE,cACA,mBAEA,0GACE,gBAIJ,sDACE,aAEA,mEACE,SACA,kBAIJ,gDACE,mBAEA,kBADA,gBACA,CAGF,8CAGE,aADA,eADA,UAEA,CAGF,wGAEE","sources":["webpack://pleroma_fe/./src/components/settings_modal/helpers/modified_indicator.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/profile_setting_indicator.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/draft_buttons.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/attachment_setting.vue","webpack://pleroma_fe/./src/components/settings_modal/admin_tabs/frontends_tab.scss","webpack://pleroma_fe/./src/components/settings_modal/helpers/emoji_editing_popover.vue","webpack://pleroma_fe/./src/components/settings_modal/admin_tabs/emoji_tab.scss","webpack://pleroma_fe/./src/components/settings_modal/settings_modal_admin_content.scss"],"sourcesContent":["\n.ModifiedIndicator {\n display: inline-block;\n position: relative;\n}\n\n.modified-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.ProfileSettingIndicator {\n display: inline-block;\n position: relative;\n}\n\n.profilesetting-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.DraftButtons {\n display: inline-block;\n position: relative;\n\n .button-default {\n margin-left: 0.5em;\n }\n}\n\n.draft-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.AttachmentSetting {\n .attachment {\n display: block;\n width: 100%;\n height: 15em;\n margin-bottom: 0.5em;\n }\n\n .attachment-input {\n margin-left: 1em;\n display: flex;\n flex-direction: column;\n width: 20em;\n }\n\n &.-compact {\n .attachment-input {\n flex-direction: row;\n align-items: flex-end;\n }\n\n .attachment {\n flex: 0;\n order: 0;\n display: block;\n min-width: 4em;\n height: 4em;\n align-self: center;\n margin-bottom: 0;\n }\n\n .control-field {\n order: 1;\n min-width: 12em;\n margin-left: 0.5em;\n }\n\n .control-upload {\n order: 2;\n min-width: 12em;\n padding: 0 0.5em;\n }\n }\n\n .controls {\n margin-bottom: 0.5em;\n\n input,\n button {\n width: 100%;\n }\n }\n}\n",".frontends-tab {\n .cards-list {\n padding: 0;\n }\n\n .relative {\n position: relative;\n }\n\n .overlay {\n position: absolute;\n background: var(--bg);\n // fix buttons showing through\n z-index: 2;\n opacity: 0.9;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n\n dd {\n text-overflow: ellipsis;\n word-wrap: nowrap;\n white-space: nowrap;\n overflow-x: hidden;\n max-width: 10em;\n }\n}\n","\n .emoji-tab-edit-popover {\n padding-left: 0.5em;\n padding-right: 0.5em;\n padding-bottom: 0.5em;\n\n .emoji {\n width: 32px;\n height: 32px;\n }\n }\n",".emoji-tab {\n .btn-group .btn:not(:first-child) {\n margin-left: 0.5em;\n }\n\n .pack-info-wrapper {\n margin-top: 1em;\n }\n\n .emoji-info-input {\n width: 100%;\n }\n\n .emoji-data-input {\n width: 40%;\n margin-left: 0.5em;\n margin-right: 0.5em;\n }\n\n .emoji {\n width: 32px;\n height: 32px;\n }\n\n .emoji-unsaved {\n box-shadow: 0 3px 5px var(--cBlue);\n }\n\n .emoji-list {\n display: flex;\n flex-wrap: wrap;\n gap: 1em 1em;\n }\n}\n\n.emoji-tab-popover-button:not(:first-child) {\n margin-left: 0.5em;\n}\n\n.emoji-tab-popover-input {\n margin-bottom: 0.5em;\n\n label {\n display: block;\n margin-bottom: 0.5em;\n }\n\n input {\n width: 20em;\n }\n\n .emoji-tab-popover-file {\n padding-top: 3px;\n }\n\n .warning {\n color: var(--cOrange);\n }\n}\n",".settings_tab-switcher {\n height: 100%;\n\n .setting-item {\n border-bottom: 2px solid var(--border);\n margin: 1em 1em 1.4em;\n padding-bottom: 1.4em;\n\n > div,\n > label {\n display: block;\n margin-bottom: 0.5em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .select-multiple {\n display: flex;\n\n .option-list {\n margin: 0;\n padding-left: 0.5em;\n }\n }\n\n &:last-child {\n border-bottom: none;\n padding-bottom: 0;\n margin-bottom: 1em;\n }\n\n textarea {\n width: 100%;\n max-width: 100%;\n height: 100px;\n }\n\n .unavailable,\n .unavailable svg {\n color: var(--cRed);\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/5292.035030cbb2311a7ddada.css b/priv/static/static/css/5292.035030cbb2311a7ddada.css new file mode 100644 index 000000000..c50997d65 --- /dev/null +++ b/priv/static/static/css/5292.035030cbb2311a7ddada.css @@ -0,0 +1,11 @@ +.importer-uploading{font-size:1.5em;margin:.25em}.exporter-processing{margin:.25em}.autosuggest{position:relative}.autosuggest-input{display:block;width:100%}.autosuggest-results{background-color:var(--bg);border-color:var(--border);border-radius:var(--roundness);border-style:solid;border-top-left-radius:0;border-top-right-radius:0;border-width:1px;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--shadow);left:0;max-height:400px;overflow-y:auto;position:absolute;right:0;top:100%;z-index:1}.block-card-content-container{margin-top:.5em;text-align:right}.block-card-content-container button{width:10em}.mute-card-content-container{margin-top:.5em;text-align:right}.mute-card-content-container button{width:10em}.domain-mute-card{align-items:center;display:flex;flex:1 0;justify-content:space-between;padding:.6em 1em .6em 0}.domain-mute-card-domain{margin-right:1em;overflow:hidden;text-overflow:ellipsis}.domain-mute-card button{width:10em}.autosuggest-results .domain-mute-card{padding-left:1em}.selectable-list{--__line-height:1.5em;--__horizontal-gap:0.75em;--__vertical-gap:0.5em}.selectable-list-item-inner{align-items:center;display:flex}.selectable-list-item-inner>*{min-width:0}.selectable-list-header{align-items:center;border-bottom:1px solid;border-bottom-color:var(--border);display:flex;padding:var(--__vertical-gap) var(--__horizontal-gap)}.selectable-list-header-actions{flex:1}.selectable-list-checkbox-wrapper{flex:none;padding-right:var(--__horizontal-gap)}.with-subscription-loading{padding:10px;text-align:center}.with-subscription-loading .error{font-size:1rem}.mutes-and-blocks-tab{height:100%}.mutes-and-blocks-tab .usersearch-wrapper{padding:1em}.mutes-and-blocks-tab .bulk-actions{min-height:2em;padding:0 1em;text-align:right}.mutes-and-blocks-tab .bulk-action-button{width:10em}.mutes-and-blocks-tab .domain-mute-form{display:flex;flex-direction:column;padding:1em}.mutes-and-blocks-tab .domain-mute-button{align-self:flex-end;margin-top:1em;width:10em}.ModifiedIndicator{display:inline-block;position:relative}.modified-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.ProfileSettingIndicator{display:inline-block;position:relative}.profilesetting-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.DraftButtons{display:inline-block;position:relative}.DraftButtons .button-default{margin-left:.5em}.draft-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.UnitSetting .number-input{max-width:6.5em;text-align:right}.UnitSetting .unit-input,.UnitSetting .unit-input select{min-width:4em;width:auto}.mfa-backup-codes .warning{color:var(--cOrange)}.mfa-backup-codes .backup-codes{font-family:var(--monoFont)}.mfa-settings .method-item,.mfa-settings .mfa-heading{align-items:baseline;display:flex;flex-wrap:wrap;justify-content:space-between}.mfa-settings .warning{color:var(--cOrange)}.mfa-settings .setup-otp{display:flex;flex-wrap:wrap;justify-content:center}.mfa-settings .setup-otp .qr-code{flex:1;padding-right:10px}.mfa-settings .setup-otp .verify{flex:1}.mfa-settings .setup-otp .error{margin:4px 0 0}.mfa-settings .setup-otp .confirm-otp-actions button{margin-top:5px;width:15em} +/*! + * Cropper.js v1.5.13 + * https://fengyuanchen.github.io/cropperjs + * + * Copyright 2015-present Chen Fengyuan + * Released under the MIT license + * + * Date: 2022-11-20T05:30:43.444Z + */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.image-cropper-img-input{display:none}.image-cropper-image-container{position:relative}.image-cropper-image-container img{display:block;max-width:100%}.image-cropper-buttons-wrapper{margin-top:10px}.image-cropper-buttons-wrapper button{margin-top:5px}.profile-tab .bio{margin:0}.profile-tab .visibility-tray{padding-top:5px}.profile-tab input[type=file]{height:auto;padding:5px}.profile-tab .banner-background-preview{max-width:100%;position:relative;width:300px}.profile-tab .banner-background-preview img{width:100%}.profile-tab .uploading{font-size:1.5em;margin:.25em}.profile-tab .name-changer{width:100%}.profile-tab .current-avatar-container{height:150px;position:relative;width:150px}.profile-tab .current-avatar{border-radius:var(--roundness);display:block;height:100%;width:100%}.profile-tab .reset-button{background-color:rgba(0,0,0,.6);border-radius:var(--roundness);cursor:pointer;font-size:1.5em;height:1.5em;line-height:1.5em;opacity:.7;position:absolute;right:.2em;text-align:center;top:.2em;width:1.5em}.profile-tab .reset-button:hover{opacity:1}.profile-tab .reset-button svg{color:#fff}.profile-tab .oauth-tokens{width:100%}.profile-tab .oauth-tokens th{text-align:left}.profile-tab .oauth-tokens .actions{text-align:right}.profile-tab-usersearch-wrapper{padding:1em}.profile-tab-bulk-actions{min-height:2em;padding:0 1em;text-align:right}.profile-tab-bulk-actions button{width:10em}.profile-tab-domain-mute-form{display:flex;flex-direction:column;padding:1em}.profile-tab-domain-mute-form button{align-self:flex-end;margin-top:1em;width:10em}.profile-tab .setting-subitem{margin-left:1.75em}.profile-tab .profile-fields{display:flex}.profile-tab .profile-fields>.emoji-input{flex:1 1 auto;margin:0 .2em .5em;min-width:0}.profile-tab .profile-fields .delete-field{align-self:center;margin:0 .2em .5em;padding:0 .5em;width:20px}.profile-tab .birthday-input{display:block;margin-bottom:1em}.font-control .custom-font{max-width:20em;min-width:20em}.invalid-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.theme-preview-container{background-color:var(--wallpaper);background-image:var(--body-background-image);background-position:50% 50%;background-size:cover;border-bottom:1px dashed;border-top:1px dashed;border-color:var(--border);margin:1em 0;padding:1em;position:relative}.theme-preview-container .theme-preview-content{padding:20px}.theme-preview-container .dummy .post{display:flex;font-family:var(--postFont)}.theme-preview-container .dummy .post .content{flex:1}.theme-preview-container .dummy .post .content h4{margin-bottom:.25em}.theme-preview-container .dummy .post .content .icons{display:flex;margin-top:.5em}.theme-preview-container .dummy .post .content .icons i{margin-right:1em}.theme-preview-container .dummy .after-post{align-items:center;display:flex;margin-top:1em}.theme-preview-container .dummy .avatar,.theme-preview-container .dummy .avatar-alt{background:linear-gradient(135deg,#b8e1fc,#a9d2f3 10%,#90bae4 25%,#90bcea 37%,#90bff0 50%,#6ba8e5 51%,#a2daf5 83%,#bdf3fd);color:#000;font-family:sans-serif;margin-right:1em;text-align:center}.theme-preview-container .dummy .avatar-alt{flex:0 auto;font-size:12px;line-height:20px;margin-left:28px;min-height:20px;min-width:20px}.theme-preview-container .dummy .avatar{flex:0 auto;font-size:14px;height:48px;line-height:48px;width:48px}.theme-preview-container .dummy .actions{align-items:baseline;display:flex}.theme-preview-container .dummy .actions .checkbox{flex:1;margin-right:1em}.theme-preview-container .dummy .separator{border-bottom:1px solid;border-color:var(--border);margin:1em}.theme-preview-container .dummy .btn{min-width:3em}.theme-preview-container .underlay-preview{bottom:0;left:10px;position:absolute;right:10px;top:0}.appearance-tab .theme-notice{margin:1em;padding:.5em}.appearance-tab .column-settings{display:flex;flex-wrap:wrap;justify-content:space-evenly}.appearance-tab .column-settings .size-label{display:block;margin-bottom:.5em;margin-top:.5em}.appearance-tab .theme-list{border:1px solid var(--border);border-radius:var(--roundness);display:flex;flex-wrap:wrap;height:25em;list-style:none;margin:-.5em 0;overflow-x:hidden;overflow-y:auto;padding:0;scrollbar-gutter:stable}.appearance-tab .theme-list .theme-preview{align-items:center;display:flex;flex-direction:column;font-size:1rem;margin:.5em;width:19rem}.appearance-tab .theme-list .theme-preview.placeholder{opacity:.2}.appearance-tab .theme-list .theme-preview .theme-preview-container{zoom:.5;border:none;border-radius:var(--roundness);pointer-events:none;text-align:left}.color-input{display:inline-flex}.color-input-field.input{align-items:stretch;display:inline-flex;flex:0 0 0;max-width:9em;padding:.2em 8px}.color-input-field.input input{background:none;border:none;color:var(--text);margin:0;padding:0}.color-input-field.input input.textColor{flex:1 0 3em;min-width:3em;padding:0}.color-input-field.input .nativeColor{cursor:pointer;flex:0 0 auto}.color-input-field.input .nativeColor input{-webkit-appearance:none;-moz-appearance:none;appearance:none;max-height:0;max-width:0;min-width:0;opacity:0!important}.color-input-field.input .computedIndicator,.color-input-field.input .invalidIndicator,.color-input-field.input .transparentIndicator,.color-input-field.input .validIndicator{align-self:stretch;border-radius:var(--roundness);flex:0 0 2em;margin:0 .5em;min-height:1.5em;min-width:2em}.color-input-field.input .invalidIndicator{background:transparent;border:2px solid var(--cRed);box-sizing:border-box}.color-input-field.input .transparentIndicator{background-color:#f0f;position:relative}.color-input-field.input .transparentIndicator:after,.color-input-field.input .transparentIndicator:before{background-color:#000;content:"";display:block;height:50%;position:absolute;width:50%}.color-input-field.input .transparentIndicator:after{border-top-left-radius:var(--roundness);left:0;top:0}.color-input-field.input .transparentIndicator:before{border-bottom-right-radius:var(--roundness);bottom:0;right:0}.color-input .label{flex:1 1 auto}.shadow-control{display:flex;flex-wrap:wrap;justify-content:center;margin-bottom:1em}.shadow-control .shadow-preview-container,.shadow-control .shadow-tweak{margin:5px 6px 0 0}.shadow-control .shadow-preview-container{display:flex;flex:0;flex-wrap:wrap}.shadow-control .shadow-preview-container input[type=number]{min-width:2em;width:5em}.shadow-control .shadow-preview-container .x-shift-control,.shadow-control .shadow-preview-container .y-shift-control{display:flex;flex:0}.shadow-control .shadow-preview-container .x-shift-control[disabled=disabled] *,.shadow-control .shadow-preview-container .y-shift-control[disabled=disabled] *{opacity:.5}.shadow-control .shadow-preview-container .x-shift-control{align-items:flex-start}.shadow-control .shadow-preview-container .x-shift-control .wrap,.shadow-control .shadow-preview-container input[type=range]{height:2em;margin:0;width:15em}.shadow-control .shadow-preview-container .y-shift-control{align-items:flex-end;flex-direction:column}.shadow-control .shadow-preview-container .y-shift-control .wrap{height:15em;width:2em}.shadow-control .shadow-preview-container .y-shift-control input[type=range]{transform:rotate(90deg);transform-origin:1em 1em}.shadow-control .shadow-preview-container .preview-window{align-items:center;background-color:#999;background-image:linear-gradient(45deg,#666 25%,transparent 0),linear-gradient(-45deg,#666 25%,transparent 0),linear-gradient(45deg,transparent 75%,#666 0),linear-gradient(-45deg,transparent 75%,#666 0);background-position:0 0,0 10px,10px -10px,-10px 0;background-size:20px 20px;border-radius:var(--roundness);display:flex;flex:1;justify-content:center}.shadow-control .shadow-preview-container .preview-window .preview-block{border-radius:var(--roundness);height:33%;width:33%}.shadow-control .shadow-tweak{flex:1;min-width:280px}.shadow-control .shadow-tweak .id-control{align-items:stretch}.shadow-control .shadow-tweak .id-control .shadow-switcher{flex:1}.shadow-control .shadow-tweak .id-control .btn,.shadow-control .shadow-tweak .id-control .shadow-switcher{margin-right:5px;min-width:1px}.shadow-control .shadow-tweak .id-control .btn{margin:0 .1em;padding:0 .4em}.contrast-ratio{display:flex;justify-content:flex-end;margin-bottom:5px;margin-top:-4px}.contrast-ratio .label{margin-right:1em}.contrast-ratio .rating{display:inline-block;margin-left:.5em;text-align:center}.theme-tab{padding-bottom:2em}.theme-tab .deprecation-warning{margin:2em;padding:.5em}.theme-tab .preset-switcher{margin-right:1em}.theme-tab .btn{margin-left:.25em;margin-right:.25em}.theme-tab .btn-group .btn{margin:0}.theme-tab .style-control{align-items:baseline;display:flex;margin-bottom:5px}.theme-tab .style-control .label{flex:1}.theme-tab .style-control .opt{margin:.5em}.theme-tab .style-control .color-input{flex:0 0 0}.theme-tab .style-control input,.theme-tab .style-control select{flex:0;margin:0;min-width:3em}.theme-tab .style-control input[type=number],.theme-tab .style-control select[type=number]{min-width:5em}.theme-tab .style-control input[type=range],.theme-tab .style-control select[type=range]{align-self:flex-start;flex:1;min-width:3em}.theme-tab .style-control.disabled input,.theme-tab .style-control.disabled select{opacity:.5}.theme-tab .reset-container{flex-wrap:wrap}.theme-tab .apply-container,.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .radius-container,.theme-tab .reset-container{display:flex}.theme-tab .fonts-container,.theme-tab .radius-container{flex-direction:column}.theme-tab .color-container{flex-wrap:wrap;justify-content:space-between}.theme-tab .color-container>h4{width:99%}.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .presets-container,.theme-tab .radius-container,.theme-tab .shadow-container{margin:1em 1em 0}.theme-tab .tab-header{align-items:baseline;display:flex;justify-content:space-between;margin-bottom:1em;min-height:30px;width:100%}.theme-tab .tab-header p{flex:1;margin:0 .5em 0 0}.theme-tab .tab-header-buttons{display:flex;flex-direction:column}.theme-tab .tab-header-buttons .btn{flex:0 auto;margin-bottom:.5em;min-width:1px;padding:0 1em}.theme-tab .shadow-selector .override{flex:1;margin-left:.5em}.theme-tab .shadow-selector .select-container{margin-bottom:-3px;margin-top:-4px}.theme-tab .save-load,.theme-tab .save-load-options{align-items:baseline;display:flex;flex-wrap:wrap;justify-content:center}.theme-tab .save-load .import-export,.theme-tab .save-load .presets,.theme-tab .save-load-options .import-export,.theme-tab .save-load-options .presets{margin-bottom:.5em}.theme-tab .save-load .import-export,.theme-tab .save-load-options .import-export{display:flex}.theme-tab .save-load .override,.theme-tab .save-load-options .override{margin-left:.5em}.theme-tab .save-load-options{flex-wrap:wrap;justify-content:center;margin-top:.5em}.theme-tab .save-load-options .keep-option{margin:0 .5em .5em;min-width:25%}.theme-tab .radius-item{flex-basis:auto}.theme-tab .color-item,.theme-tab .radius-item{display:flex;flex:1 1 0;flex-direction:column;margin:5px 6px 0 0;min-width:20em}.theme-tab .color-item.wide,.theme-tab .radius-item.wide{min-width:60%}.theme-tab .color-item:not(.wide):nth-child(odd),.theme-tab .radius-item:not(.wide):nth-child(odd){margin-right:7px}.theme-tab .color-item .color,.theme-tab .color-item .opacity,.theme-tab .radius-item .color,.theme-tab .radius-item .opacity{align-items:baseline;display:flex}.theme-tab .theme-color-cl,.theme-tab .theme-radius-rn{align-self:stretch;background:transparent;border:0;box-shadow:none;color:var(--textFaint)}.theme-tab .theme-color-cl,.theme-tab .theme-color-in,.theme-tab .theme-radius-in{margin-left:4px}.theme-tab .theme-radius-in{flex:1;max-width:7em;min-width:1em}.theme-tab .theme-radius-lb{max-width:50em}.theme-tab .theme-warning{align-items:baseline;display:flex;margin-bottom:.5em}.theme-tab .theme-warning .buttons .btn{margin-bottom:.5em}.extra-content .apply-container{display:flex;flex-direction:row;flex-grow:1;justify-content:space-around}.extra-content .apply-container .btn{flex-grow:1;max-width:10em;min-height:2em;min-width:0;padding:0}.settings_tab-switcher{height:100%}.settings_tab-switcher .setting-item{border-bottom:2px solid var(--border);margin:1em 1em 1.4em;padding-bottom:1.4em}.settings_tab-switcher .setting-item>div,.settings_tab-switcher .setting-item>label{display:block;margin-bottom:.5em}.settings_tab-switcher .setting-item>div:last-child,.settings_tab-switcher .setting-item>label:last-child{margin-bottom:0}.settings_tab-switcher .setting-item .select-multiple{display:flex}.settings_tab-switcher .setting-item .select-multiple .option-list{margin:0;padding-left:.5em}.settings_tab-switcher .setting-item:last-child{border-bottom:none;margin-bottom:1em;padding-bottom:0}.settings_tab-switcher .setting-item textarea{height:100px;max-width:100%;width:100%}.settings_tab-switcher .setting-item .unavailable,.settings_tab-switcher .setting-item .unavailable svg{color:var(--cRed)} +/*# sourceMappingURL=5292.035030cbb2311a7ddada.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/5292.035030cbb2311a7ddada.css.map b/priv/static/static/css/5292.035030cbb2311a7ddada.css.map new file mode 100644 index 000000000..d3fca3d12 --- /dev/null +++ b/priv/static/static/css/5292.035030cbb2311a7ddada.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/5292.035030cbb2311a7ddada.css","mappings":"AAEE,oBACE,gBACA,aCFF,qBACE,aCFJ,aACE,kBAEA,mBACE,cACA,WAGF,qBAME,2BAGA,2BACA,+BAHA,mBAIA,yBACA,0BAJA,iBAKA,sCACA,yBAZA,OAGA,iBAUA,gBAdA,kBAGA,QADA,SAaA,UCxBJ,8BACE,gBACA,iBAEA,qCACE,WCLJ,6BACE,gBACA,iBAEA,oCACE,WCLJ,kBAIE,mBAFA,aADA,SAEA,8BAEA,wBAEA,yBACE,iBACA,gBACA,uBAGF,yBACE,WAGF,uCACE,iBClBJ,iBACE,qBAAsB,CACtB,yBAA0B,CAC1B,sBAAuB,CAEvB,4BAEE,mBADA,YACA,CAEA,8BACE,YAIJ,wBAEE,mBAGA,0DAJA,aAEA,qDAEA,CAEA,gCACE,OAIJ,kCAEE,UADA,qCACA,CC5BF,2BACE,aACA,kBAEA,kCACE,eCNN,sBACE,YAEA,0CACE,YAGF,oCAGE,eADA,cADA,gBAEA,CAGF,0CACE,WAGF,wCAEE,aACA,sBAFA,WAEA,CAGF,0CACE,oBACA,eACA,WCzBJ,mBACE,qBACA,kBAGF,kBACE,gBACA,eACA,kBCRF,yBACE,qBACA,kBAGF,wBACE,gBACA,eACA,kBCRF,cACE,qBACA,kBAEA,8BACE,iBAIJ,eACE,gBACA,eACA,kBCXA,2BACE,gBACA,iBAGF,yDAEE,cACA,WCRF,2BACE,qBAGF,gCACE,4BCLF,sDAKE,qBAHA,aACA,eACA,6BACA,CAGF,uBACE,qBAGF,yBACE,aAEA,eADA,sBACA,CAEA,kCACE,OACA,mBAEF,wCACA,+CAGE,qDAEE,eADA,UACA;AC7BR;;;;;;;;EAQE,CAEF,mBACE,aAAc,CACd,WAAY,CACZ,aAAc,CACd,iBAAkB,CAEd,iBAAkB,CACtB,wBAAyB,CACtB,qBAAsB,CAEjB,gBACV,CAEA,uBAEY,0BAA2B,CACnC,aAAc,CACd,WAAY,CACZ,sBAAuB,CACvB,yBAA2B,CAC3B,wBAA0B,CAC1B,sBAAwB,CACxB,qBAAuB,CACvB,UACF,CAEF,qFAKE,QAAS,CACT,MAAO,CACP,iBAAkB,CAClB,OAAQ,CACR,KACF,CAEA,kCAEE,eACF,CAEA,kBACE,qBAAsB,CACtB,SACF,CAEA,eACE,qBAAsB,CACtB,UACF,CAEA,kBACE,aAAc,CACd,WAAY,CACZ,sBAAuB,CACvB,kCAAsC,CACtC,eAAgB,CAChB,UACF,CAEA,gBACE,oBAAqB,CACrB,aAAc,CACd,UAAY,CACZ,iBACF,CAEA,yBACI,uBAAwB,CACxB,oBAAqB,CACrB,gBAAsB,CACtB,MAAO,CACP,aAAmB,CACnB,UACF,CAEF,yBACI,qBAAsB,CACtB,sBAAuB,CACvB,WAAY,CACZ,cAAoB,CACpB,KAAM,CACN,eACF,CAEF,gBACE,aAAc,CACd,QAAS,CACT,QAAS,CACT,WAAa,CACb,iBAAkB,CAClB,OAAQ,CACR,OACF,CAEA,6CAEI,qBAAsB,CACtB,WAAY,CACZ,aAAc,CACd,iBACF,CAEF,uBACI,UAAW,CACX,SAAU,CACV,KAAM,CACN,SACF,CAEF,sBACI,UAAW,CACX,MAAO,CACP,QAAS,CACT,SACF,CAEF,2CAGE,aAAc,CACd,WAAY,CACZ,UAAY,CACZ,iBAAkB,CAClB,UACF,CAEA,cACE,qBAAsB,CACtB,MAAO,CACP,KACF,CAEA,cACE,qBACF,CAEA,qBACI,gBAAiB,CACjB,UAAW,CACX,KAAM,CACN,SACF,CAEF,qBACI,gBAAiB,CACjB,UAAW,CACX,MAAO,CACP,QACF,CAEF,qBACI,gBAAiB,CACjB,SAAU,CACV,KAAM,CACN,SACF,CAEF,qBACI,WAAY,CACZ,gBAAiB,CACjB,UAAW,CACX,MACF,CAEF,eACE,qBAAsB,CACtB,UAAW,CACX,WAAa,CACb,SACF,CAEA,uBACI,gBAAiB,CACjB,eAAgB,CAChB,UAAW,CACX,OACF,CAEF,uBACI,gBAAiB,CACjB,QAAS,CACT,gBAAiB,CACjB,QACF,CAEF,uBACI,gBAAiB,CACjB,SAAU,CACV,eAAgB,CAChB,OACF,CAEF,uBACI,WAAY,CACZ,eAAgB,CAChB,QAAS,CACT,gBACF,CAEF,wBACI,kBAAmB,CACnB,UAAW,CACX,QACF,CAEF,wBACI,kBAAmB,CACnB,SAAU,CACV,QACF,CAEF,wBACI,WA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","sources":["webpack://pleroma_fe/./src/components/importer/importer.vue","webpack://pleroma_fe/./src/components/exporter/exporter.vue","webpack://pleroma_fe/./src/components/autosuggest/autosuggest.vue","webpack://pleroma_fe/./src/components/block_card/block_card.vue","webpack://pleroma_fe/./src/components/mute_card/mute_card.vue","webpack://pleroma_fe/./src/components/domain_mute_card/domain_mute_card.vue","webpack://pleroma_fe/./src/components/selectable_list/selectable_list.vue","webpack://pleroma_fe/./src/hocs/with_subscription/with_subscription.scss","webpack://pleroma_fe/./src/components/settings_modal/tabs/mutes_and_blocks_tab.scss","webpack://pleroma_fe/./src/components/settings_modal/helpers/modified_indicator.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/profile_setting_indicator.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/draft_buttons.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/unit_setting.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/security_tab/mfa.vue","webpack://pleroma_fe/./node_modules/cropperjs/dist/cropper.css","webpack://pleroma_fe/./src/components/image_cropper/image_cropper.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/profile_tab.scss","webpack://pleroma_fe/./src/components/font_control/font_control.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/theme_tab/theme_preview.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/appearance_tab.vue","webpack://pleroma_fe/./src/components/color_input/color_input.scss","webpack://pleroma_fe/./src/components/shadow_control/shadow_control.vue","webpack://pleroma_fe/./src/components/contrast_ratio/contrast_ratio.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/theme_tab/theme_tab.scss","webpack://pleroma_fe/./src/components/settings_modal/settings_modal_user_content.scss"],"sourcesContent":["\n.importer {\n &-uploading {\n font-size: 1.5em;\n margin: 0.25em;\n }\n}\n","\n.exporter {\n &-processing {\n margin: 0.25em;\n }\n}\n","\n.autosuggest {\n position: relative;\n\n &-input {\n display: block;\n width: 100%;\n }\n\n &-results {\n position: absolute;\n left: 0;\n top: 100%;\n right: 0;\n max-height: 400px;\n background-color: var(--bg);\n border-style: solid;\n border-width: 1px;\n border-color: var(--border);\n border-radius: var(--roundness);\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n box-shadow: 1px 1px 4px rgb(0 0 0 / 60%);\n box-shadow: var(--shadow);\n overflow-y: auto;\n z-index: 1;\n }\n}\n","\n.block-card-content-container {\n margin-top: 0.5em;\n text-align: right;\n\n button {\n width: 10em;\n }\n}\n","\n.mute-card-content-container {\n margin-top: 0.5em;\n text-align: right;\n\n button {\n width: 10em;\n }\n}\n","\n.domain-mute-card {\n flex: 1 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.6em 1em 0.6em 0;\n\n &-domain {\n margin-right: 1em;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n button {\n width: 10em;\n }\n\n .autosuggest-results & {\n padding-left: 1em;\n }\n}\n","\n.selectable-list {\n --__line-height: 1.5em;\n --__horizontal-gap: 0.75em;\n --__vertical-gap: 0.5em;\n\n &-item-inner {\n display: flex;\n align-items: center;\n\n > * {\n min-width: 0;\n }\n }\n\n &-header {\n display: flex;\n align-items: center;\n padding: var(--__vertical-gap) var(--__horizontal-gap);\n border-bottom: 1px solid;\n border-bottom-color: var(--border);\n\n &-actions {\n flex: 1;\n }\n }\n\n &-checkbox-wrapper {\n padding-right: var(--__horizontal-gap);\n flex: none;\n }\n}\n",".with-subscription {\n &-loading {\n padding: 10px;\n text-align: center;\n\n .error {\n font-size: 1rem;\n }\n }\n}\n",".mutes-and-blocks-tab {\n height: 100%;\n\n .usersearch-wrapper {\n padding: 1em;\n }\n\n .bulk-actions {\n text-align: right;\n padding: 0 1em;\n min-height: 2em;\n }\n\n .bulk-action-button {\n width: 10em;\n }\n\n .domain-mute-form {\n padding: 1em;\n display: flex;\n flex-direction: column;\n }\n\n .domain-mute-button {\n align-self: flex-end;\n margin-top: 1em;\n width: 10em;\n }\n}\n","\n.ModifiedIndicator {\n display: inline-block;\n position: relative;\n}\n\n.modified-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.ProfileSettingIndicator {\n display: inline-block;\n position: relative;\n}\n\n.profilesetting-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.DraftButtons {\n display: inline-block;\n position: relative;\n\n .button-default {\n margin-left: 0.5em;\n }\n}\n\n.draft-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.UnitSetting {\n .number-input {\n max-width: 6.5em;\n text-align: right;\n }\n\n .unit-input,\n .unit-input select {\n min-width: 4em;\n width: auto;\n }\n}\n\n","\n.mfa-backup-codes {\n .warning {\n color: var(--cOrange);\n }\n\n .backup-codes {\n font-family: var(--monoFont);\n }\n}\n","\n.mfa-settings {\n .mfa-heading,\n .method-item {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: baseline;\n }\n\n .warning {\n color: var(--cOrange);\n }\n\n .setup-otp {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n\n .qr-code {\n flex: 1;\n padding-right: 10px;\n }\n .verify { flex: 1; }\n .error { margin: 4px 0 0; }\n\n .confirm-otp-actions {\n button {\n width: 15em;\n margin-top: 5px;\n }\n }\n }\n}\n","/*!\n * Cropper.js v1.5.13\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2022-11-20T05:30:43.444Z\n */\n\n.cropper-container {\n direction: ltr;\n font-size: 0;\n line-height: 0;\n position: relative;\n -ms-touch-action: none;\n touch-action: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.cropper-container img {\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n display: block;\n height: 100%;\n image-orientation: 0deg;\n max-height: none !important;\n max-width: none !important;\n min-height: 0 !important;\n min-width: 0 !important;\n width: 100%;\n }\n\n.cropper-wrap-box,\n.cropper-canvas,\n.cropper-drag-box,\n.cropper-crop-box,\n.cropper-modal {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.cropper-wrap-box,\n.cropper-canvas {\n overflow: hidden;\n}\n\n.cropper-drag-box {\n background-color: #fff;\n opacity: 0;\n}\n\n.cropper-modal {\n background-color: #000;\n opacity: 0.5;\n}\n\n.cropper-view-box {\n display: block;\n height: 100%;\n outline: 1px solid #39f;\n outline-color: rgba(51, 153, 255, 75%);\n overflow: hidden;\n width: 100%;\n}\n\n.cropper-dashed {\n border: 0 dashed #eee;\n display: block;\n opacity: 0.5;\n position: absolute;\n}\n\n.cropper-dashed.dashed-h {\n border-bottom-width: 1px;\n border-top-width: 1px;\n height: calc(100% / 3);\n left: 0;\n top: calc(100% / 3);\n width: 100%;\n }\n\n.cropper-dashed.dashed-v {\n border-left-width: 1px;\n border-right-width: 1px;\n height: 100%;\n left: calc(100% / 3);\n top: 0;\n width: calc(100% / 3);\n }\n\n.cropper-center {\n display: block;\n height: 0;\n left: 50%;\n opacity: 0.75;\n position: absolute;\n top: 50%;\n width: 0;\n}\n\n.cropper-center::before,\n .cropper-center::after {\n background-color: #eee;\n content: \" \";\n display: block;\n position: absolute;\n }\n\n.cropper-center::before {\n height: 1px;\n left: -3px;\n top: 0;\n width: 7px;\n }\n\n.cropper-center::after {\n height: 7px;\n left: 0;\n top: -3px;\n width: 1px;\n }\n\n.cropper-face,\n.cropper-line,\n.cropper-point {\n display: block;\n height: 100%;\n opacity: 0.1;\n position: absolute;\n width: 100%;\n}\n\n.cropper-face {\n background-color: #fff;\n left: 0;\n top: 0;\n}\n\n.cropper-line {\n background-color: #39f;\n}\n\n.cropper-line.line-e {\n cursor: ew-resize;\n right: -3px;\n top: 0;\n width: 5px;\n }\n\n.cropper-line.line-n {\n cursor: ns-resize;\n height: 5px;\n left: 0;\n top: -3px;\n }\n\n.cropper-line.line-w {\n cursor: ew-resize;\n left: -3px;\n top: 0;\n width: 5px;\n }\n\n.cropper-line.line-s {\n bottom: -3px;\n cursor: ns-resize;\n height: 5px;\n left: 0;\n }\n\n.cropper-point {\n background-color: #39f;\n height: 5px;\n opacity: 0.75;\n width: 5px;\n}\n\n.cropper-point.point-e {\n cursor: ew-resize;\n margin-top: -3px;\n right: -3px;\n top: 50%;\n }\n\n.cropper-point.point-n {\n cursor: ns-resize;\n left: 50%;\n margin-left: -3px;\n top: -3px;\n }\n\n.cropper-point.point-w {\n cursor: ew-resize;\n left: -3px;\n margin-top: -3px;\n top: 50%;\n }\n\n.cropper-point.point-s {\n bottom: -3px;\n cursor: s-resize;\n left: 50%;\n margin-left: -3px;\n }\n\n.cropper-point.point-ne {\n cursor: nesw-resize;\n right: -3px;\n top: -3px;\n }\n\n.cropper-point.point-nw {\n cursor: nwse-resize;\n left: -3px;\n top: -3px;\n }\n\n.cropper-point.point-sw {\n bottom: -3px;\n cursor: nesw-resize;\n left: -3px;\n }\n\n.cropper-point.point-se {\n bottom: -3px;\n cursor: nwse-resize;\n height: 20px;\n opacity: 1;\n right: -3px;\n width: 20px;\n }\n\n@media (min-width: 768px) {\n\n.cropper-point.point-se {\n height: 15px;\n width: 15px;\n }\n }\n\n@media (min-width: 992px) {\n\n.cropper-point.point-se {\n height: 10px;\n width: 10px;\n }\n }\n\n@media (min-width: 1200px) {\n\n.cropper-point.point-se {\n height: 5px;\n opacity: 0.75;\n width: 5px;\n }\n }\n\n.cropper-point.point-se::before {\n background-color: #39f;\n bottom: -50%;\n content: \" \";\n display: block;\n height: 200%;\n opacity: 0;\n position: absolute;\n right: -50%;\n width: 200%;\n }\n\n.cropper-invisible {\n opacity: 0;\n}\n\n.cropper-bg {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC\");\n}\n\n.cropper-hide {\n display: block;\n height: 0;\n position: absolute;\n width: 0;\n}\n\n.cropper-hidden {\n display: none !important;\n}\n\n.cropper-move {\n cursor: move;\n}\n\n.cropper-crop {\n cursor: crosshair;\n}\n\n.cropper-disabled .cropper-drag-box,\n.cropper-disabled .cropper-face,\n.cropper-disabled .cropper-line,\n.cropper-disabled .cropper-point {\n cursor: not-allowed;\n}\n","\n.image-cropper {\n &-img-input {\n display: none;\n }\n\n &-image-container {\n position: relative;\n\n img {\n display: block;\n max-width: 100%;\n }\n }\n\n &-buttons-wrapper {\n margin-top: 10px;\n\n button {\n margin-top: 5px;\n }\n }\n}\n",".profile-tab {\n .bio {\n margin: 0;\n }\n\n .visibility-tray {\n padding-top: 5px;\n }\n\n input[type=\"file\"] {\n padding: 5px;\n height: auto;\n }\n\n .banner-background-preview {\n max-width: 100%;\n width: 300px;\n position: relative;\n\n img {\n width: 100%;\n }\n }\n\n .uploading {\n font-size: 1.5em;\n margin: 0.25em;\n }\n\n .name-changer {\n width: 100%;\n }\n\n .current-avatar-container {\n position: relative;\n width: 150px;\n height: 150px;\n }\n\n .current-avatar {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: var(--roundness);\n }\n\n .reset-button {\n position: absolute;\n top: 0.2em;\n right: 0.2em;\n border-radius: var(--roundness);\n background-color: rgb(0 0 0 / 60%);\n opacity: 0.7;\n width: 1.5em;\n height: 1.5em;\n text-align: center;\n line-height: 1.5em;\n font-size: 1.5em;\n cursor: pointer;\n\n &:hover {\n opacity: 1;\n }\n\n svg {\n color: white;\n }\n }\n\n .oauth-tokens {\n width: 100%;\n\n th {\n text-align: left;\n }\n\n .actions {\n text-align: right;\n }\n }\n\n &-usersearch-wrapper {\n padding: 1em;\n }\n\n &-bulk-actions {\n text-align: right;\n padding: 0 1em;\n min-height: 2em;\n\n button {\n width: 10em;\n }\n }\n\n &-domain-mute-form {\n padding: 1em;\n display: flex;\n flex-direction: column;\n\n button {\n align-self: flex-end;\n margin-top: 1em;\n width: 10em;\n }\n }\n\n .setting-subitem {\n margin-left: 1.75em;\n }\n\n .profile-fields {\n display: flex;\n\n & > .emoji-input {\n flex: 1 1 auto;\n margin: 0 0.2em 0.5em;\n min-width: 0;\n }\n\n .delete-field {\n width: 20px;\n align-self: center;\n margin: 0 0.2em 0.5em;\n padding: 0 0.5em;\n }\n }\n\n .birthday-input {\n display: block;\n margin-bottom: 1em;\n }\n}\n","\n.font-control {\n .custom-font {\n min-width: 20em;\n max-width: 20em;\n }\n}\n\n.invalid-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.theme-preview-container {\n position: relative;\n border-top: 1px dashed;\n border-bottom: 1px dashed;\n border-color: var(--border);\n margin: 1em 0;\n padding: 1em;\n background-color: var(--wallpaper);\n background-image: var(--body-background-image);\n background-size: cover;\n background-position: 50% 50%;\n\n .theme-preview-content {\n padding: 20px;\n }\n\n .dummy {\n .post {\n font-family: var(--postFont);\n display: flex;\n\n .content {\n flex: 1;\n\n h4 {\n margin-bottom: 0.25em;\n }\n\n .icons {\n margin-top: 0.5em;\n display: flex;\n\n i {\n margin-right: 1em;\n }\n }\n }\n }\n\n .after-post {\n margin-top: 1em;\n display: flex;\n align-items: center;\n }\n\n .avatar,\n .avatar-alt {\n background:\n linear-gradient(\n 135deg,\n #b8e1fc 0%,\n #a9d2f3 10%,\n #90bae4 25%,\n #90bcea 37%,\n #90bff0 50%,\n #6ba8e5 51%,\n #a2daf5 83%,\n #bdf3fd 100%\n );\n color: black;\n font-family: sans-serif;\n text-align: center;\n margin-right: 1em;\n }\n\n .avatar-alt {\n flex: 0 auto;\n margin-left: 28px;\n font-size: 12px;\n min-width: 20px;\n min-height: 20px;\n line-height: 20px;\n }\n\n .avatar {\n flex: 0 auto;\n width: 48px;\n height: 48px;\n font-size: 14px;\n line-height: 48px;\n }\n\n .actions {\n display: flex;\n align-items: baseline;\n\n .checkbox {\n margin-right: 1em;\n flex: 1;\n }\n }\n\n .separator {\n margin: 1em;\n border-bottom: 1px solid;\n border-color: var(--border);\n }\n\n .btn {\n min-width: 3em;\n }\n }\n\n .underlay-preview {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 10px;\n right: 10px;\n }\n}\n ","\n.appearance-tab {\n .theme-notice {\n padding: 0.5em;\n margin: 1em;\n }\n\n .column-settings {\n display: flex;\n justify-content: space-evenly;\n flex-wrap: wrap;\n }\n\n .column-settings .size-label {\n display: block;\n margin-bottom: 0.5em;\n margin-top: 0.5em;\n }\n\n .theme-list {\n list-style: none;\n display: flex;\n flex-wrap: wrap;\n margin: -0.5em 0;\n height: 25em;\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-gutter: stable;\n border-radius: var(--roundness);\n border: 1px solid var(--border);\n padding: 0;\n\n .theme-preview {\n font-size: 1rem; // fix for firefox\n width: 19rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: 0.5em;\n\n &.placeholder {\n opacity: 0.2;\n }\n\n .theme-preview-container {\n pointer-events: none;\n zoom: 0.5;\n border: none;\n border-radius: var(--roundness);\n text-align: left;\n }\n }\n }\n}\n",".color-input {\n display: inline-flex;\n\n &-field.input {\n display: inline-flex;\n flex: 0 0 0;\n max-width: 9em;\n align-items: stretch;\n padding: 0.2em 8px;\n\n input {\n color: var(--text);\n background: none;\n border: none;\n padding: 0;\n margin: 0;\n\n &.textColor {\n flex: 1 0 3em;\n min-width: 3em;\n padding: 0;\n }\n }\n\n .nativeColor {\n cursor: pointer;\n flex: 0 0 auto;\n\n input {\n appearance: none;\n max-width: 0;\n min-width: 0;\n max-height: 0;\n /* stylelint-disable-next-line declaration-no-important */\n opacity: 0 !important;\n }\n }\n\n .computedIndicator,\n .validIndicator,\n .invalidIndicator,\n .transparentIndicator {\n flex: 0 0 2em;\n margin: 0 0.5em;\n min-width: 2em;\n align-self: stretch;\n min-height: 1.5em;\n border-radius: var(--roundness);\n }\n\n .invalidIndicator {\n background: transparent;\n box-sizing: border-box;\n border: 2px solid var(--cRed);\n }\n\n .transparentIndicator {\n // forgot to install counter-strike source, ooops\n background-color: #f0f;\n position: relative;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n background-color: #000;\n position: absolute;\n height: 50%;\n width: 50%;\n }\n\n &::after {\n top: 0;\n left: 0;\n border-top-left-radius: var(--roundness);\n }\n\n &::before {\n bottom: 0;\n right: 0;\n border-bottom-right-radius: var(--roundness);\n }\n }\n }\n\n .label {\n flex: 1 1 auto;\n }\n}\n","\n.shadow-control {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n margin-bottom: 1em;\n\n .shadow-preview-container,\n .shadow-tweak {\n margin: 5px 6px 0 0;\n }\n\n .shadow-preview-container {\n flex: 0;\n display: flex;\n flex-wrap: wrap;\n\n input[type=\"number\"] {\n width: 5em;\n min-width: 2em;\n }\n\n .x-shift-control,\n .y-shift-control {\n display: flex;\n flex: 0;\n\n &[disabled=\"disabled\"] * {\n opacity: 0.5;\n }\n }\n\n .x-shift-control {\n align-items: flex-start;\n }\n\n .x-shift-control .wrap,\n input[type=\"range\"] {\n margin: 0;\n width: 15em;\n height: 2em;\n }\n\n .y-shift-control {\n flex-direction: column;\n align-items: flex-end;\n\n .wrap {\n width: 2em;\n height: 15em;\n }\n\n input[type=\"range\"] {\n transform-origin: 1em 1em;\n transform: rotate(90deg);\n }\n }\n\n .preview-window {\n flex: 1;\n background-color: #999;\n display: flex;\n align-items: center;\n justify-content: center;\n background-image:\n linear-gradient(45deg, #666 25%, transparent 25%),\n linear-gradient(-45deg, #666 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #666 75%),\n linear-gradient(-45deg, transparent 75%, #666 75%);\n background-size: 20px 20px;\n background-position: 0 0, 0 10px, 10px -10px, -10px 0;\n border-radius: var(--roundness);\n\n .preview-block {\n width: 33%;\n height: 33%;\n border-radius: var(--roundness);\n }\n }\n }\n\n .shadow-tweak {\n flex: 1;\n min-width: 280px;\n\n .id-control {\n align-items: stretch;\n\n .shadow-switcher {\n flex: 1;\n }\n\n .shadow-switcher,\n .btn {\n min-width: 1px;\n margin-right: 5px;\n }\n\n .btn {\n padding: 0 0.4em;\n margin: 0 0.1em;\n }\n }\n }\n}\n","\n.contrast-ratio {\n display: flex;\n justify-content: flex-end;\n margin-top: -4px;\n margin-bottom: 5px;\n\n .label {\n margin-right: 1em;\n }\n\n .rating {\n display: inline-block;\n text-align: center;\n margin-left: 0.5em;\n }\n}\n",".theme-tab {\n .deprecation-warning {\n padding: 0.5em;\n margin: 2em;\n }\n\n padding-bottom: 2em;\n\n .preset-switcher {\n margin-right: 1em;\n }\n\n .btn {\n margin-left: 0.25em;\n margin-right: 0.25em;\n }\n\n .btn-group .btn {\n margin: 0;\n }\n\n .style-control {\n display: flex;\n align-items: baseline;\n margin-bottom: 5px;\n\n .label {\n flex: 1;\n }\n\n .opt {\n margin: 0.5em;\n }\n\n .color-input {\n flex: 0 0 0;\n }\n\n input,\n select {\n min-width: 3em;\n margin: 0;\n flex: 0;\n\n &[type=\"number\"] {\n min-width: 5em;\n }\n\n &[type=\"range\"] {\n flex: 1;\n min-width: 3em;\n align-self: flex-start;\n }\n }\n\n &.disabled {\n input,\n select {\n opacity: 0.5;\n }\n }\n }\n\n .reset-container {\n flex-wrap: wrap;\n }\n\n .fonts-container,\n .reset-container,\n .apply-container,\n .radius-container,\n .color-container, {\n display: flex;\n }\n\n .fonts-container,\n .radius-container {\n flex-direction: column;\n }\n\n .color-container {\n > h4 {\n width: 99%;\n }\n\n flex-wrap: wrap;\n justify-content: space-between;\n }\n\n .fonts-container,\n .color-container,\n .shadow-container,\n .radius-container,\n .presets-container {\n margin: 1em 1em 0;\n }\n\n .tab-header {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n width: 100%;\n min-height: 30px;\n margin-bottom: 1em;\n\n p {\n flex: 1;\n margin: 0;\n margin-right: 0.5em;\n }\n }\n\n .tab-header-buttons {\n display: flex;\n flex-direction: column;\n\n .btn {\n min-width: 1px;\n flex: 0 auto;\n padding: 0 1em;\n margin-bottom: 0.5em;\n }\n }\n\n .shadow-selector {\n .override {\n flex: 1;\n margin-left: 0.5em;\n }\n\n .select-container {\n margin-top: -4px;\n margin-bottom: -3px;\n }\n }\n\n .save-load,\n .save-load-options {\n display: flex;\n justify-content: center;\n align-items: baseline;\n flex-wrap: wrap;\n\n .presets,\n .import-export {\n margin-bottom: 0.5em;\n }\n\n .import-export {\n display: flex;\n }\n\n .override {\n margin-left: 0.5em;\n }\n }\n\n .save-load-options {\n flex-wrap: wrap;\n margin-top: 0.5em;\n justify-content: center;\n\n .keep-option {\n margin: 0 0.5em 0.5em;\n min-width: 25%;\n }\n }\n\n .radius-item {\n flex-basis: auto;\n }\n\n .radius-item,\n .color-item {\n min-width: 20em;\n margin: 5px 6px 0 0;\n display: flex;\n flex-direction: column;\n flex: 1 1 0;\n\n &.wide {\n min-width: 60%;\n }\n\n &:not(.wide):nth-child(2n+1) {\n margin-right: 7px;\n }\n\n .color,\n .opacity {\n display: flex;\n align-items: baseline;\n }\n }\n\n .theme-radius-rn,\n .theme-color-cl {\n border: 0;\n box-shadow: none;\n background: transparent;\n color: var(--textFaint);\n align-self: stretch;\n }\n\n .theme-color-cl,\n .theme-radius-in,\n .theme-color-in {\n margin-left: 4px;\n }\n\n .theme-radius-in {\n min-width: 1em;\n max-width: 7em;\n flex: 1;\n }\n\n .theme-radius-lb {\n max-width: 50em;\n }\n\n .theme-warning {\n display: flex;\n align-items: baseline;\n margin-bottom: 0.5em;\n\n .buttons {\n .btn {\n margin-bottom: 0.5em;\n }\n }\n }\n}\n\n.extra-content {\n .apply-container {\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n flex-grow: 1;\n\n /* stylelint-disable-next-line no-descending-specificity */\n .btn {\n flex-grow: 1;\n min-height: 2em;\n min-width: 0;\n max-width: 10em;\n padding: 0;\n }\n }\n}\n",".settings_tab-switcher {\n height: 100%;\n\n .setting-item {\n border-bottom: 2px solid var(--border);\n margin: 1em 1em 1.4em;\n padding-bottom: 1.4em;\n\n > div,\n > label {\n display: block;\n margin-bottom: 0.5em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .select-multiple {\n display: flex;\n\n .option-list {\n margin: 0;\n padding-left: 0.5em;\n }\n }\n\n &:last-child {\n border-bottom: none;\n padding-bottom: 0;\n margin-bottom: 1em;\n }\n\n textarea {\n width: 100%;\n max-width: 100%;\n height: 100px;\n }\n\n .unavailable,\n .unavailable svg {\n color: var(--cRed);\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/6464.169260b661120cc50815.css b/priv/static/static/css/6464.169260b661120cc50815.css deleted file mode 100644 index 240087a1d..000000000 --- a/priv/static/static/css/6464.169260b661120cc50815.css +++ /dev/null @@ -1,2 +0,0 @@ -.UpdateNotification{overflow:hidden}.UpdateNotificationModal{--__top-fringe:15em;--__bottom-fringe:80em;--__right-fringe:8em;font-size:15px;position:relative;transition:transform;transition-duration:.5s;transition-timing-function:ease-in-out}.UpdateNotificationModal .text{max-width:40em;padding-left:1em}@media (max-width:800px){.UpdateNotificationModal{width:100vw}}@media (max-height:600px){.UpdateNotificationModal{display:none}}.UpdateNotificationModal .content{margin-bottom:calc(var(--__bottom-fringe)*-1);margin-right:calc(var(--__right-fringe)*-1);margin-top:calc(var(--__top-fringe)*-1);overflow:hidden}.UpdateNotificationModal .content.-noImage .text{padding-right:var(--__right-fringe)}.UpdateNotificationModal .panel-body{border-color:var(--border,#222);border-style:solid;border-width:0 0 1px}.UpdateNotificationModal .panel-footer{border-width:0;grid-template-columns:auto;position:relative;z-index:22}.UpdateNotificationModal .pleroma-tan{filter:drop-shadow(5px 5px 10px rgba(0,0,0,.5));float:right;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;pointer-events:none;position:relative;shape-margin:.5em;transition:position,left,right,top,bottom,max-width,max-height;transition-duration:.5s;transition-timing-function:ease-in-out;width:25em;z-index:20}.UpdateNotificationModal .spacer-top{min-height:var(--__top-fringe)}.UpdateNotificationModal .spacer-bottom{min-height:var(--__bottom-fringe)}.UpdateNotificationModal .extra-info-group{-webkit-mask:linear-gradient(0deg,#fff,transparent) bottom/100% 2px no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff,transparent) bottom/100% 2px no-repeat,linear-gradient(0deg,#fff,#fff);max-height:70vh;transition:max-height,padding,height;transition-duration:.7s;transition-timing-function:ease-in}.UpdateNotificationModal .art-credit{text-align:right}.UpdateNotificationModal.-peek{transform:translateY(calc(50vh - 50%))}.UpdateNotificationModal.-peek .pleroma-tan{float:right;shape-image-threshold:70%;z-index:10}.UpdateNotificationModal.-peek .extra-info-group{max-height:0} -/*# sourceMappingURL=6464.169260b661120cc50815.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/6464.169260b661120cc50815.css.map b/priv/static/static/css/6464.169260b661120cc50815.css.map deleted file mode 100644 index 048efb2b9..000000000 --- a/priv/static/static/css/6464.169260b661120cc50815.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/css/6464.169260b661120cc50815.css","mappings":"AAEA,oBACE,gBAGF,yBACE,mBAAoB,CACpB,sBAAuB,CACvB,oBAAqB,CAErB,eACA,kBACA,qBAEA,wBADA,sCACA,CAEA,+BACE,eACA,iBAGF,yBAhBF,yBAqBI,aAGF,0BAxBF,yBAyBI,cAGF,kCAGE,8CACA,4CAFA,wCADA,eAGA,CAGE,iDACE,oCAKN,qCAGE,gCADA,mBADA,oBAEA,CAGF,uCAGE,eACA,2BAFA,kBADA,UAGA,CAGF,sCAWE,gDAJA,YANA,qCACA,2CAUA,oBAHA,kBACA,kBAPA,+DAEA,wBADA,uCAEA,WAEA,UAIA,CAGF,qCACE,+BAGF,wCACE,kCAGF,2CAKE,6GACE,CADF,sGADA,gBAHA,qCAEA,wBADA,kCAIE,CAIJ,qCACE,iBAGF,+BAKE,uCAEA,4CACE,YAEA,0BADA,UACA,CAGF,iDACE","sources":["webpack://pleroma_fe/./src/components/update_notification/update_notification.scss"],"sourcesContent":["@import \"src/variables\";\n\n.UpdateNotification {\n overflow: hidden;\n}\n\n.UpdateNotificationModal {\n --__top-fringe: 15em; // how much pleroma-tan should stick her head above\n --__bottom-fringe: 80em; // just reserving as much as we can, number is mostly irrelevant\n --__right-fringe: 8em;\n\n font-size: 15px;\n position: relative;\n transition: transform;\n transition-timing-function: ease-in-out;\n transition-duration: 500ms;\n\n .text {\n max-width: 40em;\n padding-left: 1em;\n }\n\n @media all and (max-width: 800px) {\n /* For mobile, the modal takes 100% of the available screen.\n This ensures the minimized modal is always 50px above the browser\n bottom bar regardless of whether or not it is visible.\n */\n width: 100vw;\n }\n\n @media all and (max-height: 600px) {\n display: none;\n }\n\n .content {\n overflow: hidden;\n margin-top: calc(-1 * var(--__top-fringe));\n margin-bottom: calc(-1 * var(--__bottom-fringe));\n margin-right: calc(-1 * var(--__right-fringe));\n\n &.-noImage {\n .text {\n padding-right: var(--__right-fringe);\n }\n }\n }\n\n .panel-body {\n border-width: 0 0 1px;\n border-style: solid;\n border-color: var(--border, $fallback--border);\n }\n\n .panel-footer {\n z-index: 22;\n position: relative;\n border-width: 0;\n grid-template-columns: auto;\n }\n\n .pleroma-tan {\n object-fit: cover;\n object-position: top;\n transition: position, left, right, top, bottom, max-width, max-height;\n transition-timing-function: ease-in-out;\n transition-duration: 500ms;\n width: 25em;\n float: right;\n z-index: 20;\n position: relative;\n shape-margin: 0.5em;\n filter: drop-shadow(5px 5px 10px rgb(0 0 0 / 50%));\n pointer-events: none;\n }\n\n .spacer-top {\n min-height: var(--__top-fringe);\n }\n\n .spacer-bottom {\n min-height: var(--__bottom-fringe);\n }\n\n .extra-info-group {\n transition: max-height, padding, height;\n transition-timing-function: ease-in;\n transition-duration: 700ms;\n max-height: 70vh;\n mask:\n linear-gradient(to top, white, transparent) bottom/100% 2px no-repeat,\n linear-gradient(to top, white, white);\n }\n\n .art-credit {\n text-align: right;\n }\n\n &.-peek {\n /* Explanation:\n * 100vh - 100% = Distance between modal's top+bottom boundaries and screen\n * (100vh - 100%) / 2 = Distance between bottom (or top) boundary and screen\n */\n transform: translateY(calc(((100vh - 100%) / 2)));\n\n .pleroma-tan {\n float: right;\n z-index: 10;\n shape-image-threshold: 70%;\n }\n\n .extra-info-group {\n max-height: 0;\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/6464.7845ee2ccc5e22628b2a.css b/priv/static/static/css/6464.7845ee2ccc5e22628b2a.css new file mode 100644 index 000000000..d8dc1f944 --- /dev/null +++ b/priv/static/static/css/6464.7845ee2ccc5e22628b2a.css @@ -0,0 +1,2 @@ +.UpdateNotification{overflow:hidden}.UpdateNotificationModal{--__top-fringe:15em;--__bottom-fringe:80em;--__right-fringe:8em;font-size:15px;position:relative;transition:transform;transition-duration:.5s;transition-timing-function:ease-in-out}.UpdateNotificationModal .text{max-width:40em;padding-left:1em}@media (max-width:800px){.UpdateNotificationModal{width:100vw}}@media (max-height:600px){.UpdateNotificationModal{display:none}}.UpdateNotificationModal .content{margin-bottom:calc(var(--__bottom-fringe)*-1);margin-right:calc(var(--__right-fringe)*-1);margin-top:calc(var(--__top-fringe)*-1);overflow:hidden}.UpdateNotificationModal .content.-noImage .text{padding-right:var(--__right-fringe)}.UpdateNotificationModal .panel-body{border-color:var(--border);border-style:solid;border-width:0 0 1px}.UpdateNotificationModal .panel-footer{border-width:0;grid-template-columns:auto;position:relative;z-index:22}.UpdateNotificationModal .pleroma-tan{filter:drop-shadow(5px 5px 10px rgba(0,0,0,.5));float:right;-o-object-fit:cover;object-fit:cover;-o-object-position:top;object-position:top;pointer-events:none;position:relative;shape-margin:.5em;transition:position,left,right,top,bottom,max-width,max-height;transition-duration:.5s;transition-timing-function:ease-in-out;width:25em;z-index:20}.UpdateNotificationModal .spacer-top{min-height:var(--__top-fringe)}.UpdateNotificationModal .spacer-bottom{min-height:var(--__bottom-fringe)}.UpdateNotificationModal .extra-info-group{-webkit-mask:linear-gradient(0deg,#fff,transparent) bottom/100% 2px no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff,transparent) bottom/100% 2px no-repeat,linear-gradient(0deg,#fff,#fff);max-height:70vh;transition:max-height,padding,height;transition-duration:.7s;transition-timing-function:ease-in}.UpdateNotificationModal .art-credit{text-align:right}.UpdateNotificationModal.-peek{transform:translateY(calc(50vh - 50%))}.UpdateNotificationModal.-peek .pleroma-tan{float:right;shape-image-threshold:70%;z-index:10}.UpdateNotificationModal.-peek .extra-info-group{max-height:0} +/*# sourceMappingURL=6464.7845ee2ccc5e22628b2a.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/6464.7845ee2ccc5e22628b2a.css.map b/priv/static/static/css/6464.7845ee2ccc5e22628b2a.css.map new file mode 100644 index 000000000..90d2c8fce --- /dev/null +++ b/priv/static/static/css/6464.7845ee2ccc5e22628b2a.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/6464.7845ee2ccc5e22628b2a.css","mappings":"AAAA,oBACE,gBAGF,yBACE,mBAAoB,CACpB,sBAAuB,CACvB,oBAAqB,CAErB,eACA,kBACA,qBAEA,wBADA,sCACA,CAEA,+BACE,eACA,iBAGF,yBAhBF,yBAqBI,aAGF,0BAxBF,yBAyBI,cAGF,kCAGE,8CACA,4CAFA,wCADA,eAGA,CAGE,iDACE,oCAKN,qCAGE,2BADA,mBADA,oBAEA,CAGF,uCAGE,eACA,2BAFA,kBADA,UAGA,CAGF,sCAWE,gDAJA,YANA,qCACA,2CAUA,oBAHA,kBACA,kBAPA,+DAEA,wBADA,uCAEA,WAEA,UAIA,CAGF,qCACE,+BAGF,wCACE,kCAGF,2CAKE,6GACE,CADF,sGADA,gBAHA,qCAEA,wBADA,kCAIE,CAIJ,qCACE,iBAGF,+BAKE,uCAEA,4CACE,YAEA,0BADA,UACA,CAGF,iDACE","sources":["webpack://pleroma_fe/./src/components/update_notification/update_notification.scss"],"sourcesContent":[".UpdateNotification {\n overflow: hidden;\n}\n\n.UpdateNotificationModal {\n --__top-fringe: 15em; // how much pleroma-tan should stick her head above\n --__bottom-fringe: 80em; // just reserving as much as we can, number is mostly irrelevant\n --__right-fringe: 8em;\n\n font-size: 15px;\n position: relative;\n transition: transform;\n transition-timing-function: ease-in-out;\n transition-duration: 500ms;\n\n .text {\n max-width: 40em;\n padding-left: 1em;\n }\n\n @media all and (max-width: 800px) {\n /* For mobile, the modal takes 100% of the available screen.\n This ensures the minimized modal is always 50px above the browser\n bottom bar regardless of whether or not it is visible.\n */\n width: 100vw;\n }\n\n @media all and (max-height: 600px) {\n display: none;\n }\n\n .content {\n overflow: hidden;\n margin-top: calc(-1 * var(--__top-fringe));\n margin-bottom: calc(-1 * var(--__bottom-fringe));\n margin-right: calc(-1 * var(--__right-fringe));\n\n &.-noImage {\n .text {\n padding-right: var(--__right-fringe);\n }\n }\n }\n\n .panel-body {\n border-width: 0 0 1px;\n border-style: solid;\n border-color: var(--border);\n }\n\n .panel-footer {\n z-index: 22;\n position: relative;\n border-width: 0;\n grid-template-columns: auto;\n }\n\n .pleroma-tan {\n object-fit: cover;\n object-position: top;\n transition: position, left, right, top, bottom, max-width, max-height;\n transition-timing-function: ease-in-out;\n transition-duration: 500ms;\n width: 25em;\n float: right;\n z-index: 20;\n position: relative;\n shape-margin: 0.5em;\n filter: drop-shadow(5px 5px 10px rgb(0 0 0 / 50%));\n pointer-events: none;\n }\n\n .spacer-top {\n min-height: var(--__top-fringe);\n }\n\n .spacer-bottom {\n min-height: var(--__bottom-fringe);\n }\n\n .extra-info-group {\n transition: max-height, padding, height;\n transition-timing-function: ease-in;\n transition-duration: 700ms;\n max-height: 70vh;\n mask:\n linear-gradient(to top, white, transparent) bottom/100% 2px no-repeat,\n linear-gradient(to top, white, white);\n }\n\n .art-credit {\n text-align: right;\n }\n\n &.-peek {\n /* Explanation:\n * 100vh - 100% = Distance between modal's top+bottom boundaries and screen\n * (100vh - 100%) / 2 = Distance between bottom (or top) boundary and screen\n */\n transform: translateY(calc(((100vh - 100%) / 2)));\n\n .pleroma-tan {\n float: right;\n z-index: 10;\n shape-image-threshold: 70%;\n }\n\n .extra-info-group {\n max-height: 0;\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/7586.0d43f70bc6240422f179.css b/priv/static/static/css/7586.0d43f70bc6240422f179.css deleted file mode 100644 index 7da2aa2ea..000000000 --- a/priv/static/static/css/7586.0d43f70bc6240422f179.css +++ /dev/null @@ -1,2 +0,0 @@ -.async-component-error{align-items:center;display:flex;height:100%;justify-content:center}.async-component-error .btn{margin:.5em;padding:.5em 2em}.settings-modal{overflow:hidden}.settings-modal .option-list,.settings-modal .setting-list{list-style-type:none;padding-left:2em}.settings-modal .option-list li,.settings-modal .setting-list li{margin-bottom:.5em}.settings-modal .option-list .suboptions,.settings-modal .setting-list .suboptions{margin-top:.3em}.settings-modal .setting-description{font-size:70%;margin-bottom:2em;margin-top:.2em}.settings-modal .settings-modal-panel{height:90vh;max-width:90vw;overflow:hidden;transition:transform;transition-duration:.3s;transition-timing-function:ease-in-out;width:1000px}@media (max-width:800px){.settings-modal .settings-modal-panel{height:100%;max-width:100vw}}.settings-modal .settings-modal-panel>.panel-body{height:100%;overflow-y:hidden}.settings-modal .settings-modal-panel>.panel-body .btn{min-height:2em}.settings-modal .settings-modal-panel>.panel-body .btn:not(.dropdown-button){padding:0 2em}.settings-modal .settings-footer{display:flex;flex-wrap:wrap;line-height:2}.settings-modal .settings-footer>*{margin-right:.5em}.settings-modal .settings-footer .extra-content{display:flex;flex-grow:1}.settings-modal.peek .settings-modal-panel{transform:translateY(calc(50vh + 50% - 50px))}@media (max-width:800px){.settings-modal.peek .settings-modal-panel{transform:translateY(calc(100% - 50px))}} -/*# sourceMappingURL=7586.0d43f70bc6240422f179.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/7586.0d43f70bc6240422f179.css.map b/priv/static/static/css/7586.0d43f70bc6240422f179.css.map deleted file mode 100644 index f8f61fe6e..000000000 --- a/priv/static/static/css/7586.0d43f70bc6240422f179.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/css/7586.0d43f70bc6240422f179.css","mappings":"AACA,uBAGE,mBAFA,aACA,YAEA,uBAEA,4BACE,YACA,iBCPJ,gBACE,gBAEA,2DAEE,qBACA,iBAEA,iEACE,mBAGF,mFACE,gBAIJ,qCAGE,cADA,kBADA,eAEA,CAGF,sCAOE,YADA,eALA,gBACA,qBAEA,wBADA,uCAEA,YAEA,CAEA,yBATF,sCAWI,YADA,eACA,EAGF,kDACE,YACA,kBAEA,uDACE,eAGF,6EACE,cAKN,iCACE,aACA,eACA,cAEA,mCACE,kBAGF,gDACE,aACA,YAKF,2CASE,8CAEA,yBAXF,2CAgBI","sources":["webpack://pleroma_fe/./src/components/async_component_error/async_component_error.vue","webpack://pleroma_fe/./src/components/settings_modal/settings_modal.scss"],"sourcesContent":["\n.async-component-error {\n display: flex;\n height: 100%;\n align-items: center;\n justify-content: center;\n\n .btn {\n margin: 0.5em;\n padding: 0.5em 2em;\n }\n}\n","@import \"src/variables\";\n\n.settings-modal {\n overflow: hidden;\n\n .setting-list,\n .option-list {\n list-style-type: none;\n padding-left: 2em;\n\n li {\n margin-bottom: 0.5em;\n }\n\n .suboptions {\n margin-top: 0.3em;\n }\n }\n\n .setting-description {\n margin-top: 0.2em;\n margin-bottom: 2em;\n font-size: 70%;\n }\n\n .settings-modal-panel {\n overflow: hidden;\n transition: transform;\n transition-timing-function: ease-in-out;\n transition-duration: 300ms;\n width: 1000px;\n max-width: 90vw;\n height: 90vh;\n\n @media all and (max-width: 800px) {\n max-width: 100vw;\n height: 100%;\n }\n\n >.panel-body {\n height: 100%;\n overflow-y: hidden;\n\n .btn {\n min-height: 2em;\n }\n\n .btn:not(.dropdown-button) {\n padding: 0 2em;\n }\n }\n }\n\n .settings-footer {\n display: flex;\n flex-wrap: wrap;\n line-height: 2;\n\n >* {\n margin-right: 0.5em;\n }\n\n .extra-content {\n display: flex;\n flex-grow: 1;\n }\n }\n\n &.peek {\n .settings-modal-panel {\n /* Explanation:\n * Modal is positioned vertically centered.\n * 100vh - 100% = Distance between modal's top+bottom boundaries and screen\n * (100vh - 100%) / 2 = Distance between bottom (or top) boundary and screen\n * + 100% - we move modal completely off-screen, it's top boundary touches\n * bottom of the screen\n * - 50px - leaving tiny amount of space so that titlebar + tiny amount of modal is visible\n */\n transform: translateY(calc(((100vh - 100%) / 2 + 100%) - 50px));\n\n @media all and (max-width: 800px) {\n /* For mobile, the modal takes 100% of the available screen.\n This ensures the minimized modal is always 50px above the browser bottom\n bar regardless of whether or not it is visible.\n */\n transform: translateY(calc(100% - 50px));\n }\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/7594.a8030565c3ef463dc1de.css b/priv/static/static/css/7594.a8030565c3ef463dc1de.css new file mode 100644 index 000000000..90225e2c0 --- /dev/null +++ b/priv/static/static/css/7594.a8030565c3ef463dc1de.css @@ -0,0 +1,2 @@ +.async-component-error{align-items:center;display:flex;height:100%;justify-content:center}.async-component-error .btn{margin:.5em;padding:.5em 2em}.settings-modal{overflow:hidden}.settings-modal h4{margin-bottom:.5em}.settings-modal .option-list,.settings-modal .setting-list{list-style-type:none;padding-left:2em}.settings-modal .option-list li,.settings-modal .setting-list li{margin-bottom:.5em}.settings-modal .option-list .suboptions,.settings-modal .setting-list .suboptions{margin-top:.3em}.settings-modal .option-list.two-column,.settings-modal .setting-list.two-column{-moz-column-count:2;column-count:2}.settings-modal .option-list.two-column>li,.settings-modal .setting-list.two-column>li{-moz-column-break-inside:avoid;break-inside:avoid}.settings-modal .setting-description{font-size:70%;margin-bottom:2em;margin-top:.2em}.settings-modal .settings-modal-panel{height:90vh;max-width:90vw;overflow:hidden;transition:transform;transition-duration:.3s;transition-timing-function:ease-in-out;width:1000px}@media (max-width:800px){.settings-modal .settings-modal-panel{height:100%;max-width:100vw}}.settings-modal .settings-modal-panel>.panel-body{height:100%;overflow-y:hidden}.settings-modal .settings-modal-panel>.panel-body .btn{min-height:2em}.settings-modal .settings-modal-panel>.panel-body .btn:not(.dropdown-button){padding:0 2em}.settings-modal .settings-footer{display:flex;flex-wrap:wrap;line-height:2}.settings-modal .settings-footer>*{margin-right:.5em}.settings-modal .settings-footer .extra-content{display:flex;flex-grow:1}.settings-modal.peek .settings-modal-panel{transform:translateY(calc(50vh + 50% - 50px))}@media (max-width:800px){.settings-modal.peek .settings-modal-panel{transform:translateY(calc(100% - 50px))}} +/*# sourceMappingURL=7594.a8030565c3ef463dc1de.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/7594.a8030565c3ef463dc1de.css.map b/priv/static/static/css/7594.a8030565c3ef463dc1de.css.map new file mode 100644 index 000000000..8db316a71 --- /dev/null +++ b/priv/static/static/css/7594.a8030565c3ef463dc1de.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/7594.a8030565c3ef463dc1de.css","mappings":"AACA,uBAGE,mBAFA,aACA,YAEA,uBAEA,4BACE,YACA,iBCTJ,gBACE,gBAEA,mBACE,mBAGF,2DAEE,qBACA,iBAEA,iEACE,mBAGF,mFACE,gBAGF,iFACE,mCAEA,uFACE,kDAKN,qCAGE,cADA,kBADA,eAEA,CAGF,sCAOE,YADA,eALA,gBACA,qBAEA,wBADA,uCAEA,YAEA,CAEA,yBATF,sCAWI,YADA,eACA,EAGF,kDACE,YACA,kBAEA,uDACE,eAGF,6EACE,cAKN,iCACE,aACA,eACA,cAEA,mCACE,kBAGF,gDACE,aACA,YAKF,2CASE,8CAEA,yBAXF,2CAgBI","sources":["webpack://pleroma_fe/./src/components/async_component_error/async_component_error.vue","webpack://pleroma_fe/./src/components/settings_modal/settings_modal.scss"],"sourcesContent":["\n.async-component-error {\n display: flex;\n height: 100%;\n align-items: center;\n justify-content: center;\n\n .btn {\n margin: 0.5em;\n padding: 0.5em 2em;\n }\n}\n",".settings-modal {\n overflow: hidden;\n\n h4 {\n margin-bottom: 0.5em;\n }\n\n .setting-list,\n .option-list {\n list-style-type: none;\n padding-left: 2em;\n\n li {\n margin-bottom: 0.5em;\n }\n\n .suboptions {\n margin-top: 0.3em;\n }\n\n &.two-column {\n column-count: 2;\n\n > li {\n break-inside: avoid;\n }\n }\n }\n\n .setting-description {\n margin-top: 0.2em;\n margin-bottom: 2em;\n font-size: 70%;\n }\n\n .settings-modal-panel {\n overflow: hidden;\n transition: transform;\n transition-timing-function: ease-in-out;\n transition-duration: 300ms;\n width: 1000px;\n max-width: 90vw;\n height: 90vh;\n\n @media all and (max-width: 800px) {\n max-width: 100vw;\n height: 100%;\n }\n\n >.panel-body {\n height: 100%;\n overflow-y: hidden;\n\n .btn {\n min-height: 2em;\n }\n\n .btn:not(.dropdown-button) {\n padding: 0 2em;\n }\n }\n }\n\n .settings-footer {\n display: flex;\n flex-wrap: wrap;\n line-height: 2;\n\n >* {\n margin-right: 0.5em;\n }\n\n .extra-content {\n display: flex;\n flex-grow: 1;\n }\n }\n\n &.peek {\n .settings-modal-panel {\n /* Explanation:\n * Modal is positioned vertically centered.\n * 100vh - 100% = Distance between modal's top+bottom boundaries and screen\n * (100vh - 100%) / 2 = Distance between bottom (or top) boundary and screen\n * + 100% - we move modal completely off-screen, it's top boundary touches\n * bottom of the screen\n * - 50px - leaving tiny amount of space so that titlebar + tiny amount of modal is visible\n */\n transform: translateY(calc(((100vh - 100%) / 2 + 100%) - 50px));\n\n @media all and (max-width: 800px) {\n /* For mobile, the modal takes 100% of the available screen.\n This ensures the minimized modal is always 50px above the browser bottom\n bar regardless of whether or not it is visible.\n */\n transform: translateY(calc(100% - 50px));\n }\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/7962.76663e78ad5ea0bb0b90.css b/priv/static/static/css/7962.76663e78ad5ea0bb0b90.css deleted file mode 100644 index 2326ed932..000000000 --- a/priv/static/static/css/7962.76663e78ad5ea0bb0b90.css +++ /dev/null @@ -1,11 +0,0 @@ -.importer-uploading{font-size:1.5em;margin:.25em}.exporter-processing{margin:.25em}.autosuggest{position:relative}.autosuggest-input{display:block;width:100%}.autosuggest-results{background-color:#121a24;background-color:var(--bg,#121a24);border:1px solid #222;border-color:var(--border,#222);border-radius:4px;border-radius:var(--inputRadius,4px);border-top-left-radius:0;border-top-right-radius:0;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);left:0;max-height:400px;overflow-y:auto;position:absolute;right:0;top:100%;z-index:1}.block-card-content-container{margin-top:.5em;text-align:right}.block-card-content-container button{width:10em}.mute-card-content-container{margin-top:.5em;text-align:right}.mute-card-content-container button{width:10em}.domain-mute-card{align-items:center;display:flex;flex:1 0;justify-content:space-between;padding:.6em 1em .6em 0}.domain-mute-card-domain{margin-right:1em;overflow:hidden;text-overflow:ellipsis}.domain-mute-card button{width:10em}.autosuggest-results .domain-mute-card{padding-left:1em}.selectable-list-item-inner{align-items:center;display:flex}.selectable-list-item-inner>*{min-width:0}.selectable-list-item-selected-inner{--faint:var(--selectedMenuFaintText,$fallback--faint);--faintLink:var(--selectedMenuFaintLink,$fallback--faint);--lightText:var(--selectedMenuLightText,$fallback--lightText);--icon:var(--selectedMenuIcon,$fallback--icon);background-color:#151e2a;background-color:var(--selectedMenu,#151e2a);color:var(--selectedMenuText,#b9b9ba)}.selectable-list-header{align-items:center;border-bottom:2px solid #222;border-bottom-color:var(--border,#222);display:flex;padding:.6em 0}.selectable-list-header-actions{flex:1}.selectable-list-checkbox-wrapper{flex:none;padding:0 10px}.with-subscription-loading{padding:10px;text-align:center}.with-subscription-loading .error{font-size:1rem}.mutes-and-blocks-tab{height:100%}.mutes-and-blocks-tab .usersearch-wrapper{padding:1em}.mutes-and-blocks-tab .bulk-actions{min-height:2em;padding:0 1em;text-align:right}.mutes-and-blocks-tab .bulk-action-button{width:10em}.mutes-and-blocks-tab .domain-mute-form{display:flex;flex-direction:column;padding:1em}.mutes-and-blocks-tab .domain-mute-button{align-self:flex-end;margin-top:1em;width:10em}.ModifiedIndicator{display:inline-block;position:relative}.modified-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.ProfileSettingIndicator{display:inline-block;position:relative}.profilesetting-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.DraftButtons{display:inline-block;position:relative}.DraftButtons .button-default{margin-left:.5em}.draft-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.mfa-backup-codes .warning{color:orange;color:var(--cOrange,orange)}.mfa-backup-codes .backup-codes{font-family:var(--postCodeFont,monospace)}.mfa-settings .method-item,.mfa-settings .mfa-heading{align-items:baseline;display:flex;flex-wrap:wrap;justify-content:space-between}.mfa-settings .warning{color:orange;color:var(--cOrange,orange)}.mfa-settings .setup-otp{display:flex;flex-wrap:wrap;justify-content:center}.mfa-settings .setup-otp .qr-code{flex:1;padding-right:10px}.mfa-settings .setup-otp .verify{flex:1}.mfa-settings .setup-otp .error{margin:4px 0 0}.mfa-settings .setup-otp .confirm-otp-actions button{margin-top:5px;width:15em} -/*! - * Cropper.js v1.5.13 - * https://fengyuanchen.github.io/cropperjs - * - * Copyright 2015-present Chen Fengyuan - * Released under the MIT license - * - * Date: 2022-11-20T05:30:43.444Z - */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.image-cropper-img-input{display:none}.image-cropper-image-container{position:relative}.image-cropper-image-container img{display:block;max-width:100%}.image-cropper-buttons-wrapper{margin-top:10px}.image-cropper-buttons-wrapper button{margin-top:5px}.profile-tab .bio{margin:0}.profile-tab .visibility-tray{padding-top:5px}.profile-tab input[type=file]{height:auto;padding:5px}.profile-tab .banner-background-preview{max-width:100%;position:relative;width:300px}.profile-tab .banner-background-preview img{width:100%}.profile-tab .uploading{font-size:1.5em;margin:.25em}.profile-tab .name-changer{width:100%}.profile-tab .current-avatar-container{height:150px;position:relative;width:150px}.profile-tab .current-avatar{border-radius:4px;border-radius:var(--avatarRadius,4px);display:block;height:100%;width:100%}.profile-tab .reset-button{background-color:rgba(0,0,0,.6);border-radius:5px;border-radius:var(--tooltipRadius,5px);cursor:pointer;font-size:1.5em;height:1.5em;line-height:1.5em;opacity:.7;position:absolute;right:.2em;text-align:center;top:.2em;width:1.5em}.profile-tab .reset-button:hover{opacity:1}.profile-tab .reset-button svg{color:#fff}.profile-tab .oauth-tokens{width:100%}.profile-tab .oauth-tokens th{text-align:left}.profile-tab .oauth-tokens .actions{text-align:right}.profile-tab-usersearch-wrapper{padding:1em}.profile-tab-bulk-actions{min-height:2em;padding:0 1em;text-align:right}.profile-tab-bulk-actions button{width:10em}.profile-tab-domain-mute-form{display:flex;flex-direction:column;padding:1em}.profile-tab-domain-mute-form button{align-self:flex-end;margin-top:1em;width:10em}.profile-tab .setting-subitem{margin-left:1.75em}.profile-tab .profile-fields{display:flex}.profile-tab .profile-fields>.emoji-input{flex:1 1 auto;margin:0 .2em .5em;min-width:0}.profile-tab .profile-fields .delete-field{align-self:center;margin:0 .2em .5em;padding:0 .5em;width:20px}.profile-tab .birthday-input{display:block;margin-bottom:1em}.SizeSetting .number-input{max-width:6.5em}.SizeSetting .css-unit-input,.SizeSetting .css-unit-input select{margin-left:.5em;max-width:4em;min-width:4em;width:4em}.column-settings{display:flex;flex-wrap:wrap;justify-content:space-evenly}.column-settings .size-label{display:block;margin-bottom:.5em;margin-top:.5em}.color-input{display:inline-flex}.color-input-field.input{align-items:stretch;display:inline-flex;flex:0 0 0;max-width:9em;padding:.2em 8px}.color-input-field.input input{background:none;border:none;color:#b9b9ba;color:var(--inputText,#b9b9ba);margin:0;padding:0}.color-input-field.input input.textColor{flex:1 0 3em;min-width:3em;padding:0}.color-input-field.input .computedIndicator,.color-input-field.input .transparentIndicator,.color-input-field.input input.nativeColor{align-self:stretch;flex:0 0 2em;min-height:100%;min-width:2em}.color-input-field.input .transparentIndicator{background-color:#f0f;position:relative}.color-input-field.input .transparentIndicator:after,.color-input-field.input .transparentIndicator:before{background-color:#000;content:"";display:block;height:50%;position:absolute;width:50%}.color-input-field.input .transparentIndicator:after{left:0;top:0}.color-input-field.input .transparentIndicator:before{bottom:0;right:0}.color-input .label{flex:1 1 auto}.color-control input.text-input{flex:1;max-width:7em}.shadow-control{display:flex;flex-wrap:wrap;justify-content:center;margin-bottom:1em}.shadow-control .shadow-preview-container,.shadow-control .shadow-tweak{margin:5px 6px 0 0}.shadow-control .shadow-preview-container{display:flex;flex:0;flex-wrap:wrap}.shadow-control .shadow-preview-container input[type=number]{min-width:2em;width:5em}.shadow-control .shadow-preview-container .x-shift-control,.shadow-control .shadow-preview-container .y-shift-control{display:flex;flex:0}.shadow-control .shadow-preview-container .x-shift-control[disabled=disabled] *,.shadow-control .shadow-preview-container .y-shift-control[disabled=disabled] *{opacity:.5}.shadow-control .shadow-preview-container .x-shift-control{align-items:flex-start}.shadow-control .shadow-preview-container .x-shift-control .wrap,.shadow-control .shadow-preview-container input[type=range]{height:2em;margin:0;width:15em}.shadow-control .shadow-preview-container .y-shift-control{align-items:flex-end;flex-direction:column}.shadow-control .shadow-preview-container .y-shift-control .wrap{height:15em;width:2em}.shadow-control .shadow-preview-container .y-shift-control input[type=range]{transform:rotate(90deg);transform-origin:1em 1em}.shadow-control .shadow-preview-container .preview-window{align-items:center;background-color:#999;background-image:linear-gradient(45deg,#666 25%,transparent 0),linear-gradient(-45deg,#666 25%,transparent 0),linear-gradient(45deg,transparent 75%,#666 0),linear-gradient(-45deg,transparent 75%,#666 0);background-position:0 0,0 10px,10px -10px,-10px 0;background-size:20px 20px;border-radius:4px;border-radius:var(--inputRadius,4px);display:flex;flex:1;justify-content:center}.shadow-control .shadow-preview-container .preview-window .preview-block{background-color:#121a24;background-color:var(--bg,#121a24);border-radius:10px;border-radius:var(--panelRadius,10px);height:33%;width:33%}.shadow-control .shadow-tweak{flex:1;min-width:280px}.shadow-control .shadow-tweak .id-control{align-items:stretch}.shadow-control .shadow-tweak .id-control .shadow-switcher{flex:1}.shadow-control .shadow-tweak .id-control .btn,.shadow-control .shadow-tweak .id-control .shadow-switcher{margin-right:5px;min-width:1px}.shadow-control .shadow-tweak .id-control .btn{margin:0 .1em;padding:0 .4em}.font-control input.custom-font{min-width:10em}.font-control.custom .font-switcher{border-bottom-right-radius:0;border-top-right-radius:0}.font-control.custom .custom-font{border-bottom-left-radius:0;border-top-left-radius:0}.contrast-ratio{display:flex;justify-content:flex-end;margin-bottom:5px;margin-top:-4px}.contrast-ratio .label{margin-right:1em}.contrast-ratio .rating{display:inline-block;margin-left:.5em;text-align:center}.preview-container{position:relative}.underlay-preview{bottom:0;left:10px;position:absolute;right:10px;top:0}.theme-tab{padding-bottom:2em}.theme-tab .preset-switcher{margin-right:1em}.theme-tab .btn{margin-left:.25em;margin-right:.25em}.theme-tab .style-control{align-items:baseline;display:flex;margin-bottom:5px}.theme-tab .style-control .label{flex:1}.theme-tab .style-control .opt{margin:.5em}.theme-tab .style-control .color-input{flex:0 0 0}.theme-tab .style-control input,.theme-tab .style-control select{flex:0;margin:0;min-width:3em}.theme-tab .style-control input[type=number],.theme-tab .style-control select[type=number]{min-width:5em}.theme-tab .style-control input[type=range],.theme-tab .style-control select[type=range]{align-self:flex-start;flex:1;min-width:3em}.theme-tab .style-control.disabled input,.theme-tab .style-control.disabled select{opacity:.5}.theme-tab .reset-container{flex-wrap:wrap}.theme-tab .apply-container,.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .radius-container,.theme-tab .reset-container{display:flex}.theme-tab .fonts-container,.theme-tab .radius-container{flex-direction:column}.theme-tab .color-container{flex-wrap:wrap;justify-content:space-between}.theme-tab .color-container>h4{width:99%}.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .presets-container,.theme-tab .radius-container,.theme-tab .shadow-container{margin:1em 1em 0}.theme-tab .tab-header{align-items:baseline;display:flex;justify-content:space-between;margin-bottom:1em;min-height:30px;width:100%}.theme-tab .tab-header p{flex:1;margin:0 .5em 0 0}.theme-tab .tab-header-buttons{display:flex;flex-direction:column}.theme-tab .tab-header-buttons .btn{flex:0 auto;margin-bottom:.5em;min-width:1px;padding:0 1em}.theme-tab .shadow-selector .override{flex:1;margin-left:.5em}.theme-tab .shadow-selector .select-container{margin-bottom:-3px;margin-top:-4px}.theme-tab .save-load,.theme-tab .save-load-options{align-items:baseline;display:flex;flex-wrap:wrap;justify-content:center}.theme-tab .save-load .import-export,.theme-tab .save-load .presets,.theme-tab .save-load-options .import-export,.theme-tab .save-load-options .presets{margin-bottom:.5em}.theme-tab .save-load .import-export,.theme-tab .save-load-options .import-export{display:flex}.theme-tab .save-load .override,.theme-tab .save-load-options .override{margin-left:.5em}.theme-tab .save-load-options{flex-wrap:wrap;justify-content:center;margin-top:.5em}.theme-tab .save-load-options .keep-option{margin:0 .5em .5em;min-width:25%}.theme-tab .preview-container{background-color:var(--wallpaper);background-image:var(--body-background-image);background-position:50% 50%;background-size:cover;border-bottom:1px dashed #222;border-color:#222 currentcolor;border-top:1px dashed #222;border-color:var(--border,#222);margin:1em 0;padding:1em}.theme-tab .preview-container .dummy .post{display:flex;font-family:var(--postFont)}.theme-tab .preview-container .dummy .post .content{flex:1}.theme-tab .preview-container .dummy .post .content h4{margin-bottom:.25em}.theme-tab .preview-container .dummy .post .content .icons{display:flex;margin-top:.5em}.theme-tab .preview-container .dummy .post .content .icons i{margin-right:1em}.theme-tab .preview-container .dummy .after-post{align-items:center;display:flex;margin-top:1em}.theme-tab .preview-container .dummy .avatar,.theme-tab .preview-container .dummy .avatar-alt{background:linear-gradient(135deg,#b8e1fc,#a9d2f3 10%,#90bae4 25%,#90bcea 37%,#90bff0 50%,#6ba8e5 51%,#a2daf5 83%,#bdf3fd);color:#000;font-family:sans-serif;margin-right:1em;text-align:center}.theme-tab .preview-container .dummy .avatar-alt{border-radius:10px;border-radius:var(--avatarAltRadius,10px);flex:0 auto;font-size:12px;line-height:20px;margin-left:28px;min-height:20px;min-width:20px}.theme-tab .preview-container .dummy .avatar{flex:0 auto;font-size:14px;height:48px;line-height:48px;width:48px}.theme-tab .preview-container .dummy .actions{align-items:baseline;display:flex}.theme-tab .preview-container .dummy .actions .checkbox{align-items:baseline;display:inline-flex;flex:1;margin-right:1em}.theme-tab .preview-container .dummy .separator{border-bottom:1px solid;border-color:#222;border-color:var(--border,#222);margin:1em}.theme-tab .preview-container .dummy .btn{min-width:3em}.theme-tab .radius-item{flex-basis:auto}.theme-tab .color-item,.theme-tab .radius-item{display:flex;flex:1 1 0;flex-direction:column;margin:5px 6px 0 0;min-width:20em}.theme-tab .color-item.wide,.theme-tab .radius-item.wide{min-width:60%}.theme-tab .color-item:not(.wide):nth-child(odd),.theme-tab .radius-item:not(.wide):nth-child(odd){margin-right:7px}.theme-tab .color-item .color,.theme-tab .color-item .opacity,.theme-tab .radius-item .color,.theme-tab .radius-item .opacity{align-items:baseline;display:flex}.theme-tab .theme-color-cl,.theme-tab .theme-radius-rn{align-self:stretch;background:transparent;border:0;box-shadow:none;color:var(--faint,hsla(240,1%,73%,.5))}.theme-tab .theme-color-cl,.theme-tab .theme-color-in,.theme-tab .theme-radius-in{margin-left:4px}.theme-tab .theme-radius-in{flex:1;max-width:7em;min-width:1em}.theme-tab .theme-radius-lb{max-width:50em}.theme-tab .theme-preview-content{padding:20px}.theme-tab .theme-warning{align-items:baseline;display:flex;margin-bottom:.5em}.theme-tab .theme-warning .buttons .btn{margin-bottom:.5em}.extra-content .apply-container{display:flex;flex-direction:row;flex-grow:1;justify-content:space-around}.extra-content .apply-container .btn{flex-grow:1;max-width:10em;min-height:2em;min-width:0;padding:0}.settings_tab-switcher{height:100%}.settings_tab-switcher .setting-item{border-bottom:2px solid var(--fg,#182230);margin:1em 1em 1.4em;padding-bottom:1.4em}.settings_tab-switcher .setting-item>div,.settings_tab-switcher .setting-item>label{display:block;margin-bottom:.5em}.settings_tab-switcher .setting-item>div:last-child,.settings_tab-switcher .setting-item>label:last-child{margin-bottom:0}.settings_tab-switcher .setting-item .select-multiple{display:flex}.settings_tab-switcher .setting-item .select-multiple .option-list{margin:0;padding-left:.5em}.settings_tab-switcher .setting-item:last-child{border-bottom:none;margin-bottom:1em;padding-bottom:0}.settings_tab-switcher .setting-item select{min-width:10em}.settings_tab-switcher .setting-item textarea{height:100px;max-width:100%;width:100%}.settings_tab-switcher .setting-item .unavailable,.settings_tab-switcher .setting-item .unavailable svg{color:var(--cRed,red);color:red} -/*# sourceMappingURL=7962.76663e78ad5ea0bb0b90.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/7962.76663e78ad5ea0bb0b90.css.map b/priv/static/static/css/7962.76663e78ad5ea0bb0b90.css.map deleted file mode 100644 index 9d501f27a..000000000 --- a/priv/static/static/css/7962.76663e78ad5ea0bb0b90.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/css/7962.76663e78ad5ea0bb0b90.css","mappings":"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","sources":["webpack://pleroma_fe/./src/components/importer/importer.vue","webpack://pleroma_fe/./src/components/exporter/exporter.vue","webpack://pleroma_fe/./src/components/autosuggest/autosuggest.vue","webpack://pleroma_fe/./src/_variables.scss","webpack://pleroma_fe/./src/components/block_card/block_card.vue","webpack://pleroma_fe/./src/components/mute_card/mute_card.vue","webpack://pleroma_fe/./src/components/domain_mute_card/domain_mute_card.vue","webpack://pleroma_fe/./src/components/selectable_list/selectable_list.vue","webpack://pleroma_fe/./src/hocs/with_subscription/with_subscription.scss","webpack://pleroma_fe/./src/components/settings_modal/tabs/mutes_and_blocks_tab.scss","webpack://pleroma_fe/./src/components/settings_modal/helpers/modified_indicator.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/profile_setting_indicator.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/draft_buttons.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/security_tab/mfa.vue","webpack://pleroma_fe/./node_modules/cropperjs/dist/cropper.css","webpack://pleroma_fe/./src/components/image_cropper/image_cropper.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/profile_tab.scss","webpack://pleroma_fe/./src/components/settings_modal/helpers/size_setting.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/general_tab.vue","webpack://pleroma_fe/./src/components/color_input/color_input.scss","webpack://pleroma_fe/./src/components/color_input/color_input.vue","webpack://pleroma_fe/./src/components/shadow_control/shadow_control.vue","webpack://pleroma_fe/./src/components/font_control/font_control.vue","webpack://pleroma_fe/./src/components/contrast_ratio/contrast_ratio.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/theme_tab/preview.vue","webpack://pleroma_fe/./src/components/settings_modal/tabs/theme_tab/theme_tab.scss","webpack://pleroma_fe/./src/components/settings_modal/settings_modal_user_content.scss"],"sourcesContent":["\n.importer {\n &-uploading {\n font-size: 1.5em;\n margin: 0.25em;\n }\n}\n","\n.exporter {\n &-processing {\n margin: 0.25em;\n }\n}\n","\n@import \"../../variables\";\n\n.autosuggest {\n position: relative;\n\n &-input {\n display: block;\n width: 100%;\n }\n\n &-results {\n position: absolute;\n left: 0;\n top: 100%;\n right: 0;\n max-height: 400px;\n background-color: $fallback--bg;\n background-color: var(--bg, $fallback--bg);\n border-style: solid;\n border-width: 1px;\n border-color: $fallback--border;\n border-color: var(--border, $fallback--border);\n border-radius: $fallback--inputRadius;\n border-radius: var(--inputRadius, $fallback--inputRadius);\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n box-shadow: 1px 1px 4px rgb(0 0 0 / 60%);\n box-shadow: var(--panelShadow);\n overflow-y: auto;\n z-index: 1;\n }\n}\n","$main-color: #f58d2c;\n$main-background: white;\n$darkened-background: whitesmoke;\n\n$fallback--bg: #121a24;\n$fallback--fg: #182230;\n$fallback--faint: rgb(185 185 186 / 50%);\n$fallback--text: #b9b9ba;\n$fallback--link: #d8a070;\n$fallback--icon: #666;\n$fallback--lightBg: rgb(21 30 42);\n$fallback--lightText: #b9b9ba;\n$fallback--border: #222;\n$fallback--cRed: #f00;\n$fallback--cBlue: #0095ff;\n$fallback--cGreen: #0fa00f;\n$fallback--cOrange: orange;\n\n$fallback--alertError: rgb(211 16 20 / 50%);\n$fallback--alertWarning: rgb(111 111 20 / 50%);\n\n$fallback--panelRadius: 10px;\n$fallback--checkboxRadius: 2px;\n$fallback--btnRadius: 4px;\n$fallback--inputRadius: 4px;\n$fallback--tooltipRadius: 5px;\n$fallback--avatarRadius: 4px;\n$fallback--avatarAltRadius: 10px;\n$fallback--attachmentRadius: 10px;\n$fallback--chatMessageRadius: 10px;\n\n$fallback--buttonShadow: 0 0 2px 0 rgb(0 0 0 / 100%),\n 0 1px 0 0 rgb(255 255 255 / 20%) inset,\n 0 -1px 0 0 rgb(0 0 0 / 20%) inset;\n\n$status-margin: 0.75em;\n","\n.block-card-content-container {\n margin-top: 0.5em;\n text-align: right;\n\n button {\n width: 10em;\n }\n}\n","\n.mute-card-content-container {\n margin-top: 0.5em;\n text-align: right;\n\n button {\n width: 10em;\n }\n}\n","\n.domain-mute-card {\n flex: 1 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.6em 1em 0.6em 0;\n\n &-domain {\n margin-right: 1em;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n button {\n width: 10em;\n }\n\n .autosuggest-results & {\n padding-left: 1em;\n }\n}\n","\n@import \"../../variables\";\n\n.selectable-list {\n &-item-inner {\n display: flex;\n align-items: center;\n\n > * {\n min-width: 0;\n }\n }\n\n &-item-selected-inner {\n background-color: $fallback--lightBg;\n background-color: var(--selectedMenu, $fallback--lightBg);\n color: var(--selectedMenuText, $fallback--text);\n\n --faint: var(--selectedMenuFaintText, $fallback--faint);\n --faintLink: var(--selectedMenuFaintLink, $fallback--faint);\n --lightText: var(--selectedMenuLightText, $fallback--lightText);\n --icon: var(--selectedMenuIcon, $fallback--icon);\n }\n\n &-header {\n display: flex;\n align-items: center;\n padding: 0.6em 0;\n border-bottom: 2px solid;\n border-bottom-color: $fallback--border;\n border-bottom-color: var(--border, $fallback--border);\n\n &-actions {\n flex: 1;\n }\n }\n\n &-checkbox-wrapper {\n padding: 0 10px;\n flex: none;\n }\n}\n",".with-subscription {\n &-loading {\n padding: 10px;\n text-align: center;\n\n .error {\n font-size: 1rem;\n }\n }\n}\n",".mutes-and-blocks-tab {\n height: 100%;\n\n .usersearch-wrapper {\n padding: 1em;\n }\n\n .bulk-actions {\n text-align: right;\n padding: 0 1em;\n min-height: 2em;\n }\n\n .bulk-action-button {\n width: 10em;\n }\n\n .domain-mute-form {\n padding: 1em;\n display: flex;\n flex-direction: column;\n }\n\n .domain-mute-button {\n align-self: flex-end;\n margin-top: 1em;\n width: 10em;\n }\n}\n","\n.ModifiedIndicator {\n display: inline-block;\n position: relative;\n}\n\n.modified-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.ProfileSettingIndicator {\n display: inline-block;\n position: relative;\n}\n\n.profilesetting-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.DraftButtons {\n display: inline-block;\n position: relative;\n\n .button-default {\n margin-left: 0.5em;\n }\n}\n\n.draft-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n@import \"../../../../variables\";\n\n.mfa-backup-codes {\n .warning {\n color: $fallback--cOrange;\n color: var(--cOrange, $fallback--cOrange);\n }\n\n .backup-codes {\n font-family: var(--postCodeFont, monospace);\n }\n}\n","\n@import \"../../../../variables\";\n\n.mfa-settings {\n .mfa-heading,\n .method-item {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: baseline;\n }\n\n .warning {\n color: $fallback--cOrange;\n color: var(--cOrange, $fallback--cOrange);\n }\n\n .setup-otp {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n\n .qr-code {\n flex: 1;\n padding-right: 10px;\n }\n .verify { flex: 1; }\n .error { margin: 4px 0 0; }\n\n .confirm-otp-actions {\n button {\n width: 15em;\n margin-top: 5px;\n }\n }\n }\n}\n","/*!\n * Cropper.js v1.5.13\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2022-11-20T05:30:43.444Z\n */\n\n.cropper-container {\n direction: ltr;\n font-size: 0;\n line-height: 0;\n position: relative;\n -ms-touch-action: none;\n touch-action: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.cropper-container img {\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n display: block;\n height: 100%;\n image-orientation: 0deg;\n max-height: none !important;\n max-width: none !important;\n min-height: 0 !important;\n min-width: 0 !important;\n width: 100%;\n }\n\n.cropper-wrap-box,\n.cropper-canvas,\n.cropper-drag-box,\n.cropper-crop-box,\n.cropper-modal {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.cropper-wrap-box,\n.cropper-canvas {\n overflow: hidden;\n}\n\n.cropper-drag-box {\n background-color: #fff;\n opacity: 0;\n}\n\n.cropper-modal {\n background-color: #000;\n opacity: 0.5;\n}\n\n.cropper-view-box {\n display: block;\n height: 100%;\n outline: 1px solid #39f;\n outline-color: rgba(51, 153, 255, 75%);\n overflow: hidden;\n width: 100%;\n}\n\n.cropper-dashed {\n border: 0 dashed #eee;\n display: block;\n opacity: 0.5;\n position: absolute;\n}\n\n.cropper-dashed.dashed-h {\n border-bottom-width: 1px;\n border-top-width: 1px;\n height: calc(100% / 3);\n left: 0;\n top: calc(100% / 3);\n width: 100%;\n }\n\n.cropper-dashed.dashed-v {\n border-left-width: 1px;\n border-right-width: 1px;\n height: 100%;\n left: calc(100% / 3);\n top: 0;\n width: calc(100% / 3);\n }\n\n.cropper-center {\n display: block;\n height: 0;\n left: 50%;\n opacity: 0.75;\n position: absolute;\n top: 50%;\n width: 0;\n}\n\n.cropper-center::before,\n .cropper-center::after {\n background-color: #eee;\n content: \" \";\n display: block;\n position: absolute;\n }\n\n.cropper-center::before {\n height: 1px;\n left: -3px;\n top: 0;\n width: 7px;\n }\n\n.cropper-center::after {\n height: 7px;\n left: 0;\n top: -3px;\n width: 1px;\n }\n\n.cropper-face,\n.cropper-line,\n.cropper-point {\n display: block;\n height: 100%;\n opacity: 0.1;\n position: absolute;\n width: 100%;\n}\n\n.cropper-face {\n background-color: #fff;\n left: 0;\n top: 0;\n}\n\n.cropper-line {\n background-color: #39f;\n}\n\n.cropper-line.line-e {\n cursor: ew-resize;\n right: -3px;\n top: 0;\n width: 5px;\n }\n\n.cropper-line.line-n {\n cursor: ns-resize;\n height: 5px;\n left: 0;\n top: -3px;\n }\n\n.cropper-line.line-w {\n cursor: ew-resize;\n left: -3px;\n top: 0;\n width: 5px;\n }\n\n.cropper-line.line-s {\n bottom: -3px;\n cursor: ns-resize;\n height: 5px;\n left: 0;\n }\n\n.cropper-point {\n background-color: #39f;\n height: 5px;\n opacity: 0.75;\n width: 5px;\n}\n\n.cropper-point.point-e {\n cursor: ew-resize;\n margin-top: -3px;\n right: -3px;\n top: 50%;\n }\n\n.cropper-point.point-n {\n cursor: ns-resize;\n left: 50%;\n margin-left: -3px;\n top: -3px;\n }\n\n.cropper-point.point-w {\n cursor: ew-resize;\n left: -3px;\n margin-top: -3px;\n top: 50%;\n }\n\n.cropper-point.point-s {\n bottom: -3px;\n cursor: s-resize;\n left: 50%;\n margin-left: -3px;\n }\n\n.cropper-point.point-ne {\n cursor: nesw-resize;\n right: -3px;\n top: -3px;\n }\n\n.cropper-point.point-nw {\n cursor: nwse-resize;\n left: -3px;\n top: -3px;\n }\n\n.cropper-point.point-sw {\n bottom: -3px;\n cursor: nesw-resize;\n left: -3px;\n }\n\n.cropper-point.point-se {\n bottom: -3px;\n cursor: nwse-resize;\n height: 20px;\n opacity: 1;\n right: -3px;\n width: 20px;\n }\n\n@media (min-width: 768px) {\n\n.cropper-point.point-se {\n height: 15px;\n width: 15px;\n }\n }\n\n@media (min-width: 992px) {\n\n.cropper-point.point-se {\n height: 10px;\n width: 10px;\n }\n }\n\n@media (min-width: 1200px) {\n\n.cropper-point.point-se {\n height: 5px;\n opacity: 0.75;\n width: 5px;\n }\n }\n\n.cropper-point.point-se::before {\n background-color: #39f;\n bottom: -50%;\n content: \" \";\n display: block;\n height: 200%;\n opacity: 0;\n position: absolute;\n right: -50%;\n width: 200%;\n }\n\n.cropper-invisible {\n opacity: 0;\n}\n\n.cropper-bg {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC\");\n}\n\n.cropper-hide {\n display: block;\n height: 0;\n position: absolute;\n width: 0;\n}\n\n.cropper-hidden {\n display: none !important;\n}\n\n.cropper-move {\n cursor: move;\n}\n\n.cropper-crop {\n cursor: crosshair;\n}\n\n.cropper-disabled .cropper-drag-box,\n.cropper-disabled .cropper-face,\n.cropper-disabled .cropper-line,\n.cropper-disabled .cropper-point {\n cursor: not-allowed;\n}\n","\n.image-cropper {\n &-img-input {\n display: none;\n }\n\n &-image-container {\n position: relative;\n\n img {\n display: block;\n max-width: 100%;\n }\n }\n\n &-buttons-wrapper {\n margin-top: 10px;\n\n button {\n margin-top: 5px;\n }\n }\n}\n","@import \"../../../variables\";\n\n.profile-tab {\n .bio {\n margin: 0;\n }\n\n .visibility-tray {\n padding-top: 5px;\n }\n\n input[type=\"file\"] {\n padding: 5px;\n height: auto;\n }\n\n .banner-background-preview {\n max-width: 100%;\n width: 300px;\n position: relative;\n\n img {\n width: 100%;\n }\n }\n\n .uploading {\n font-size: 1.5em;\n margin: 0.25em;\n }\n\n .name-changer {\n width: 100%;\n }\n\n .current-avatar-container {\n position: relative;\n width: 150px;\n height: 150px;\n }\n\n .current-avatar {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: $fallback--avatarRadius;\n border-radius: var(--avatarRadius, $fallback--avatarRadius);\n }\n\n .reset-button {\n position: absolute;\n top: 0.2em;\n right: 0.2em;\n border-radius: $fallback--tooltipRadius;\n border-radius: var(--tooltipRadius, $fallback--tooltipRadius);\n background-color: rgb(0 0 0 / 60%);\n opacity: 0.7;\n width: 1.5em;\n height: 1.5em;\n text-align: center;\n line-height: 1.5em;\n font-size: 1.5em;\n cursor: pointer;\n\n &:hover {\n opacity: 1;\n }\n\n svg {\n color: white;\n }\n }\n\n .oauth-tokens {\n width: 100%;\n\n th {\n text-align: left;\n }\n\n .actions {\n text-align: right;\n }\n }\n\n &-usersearch-wrapper {\n padding: 1em;\n }\n\n &-bulk-actions {\n text-align: right;\n padding: 0 1em;\n min-height: 2em;\n\n button {\n width: 10em;\n }\n }\n\n &-domain-mute-form {\n padding: 1em;\n display: flex;\n flex-direction: column;\n\n button {\n align-self: flex-end;\n margin-top: 1em;\n width: 10em;\n }\n }\n\n .setting-subitem {\n margin-left: 1.75em;\n }\n\n .profile-fields {\n display: flex;\n\n & > .emoji-input {\n flex: 1 1 auto;\n margin: 0 0.2em 0.5em;\n min-width: 0;\n }\n\n .delete-field {\n width: 20px;\n align-self: center;\n margin: 0 0.2em 0.5em;\n padding: 0 0.5em;\n }\n }\n\n .birthday-input {\n display: block;\n margin-bottom: 1em;\n }\n}\n","\n.SizeSetting {\n .number-input {\n max-width: 6.5em;\n }\n\n .css-unit-input,\n .css-unit-input select {\n margin-left: 0.5em;\n width: 4em;\n max-width: 4em;\n min-width: 4em;\n }\n}\n\n","\n.column-settings {\n display: flex;\n justify-content: space-evenly;\n flex-wrap: wrap;\n}\n\n.column-settings .size-label {\n display: block;\n margin-bottom: 0.5em;\n margin-top: 0.5em;\n}\n","@import \"../../variables\";\n\n.color-input {\n display: inline-flex;\n\n &-field.input {\n display: inline-flex;\n flex: 0 0 0;\n max-width: 9em;\n align-items: stretch;\n padding: 0.2em 8px;\n\n input {\n background: none;\n color: $fallback--lightText;\n color: var(--inputText, $fallback--lightText);\n border: none;\n padding: 0;\n margin: 0;\n\n &.textColor {\n flex: 1 0 3em;\n min-width: 3em;\n padding: 0;\n }\n\n &.nativeColor {\n flex: 0 0 2em;\n min-width: 2em;\n align-self: stretch;\n min-height: 100%;\n }\n }\n\n .computedIndicator,\n .transparentIndicator {\n flex: 0 0 2em;\n min-width: 2em;\n align-self: stretch;\n min-height: 100%;\n }\n\n .transparentIndicator {\n // forgot to install counter-strike source, ooops\n background-color: #f0f;\n position: relative;\n\n &::before,\n &::after {\n display: block;\n content: \"\";\n background-color: #000;\n position: absolute;\n height: 50%;\n width: 50%;\n }\n\n &::after {\n top: 0;\n left: 0;\n }\n\n &::before {\n bottom: 0;\n right: 0;\n }\n }\n }\n\n .label {\n flex: 1 1 auto;\n }\n}\n","\n.color-control {\n input.text-input {\n max-width: 7em;\n flex: 1;\n }\n}\n","\n@import \"../../variables\";\n\n.shadow-control {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n margin-bottom: 1em;\n\n .shadow-preview-container,\n .shadow-tweak {\n margin: 5px 6px 0 0;\n }\n\n .shadow-preview-container {\n flex: 0;\n display: flex;\n flex-wrap: wrap;\n\n $side: 15em;\n\n input[type=\"number\"] {\n width: 5em;\n min-width: 2em;\n }\n\n .x-shift-control,\n .y-shift-control {\n display: flex;\n flex: 0;\n\n &[disabled=\"disabled\"] * {\n opacity: 0.5;\n }\n }\n\n .x-shift-control {\n align-items: flex-start;\n }\n\n .x-shift-control .wrap,\n input[type=\"range\"] {\n margin: 0;\n width: $side;\n height: 2em;\n }\n\n .y-shift-control {\n flex-direction: column;\n align-items: flex-end;\n\n .wrap {\n width: 2em;\n height: $side;\n }\n\n input[type=\"range\"] {\n transform-origin: 1em 1em;\n transform: rotate(90deg);\n }\n }\n\n .preview-window {\n flex: 1;\n background-color: #999;\n display: flex;\n align-items: center;\n justify-content: center;\n background-image:\n linear-gradient(45deg, #666 25%, transparent 25%),\n linear-gradient(-45deg, #666 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #666 75%),\n linear-gradient(-45deg, transparent 75%, #666 75%);\n background-size: 20px 20px;\n background-position: 0 0, 0 10px, 10px -10px, -10px 0;\n border-radius: $fallback--inputRadius;\n border-radius: var(--inputRadius, $fallback--inputRadius);\n\n .preview-block {\n width: 33%;\n height: 33%;\n background-color: $fallback--bg;\n background-color: var(--bg, $fallback--bg);\n border-radius: $fallback--panelRadius;\n border-radius: var(--panelRadius, $fallback--panelRadius);\n }\n }\n }\n\n .shadow-tweak {\n flex: 1;\n min-width: 280px;\n\n .id-control {\n align-items: stretch;\n\n .shadow-switcher {\n flex: 1;\n }\n\n .shadow-switcher,\n .btn {\n min-width: 1px;\n margin-right: 5px;\n }\n\n .btn {\n padding: 0 0.4em;\n margin: 0 0.1em;\n }\n }\n }\n}\n","\n@import \"../../variables\";\n\n.font-control {\n input.custom-font {\n min-width: 10em;\n }\n\n &.custom {\n /* TODO Should make proper joiners... */\n .font-switcher {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n .custom-font {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n}\n","\n.contrast-ratio {\n display: flex;\n justify-content: flex-end;\n margin-top: -4px;\n margin-bottom: 5px;\n\n .label {\n margin-right: 1em;\n }\n\n .rating {\n display: inline-block;\n text-align: center;\n margin-left: 0.5em;\n }\n}\n","\n.preview-container {\n position: relative;\n}\n\n.underlay-preview {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 10px;\n right: 10px;\n}\n","@import \"src/variables\";\n\n.theme-tab {\n padding-bottom: 2em;\n\n .preset-switcher {\n margin-right: 1em;\n }\n\n .btn {\n margin-left: 0.25em;\n margin-right: 0.25em;\n }\n\n .style-control {\n display: flex;\n align-items: baseline;\n margin-bottom: 5px;\n\n .label {\n flex: 1;\n }\n\n .opt {\n margin: 0.5em;\n }\n\n .color-input {\n flex: 0 0 0;\n }\n\n input,\n select {\n min-width: 3em;\n margin: 0;\n flex: 0;\n\n &[type=\"number\"] {\n min-width: 5em;\n }\n\n &[type=\"range\"] {\n flex: 1;\n min-width: 3em;\n align-self: flex-start;\n }\n }\n\n &.disabled {\n input,\n select {\n opacity: 0.5;\n }\n }\n }\n\n .reset-container {\n flex-wrap: wrap;\n }\n\n .fonts-container,\n .reset-container,\n .apply-container,\n .radius-container,\n .color-container, {\n display: flex;\n }\n\n .fonts-container,\n .radius-container {\n flex-direction: column;\n }\n\n .color-container {\n > h4 {\n width: 99%;\n }\n\n flex-wrap: wrap;\n justify-content: space-between;\n }\n\n .fonts-container,\n .color-container,\n .shadow-container,\n .radius-container,\n .presets-container {\n margin: 1em 1em 0;\n }\n\n .tab-header {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n width: 100%;\n min-height: 30px;\n margin-bottom: 1em;\n\n p {\n flex: 1;\n margin: 0;\n margin-right: 0.5em;\n }\n }\n\n .tab-header-buttons {\n display: flex;\n flex-direction: column;\n\n .btn {\n min-width: 1px;\n flex: 0 auto;\n padding: 0 1em;\n margin-bottom: 0.5em;\n }\n }\n\n .shadow-selector {\n .override {\n flex: 1;\n margin-left: 0.5em;\n }\n\n .select-container {\n margin-top: -4px;\n margin-bottom: -3px;\n }\n }\n\n .save-load,\n .save-load-options {\n display: flex;\n justify-content: center;\n align-items: baseline;\n flex-wrap: wrap;\n\n .presets,\n .import-export {\n margin-bottom: 0.5em;\n }\n\n .import-export {\n display: flex;\n }\n\n .override {\n margin-left: 0.5em;\n }\n }\n\n .save-load-options {\n flex-wrap: wrap;\n margin-top: 0.5em;\n justify-content: center;\n\n .keep-option {\n margin: 0 0.5em 0.5em;\n min-width: 25%;\n }\n }\n\n .preview-container {\n border-top: 1px dashed;\n border-bottom: 1px dashed;\n border-color: $fallback--border;\n border-color: var(--border, $fallback--border);\n margin: 1em 0;\n padding: 1em;\n background-color: var(--wallpaper);\n background-image: var(--body-background-image);\n background-size: cover;\n background-position: 50% 50%;\n\n .dummy {\n .post {\n font-family: var(--postFont);\n display: flex;\n\n .content {\n flex: 1;\n\n h4 {\n margin-bottom: 0.25em;\n }\n\n .icons {\n margin-top: 0.5em;\n display: flex;\n\n i {\n margin-right: 1em;\n }\n }\n }\n }\n\n .after-post {\n margin-top: 1em;\n display: flex;\n align-items: center;\n }\n\n .avatar,\n .avatar-alt {\n background:\n linear-gradient(\n 135deg,\n #b8e1fc 0%,\n #a9d2f3 10%,\n #90bae4 25%,\n #90bcea 37%,\n #90bff0 50%,\n #6ba8e5 51%,\n #a2daf5 83%,\n #bdf3fd 100%\n );\n color: black;\n font-family: sans-serif;\n text-align: center;\n margin-right: 1em;\n }\n\n .avatar-alt {\n flex: 0 auto;\n margin-left: 28px;\n font-size: 12px;\n min-width: 20px;\n min-height: 20px;\n line-height: 20px;\n border-radius: $fallback--avatarAltRadius;\n border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);\n }\n\n .avatar {\n flex: 0 auto;\n width: 48px;\n height: 48px;\n font-size: 14px;\n line-height: 48px;\n }\n\n .actions {\n display: flex;\n align-items: baseline;\n\n .checkbox {\n display: inline-flex;\n align-items: baseline;\n margin-right: 1em;\n flex: 1;\n }\n }\n\n .separator {\n margin: 1em;\n border-bottom: 1px solid;\n border-color: $fallback--border;\n border-color: var(--border, $fallback--border);\n }\n\n .btn {\n min-width: 3em;\n }\n }\n }\n\n .radius-item {\n flex-basis: auto;\n }\n\n .radius-item,\n .color-item {\n min-width: 20em;\n margin: 5px 6px 0 0;\n display: flex;\n flex-direction: column;\n flex: 1 1 0;\n\n &.wide {\n min-width: 60%;\n }\n\n &:not(.wide):nth-child(2n+1) {\n margin-right: 7px;\n }\n\n .color,\n .opacity {\n display: flex;\n align-items: baseline;\n }\n }\n\n .theme-radius-rn,\n .theme-color-cl {\n border: 0;\n box-shadow: none;\n background: transparent;\n color: var(--faint, $fallback--faint);\n align-self: stretch;\n }\n\n .theme-color-cl,\n .theme-radius-in,\n .theme-color-in {\n margin-left: 4px;\n }\n\n .theme-radius-in {\n min-width: 1em;\n max-width: 7em;\n flex: 1;\n }\n\n .theme-radius-lb {\n max-width: 50em;\n }\n\n .theme-preview-content {\n padding: 20px;\n }\n\n .theme-warning {\n display: flex;\n align-items: baseline;\n margin-bottom: 0.5em;\n\n .buttons {\n .btn {\n margin-bottom: 0.5em;\n }\n }\n }\n}\n\n.extra-content {\n .apply-container {\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n flex-grow: 1;\n\n /* stylelint-disable-next-line no-descending-specificity */\n .btn {\n flex-grow: 1;\n min-height: 2em;\n min-width: 0;\n max-width: 10em;\n padding: 0;\n }\n }\n}\n","@import \"src/variables\";\n\n.settings_tab-switcher {\n height: 100%;\n\n .setting-item {\n border-bottom: 2px solid var(--fg, $fallback--fg);\n margin: 1em 1em 1.4em;\n padding-bottom: 1.4em;\n\n > div,\n > label {\n display: block;\n margin-bottom: 0.5em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .select-multiple {\n display: flex;\n\n .option-list {\n margin: 0;\n padding-left: 0.5em;\n }\n }\n\n &:last-child {\n border-bottom: none;\n padding-bottom: 0;\n margin-bottom: 1em;\n }\n\n select {\n min-width: 10em;\n }\n\n textarea {\n width: 100%;\n max-width: 100%;\n height: 100px;\n }\n\n .unavailable,\n .unavailable svg {\n color: var(--cRed, $fallback--cRed);\n color: $fallback--cRed;\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/8859.d26a3b0841a7beb8fd4a.css b/priv/static/static/css/8859.d26a3b0841a7beb8fd4a.css deleted file mode 100644 index b89695d29..000000000 --- a/priv/static/static/css/8859.d26a3b0841a7beb8fd4a.css +++ /dev/null @@ -1,2 +0,0 @@ -.ModifiedIndicator{display:inline-block;position:relative}.modified-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.ProfileSettingIndicator{display:inline-block;position:relative}.profilesetting-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.DraftButtons{display:inline-block;position:relative}.DraftButtons .button-default{margin-left:.5em}.draft-tooltip{margin:.5em 1em;min-width:10em;text-align:center}.AttachmentSetting .attachment{display:block;height:15em;margin-bottom:.5em;width:100%}.AttachmentSetting .attachment-input{display:flex;flex-direction:column;margin-left:1em;width:20em}.AttachmentSetting.-compact .attachment-input{align-items:flex-end;flex-direction:row}.AttachmentSetting.-compact .attachment{align-self:center;display:block;flex:0;height:4em;margin-bottom:0;min-width:4em;order:0}.AttachmentSetting.-compact .control-field{margin-left:.5em;min-width:12em;order:1}.AttachmentSetting.-compact .control-upload{min-width:12em;order:2;padding:0 .5em}.AttachmentSetting .controls{margin-bottom:.5em}.AttachmentSetting .controls button,.AttachmentSetting .controls input{width:100%}.frontends-tab .cards-list{padding:0}.frontends-tab .relative{position:relative}.frontends-tab .overlay{background:var(--bg);bottom:0;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:2}.frontends-tab dd{word-wrap:nowrap;max-width:10em;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.settings_tab-switcher{height:100%}.settings_tab-switcher .setting-item{border-bottom:2px solid var(--fg,#182230);margin:1em 1em 1.4em;padding-bottom:1.4em}.settings_tab-switcher .setting-item>div,.settings_tab-switcher .setting-item>label{display:block;margin-bottom:.5em}.settings_tab-switcher .setting-item>div:last-child,.settings_tab-switcher .setting-item>label:last-child{margin-bottom:0}.settings_tab-switcher .setting-item .select-multiple{display:flex}.settings_tab-switcher .setting-item .select-multiple .option-list{margin:0;padding-left:.5em}.settings_tab-switcher .setting-item:last-child{border-bottom:none;margin-bottom:1em;padding-bottom:0}.settings_tab-switcher .setting-item select{min-width:10em}.settings_tab-switcher .setting-item textarea{height:100px;max-width:100%;width:100%}.settings_tab-switcher .setting-item .unavailable,.settings_tab-switcher .setting-item .unavailable svg{color:var(--cRed,red);color:red} -/*# sourceMappingURL=8859.d26a3b0841a7beb8fd4a.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/8859.d26a3b0841a7beb8fd4a.css.map b/priv/static/static/css/8859.d26a3b0841a7beb8fd4a.css.map deleted file mode 100644 index c0ebb3d85..000000000 --- a/priv/static/static/css/8859.d26a3b0841a7beb8fd4a.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/css/8859.d26a3b0841a7beb8fd4a.css","mappings":"AACA,mBACE,qBACA,kBAGF,kBACE,gBACA,eACA,kBCRF,yBACE,qBACA,kBAGF,wBACE,gBACA,eACA,kBCRF,cACE,qBACA,kBAEA,8BACE,iBAIJ,eACE,gBACA,eACA,kBCXA,+BACE,cAEA,YACA,mBAFA,UAEA,CAGF,qCAEE,aACA,sBAFA,gBAGA,WAIA,8CAEE,qBADA,kBACA,CAGF,wCAME,kBAHA,cAFA,OAIA,WAEA,eAAc,CAHd,cAFA,OAKA,CAGF,2CAGE,iBADA,eADA,OAEA,CAGF,4CAEE,eADA,QAEA,eAIJ,6BACE,mBAEA,uEAEE,WCjDJ,2BACE,UAGF,yBACE,kBAGF,wBAEE,qBAKA,SACA,OAHA,WAJA,kBAQA,OAAM,CAHN,MAFA,SAKA,CAGF,kBAEE,iBAGA,eADA,kBAHA,uBAEA,kBAEA,CCxBJ,uBACE,YAEA,qCACE,0CACA,qBACA,qBAEA,oFAEE,cACA,mBAEA,0GACE,gBAIJ,sDACE,aAEA,mEACE,SACA,kBAIJ,gDACE,mBAEA,kBADA,gBACA,CAGF,4CACE,eAGF,8CAGE,aADA,eADA,UAEA,CAGF,wGAEE,sBACA,SCnCW","sources":["webpack://pleroma_fe/./src/components/settings_modal/helpers/modified_indicator.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/profile_setting_indicator.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/draft_buttons.vue","webpack://pleroma_fe/./src/components/settings_modal/helpers/attachment_setting.vue","webpack://pleroma_fe/./src/components/settings_modal/admin_tabs/frontends_tab.scss","webpack://pleroma_fe/./src/components/settings_modal/settings_modal_admin_content.scss","webpack://pleroma_fe/./src/_variables.scss"],"sourcesContent":["\n.ModifiedIndicator {\n display: inline-block;\n position: relative;\n}\n\n.modified-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.ProfileSettingIndicator {\n display: inline-block;\n position: relative;\n}\n\n.profilesetting-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.DraftButtons {\n display: inline-block;\n position: relative;\n\n .button-default {\n margin-left: 0.5em;\n }\n}\n\n.draft-tooltip {\n margin: 0.5em 1em;\n min-width: 10em;\n text-align: center;\n}\n","\n.AttachmentSetting {\n .attachment {\n display: block;\n width: 100%;\n height: 15em;\n margin-bottom: 0.5em;\n }\n\n .attachment-input {\n margin-left: 1em;\n display: flex;\n flex-direction: column;\n width: 20em;\n }\n\n &.-compact {\n .attachment-input {\n flex-direction: row;\n align-items: flex-end;\n }\n\n .attachment {\n flex: 0;\n order: 0;\n display: block;\n min-width: 4em;\n height: 4em;\n align-self: center;\n margin-bottom: 0;\n }\n\n .control-field {\n order: 1;\n min-width: 12em;\n margin-left: 0.5em;\n }\n\n .control-upload {\n order: 2;\n min-width: 12em;\n padding: 0 0.5em;\n }\n }\n\n .controls {\n margin-bottom: 0.5em;\n\n input,\n button {\n width: 100%;\n }\n }\n}\n",".frontends-tab {\n .cards-list {\n padding: 0;\n }\n\n .relative {\n position: relative;\n }\n\n .overlay {\n position: absolute;\n background: var(--bg);\n // fix buttons showing through\n z-index: 2;\n opacity: 0.9;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n\n dd {\n text-overflow: ellipsis;\n word-wrap: nowrap;\n white-space: nowrap;\n overflow-x: hidden;\n max-width: 10em;\n }\n}\n","@import \"src/variables\";\n\n.settings_tab-switcher {\n height: 100%;\n\n .setting-item {\n border-bottom: 2px solid var(--fg, $fallback--fg);\n margin: 1em 1em 1.4em;\n padding-bottom: 1.4em;\n\n > div,\n > label {\n display: block;\n margin-bottom: 0.5em;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .select-multiple {\n display: flex;\n\n .option-list {\n margin: 0;\n padding-left: 0.5em;\n }\n }\n\n &:last-child {\n border-bottom: none;\n padding-bottom: 0;\n margin-bottom: 1em;\n }\n\n select {\n min-width: 10em;\n }\n\n textarea {\n width: 100%;\n max-width: 100%;\n height: 100px;\n }\n\n .unavailable,\n .unavailable svg {\n color: var(--cRed, $fallback--cRed);\n color: $fallback--cRed;\n }\n }\n}\n","$main-color: #f58d2c;\n$main-background: white;\n$darkened-background: whitesmoke;\n\n$fallback--bg: #121a24;\n$fallback--fg: #182230;\n$fallback--faint: rgb(185 185 186 / 50%);\n$fallback--text: #b9b9ba;\n$fallback--link: #d8a070;\n$fallback--icon: #666;\n$fallback--lightBg: rgb(21 30 42);\n$fallback--lightText: #b9b9ba;\n$fallback--border: #222;\n$fallback--cRed: #f00;\n$fallback--cBlue: #0095ff;\n$fallback--cGreen: #0fa00f;\n$fallback--cOrange: orange;\n\n$fallback--alertError: rgb(211 16 20 / 50%);\n$fallback--alertWarning: rgb(111 111 20 / 50%);\n\n$fallback--panelRadius: 10px;\n$fallback--checkboxRadius: 2px;\n$fallback--btnRadius: 4px;\n$fallback--inputRadius: 4px;\n$fallback--tooltipRadius: 5px;\n$fallback--avatarRadius: 4px;\n$fallback--avatarAltRadius: 10px;\n$fallback--attachmentRadius: 10px;\n$fallback--chatMessageRadius: 10px;\n\n$fallback--buttonShadow: 0 0 2px 0 rgb(0 0 0 / 100%),\n 0 1px 0 0 rgb(255 255 255 / 20%) inset,\n 0 -1px 0 0 rgb(0 0 0 / 20%) inset;\n\n$status-margin: 0.75em;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/app.75b043cffb8e922bc29e.css b/priv/static/static/css/app.75b043cffb8e922bc29e.css new file mode 100644 index 000000000..a8df04ea3 --- /dev/null +++ b/priv/static/static/css/app.75b043cffb8e922bc29e.css @@ -0,0 +1,2 @@ +.modal-view{align-items:center;animation-duration:.2s;animation-name:modal-background-fadein;bottom:0;display:flex;justify-content:center;left:0;opacity:0;overflow:auto;pointer-events:none;position:fixed;right:0;top:0;z-index:var(--ZI_modals)}.modal-view>*{pointer-events:auto}.modal-view.modal-background{background-color:rgba(0,0,0,.5);pointer-events:auto}.modal-view.open{opacity:1}@keyframes modal-background-fadein{0%{background-color:transparent}to{background-color:rgba(0,0,0,.5)}}.vue-recycle-scroller{position:relative}.vue-recycle-scroller.direction-vertical:not(.page-mode){overflow-y:auto}.vue-recycle-scroller.direction-horizontal:not(.page-mode){overflow-x:auto}.vue-recycle-scroller.direction-horizontal{display:-webkit-box;display:-ms-flexbox;display:flex}.vue-recycle-scroller__slot{-webkit-box-flex:1;-ms-flex:auto 0 0px;flex:auto 0 0}.vue-recycle-scroller__item-wrapper{-webkit-box-flex:1;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex:1;flex:1;overflow:hidden;position:relative}.vue-recycle-scroller.ready .vue-recycle-scroller__item-view{left:0;position:absolute;top:0;will-change:transform}.vue-recycle-scroller.direction-vertical .vue-recycle-scroller__item-wrapper{width:100%}.vue-recycle-scroller.direction-horizontal .vue-recycle-scroller__item-wrapper{height:100%}.vue-recycle-scroller.ready.direction-vertical .vue-recycle-scroller__item-view{width:100%}.vue-recycle-scroller.ready.direction-horizontal .vue-recycle-scroller__item-view{height:100%}.resize-observer[data-v-b329ee4c]{background-color:transparent;border:none;opacity:0}.resize-observer[data-v-b329ee4c],.resize-observer[data-v-b329ee4c] object{display:block;height:100%;left:0;overflow:hidden;pointer-events:none;position:absolute;top:0;width:100%;z-index:-1}.login-form{display:flex;flex-direction:column;padding:.6em}.login-form .btn{min-height:2em;width:10em}.login-form .register{flex:1 1}.login-form .login-bottom{align-items:center;display:flex;flex-direction:row;justify-content:space-between;margin-top:1em}.login-form .form-group{display:flex;flex-direction:column;line-height:24px;padding:.3em .5em .6em}.login-form .form-bottom{display:flex;height:32px;padding:.5em}.login-form .form-bottom button{width:10em}.login-form .form-bottom p{display:flex;margin:.35em;padding:.35em}.login-form .error{animation-duration:.4s;animation-name:shakeError;animation-timing-function:ease-in-out;text-align:center}.media-upload .hidden-input-file{display:none}label.media-upload{cursor:pointer}.ScopeSelector .scope{cursor:pointer;display:inline-block;min-height:1.3em;min-width:1.3em;text-align:center}.checkbox{display:inline-block;min-height:1.2em;position:relative}.checkbox>.checkbox-indicator{box-shadow:none;display:inline;line-height:inherit;margin:0;padding:0 0 0 1.2em;position:relative}.checkbox-indicator:before{background-color:var(--background);border-radius:var(--roundness);box-shadow:var(--shadow);box-sizing:border-box;color:transparent;content:"✓";display:block;font-size:1.1em;height:1.1em;line-height:1.1em;overflow:hidden;position:absolute;right:0;text-align:center;top:0;transition:color .2s;vertical-align:top;width:1.1em}.checkbox.disabled .checkbox-indicator:before,.checkbox.disabled .label{opacity:.5}.checkbox input[type=checkbox]:checked+.checkbox-indicator:before,.checkbox.disabled .label{color:var(--text)}.checkbox input[type=checkbox]:indeterminate+.checkbox-indicator:before{color:var(--text);content:"–"}.checkbox.indeterminate-fix input[type=checkbox]+.checkbox-indicator:before{content:"–"}.checkbox>span{margin-left:.5em}.popover-trigger-button{display:inline-block}.popover{box-shadow:var(--shadow);max-width:calc(100vw - 20px);min-width:0;position:fixed;z-index:var(--ZI_popover_override,var(--ZI_popovers))}.popover-default{background-color:var(--background);border-color:var(--border);border-radius:var(--roundness);border-style:solid;border-width:1px}.popover-default:after{bottom:-1px;box-shadow:var(--shadow);content:"";left:-1px;pointer-events:none;position:absolute;right:-1px;top:-1px;z-index:-1px}.dropdown-menu{background-color:var(--background);display:block;font-size:1em;list-style:none;max-width:100vw;padding:0;text-align:left;white-space:nowrap;z-index:var(--ZI_popover_override,var(--ZI_popovers))}.dropdown-menu .dropdown-divider{border-top:1px solid var(--border);height:0;margin:.5rem 0;overflow:hidden}.dropdown-menu .dropdown-item{border:none}.dropdown-menu .dropdown-item-icon svg{margin-right:var(--__horizontal-gap);width:var(--__line-height)}.dropdown-menu .dropdown-item.-has-submenu .chevron-icon{margin-left:2rem;margin-right:.25rem}.dropdown-menu .dropdown-item .menu-checkbox{border-radius:0;box-shadow:var(--shadow);display:inline-block;line-height:var(--__line-height);margin-right:var(--__horizontal-gap);max-height:calc(var(--__line-height) + 1px);max-width:calc(var(--__line-height) + 1px);min-height:calc(var(--__line-height) + 1px);min-width:calc(var(--__line-height) + 1px);text-align:center;vertical-align:middle}.dropdown-menu .dropdown-item .menu-checkbox.menu-checkbox-checked:after{content:"✓";font-size:1.25em}.dropdown-menu .dropdown-item .menu-checkbox.-radio{border-radius:9999px}.dropdown-menu .dropdown-item .menu-checkbox.-radio.menu-checkbox-checked:after{content:"•";font-size:2em}.still-image{align-items:center;display:inline-flex;line-height:0;overflow:hidden;position:relative}.still-image canvas{bottom:0;left:0;position:absolute;right:0;top:0;visibility:var(--_still-image-canvas-visibility,visible)}.still-image canvas,.still-image img{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.still-image.animated:before{zoom:var(--_still_image-label-scale,1);background:hsla(0,0%,50%,.5);border-radius:var(--roundness);color:#fff;content:"gif";display:block;font-size:.7em;left:.5em;line-height:1;padding:2px 4px;position:absolute;top:.5em;visibility:var(--_still-image-label-visibility,visible);z-index:2}.still-image.animated:hover canvas{display:none}.still-image.animated:hover:before{visibility:var(--_still-image-label-visibility,hidden)}.still-image.animated img{visibility:var(--_still-image-img-visibility,hidden)}.still-image.animated:hover img{visibility:visible}.emoji-picker{--__emoji-picker-header:2.2em;display:flex;flex-direction:column;max-width:calc(100vw - 20px);width:25em}.emoji-picker-header-image{align-items:center;display:inline-flex;justify-content:center}.emoji-picker-header-image,.emoji-picker-header-image .still-image{height:var(--__emoji-picker-header);max-height:var(--__emoji-picker-header);max-width:var(--__emoji-picker-header);width:var(--__emoji-picker-header)}.emoji-picker-header-image .still-image{--_still_image-label-scale:0.5;-o-object-fit:contain;object-fit:contain}.emoji-picker .hide-custom-emoji,.emoji-picker .keep-open,.emoji-picker .too-many-emoji{line-height:normal;padding:.5em}.emoji-picker .hide-custom-emoji{padding-top:0}.emoji-picker .too-many-emoji{display:flex;flex-direction:column}.emoji-picker .keep-open-label{display:flex;padding:0 .5em}.emoji-picker .heading{display:flex;padding:.7em .5em 0}.emoji-picker .content{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.emoji-picker .emoji-tabs{display:flex;flex-flow:row nowrap;flex-grow:1;overflow-x:auto;overflow-y:hidden}.emoji-picker .additional-tabs{border-left:1px solid;border-left-color:var(--border);display:flex;flex:0 0 auto;padding-left:.5em}.emoji-picker .additional-tabs,.emoji-picker .emoji-tabs{align-content:center;display:flex;flex-basis:auto;scrollbar-width:thin}.emoji-picker .additional-tabs-item,.emoji-picker .emoji-tabs-item{align-items:center;cursor:pointer;display:flex;height:var(--__emoji-picker-header);max-height:var(--__emoji-picker-header);max-width:var(--__emoji-picker-header);padding:0 .5em;width:var(--__emoji-picker-header)}.emoji-picker .additional-tabs-item .svg-inline--fa,.emoji-picker .emoji-tabs-item .svg-inline--fa{font-size:1.85em}.emoji-picker .additional-tabs-item.disabled,.emoji-picker .emoji-tabs-item.disabled{opacity:.5;pointer-events:none}.emoji-picker .additional-tabs-item.toggled,.emoji-picker .emoji-tabs-item.toggled{border-bottom:.2em solid}.emoji-picker .sticker-picker{flex:1 1 auto}.emoji-picker .emoji-content,.emoji-picker .stickers-content{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.emoji-picker .emoji-content.hidden,.emoji-picker .stickers-content.hidden{opacity:0;pointer-events:none;position:absolute}.emoji-picker .emoji-search{flex:0 0 auto;padding:.3em}.emoji-picker .emoji-search input{width:100%}.emoji-picker .emoji-groups{flex:1 1 1px;height:100%;-webkit-mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);mask-composite:xor;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-size:100% 20px,100% 20px,auto;mask-size:100% 20px,100% 20px,auto;min-height:200px;overflow:auto;position:relative;scrollbar-gutter:stable both-edges;transition:-webkit-mask-size .15s;transition:mask-size .15s;transition:mask-size .15s,-webkit-mask-size .15s;-webkit-user-select:none;-moz-user-select:none;user-select:none}.emoji-picker .emoji-groups.scrolled-top{-webkit-mask-size:100% 20px,100% 0,auto;mask-size:100% 20px,100% 0,auto}.emoji-picker .emoji-groups.scrolled-bottom{-webkit-mask-size:100% 0,100% 20px,auto;mask-size:100% 0,100% 20px,auto}.emoji-picker .emoji-group{align-items:center;display:flex;flex-wrap:wrap;justify-content:left}.emoji-picker .emoji-group-title{font-size:.85em;margin:0;padding-left:.3em;width:100%}.emoji-picker .emoji-group-title.disabled{display:none}.emoji-picker .emoji-item{align-items:center;box-sizing:border-box;cursor:pointer;display:flex;height:var(--emoji-size);justify-content:center;line-height:var(--emoji-size);margin:.2em;width:var(--emoji-size)}.emoji-picker .emoji-item .emoji-picker-emoji.-custom{--_still_image-label-scale:0.5;height:var(--emoji-size);max-height:var(--emoji-size);max-width:var(--emoji-size);-o-object-fit:contain;object-fit:contain;width:var(--emoji-size)}.emoji-picker .emoji-item .emoji-picker-emoji.-unicode{font-size:1.6em;overflow:hidden}.input.emoji-input{display:flex;flex-direction:column;padding:0;position:relative}.input.emoji-input .emoji-picker-icon{cursor:pointer;font-size:1.3em;line-height:24px;margin:.2em .25em;position:absolute;right:0;top:0}.input.emoji-input .emoji-picker-icon:hover i{color:var(--text)}.input.emoji-input .emoji-picker-panel{margin-top:2px;position:absolute;z-index:20}.input.emoji-input .emoji-picker-panel.hide{display:none}.input.emoji-input input,.input.emoji-input textarea{background:none!important;border:none;box-shadow:none;color:inherit;flex:1 0 auto;outline:none}.input.emoji-input.with-picker input{padding-right:30px}.input.emoji-input .hidden-overlay{bottom:0;color:red;left:0;opacity:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.input.emoji-input .hidden-overlay .caret{border:1px solid red;margin-right:calc(-1ch - 1px);width:0}.autocomplete-panel{position:absolute}.autocomplete-item.menu-item{display:flex;padding-bottom:0;padding-top:0}.autocomplete-item.menu-item .image{line-height:var(--__line-height);margin-right:var(--__horizontal-gap);text-align:center}.autocomplete-item.menu-item .image,.autocomplete-item.menu-item .image img{height:calc(var(--__line-height) + var(--__vertical-gap)*2);width:calc(var(--__line-height) + var(--__vertical-gap)*2)}.autocomplete-item.menu-item .image img{-o-object-fit:contain;object-fit:contain}.autocomplete-item.menu-item .image span{font-size:var(--__line-height);line-height:var(--__line-height)}.autocomplete-item.menu-item .label{display:flex;flex-direction:column;justify-content:center;margin:0 .1em 0 .2em}.autocomplete-item.menu-item .label .displayText{line-height:1.5}.autocomplete-item.menu-item .label .detailText{font-size:9px;line-height:9px}label.Select{padding:0}label.Select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:none;color:var(--text);font-family:var(--font);font-size:1em;height:2em;line-height:16px;margin:0;padding:0 2em 0 .2em;width:100%;z-index:1}label.Select .select-down-icon{bottom:0;font-family:var(--font);height:100%;line-height:2;pointer-events:none;position:absolute;right:5px;top:0;width:.875em;z-index:0}.poll-form{display:flex;flex-direction:column;padding:0 .5em .5em}.poll-form .add-option{align-self:flex-start;padding-left:.1em;padding-top:.25em}.poll-form .poll-option{align-items:baseline;display:flex;justify-content:space-between;margin-bottom:.25em}.poll-form .input-container{width:100%}.poll-form .input-container input{padding-right:2.5em;width:100%}.poll-form .delete-option{margin-left:-1.5em;width:1.5em;z-index:1}.poll-form .poll-type-expiry{display:flex;margin-top:.5em;width:100%}.poll-form .poll-type{flex:1 1 60%;margin-right:.75em}.poll-form .poll-type .poll-type-select{padding-right:.75em}.poll-form .poll-expiry{display:flex}.poll-form .poll-expiry .expiry-amount{text-align:right;width:3em}.Flash{display:inline-block;position:relative}.Flash,.Flash .placeholder,.Flash .player{height:100%;width:100%}.Flash .placeholder{align-items:center;background:var(--bg);color:var(--link);display:flex;justify-content:center}.Flash .hider{top:0}.Flash .label{word-wrap:normal;flex:1 1 0;line-height:1.2;text-align:center;white-space:normal}.Flash .hidden{display:none;visibility:"hidden"}.Attachment{align-self:flex-start;border-color:var(--border);border-radius:var(--roundness);border-style:solid;border-width:1px;display:inline-flex;flex-direction:column;height:100%;line-height:0;position:relative}.Attachment .attachment-wrapper{flex:1 1 auto;height:100%;overflow:hidden;position:relative}.Attachment .description-container{display:flex;flex:0 1 0;padding-top:.5em;z-index:1}.Attachment .description-container p{flex:1;line-height:1.5;margin:0;overflow:hidden;padding:.5em;text-align:center;text-overflow:ellipsis;white-space:nowrap}.Attachment .description-container.-static{background:var(--popover);bottom:0;box-shadow:var(--popupShadow);left:0;padding-top:0;position:absolute;right:0}.Attachment .description-field{flex:1;min-width:0}.Attachment .audio-container,.Attachment .flash-container,.Attachment .image-container,.Attachment .oembed-container,.Attachment .placeholder-container,.Attachment .video-container{display:flex;height:100%;justify-content:center;width:100%}.Attachment .image-container .image{height:100%;width:100%}.Attachment .flash-container .flash,.Attachment .flash-container video,.Attachment .video-container .flash,.Attachment .video-container video{align-self:center;height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.Attachment .video-container{background:transparent;border:none;color:inherit;outline:none}.Attachment .audio-container{align-items:flex-end;display:flex}.Attachment .audio-container audio{height:100%;width:100%}.Attachment .placeholder-container{align-items:center;display:flex;flex-direction:column;justify-content:center;padding-top:.5em}.Attachment .play-icon{color:hsla(0,0%,100%,.75);font-size:64px;left:calc(50% - 32px);position:absolute;text-shadow:0 0 2px rgba(0,0,0,.4);top:calc(50% - 32px)}.Attachment .play-icon:before{margin:0}.Attachment .attachment-buttons{display:flex;margin-right:.5em;margin-top:.5em;position:absolute;right:0;top:0;z-index:1}.Attachment .attachment-buttons .attachment-button{border-radius:var(--roundness);font-size:1.25em;height:2em;margin-left:.5em;padding:0;text-align:center;width:2em}.Attachment.-contain-fit canvas,.Attachment.-contain-fit img{-o-object-fit:contain;object-fit:contain}.Attachment.-cover-fit canvas,.Attachment.-cover-fit img{-o-object-fit:cover;object-fit:cover}.Attachment .oembed-container{display:flex;flex:1 0 100%;line-height:1.2em;margin-right:15px;width:100%}.Attachment .oembed-container img{width:100%}.Attachment .oembed-container .image{flex:1}.Attachment .oembed-container .image img{border:0;border-radius:5px;height:100%;-o-object-fit:cover;object-fit:cover}.Attachment .oembed-container .text{flex:2;margin:8px;word-break:break-all}.Attachment .oembed-container .text h1{font-size:1rem;margin:0}.Attachment.-size-small .play-icon{zoom:.5;opacity:.7}.Attachment.-size-small .attachment-buttons{zoom:.7;opacity:.5}.Attachment.-editable{padding:.5em}.Attachment.-editable .attachment-buttons,.Attachment.-editable .description-container{margin:0}.Attachment.-placeholder{color:var(--link);display:inline-block;height:auto;line-height:1.5;overflow:hidden;white-space:nowrap}.Attachment.-placeholder:not(.-editable){border:none}.Attachment.-placeholder.-editable{align-items:baseline;display:flex;flex-direction:row}.Attachment.-placeholder.-editable .attachment-buttons,.Attachment.-placeholder.-editable .description-container{margin:0;padding:0;position:relative}.Attachment.-placeholder.-editable .description-container{flex:1;padding-left:.5em}.Attachment.-placeholder.-editable .attachment-buttons{align-self:center;order:99}.Attachment.-placeholder a{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis}.Attachment.-placeholder svg{color:inherit}.Attachment.-loading{cursor:progress}.Attachment.-compact .placeholder-container{padding-bottom:.5em}.Gallery .gallery-rows{display:flex;flex-direction:column}.Gallery .gallery-row{flex-grow:1;height:0;position:relative;width:100%}.Gallery .gallery-row .gallery-row-inner{align-content:stretch;bottom:0;display:flex;flex-flow:row wrap;left:0;position:absolute;right:0;top:0}.Gallery .gallery-row .gallery-row-inner .gallery-item{box-sizing:border-box;flex-grow:1;height:100%;margin:0 .5em 0 0;min-width:2em}.Gallery .gallery-row .gallery-row-inner .gallery-item:last-child{margin:0}.Gallery .gallery-row .gallery-row-inner.-grid{grid-gap:.5em;display:grid;grid-template-columns:repeat(auto-fill,minmax(15em,1fr));height:auto;position:relative;width:100%}.Gallery .gallery-row .gallery-row-inner.-grid .gallery-item{height:200px;margin:0}.Gallery .gallery-row.-grid,.Gallery .gallery-row.-minimal{height:auto}.Gallery .gallery-row.-grid .gallery-row-inner,.Gallery .gallery-row.-minimal .gallery-row-inner{position:relative}.Gallery .gallery-row:not(:first-child){margin-top:.5em}.Gallery.-long .gallery-rows{-webkit-mask:linear-gradient(0deg,#fff,transparent) bottom/100% 70px no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff,transparent) bottom/100% 70px no-repeat,linear-gradient(0deg,#fff,#fff);mask-composite:xor;-webkit-mask-composite:xor;mask-composite:exclude;max-height:25em;overflow:hidden}.Gallery .many-attachments-text{line-height:2;text-align:center}.Gallery .many-attachments-buttons{display:flex}.Gallery .many-attachments-button{display:flex;flex:1;justify-content:center;line-height:2}.Gallery .many-attachments-button button{padding:0 2em}.Avatar{--_avatarShadowBox:var(--shadow);--_avatarShadowFilter:var(--shadowFilter);--_avatarShadowInset:var(--shadowInset);--_still-image-label-visibility:hidden;display:inline-block;height:48px;position:relative;width:48px}.Avatar.-compact{border-radius:var(--roundness);height:32px;width:32px}.Avatar .avatar{border-radius:var(--roundness);box-shadow:var(--_avatarShadowBox);height:100%;width:100%}.Avatar .avatar.-better-shadow{box-shadow:var(--_avatarShadowInset);filter:var(--_avatarShadowFilter)}.Avatar .avatar.-animated:before{display:none}.Avatar .avatar.-compact{border-radius:var(--roundness)}.Avatar .avatar.-placeholder{background-color:var(--background)}.Avatar img{height:100%;width:100%}.Avatar .actor-type-indicator{background:hsla(0,0%,50%,.5);border-radius:var(--roundness);bottom:0;color:#fff;margin:-.2em;padding:.2em;position:absolute;right:0}.MentionLink{display:inline;position:relative;white-space:normal;word-break:normal}.MentionLink .new,.MentionLink .original{border-radius:2px;display:inline}.MentionLink .mention-avatar{border-radius:var(--roundness);height:1.5em;margin-right:.2em;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:1.5em}.MentionLink .full{word-wrap:normal;display:inline-block;height:100%;left:0;margin-top:.25em;opacity:0;padding:.5em;pointer-events:none;position:absolute;top:100%;transition:opacity .2s ease;-webkit-user-select:all;-moz-user-select:all;user-select:all;white-space:nowrap;z-index:1}.MentionLink .short.-with-tooltip,.MentionLink .you{-webkit-user-select:none;-moz-user-select:none;user-select:none}.MentionLink .full,.MentionLink .short{white-space:nowrap}.MentionLink .shortName{white-space:normal}.MentionLink .new.-you .shortName{font-weight:600}.MentionLink .new.-has-selection{--color:var(--selectionText);--link:var(--selectionText);background-color:var(--selectionBackground)}.MentionLink .new .at{color:var(--link);display:inline-block;line-height:1;margin:0;opacity:.8;padding:0 .1em;vertical-align:-25%}.MentionLink .new.-striped .shortName{background-image:repeating-linear-gradient(135deg,var(--____highlight-tintColor),var(--____highlight-tintColor) 5px,var(--____highlight-tintColor2) 5px,var(--____highlight-tintColor2) 10px)}.MentionLink .new.-solid .shortName{background-image:linear-gradient(var(--____highlight-tintColor2),var(--____highlight-tintColor2))}.MentionLink .new.-side .shortName{box-shadow:0 -5px 3px -4px inset var(--____highlight-solidColor)}.MentionLink .serverName.-faded{color:var(--linkFaint)}.mention-link-popover{max-height:20rem;max-width:70ch;overflow:hidden}.MentionsLine{word-break:break-all}.MentionsLine .mention-link:not(:first-child):before{content:" "}.MentionsLine .showMoreLess{color:var(--link);margin-left:.5em;white-space:normal}.HashtagLink{color:var(--link);display:inline-block;position:relative;white-space:normal}.RichContent{font-family:var(--font)}.RichContent.-faint{--text:var(--textFaint)!important;--link:var(--linkFaint)!important;--funtextGreentext:var(--funtextGreentextFaint)!important;--funtextCyantext:var(--funtextCyantextFaint)!important}.RichContent blockquote{border-left:.2em solid var(--textFaint);font-style:italic;margin:.2em 0 .2em .2em;padding-left:1em}.RichContent pre{overflow:auto}.RichContent code,.RichContent kbd,.RichContent pre,.RichContent samp,.RichContent var{font-family:var(--monoFont)}.RichContent p{margin:0 0 1em}.RichContent p:last-child{margin:0}.RichContent h1{font-size:1.1em;line-height:1.2em;margin:1.4em 0}.RichContent h2{font-size:1.1em;margin:1em 0}.RichContent h3{font-size:1em;margin:1.2em 0}.RichContent h4{margin:1.1em 0}.RichContent .emoji,.RichContent .img{display:inline-block}.RichContent .emoji{height:var(--emoji-size,32px);width:var(--emoji-size,32px)}.RichContent .img,.RichContent video{max-height:400px;max-width:100%;-o-object-fit:contain;object-fit:contain;vertical-align:middle}.RichContent .greentext{color:var(--funtextGreentext)}.RichContent .cyantext{color:var(--funtextCyantext)}a .RichContent{color:var(--link)!important}.poll .votes{display:flex;flex-direction:column;margin:0 0 .5em}.poll .poll-option{margin:.75em .5em}.poll .poll-option .input{line-height:inherit}.poll .option-result{color:var(--textLight);display:flex;flex-direction:row;height:100%;position:relative}.poll .option-result-label{align-items:center;display:flex;padding:.1em .25em;word-break:break-word;z-index:1}.poll .result-percentage{flex-shrink:0;width:3.5em}.poll .result-fill{border-radius:var(--roundness);height:100%;left:0;position:absolute;top:0;transition:width .5s}.poll .option-vote{align-items:center;display:flex}.poll input{width:3.5em}.poll .footer{align-items:center;display:flex}.poll.loading *{cursor:progress}.poll .poll-vote-button{margin-right:.5em;padding:0 .5em}.poll .poll-checkbox{display:none}.StatusBody{display:flex;flex-direction:column}.StatusBody .emoji{--_still_image-label-scale:0.5}.StatusBody .attachments{margin-top:.5em}.StatusBody .summary,.StatusBody .text{word-wrap:break-word;line-height:var(--post-line-height);overflow-wrap:break-word;white-space:pre-wrap;word-break:break-word}.StatusBody .summary{display:block;font-style:italic;padding-bottom:.5em}.StatusBody .text.-single-line{height:1.4em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.StatusBody .summary-wrapper{border-color:var(--border);border-style:solid;border-width:0 0 1px;flex-grow:0;margin-bottom:.5em}.StatusBody .summary-wrapper.-tall{position:relative}.StatusBody .summary-wrapper.-tall .summary{max-height:2em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.StatusBody .text-wrapper{display:flex;flex-flow:column nowrap}.StatusBody .text-wrapper.-tall-status{height:220px;overflow-x:hidden;overflow-y:hidden;position:relative;z-index:1}.StatusBody .text-wrapper.-tall-status .media-body{-webkit-mask:linear-gradient(0deg,#fff,transparent) bottom/100% 70px no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff,transparent) bottom/100% 70px no-repeat,linear-gradient(0deg,#fff,#fff);mask-composite:xor;-webkit-mask-composite:xor;mask-composite:exclude;min-height:0}.StatusBody .cw-status-hider,.StatusBody .status-unhider,.StatusBody .tall-status-hider,.StatusBody .tall-subject-hider{display:inline-block;text-align:center;width:100%;word-break:break-all}.StatusBody .tall-status-hider{height:70px;line-height:110px;margin-top:150px;position:absolute;z-index:2}.StatusBody .tall-subject-hider{padding-bottom:.5em}.StatusBody .cw-status-hider,.StatusBody .status-unhider{word-break:break-all}.StatusBody .cw-status-hider svg,.StatusBody .status-unhider svg{color:inherit}.StatusBody.-compact{--emoji-size:16px;align-items:top;flex-direction:row}.StatusBody.-compact .attachments,.StatusBody.-compact .body{max-height:3.25em}.StatusBody.-compact .body{flex:5 1 auto;mask-composite:xor;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-image:linear-gradient(180deg,#fff 2em,transparent 3em);mask-image:linear-gradient(180deg,#fff 2em,transparent 3em);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-repeat:repeat-x,repeat;mask-repeat:repeat-x,repeat;-webkit-mask-size:auto 3.5em,auto auto;mask-size:auto 3.5em,auto auto;min-width:5em;overflow:hidden;white-space:normal}.StatusBody.-compact .attachments{flex:1 1 0;height:100%;margin-left:.5em;margin-top:0;min-width:5em}.StatusBody.-compact .summary-wrapper{border:none;display:inline-block;line-height:inherit;margin:0}.StatusBody.-compact .summary-wrapper .summary:after{content:": "}.StatusBody.-compact .text-wrapper{display:inline-block}.link-preview-card{border-color:var(--border);border-radius:var(--roundness);border-style:solid;border-width:1px;color:var(--text);cursor:pointer;display:flex;flex-direction:row;margin-top:.5em;overflow:hidden}.link-preview-card .card-image{flex-shrink:0;max-width:25%;width:120px}.link-preview-card .card-image img{border-radius:var(--roundness);height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.link-preview-card .card-content{display:flex;flex-direction:column;margin:.5em;max-height:100%}.link-preview-card .card-host{font-size:.85em}.link-preview-card .card-description{line-height:1.2em;margin:.5em 0 0;max-height:calc(3.6em - 1px);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.link-preview-card .nsfw-alert{margin:2em 0}.StatusContent{flex:1;min-width:0}.post-status-form{position:relative}.post-status-form .attachments{margin-bottom:.5em}.post-status-form .form-bottom{display:flex;height:2.5em;justify-content:space-between;padding:.5em}.post-status-form .form-bottom button{width:10em}.post-status-form .form-bottom p{display:flex;margin:.35em;padding:.35em}.post-status-form .form-bottom-left{display:flex;flex:1;margin-right:7px;max-width:10em;padding-right:7px}.post-status-form .preview-heading{display:flex;padding-left:.5em}.post-status-form .preview-toggle{cursor:pointer;flex:1;-webkit-user-select:none;-moz-user-select:none;user-select:none}.post-status-form .preview-toggle:hover{text-decoration:underline}.post-status-form .preview-toggle i,.post-status-form .preview-toggle svg{font-size:.8em;margin-left:.2em;transform:rotate(90deg)}.post-status-form .preview-container{margin-bottom:1em}.post-status-form .preview-error{color:var(--textFaint);font-style:italic}.post-status-form .preview-status{border:1px solid var(--border);border-radius:var(--roundness);margin:0;padding:.5em}.post-status-form .reply-or-quote-selector{margin-bottom:.5em}.post-status-form .text-format .only-format{color:var(--textFaint)}.post-status-form .visibility-tray{align-items:baseline;display:flex;justify-content:space-between;padding-top:5px}.post-status-form .visibility-notice.edit-warning>:first-child{margin-top:0}.post-status-form .visibility-notice.edit-warning>:last-child{margin-bottom:0}.post-status-form .media-upload-icon{justify-content:left;order:1}.post-status-form .emoji-icon{justify-content:center;order:2}.post-status-form .poll-icon{justify-content:right;order:3}.post-status-form .emoji-icon,.post-status-form .media-upload-icon,.post-status-form .poll-icon{align-items:center;display:flex;flex:1;font-size:1.85em;line-height:1.1;padding:0 .1em}.post-status-form .error{text-align:center}.post-status-form .media-upload-wrapper{margin-bottom:.5em;margin-right:.2em;width:18em}.post-status-form .media-upload-wrapper img,.post-status-form .media-upload-wrapper video{max-height:10em;-o-object-fit:contain;object-fit:contain}.post-status-form .media-upload-wrapper .video{max-height:10em}.post-status-form .media-upload-wrapper input{flex:1;width:100%}.post-status-form .status-input-wrapper{display:flex;flex-direction:column;position:relative;width:100%}.post-status-form .btn[disabled]{cursor:not-allowed}.post-status-form form{display:flex;flex-direction:column;margin:.6em;position:relative}.post-status-form .form-group{display:flex;flex-direction:column;line-height:1.85;padding:.25em .5em .5em}.post-status-form .input.form-post-body{background:transparent;box-sizing:content-box;height:calc(var(--post-line-height)*1em);min-height:calc(var(--post-line-height)*1em);overflow:hidden;padding-bottom:calc(var(--_padding) + var(--post-line-height)*1em);resize:none;transition:min-height .2s .1s}.post-status-form .input.form-post-body.scrollable-form{overflow-y:auto}.post-status-form .main-input{position:relative}.post-status-form .character-counter{bottom:0;margin:0 .5em;padding:0;position:absolute;right:0}.post-status-form .character-counter.error{color:var(--cRed)}@keyframes fade-in{0%{opacity:0}to{opacity:.6}}@keyframes fade-out{0%{opacity:.6}to{opacity:0}}.post-status-form .drop-indicator{align-items:center;background-color:var(--bg);border:2px dashed var(--text);border-radius:var(--roundness);color:var(--text);display:flex;font-size:5em;height:100%;justify-content:center;opacity:.6;position:absolute;width:100%}.remote-follow{max-width:220px}.remote-follow .remote-button{min-height:2em;width:100%}.dark-overlay:before{background:rgba(27,31,35,.5);bottom:0;content:" ";left:0;right:0;z-index:2000}.dark-overlay:before,.dialog-modal.panel{cursor:default;display:block;position:fixed;top:0}.dialog-modal.panel{left:50%;margin:15vh auto;max-height:80vh;max-width:90vw;transform:translateX(-50%);z-index:2001}.dialog-modal.panel .dialog-modal-heading .title{text-align:center}.dialog-modal.panel .dialog-modal-content{margin:0;padding:1rem;white-space:normal}.dialog-modal.panel .dialog-modal-footer{border-top:1px solid var(--border);display:flex;justify-content:flex-end;margin:0;padding:.5em}.dialog-modal.panel .dialog-modal-footer button{margin-left:.5rem;width:auto}.moderation-tools-popover{height:100%}.moderation-tools-popover .trigger{display:flex!important;height:100%}.moderation-tools-button i,.moderation-tools-button svg{font-size:.8em}.AccountActions .ellipsis-button{margin:-.5em 0;padding:.5em 0;text-align:center;width:2.5em}.user-note{display:flex;flex-direction:column}.user-note .heading{align-items:center;display:flex;flex-direction:row;justify-content:space-between;margin-bottom:.75em}.user-note .heading .btn{min-width:95px}.user-note .heading .buttons{display:flex;flex-direction:row;justify-content:right}.user-note .heading .buttons .btn{margin-left:.5em}.user-note .note-text{align-self:stretch}.user-note .note-text.-blank{color:var(--textFaint);font-style:italic}.user-card{position:relative;z-index:1}.user-card:hover{--_still-image-img-visibility:visible;--_still-image-canvas-visibility:hidden;--_still-image-label-visibility:hidden}.user-card .panel-heading{align-items:stretch;background:transparent;box-shadow:none;flex-direction:column;padding:.5em 0;position:relative;text-align:center}.user-card .background-image{background-color:var(--profileBg);background-size:cover;border-bottom-left-radius:calc(var(--__roundnessBottom, --panelRadius) - 1px);border-bottom-right-radius:calc(var(--__roundnessBottom, --panelRadius) - 1px);border-top-left-radius:calc(var(--__roundnessTop, --panelRadius) - 1px);border-top-right-radius:calc(var(--__roundnessTop, --panelRadius) - 1px);bottom:0;left:0;-webkit-mask:linear-gradient(0deg,#fff,transparent) bottom no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff,transparent) bottom no-repeat,linear-gradient(0deg,#fff,#fff);mask-composite:xor;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-size:100% 60%;mask-size:100% 60%;position:absolute;right:0;top:0;z-index:-2}.user-card .background-image.hide-bio{-webkit-mask-size:100% 40px;mask-size:100% 40px}.user-card-bio{display:block;line-height:1.3;margin:0;padding:1em;text-align:center}.user-card-bio img{max-height:400px;max-width:100%;-o-object-fit:contain;object-fit:contain;vertical-align:middle}.user-card.-rounded-t{--__roundnessTop:var(--roundness);--__roundnessBottom:0;border-top-left-radius:var(--roundness);border-top-right-radius:var(--roundness)}.user-card.-popover,.user-card.-rounded{--__roundnessTop:var(--roundness);--__roundnessBottom:var(--roundness);border-radius:var(--roundness)}.user-card.-bordered{border-color:var(--border);border-style:solid;border-width:1px}.user-info{padding:0 26px}.user-info .container{align-items:flex-start;display:flex;max-height:56px;min-width:0;padding:16px 0 6px}.user-info .container>*{min-width:0}.user-info .container>a{display:flex;vertical-align:middle}.user-info .container .Avatar{--_avatarShadowBox:var(--avatarShadow);--_avatarShadowFilter:var(--avatarShadowFilter);--_avatarShadowInset:var(--avatarShadowInset);height:56px;-o-object-fit:cover;object-fit:cover;width:56px}.user-info-avatar{cursor:pointer;position:relative}.user-info-avatar.-overlay{align-items:center;background-color:rgba(0,0,0,.3);border-radius:var(--roundness);bottom:0;display:flex;justify-content:center;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease}.user-info-avatar.-overlay svg{color:#fff}.user-info-avatar:hover .user-info-avatar.-overlay{opacity:1}.user-info .edit-profile-button,.user-info .external-link-button{cursor:pointer;margin:-.5em 0;padding:.5em 0;text-align:center;width:2.5em}.user-info .edit-profile-button:not(:hover) .icon,.user-info .external-link-button:not(:hover) .icon{color:var(--lightText)}.user-info .bottom-line{align-items:baseline;font-size:1.1em;font-weight:light}.user-info .bottom-line .lock-icon{margin-left:.5em}.user-info .bottom-line .user-screen-name{color:var(--text);flex:0 1 auto;min-width:1px;overflow:hidden;text-overflow:ellipsis}.user-info .bottom-line .dailyAvg{color:var(--text);flex:0 0 auto;font-size:.7em;margin-left:1em;min-width:1px}.user-info .bottom-line .user-role{flex:none}.user-info .user-summary{--emoji-size:1.7em;display:block;flex:1 1 0;line-height:2em;margin-left:.6em;text-align:left;text-overflow:ellipsis;white-space:nowrap;z-index:1}.user-info .user-summary .RichContent{--link:var(--text)!important}.user-info .user-summary .bottom-line,.user-info .user-summary .top-line{display:flex}.user-info .user-name{flex:1 1 auto;font-size:1.1em;margin-right:1em;overflow:hidden;text-overflow:ellipsis}.user-info .user-meta{align-items:baseline;display:flex;flex-wrap:wrap;line-height:22px;margin-bottom:.15em}.user-info .user-meta .following{flex:1 0 auto;margin:0 0 .25em;text-align:left}.user-info .user-meta .highlighter{align-self:start;display:flex;flex:0 1 auto;flex-wrap:wrap;margin-right:-.5em}.user-info .user-meta .highlighter .userHighlightCl{flex:1 0 auto;padding:2px 10px}.user-info .user-meta .highlighter .userHighlightSel{flex:1 0 auto;padding-bottom:0;padding-top:0}.user-info .user-meta .highlighter .userHighlightText{flex:1 0 auto;width:70px}.user-info .user-meta .highlighter .userHighlightCl,.user-info .user-meta .highlighter .userHighlightSel,.user-info .user-meta .highlighter .userHighlightText{margin-bottom:.25em;margin-right:.5em;vertical-align:top}.user-info .user-interactions{display:flex;flex-flow:row wrap;margin-right:-.75em;position:relative}.user-info .user-interactions>*{margin:0 .75em .6em 0;min-width:95px;white-space:nowrap}.user-info .user-interactions button{margin:0}.user-info .user-note{margin:0 .75em .6em 0}.sidebar .edit-profile-button{display:none}.user-counts{display:flex;flex-wrap:wrap;justify-content:space-between;line-height:16px;padding:.5em 1.5em 0;text-align:center}.user-count{flex:1 0 auto;margin:0 .5em;padding:.5em 0}.user-count h5{font-size:1em;font-weight:bolder;margin:0 0 .25em}.user-count a{text-decoration:none}.mute-expiry{display:flex;flex-direction:row}.user-panel .panel{-webkit-backdrop-filter:var(--backdrop-filter);backdrop-filter:var(--backdrop-filter);background:var(--background)}.user-panel .signed-in{overflow:visible;z-index:10}.NavigationEntry.menu-item{--__line-height:2.5em;--__horizontal-gap:0.5em;--__vertical-gap:0.4em;align-items:baseline;display:flex;padding:0}.NavigationEntry.menu-item[aria-expanded]{padding-right:var(--__horizontal-gap)}.NavigationEntry.menu-item .main-link{box-sizing:border-box;flex:1;line-height:var(--__line-height);padding:var(--__vertical-gap) var(--__horizontal-gap)}.NavigationEntry.menu-item .menu-icon{line-height:var(--__line-height);margin-right:var(--__horizontal-gap);padding:0;width:var(--__line-height)}.NavigationEntry.menu-item .timelines-chevron{line-height:var(--__line-height);margin-right:0;padding:0;width:var(--__line-height)}.NavigationEntry.menu-item .extra-button{line-height:var(--__line-height);padding:0;text-align:center;width:var(--__line-height)}.NavigationEntry.menu-item .extra-button:last-child{margin-right:calc(var(--__horizontal-gap)*-1)}.NavigationEntry.menu-item .badge{margin:0 var(--__horizontal-gap)}.NavigationPins{display:flex;flex-wrap:wrap;height:100%;overflow:hidden}.NavigationPins .pinned-item{box-sizing:border-box;flex:1 0 3em;height:100%;min-width:2em;overflow:visible;position:relative;text-align:center}.NavigationPins .pinned-item .iconLetter,.NavigationPins .pinned-item .svg-inline--fa{margin:0}.NavigationPins .pinned-item.toggled{border-bottom:4px solid;margin-bottom:-4px}.NavPanel .panel{box-shadow:var(--shadow);overflow:hidden}.NavPanel ul{list-style:none;margin:0;padding:0}.NavPanel .navigation-chevron{margin-right:.8em}.NavPanel .navigation-chevron,.NavPanel .timelines-chevron{font-size:1.1em;margin-left:.8em}.NavPanel .timelines-background{padding:0 0 0 .6em}.NavPanel .nav-panel-heading{--panel-heading-height-padding:0px}.features-panel li{line-height:24px}.who-to-follow *{vertical-align:middle}.who-to-follow img{height:32px;width:32px}.who-to-follow{margin:0;padding:0 1em}.who-to-follow-items{margin:1em 0;overflow:hidden;padding:0;text-overflow:ellipsis;white-space:nowrap}.who-to-follow-more{margin:1em 0;padding:0;text-align:center}.floating-shout{bottom:.5em;max-width:25em;position:fixed;z-index:var(--ZI_popovers)}.floating-shout.-left{left:.5em}.floating-shout:not(.-left){right:.5em}.shout-panel .shout-heading{cursor:pointer}.shout-panel .shout-heading .icon{color:var(--text);margin-right:.5em}.shout-panel .shout-heading .title{align-items:center;display:flex;justify-content:space-between}.shout-panel .shout-window{max-height:20em;overflow-x:hidden;overflow-y:auto}.shout-panel .shout-window-container{height:100%}.shout-panel .shout-message{display:flex;padding:.2em .5em}.shout-panel .shout-avatar img{border-radius:var(--roundness);height:24px;margin-right:.5em;margin-top:.25em;width:24px}.shout-panel .shout-input{display:flex}.shout-panel .shout-input textarea{flex:1;margin:.6em;min-height:3.5em;resize:none}.shout-panel .shout-panel .title{display:flex;justify-content:space-between}@keyframes media-fadein{0%{opacity:0}to{opacity:1}}.media-modal-view .modal-image-container{max-height:100%;max-width:100%;overflow:hidden}.media-modal-view .modal-image-container,.media-modal-view .modal-image-container-inner{align-items:center;display:flex;flex-direction:column;flex-grow:1;height:100%;justify-content:center;width:100%}.media-modal-view .counter,.media-modal-view .description{color:#fff;margin-top:1em;padding:.2em 2em;text-shadow:0 0 10px #000,0 0 10px #000}.media-modal-view .description{flex:0 0 auto;max-height:9.5em;max-width:500px;min-height:1em;overflow-y:auto;word-break:break-all}.media-modal-view .modal-image{animation:media-fadein .1s cubic-bezier(.7,0,1,.6);image-orientation:from-image;max-height:100%;max-width:100%}.media-modal-view .modal-image.loading{opacity:.5}.media-modal-view .loading-spinner{align-items:center;display:flex;height:100%;justify-content:center;pointer-events:none;position:absolute;width:100%}.media-modal-view .loading-spinner svg{color:#fff}.media-modal-view .modal-view-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;box-shadow:none;cursor:pointer;height:3em;opacity:0;overflow:visible;padding:0;transition:opacity 333ms cubic-bezier(.4,0,.22,1);width:3em}.media-modal-view .modal-view-button .button-icon{background-color:rgba(0,0,0,.3);color:#fff;font-size:1rem;height:3em;line-height:3em;position:absolute;text-align:center;width:3em}.media-modal-view .modal-view-button-arrow{display:block;height:3em;margin-top:1.5em;position:absolute;top:50%;width:3em}.media-modal-view .modal-view-button-arrow .arrow-icon{background-color:rgba(0,0,0,.3);color:#fff;line-height:3em;position:absolute;text-align:center;top:0}.media-modal-view .modal-view-button-arrow--prev{left:0}.media-modal-view .modal-view-button-arrow--prev .arrow-icon{left:.5em}.media-modal-view .modal-view-button-arrow--next{right:0}.media-modal-view .modal-view-button-arrow--next .arrow-icon{right:.5em}.media-modal-view .modal-view-button-hide{position:absolute;right:0;top:0}.media-modal-view .modal-view-button-hide .button-icon{right:.5em;top:.5em}.modal-view.media-modal-view{flex-direction:column;overflow:hidden;z-index:var(--ZI_media_modal)}.modal-view.media-modal-view .modal-view-button-arrow,.modal-view.media-modal-view .modal-view-button-hide{opacity:.75}.modal-view.media-modal-view .modal-view-button-arrow:focus,.modal-view.media-modal-view .modal-view-button-arrow:hover,.modal-view.media-modal-view .modal-view-button-hide:focus,.modal-view.media-modal-view .modal-view-button-hide:hover{box-shadow:none;outline:none}.modal-view.media-modal-view .modal-view-button-arrow:hover,.modal-view.media-modal-view .modal-view-button-hide:hover{opacity:1}.side-drawer-container{align-items:stretch;display:flex;height:100%;left:0;position:fixed;top:0;transition-duration:0s;transition-property:transform;width:100%;z-index:var(--ZI_navbar)}.side-drawer-container-open{transform:translate(0)}.side-drawer-container-closed{transform:translate(-100%);transition-delay:.35s}.side-drawer-darken{background-color:rgba(0,0,0,.5);height:100vh;left:0;position:fixed;top:0;transition:.35s;transition-property:background-color;width:100vw;z-index:-1}.side-drawer-darken-closed{background-color:transparent}.side-drawer-click-outside{flex:1 1 100%}.side-drawer{background-color:var(--background);box-shadow:var(--shadow);flex:0 0 80%;margin:0 0 0 -100px;max-width:20em;overflow-x:hidden;padding:0 0 1em 100px;transition:.35s;transition-property:transform;transition-timing-function:cubic-bezier(0,1,.5,1);width:80%}.side-drawer .badge{margin-left:10px}.side-drawer-logo-wrapper{align-items:center;display:flex;padding:.85em}.side-drawer-logo-wrapper img{flex:none;height:50px;margin-right:.85em}.side-drawer-logo-wrapper span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.side-drawer-click-outside-closed{flex:0 0 0}.side-drawer-closed{transform:translate(-100%)}.side-drawer-heading{align-items:stretch;background:transparent;display:flex;flex-direction:column;margin:0;padding:0}.side-drawer ul{border-bottom:1px solid;border-color:var(--border);list-style:none;margin:0;padding:0}.side-drawer ul:last-child{border:0}.side-drawer li{padding:0}.side-drawer li a,.side-drawer li button{box-sizing:border-box;display:block;height:3em;line-height:3em;padding:0 .7em}.MobilePostButton.button-default{align-items:center;border-radius:100%;bottom:1.5em;box-shadow:0 2px 2px rgba(0,0,0,.3),0 4px 6px rgba(0,0,0,.3);display:flex;height:5em;justify-content:center;position:fixed;right:1.5em;transition:transform .35s;transition-timing-function:cubic-bezier(0,1,.5,1);width:5em;z-index:10}.MobilePostButton.hidden{transform:translateY(150%)}.MobilePostButton svg{color:var(--text);font-size:1.5em}@media (min-width:801px){.new-status-button:not(.always-show){display:none}}.ReplyButton{display:flex}.ReplyButton>:first-child{margin:-10px -8px -10px -10px;padding:10px}.ReplyButton .action-counter{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ReplyButton .interactive.-active .svg-inline--fa,.ReplyButton .interactive:hover .svg-inline--fa{color:var(--cBlue)}.ReplyButton .interactive .focus-marker{visibility:hidden}.ReplyButton .interactive:focus:not(:focus-visible,:hover) .focus-marker{visibility:hidden}.ReplyButton .interactive:focus .focus-marker,.ReplyButton .interactive:hover .focus-marker{visibility:visible}.ReplyButton .interactive:focus-visible .focus-marker{visibility:visible}.FavoriteButton{display:flex}.FavoriteButton>:first-child{margin:-10px -8px -10px -10px;padding:10px}.FavoriteButton .action-counter{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.FavoriteButton .interactive .svg-inline--fa{animation-duration:.6s}.FavoriteButton .interactive.-favorited .svg-inline--fa,.FavoriteButton .interactive:hover .svg-inline--fa{color:var(--cOrange)}.FavoriteButton .interactive .focus-marker{visibility:hidden}.FavoriteButton .interactive .active-marker{visibility:visible}.FavoriteButton .interactive:focus:not(:focus-visible,:hover) .focus-marker{visibility:hidden}.FavoriteButton .interactive:focus:not(:focus-visible,:hover) .active-marker{visibility:visible}.FavoriteButton .interactive:focus .focus-marker,.FavoriteButton .interactive:hover .focus-marker{visibility:visible}.FavoriteButton .interactive:focus .active-marker,.FavoriteButton .interactive:hover .active-marker{visibility:hidden}.FavoriteButton .interactive:focus-visible .focus-marker{visibility:visible}.FavoriteButton .interactive:focus-visible .active-marker{visibility:hidden}.ReactButton .reaction-picker-filter{display:flex;padding:.5em}.ReactButton .reaction-picker-filter input{flex:1}.ReactButton .reaction-picker-divider{background-color:var(--border);height:1px;margin:.5em;width:100%}.ReactButton .reaction-picker{align-content:flex-start;display:flex;flex-wrap:wrap;font-size:1.5em;height:9em;-webkit-mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);mask-composite:xor;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-size:100% 20px,100% 20px,auto;mask-size:100% 20px,100% 20px,auto;overflow-y:scroll;padding:.5em;text-align:center;transition:-webkit-mask-size .15s;transition:mask-size .15s;transition:mask-size .15s,-webkit-mask-size .15s;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:10em}.ReactButton .reaction-picker .emoji-button{align-content:center;cursor:pointer;flex-basis:20%;line-height:1.5}.ReactButton .reaction-picker .emoji-button:hover{transform:scale(1.25)}.ReactButton .popover-trigger{margin:-10px;padding:10px}.ReactButton .popover-trigger .focus-marker{visibility:hidden}.ReactButton .popover-trigger:focus:not(:focus-visible,:hover) .focus-marker{visibility:hidden}.ReactButton .popover-trigger:focus .focus-marker,.ReactButton .popover-trigger:hover .focus-marker{visibility:visible}.ReactButton .popover-trigger:focus-visible .focus-marker{visibility:visible}.RetweetButton{display:flex}.RetweetButton>:first-child{margin:-10px -8px -10px -10px;padding:10px}.RetweetButton .action-counter{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.RetweetButton .interactive .svg-inline--fa{animation-duration:.6s}.RetweetButton .interactive.-repeated .svg-inline--fa,.RetweetButton .interactive:hover .svg-inline--fa{color:var(--cGreen)}.RetweetButton .interactive .focus-marker{visibility:hidden}.RetweetButton .interactive .active-marker{visibility:visible}.RetweetButton .interactive:focus:not(:focus-visible,:hover) .focus-marker{visibility:hidden}.RetweetButton .interactive:focus:not(:focus-visible,:hover) .active-marker{visibility:visible}.RetweetButton .interactive:focus .focus-marker,.RetweetButton .interactive:hover .focus-marker{visibility:visible}.RetweetButton .interactive:focus .active-marker,.RetweetButton .interactive:hover .active-marker{visibility:hidden}.RetweetButton .interactive:focus-visible .focus-marker{visibility:visible}.RetweetButton .interactive:focus-visible .active-marker{visibility:hidden}.ExtraButtons .popover-trigger{margin:-10px;padding:10px;position:static}.ExtraButtons .popover-trigger:hover .svg-inline--fa{color:var(--text)}.ExtraButtons .popover-trigger-button{width:auto}.ExtraButtons .popover-trigger-button .focus-marker{visibility:hidden}.ExtraButtons .popover-trigger-button:focus:not(:focus-visible,:hover) .focus-marker{visibility:hidden}.ExtraButtons .popover-trigger-button:focus .focus-marker,.ExtraButtons .popover-trigger-button:hover .focus-marker{visibility:visible}.ExtraButtons .popover-trigger-button:focus-visible .focus-marker{visibility:visible}.avatars{display:flex;flex-wrap:wrap;height:24px;margin:0;padding:0}.avatars .avatars-item{margin:0 0 5px 5px}.avatars .avatars-item:first-child{padding-left:5px}.avatars .avatars-item .avatar-small{border-radius:var(--roundness);height:24px;width:24px}.status-popover.popover{border-color:var(--border);border-style:solid;border-width:1px;font-size:1rem;max-width:95%;min-width:15em}.status-popover.popover .Status.Status{border:none}.status-popover.popover .status-preview-no-content{padding:1em;text-align:center}.status-popover.popover .status-preview-no-content i{font-size:2em}.user-list-popover{--emoji-size:16px;padding:.5em}.user-list-popover .user-list-row{display:flex;flex-direction:row;padding:.25em}.user-list-popover .user-list-row .user-list-names{display:flex;flex-direction:column;margin-left:.5em;min-width:5em}.user-list-popover .user-list-row .user-list-names img{height:1em;width:1em}.user-list-popover .user-list-row .user-list-screen-name{font-size:.65em}.EmojiReactions{--emoji-size:calc(var(--emojiSize, 1.25em)*var(--emojiReactionsScale, 1));display:flex;flex-wrap:wrap;margin-top:.25em}.EmojiReactions .emoji-reaction-container{align-items:stretch;display:flex;margin-right:.5em;margin-top:.5em}.EmojiReactions .emoji-reaction-container .emoji-reaction-popover{padding:0}.EmojiReactions .emoji-reaction-container .emoji-reaction-popover .emoji-reaction-count-button{align-items:center;border-bottom-left-radius:0;border-top-left-radius:0;box-sizing:border-box;display:inline-flex;height:100%;justify-content:center;margin:0;min-width:2em}.EmojiReactions .emoji-reaction-container .emoji-reaction-popover .emoji-reaction-count-button.-picked-reaction{border:1px solid var(--accent);margin-right:-1px}.EmojiReactions .emoji-reaction{align-items:center;border-bottom-right-radius:0;border-top-right-radius:0;box-sizing:border-box;display:flex;justify-content:center;margin:0;padding-left:.5em}.EmojiReactions .emoji-reaction .reaction-emoji{align-items:center;display:flex;height:var(--emoji-size);justify-content:center;line-height:var(--emoji-size);margin-right:.25em;width:var(--emoji-size)}.EmojiReactions .emoji-reaction .reaction-emoji-content{font-size:calc(var(--emoji-size)*.8);height:auto;line-height:inherit;margin:0;max-height:100%;max-width:100%;overflow:hidden;width:auto}.EmojiReactions .emoji-reaction:focus{outline:none}.EmojiReactions .emoji-reaction .svg-inline--fa{color:var(--text)}.EmojiReactions .emoji-reaction.-picked-reaction{border:1px solid var(--accent);margin-left:-1px;margin-right:-1px}.EmojiReactions .emoji-reaction.-picked-reaction .svg-inline--fa{color:var(--accent)}.EmojiReactions .emoji-reaction .focus-marker{visibility:hidden}.EmojiReactions .emoji-reaction .active-marker{visibility:visible}.EmojiReactions .emoji-reaction:focus:not(:focus-visible,:hover) .focus-marker{visibility:hidden}.EmojiReactions .emoji-reaction:focus:not(:focus-visible,:hover) .active-marker{visibility:visible}.EmojiReactions .emoji-reaction:focus .svg-inline--fa,.EmojiReactions .emoji-reaction:hover .svg-inline--fa{color:var(--accent)}.EmojiReactions .emoji-reaction:focus .focus-marker,.EmojiReactions .emoji-reaction:hover .focus-marker{visibility:visible}.EmojiReactions .emoji-reaction:focus .active-marker,.EmojiReactions .emoji-reaction:hover .active-marker{visibility:hidden}.EmojiReactions .emoji-reaction:focus-visible .svg-inline--fa{color:var(--accent)}.EmojiReactions .emoji-reaction:focus-visible .focus-marker{visibility:visible}.EmojiReactions .emoji-reaction:focus-visible .active-marker{visibility:hidden}.EmojiReactions .emoji-reaction-expand{align-items:center;display:flex;justify-content:center;margin-right:.5em;margin-top:.5em;padding:0 .5em}.EmojiReactions .emoji-reaction-expand:hover{text-decoration:underline}.Status{word-wrap:break-word;min-width:0;white-space:normal;word-break:break-word}.Status:hover{--_still-image-img-visibility:visible;--_still-image-canvas-visibility:hidden;--_still-image-label-visibility:hidden}.Status .gravestone{display:flex;padding:var(--status-margin)}.Status .gravestone .deleted-text{align-items:center;margin:.5em 0}.Status .status-container{display:flex;padding:var(--status-margin)}.Status .status-container>*{min-width:0}.Status .status-container.-repeat{padding-top:0}.Status .pin{align-items:center;display:flex;justify-content:flex-end;padding:var(--status-margin) var(--status-margin) 0}._misclick-prevention .Status{pointer-events:none}._misclick-prevention .Status .attachments{cursor:auto;pointer-events:auto}.Status .left-side{margin-right:var(--status-margin)}.Status .right-side{flex:1;min-width:0}.Status .usercard{margin-bottom:var(--status-margin)}.Status .status-username{--_still_image-label-scale:0.25;--emoji-size:14px;flex-shrink:1;font-weight:700;margin-right:.4em;max-width:85%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.Status .status-favicon{height:18px;margin-right:.4em;width:18px}.Status .status-heading{margin-bottom:.5em}.Status .heading-name-row{display:flex;justify-content:space-between;line-height:1.3}.Status .heading-name-row a{display:inline-block;word-break:break-all}.Status .account-name{flex:1 1 0;margin-right:.4em;min-width:1.6em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.Status .heading-left{display:flex;min-width:0}.Status .heading-right{display:flex;flex-shrink:0}.Status .heading-right .button-unstyled{margin:-5px;padding:5px}.Status .heading-right .svg-inline--fa{margin-left:.25em}.Status .glued-label{display:inline-flex;white-space:nowrap}.Status .timeago{margin-right:.2em}.Status .heading-edited-row,.Status .heading-reply-row{align-content:baseline;align-items:stretch;font-size:.85em;line-height:130%;margin-top:.2em;max-width:100%;position:relative}.Status .mentions,.Status .reply-to-no-popover,.Status .reply-to-popover{flex-shrink:0;margin-right:.4em;min-width:0}.Status .reply-glued-label{margin-right:.5em}.Status .reply-to-popover .reply-to:hover:before{border-bottom:1px solid var(--faint);bottom:0;content:"";display:block;pointer-events:none;position:absolute;width:100%}.Status .reply-to-popover .faint-link:hover{text-decoration:none}.Status .reply-to-popover.-strikethrough .reply-to:after{border-bottom:1px solid var(--faint);content:"";display:block;pointer-events:none;position:absolute;top:50%;width:100%}.Status .mentions,.Status .reply-to{position:relative;white-space:nowrap}.Status .mentions-text,.Status .reply-to-text{color:var(--faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.Status .mentions-line{display:inline}.Status .replies{display:flex;flex-wrap:wrap;font-size:.85em;line-height:1.3;margin-top:.25em}.Status .replies>*{margin-right:.4em}.Status .reply-link{height:17px}.Status .repeat-info{padding:.4em var(--status-margin)}.Status .repeat-info .repeat-icon{color:var(--cGreen)}.Status .repeater-avatar{border-radius:var(--roundness);height:20px;margin-left:28px;width:20px}.Status .repeater-name{margin-right:0;text-overflow:ellipsis}.Status .repeater-name .emoji{height:14px;-o-object-fit:contain;object-fit:contain;vertical-align:middle;width:14px}.Status .status-fadein{animation-duration:.4s;animation-name:fadein}@keyframes fadein{0%{opacity:0}to{opacity:1}}.Status .status-actions{display:flex;margin-top:var(--status-margin);position:relative;width:100%}.Status .status-actions>*{flex:1;max-width:4em}.Status .muted{display:flex;flex-wrap:nowrap;height:1.2em;line-height:1.2em;overflow:hidden;padding:.25em .6em;text-overflow:ellipsis}.Status .muted .mute-thread,.Status .muted .mute-words,.Status .muted .status-username{word-wrap:normal;white-space:nowrap;word-break:normal}.Status .muted .mute-words,.Status .muted .status-username{overflow:hidden;text-overflow:ellipsis}.Status .muted .status-username{flex:0 1 auto;font-size:smaller;font-weight:400;margin-right:.2em}.Status .muted .mute-thread{flex:0 0 auto}.Status .muted .mute-words{flex:1 0 5em;margin-left:.2em}.Status .muted .mute-words:before{content:" "}.Status .muted .unmute{display:block;flex:0 0 auto;margin-left:auto}.Status .reply-form{padding-bottom:0;padding-top:0}.Status .reply-body{flex:1}.Status .favs-repeated-users{margin-top:var(--status-margin)}.Status .stats{display:flex;line-height:1em;width:100%}.Status .avatar-row{align-items:center;display:flex;flex:1;overflow:hidden;position:relative}.Status .avatar-row:before{background-color:var(--textFaint);content:"";height:100%;left:0;position:absolute;width:1px}.Status .stat-count{margin-right:var(--status-margin);-webkit-user-select:none;-moz-user-select:none;user-select:none}.Status .stat-count .stat-title{color:var(--textFaint);font-size:.85em;position:relative;text-transform:uppercase}.Status .stat-count .stat-number{color:var(--text);font-size:1.1em;font-weight:bolder;line-height:1em}.Status .stat-count:hover .stat-title{text-decoration:underline}@media (max-width:800px){.Status .repeater-avatar{margin-left:20px}.Status .post-avatar{height:40px;width:40px}.Status .post-avatar.-compact{height:32px;width:32px}}.Status .quoted-status{border:1px solid var(--border);border-radius:var(--roundness);margin-top:.5em}.Status .quoted-status.-unavailable-prompt{padding:.5em}.Status .display-quoted-status-button{margin:.5em}.Status .display-quoted-status-button-icon{color:inherit}.Report .report-content,.Report .report-state{margin:.5em 0 1em}.Report .reported-status{border:1px solid var(--border);border-radius:var(--roundness);display:block;margin:.5em 0;padding:.5em}.Report .reported-status .status-content{pointer-events:none}.Report .reported-status .reported-status-heading{display:flex;justify-content:space-between;margin-bottom:.2em;width:100%}.Report .reported-status .reported-status-name{font-weight:700}.Report .note{margin-bottom:.5em;width:100%}.Notification{word-wrap:break-word;--emoji-size:14px;border-bottom:1px solid;border-color:var(--border);word-break:break-word}.Notification.Status{background-color:transparent!important}.Notification:hover{--_still-image-img-visibility:visible;--_still-image-canvas-visibility:hidden;--_still-image-label-visibility:hidden}.Notification.-muted{display:flex;flex-wrap:nowrap;height:1.2em;line-height:1.2em;overflow:hidden;padding:.25em .6em;text-overflow:ellipsis}.Notification.-muted .mute-thread,.Notification.-muted .mute-words,.Notification.-muted .status-username{word-wrap:normal;white-space:nowrap;word-break:normal}.Notification.-muted .mute-words,.Notification.-muted .status-username{overflow:hidden;text-overflow:ellipsis}.Notification.-muted .status-username{flex:0 1 auto;font-size:smaller;font-weight:400;margin-right:.2em}.Notification.-muted .mute-thread{flex:0 0 auto}.Notification.-muted .mute-words{flex:1 0 5em;margin-left:.2em}.Notification.-muted .mute-words:before{content:" "}.Notification.-muted .unmute{display:block;flex:0 0 auto;margin-left:auto}.Notification .type-icon{margin:0 .1em}.Notification.-type--repeat .type-icon{color:var(--cGreen)}.Notification.-type--follow .type-icon,.Notification.-type--follow-request .type-icon{color:var(--cBlue)}.Notification.-type--like .type-icon{color:var(--cOrange)}.Notification.-type--move .type-icon{color:var(--cBlue)}.ExtraNotifications,.ExtraNotifications .notification{align-items:stretch;display:flex;flex-direction:column;width:100%}.ExtraNotifications .notification{border-bottom:1px solid;border-color:var(--border)}.ExtraNotifications .extra-notification{padding:1em}.ExtraNotifications .icon{margin-right:.5em}.ExtraNotifications .tip{display:inline}.Notifications:not(.minimal){padding-bottom:15em}.Notifications .loadmore-error{color:var(--text)}.Notifications .notification{position:relative}.Notifications .notification .notification-overlay{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0}.Notifications .notification.unseen .notification-overlay{background-image:linear-gradient(135deg,var(--badgeNotification) 4px,transparent 10px)}.notification{box-sizing:border-box}.notification .Status{flex:1}.notification:hover .animated.Avatar canvas{display:none}.notification:hover .animated.Avatar img{visibility:visible}.notification:last-child .Notification{border-bottom:none}.notification .non-mention{display:flex;flex:1;flex-wrap:nowrap;min-width:0;padding:.6em}.notification .non-mention .avatar-container{height:32px;width:32px}.notification .follow-request-accept:hover{color:var(--text)}.notification .follow-request-reject:hover{color:var(--cRed)}.notification .follow-text,.notification .move-text{display:flex;justify-content:space-between;overflow-wrap:break-word;padding:.5em 0}.notification .follow-text .follow-name,.notification .move-text .follow-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.notification time{white-space:nowrap}.notification .notification-right{flex:1;min-width:0;padding-left:.8em}.notification .notification-right .timeago{min-width:3em;text-align:right}.notification .notification-right .timeago-link{margin-right:.2em}.notification .notification-right .expand-icon .svg-inline--fa{margin-left:.25em}.notification .emoji-reaction-emoji{font-size:1.3em;height:1.25em;max-width:1.25em;width:auto}.notification .emoji-reaction-emoji-image{-o-object-fit:contain;object-fit:contain;vertical-align:middle}.notification .notification-details{word-wrap:break-word;display:flex;flex:1 1 0;flex-wrap:nowrap;justify-content:space-between;line-height:var(--post-line-height);min-width:0;overflow:hidden;position:relative;width:100%}.notification .notification-details .name-and-action{flex:1;overflow:hidden;text-overflow:ellipsis}.notification .notification-details .username{font-weight:bolder;max-width:100%;text-overflow:ellipsis;white-space:nowrap}.notification .notification-details .timeago{margin-right:.2em}.notification .notification-details .status-content{margin:0;max-height:300px}.notification .notification-details h1{font-size:1em;line-height:1.5;margin:0 0 .3em;padding:0;word-break:break-all}.notification .notification-details h1 small{font-weight:lighter}.notification .notification-details p{margin:0 0 .3em}.MobileNav{z-index:var(--ZI_navbar)}.MobileNav .mobile-nav{box-sizing:border-box;display:grid;grid-template-columns:2fr auto;grid-template-rows:var(--navbar-height);line-height:var(--navbar-height);width:100%}.MobileNav .mobile-nav a{color:var(--link)}.MobileNav .mobile-inner-nav{align-items:center;display:flex;width:100%}.MobileNav .mobile-nav-button{cursor:pointer;display:inline-block;padding:0 1em;position:relative;text-align:center}.MobileNav .site-name{display:inline-block;padding:0 .3em}.MobileNav .item{display:flex}.MobileNav .mobile-notifications-drawer{-webkit-overflow-scrolling:touch;background:var(--background);box-shadow:var(--shadow);height:100vh;left:0;overflow-x:hidden;position:fixed;top:0;transform:translateX(0);transition-duration:.25s;transition-property:transform;width:100%;z-index:var(--ZI_navbar)}.MobileNav .mobile-notifications-drawer.-closed{box-shadow:none;transform:translateX(100%)}.MobileNav .mobile-notifications-header{align-items:center;box-shadow:var(--shadow);display:flex;height:3.5em;justify-content:space-between;line-height:3.5em;position:absolute;width:100%;z-index:calc(var(--ZI_navbar) + 100)}.MobileNav .mobile-notifications-header .spacer{flex:1}.MobileNav .mobile-notifications-header .title{font-size:1.3em;margin-left:.6em}.MobileNav .pins{flex:1}.MobileNav .pins .pinned-item{flex-grow:1}.MobileNav .mobile-notifications{height:calc(100vh - var(--navbar-height));margin-top:3.5em;overflow-x:hidden;overflow-y:scroll;width:100vw}.MobileNav .mobile-notifications .notifications{border-radius:0;box-shadow:none;padding:0}.MobileNav .mobile-notifications .notifications .panel{border-radius:0;box-shadow:none;margin:0}.MobileNav .mobile-notifications .notifications .panel:after{border-radius:0}.MobileNav .mobile-notifications .notifications .panel .panel-heading{border-radius:0;box-shadow:none}.MobileNav .confirm-modal.dark-overlay:before{z-index:3000}.MobileNav .confirm-modal.dark-overlay .dialog-modal.panel{z-index:3001}.SearchBar{align-items:baseline;display:inline-flex;justify-content:flex-end;vertical-align:baseline}.SearchBar.-expanded{width:100%}.SearchBar .search-bar-input,.SearchBar .search-button{height:29px}.SearchBar .search-bar-input{flex:1 0 auto}.SearchBar .cancel-search{height:50px}.SearchBar .cancel-icon{color:var(--text)}.DesktopNav{width:100%;z-index:var(--ZI_navbar)}.DesktopNav input{color:var(--inputTopbarText,var(--inputText))}.DesktopNav a{color:var(--link)}.DesktopNav .inner-nav{box-sizing:border-box;display:grid;grid-template-areas:"sitename logo actions";grid-template-columns:2fr auto 2fr;grid-template-rows:var(--navbar-height);margin:auto;max-width:980px;padding:0 1.2em}.DesktopNav.-column-stretch .inner-nav{--miniColumn:25rem;--maxiColumn:45rem;--columnGap:1em;max-width:calc(var(--sidebarColumnWidth, var(--miniColumn)) + var(--contentColumnWidth, var(--maxiColumn)) + var(--columnGap))}.DesktopNav.-logoLeft .inner-nav{grid-template-areas:"logo sitename actions";grid-template-columns:auto 2fr 2fr}.DesktopNav.-column-stretch.-wide .inner-nav{max-width:calc(var(--sidebarColumnWidth, var(--miniColumn)) + var(--contentColumnWidth, var(--maxiColumn)) + var(--notifsColumnWidth, var(--miniColumn)) + var(--columnGap))}.DesktopNav .button-default,.DesktopNav .button-default svg{color:var(--text)}.DesktopNav .logo{grid-area:logo;position:relative;transition:opacity;transition-duration:.1s;transition-timing-function:ease-out}@media (min-width:800px){.DesktopNav .logo{opacity:1!important}}.DesktopNav .logo .mask{background-color:var(--text);bottom:0;left:0;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;right:0;top:0}.DesktopNav .logo img{display:inline-block;height:var(--navbar-height)}.DesktopNav .nav-icon{height:100%;margin-left:.2em;text-align:center;width:2em}.DesktopNav .nav-icon .svg-inline--fa{color:var(--link)}.DesktopNav .sitename{grid-area:sitename}.DesktopNav .actions{grid-area:actions}.DesktopNav .item{display:flex;flex:1;flex-wrap:wrap;height:var(--navbar-height);line-height:var(--navbar-height);overflow:hidden}.DesktopNav .item.right{justify-content:flex-end;text-align:right}.DesktopNav .spacer{width:1em}.user-reporting-panel{max-height:80vh;max-width:700px;min-height:20vh;width:90vw}.user-reporting-panel .panel-body{border-top:1px solid;border-color:var(--border);display:flex;flex-direction:column-reverse;overflow:hidden}.user-reporting-panel-left{box-sizing:border-box;line-height:var(--post-line-height);padding:1.1em .7em .7em}.user-reporting-panel-left>div{margin-bottom:1em}.user-reporting-panel-left>div:last-child{margin-bottom:0}.user-reporting-panel-left p{margin-top:0}.user-reporting-panel-left textarea.form-control{line-height:16px;min-height:44px;overflow:hidden;resize:none;transition:min-height .2s .1s;width:100%}.user-reporting-panel-left .btn{min-width:10em;padding:0 2em}.user-reporting-panel-left .alert{line-height:1.3em;margin:1em 0 0}.user-reporting-panel-right{display:flex;flex-direction:column;overflow-y:auto}.user-reporting-panel-sitem{display:flex;justify-content:space-between}.user-reporting-panel-sitem>.Status{flex:1}.user-reporting-panel-sitem>.checkbox{margin:.75em}@media (min-width:801px){.user-reporting-panel .panel-body{flex-direction:row}.user-reporting-panel-left{border-right:1px solid;border-color:var(--border);max-width:320px;padding:1.1em;width:50%}.user-reporting-panel-left>div{margin-bottom:2em}.user-reporting-panel-right{flex:1 1 auto;margin-bottom:12px;width:50%}}.modal-view.edit-form-modal-view{align-items:flex-start}.edit-form-modal-panel{flex-shrink:0;margin-bottom:2em;margin-top:25%;max-width:700px;width:100%}@media(orientation:landscape){.edit-form-modal-panel{margin-top:8%}}.edit-form-modal-panel .form-bottom-left{max-width:6.5em}.edit-form-modal-panel .form-bottom-left .emoji-icon{justify-content:right}.modal-view.post-form-modal-view{align-items:flex-start}.post-form-modal-panel{flex-shrink:0;margin-bottom:2em;margin-top:25%;max-width:700px;width:100%}@media(orientation:landscape){.post-form-modal-panel{margin-top:8%}}.modal-view.status-history-modal-view{align-items:flex-start}.status-history-modal-panel{flex-shrink:0;margin-bottom:2em;margin-top:25%;max-width:700px;width:100%}@media(orientation:landscape){.status-history-modal-panel{margin-top:8%}}.global-notice-list{align-items:center;display:flex;flex-direction:column;pointer-events:none;position:fixed;top:calc(var(--navbar-height) + .5em);width:100%;z-index:var(--ZI_modals_popovers)}.global-notice-list .global-notice{display:flex;line-height:2;margin-bottom:.5em;max-width:calc(100% - 3em);padding-left:1.5em;pointer-events:auto;text-align:center;width:40em}.global-notice-list .global-notice .notice-message{flex:1 1 100%}.global-notice-list .close-notice{padding-right:.2em}.panel{--__panel-background:var(--background);--__panel-backdrop-filter:var(--backdrop-filter);display:flex;flex-direction:column;position:relative}.panel .tab-switcher .tabs{-webkit-backdrop-filter:var(--__panel-backdrop-filter);backdrop-filter:var(--__panel-backdrop-filter);background:var(--__panel-background)}.panel .panel-heading{background-color:inherit}.panel,.panel:after{border-radius:var(--roundness)}.panel:after{bottom:0;box-shadow:var(--shadow);content:"";left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:5}.panel-body{-webkit-backdrop-filter:var(--__panel-backdrop-filter);backdrop-filter:var(--__panel-backdrop-filter);background:var(--background);padding:var(--panel-body-padding,0)}.panel-body .tab-switcher .tabs{-webkit-backdrop-filter:none;backdrop-filter:none;background:none}.panel-body:empty:before{content:"¯\\_(ツ)_/¯";display:block;padding:1em;text-align:center}.panel-body>p{line-height:1.3;margin:0;padding:1em}.panel-footer,.panel-heading{--panel-heading-height-padding:calc(var(--panel-header-height)*0.2);--__panel-heading-gap:calc(var(--panel-header-height)*0.1565);--__panel-heading-height:var(--panel-header-height);--__panel-heading-height-inner:calc(var(--__panel-heading-height) - var(--panel-heading-height-padding, 0)*2);grid-column-gap:var(--__panel-heading-gap);-webkit-backdrop-filter:var(--__panel-backdrop-filter);backdrop-filter:var(--__panel-backdrop-filter);background-size:cover;box-sizing:border-box;display:grid;flex:none;font-size:calc(var(--panelHeaderSize)/3.2);grid-auto-columns:auto;grid-auto-flow:column;grid-template-columns:minmax(50%,1fr);height:var(--__panel-heading-height);line-height:var(--__panel-heading-height-inner);padding:var(--panel-heading-height-padding);position:relative;z-index:4}.panel-footer.-flexible-height,.panel-heading.-flexible-height{--__panel-heading-height:auto}.panel-footer.-flexible-height:after,.panel-footer.-flexible-height:before,.panel-heading.-flexible-height:after,.panel-heading.-flexible-height:before{display:none}.panel-footer.-stub,.panel-footer.-stub:after,.panel-heading.-stub,.panel-heading.-stub:after{border-radius:var(--roundness)}.panel-footer.-sticky,.panel-heading.-sticky{position:sticky;top:var(--navbar-height)}.panel-footer:after,.panel-footer:before,.panel-heading:after,.panel-heading:before{bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.panel-footer .title,.panel-heading .title{font-size:1.3em}.panel-footer .alert,.panel-heading .alert{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.panel-footer:not(.-flexible-height)>.alert,.panel-footer:not(.-flexible-height)>.button-default,.panel-heading:not(.-flexible-height)>.alert,.panel-heading:not(.-flexible-height)>.button-default{align-self:stretch;box-sizing:border-box;height:var(--__panel-heading-height-inner);margin:0;min-height:0;min-width:1px;padding-bottom:0;padding-top:0}.panel-footer:not(.-flexible-height)>.alert,.panel-heading:not(.-flexible-height)>.alert{line-height:calc(var(--__panel-heading-height-inner) - 2px)}.panel-heading{align-items:start;background-image:linear-gradient(to bottom,var(--background),var(--background)),linear-gradient(to bottom,var(--__panel-background),var(--__panel-background));border-radius:var(--roundness) var(--roundness) 0 0;border-width:0 0 1px}.panel-heading:after{background-color:var(--background);border-radius:var(--roundness) var(--roundness) 0 0;box-shadow:var(--shadow);z-index:-2}.panel-heading:not(.-flexible-height)>.button-default{flex-shrink:0}.panel-heading .rightside-button{align-self:stretch;height:var(--__panel-heading-height);margin:calc(var(--panel-heading-height-padding)*-1) 0;margin-right:calc(var(--__panel-heading-gap)*-1);text-align:center;width:var(--__panel-heading-height)}.panel-heading .rightside-button>button{box-sizing:border-box;height:100%;padding:calc(var(--panel-heading-height-padding)*1) 0;text-align:center;width:100%}.panel-heading .rightside-button>button svg{font-size:1.2em}.panel-heading .rightside-icon{align-self:stretch;margin-right:calc(var(--__panel-heading-gap)*-1);text-align:center;width:var(--__panel-heading-height)}.panel-heading .rightside-icon svg{font-size:1.2em}.panel-footer{align-items:center;background-color:var(--__panel-background);border-color:var(--border);border-style:solid;border-top-left-radius:0;border-top-right-radius:0;border-width:1px 0 0}:root{--status-margin:0.75em;--post-line-height:1.4;--ZI_media_modal:9000;--ZI_modals_popovers:8500;--ZI_modals:8000;--ZI_navbar_popovers:7500;--ZI_navbar:7000;--ZI_popovers:6000;--background:var(--bg)}html{--navbar-height:var(--navbarSize,3.5rem);--emoji-size:var(--emojiSize,32px);--panel-header-height:var(--panelHeaderSize,3.2rem);font-size:var(--textSize,14px)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--text);font-family:sans-serif;font-family:var(--font);margin:0;overflow-x:clip;overflow-y:scroll;overscroll-behavior-y:none}body.hidden{display:none}@media(any-pointer:fine){*{scrollbar-color:var(--fg) transparent}::-webkit-scrollbar,::-webkit-scrollbar-corner{background:transparent}::-webkit-resizer{background-color:transparent!important;background-image:linear-gradient(135deg,transparent calc(50% - 1px),var(--textFaint) 50%,transparent calc(50% + 1px),transparent calc(75% - 1px),var(--textFaint) 75%,transparent calc(75% + 1px))}::-webkit-scrollbar-button,::-webkit-scrollbar-thumb{border-radius:var(--roundness);box-shadow:var(--shadow)}::-webkit-scrollbar-button{--___bgPadding:2px;background-repeat:no-repeat,no-repeat;color:var(--text)}::-webkit-scrollbar-button:horizontal{background-size:50% calc(50% - var(--___bgPadding)),50% calc(50% - var(--___bgPadding))}::-webkit-scrollbar-button:horizontal:increment{background-image:linear-gradient(45deg,var(--text) 50%,transparent 51%),linear-gradient(-45deg,transparent 50%,var(--text) 51%);background-position:top var(--___bgPadding) left 50%,right 50% bottom var(--___bgPadding)}::-webkit-scrollbar-button:horizontal:decrement{background-image:linear-gradient(45deg,transparent 50%,var(--text) calc(50% + 1px)),linear-gradient(-45deg,var(--text) 50%,transparent 51%);background-position:bottom var(--___bgPadding) right 50%,left 50% top var(--___bgPadding)}::-webkit-scrollbar-button:vertical{background-size:calc(50% - var(--___bgPadding)) 50%,calc(50% - var(--___bgPadding)) 50%}::-webkit-scrollbar-button:vertical:increment{background-image:linear-gradient(-45deg,transparent 50%,var(--text) 51%),linear-gradient(45deg,transparent 50%,var(--text) 51%);background-position:right var(--___bgPadding) top 50%,left var(--___bgPadding) top 50%}::-webkit-scrollbar-button:vertical:decrement{background-image:linear-gradient(-45deg,var(--text) 50%,transparent 51%),linear-gradient(45deg,var(--text) 50%,transparent 51%);background-position:left var(--___bgPadding) top 50%,right var(--___bgPadding) top 50%}html{background:var(--wallpaper);scrollbar-color:var(--fg) var(--wallpaper)}}a{color:var(--link);text-decoration:none}h4{margin:0}.iconLetter{display:inline-block;font-weight:1000;text-align:center}.iconLetter,.svg-inline--fa,i[class*=icon-]{color:var(--icon)}nav{box-shadow:var(--shadow);box-sizing:border-box;font-size:calc(var(--navbar-height)/3.5);height:var(--navbar-height);position:fixed;z-index:var(--ZI_navbar)}#sidebar{grid-area:sidebar}#modal{position:absolute;z-index:var(--ZI_modals)}.column.-scrollable{position:sticky;top:var(--navbar-height)}#main-scroller{grid-area:content;position:relative}#notifs-column{grid-area:notifs}.app-bg-wrapper{background-color:var(--wallpaper);background-image:var(--body-background-image);background-position:50%;background-repeat:no-repeat;background-size:cover;height:100%;left:0;position:fixed;right:-20px;top:var(--navbar-height);z-index:-1000}.underlay{background-color:var(--underlay);grid-column:1/span 3;grid-row:1/1;pointer-events:none;z-index:-1000}.app-layout{--miniColumn:25rem;--maxiColumn:45rem;--columnGap:1rem;--effectiveSidebarColumnWidth:minmax(var(--miniColumn),var(--sidebarColumnWidth,var(--miniColumn)));--effectiveNotifsColumnWidth:minmax(var(--miniColumn),var(--notifsColumnWidth,var(--miniColumn)));--effectiveContentColumnWidth:minmax(var(--miniColumn),var(--contentColumnWidth,var(--maxiColumn)));align-content:flex-start;flex-wrap:wrap;grid-template-areas:"sidebar content";grid-template-columns:var(--effectiveSidebarColumnWidth) var(--effectiveContentColumnWidth);grid-template-rows:1fr;justify-content:center;margin:0 auto;min-height:100vh;overflow-x:clip;position:relative}.app-layout,.app-layout .column{box-sizing:border-box;display:grid}.app-layout .column{--___columnMargin:var(--columnGap);align-content:start;grid-row:1/1;grid-template-columns:100%;margin:0 calc(var(--___columnMargin)/2);padding:calc(var(--___columnMargin)) 0;row-gap:var(--___columnMargin)}.app-layout .column:not(.-scrollable){margin-top:var(--navbar-height)}.app-layout .column:hover{z-index:2}.app-layout .column.-full-height{margin-bottom:0;padding-bottom:0;padding-top:0}.app-layout .column.-scrollable{--___paddingIncrease:calc(var(--columnGap)/2);margin-left:calc(var(--___paddingIncrease)*-1);max-height:calc(100vh - var(--navbar-height));overflow-x:hidden;overflow-y:auto;padding-left:calc(var(--___paddingIncrease) + var(--___columnMargin)/2);position:sticky;top:var(--navbar-height)}@supports(scrollbar-width:none) or (-webkit-text-fill-color:initial){.app-layout .column.-scrollable:not(.-show-scrollbar){margin-right:calc(var(--___paddingIncrease)*-1);padding-right:calc(var(--___paddingIncrease) + var(--___columnMargin)/2);scrollbar-width:none}.app-layout .column.-scrollable:not(.-show-scrollbar)::-webkit-scrollbar{display:block;width:0}}.app-layout .column.-scrollable .panel-heading.-sticky{top:calc(var(--columnGap)/-1)}.app-layout.-has-new-post-button .column{padding-bottom:10rem}.app-layout.-no-sticky-headers .column .panel-heading.-sticky{position:relative;top:0}.app-layout .column-inner{align-content:start;box-sizing:border-box;display:grid;grid-template-columns:100%;row-gap:1em}.app-layout.-reverse:not(.-wide,.-mobile){grid-template-areas:"content sidebar";grid-template-columns:var(--effectiveContentColumnWidth) var(--effectiveSidebarColumnWidth)}.app-layout.-wide{grid-template-areas:"sidebar content notifs";grid-template-columns:var(--effectiveSidebarColumnWidth) var(--effectiveContentColumnWidth) var(--effectiveNotifsColumnWidth)}.app-layout.-wide.-reverse{grid-template-areas:"notifs content sidebar";grid-template-columns:var(--effectiveNotifsColumnWidth) var(--effectiveContentColumnWidth) var(--effectiveSidebarColumnWidth)}.app-layout.-mobile{grid-template-areas:"content";grid-template-columns:100vw;padding:0}.app-layout.-mobile .column{margin:var(--navbar-height) 0 0 0;padding-top:0}.app-layout.-mobile .panel,.app-layout.-mobile .panel-heading,.app-layout.-mobile .panel-heading:after,.app-layout.-mobile .panel-heading:before,.app-layout.-mobile .panel:after{border-top-left-radius:0;border-top-right-radius:0}.app-layout.-mobile #notifs-column,.app-layout.-mobile #sidebar,.app-layout.-normal #notifs-column{display:none}.text-center{text-align:center}.button-default{background-color:var(--background);border:none;box-shadow:var(--shadow);color:var(--text);cursor:pointer;font-family:sans-serif;font-family:var(--font);font-size:1em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.button-default::-moz-focus-inner{border:none}.button-default:disabled{cursor:not-allowed}.list-item,.menu-item{--__line-height:1.5em;--__horizontal-gap:0.75em;--__vertical-gap:0.5em;background:transparent;border:none;border-color:var(--border);border-style:solid;border-width:1px 0 0;box-sizing:border-box;clear:both;color:inherit;cursor:pointer;display:block;font-family:inherit;font-size:inherit;font-weight:400;line-height:var(--__line-height);outline:none;padding:var(--__vertical-gap) var(--__horizontal-gap);position:relative;text-align:initial;white-space:nowrap;width:100%}.list-item.-non-interactive,.menu-item.-non-interactive{cursor:auto}.list-item.-active,.list-item:hover,.menu-item.-active,.menu-item:hover{border-bottom-width:1px;border-top-width:1px}.list-item.-active+.list-item,.list-item.-active+.menu-item,.list-item.-active+.menu-item-collapsible:not(.-expanded)+.list-item,.list-item.-active+.menu-item-collapsible:not(.-expanded)+.menu-item,.list-item:hover+.list-item,.list-item:hover+.menu-item,.list-item:hover+.menu-item-collapsible:not(.-expanded)+.list-item,.list-item:hover+.menu-item-collapsible:not(.-expanded)+.menu-item,.menu-item.-active+.list-item,.menu-item.-active+.menu-item,.menu-item.-active+.menu-item-collapsible:not(.-expanded)+.list-item,.menu-item.-active+.menu-item-collapsible:not(.-expanded)+.menu-item,.menu-item:hover+.list-item,.menu-item:hover+.menu-item,.menu-item:hover+.menu-item-collapsible:not(.-expanded)+.list-item,.menu-item:hover+.menu-item-collapsible:not(.-expanded)+.menu-item{border-top-width:0}.list-item[aria-expanded=true],.menu-item[aria-expanded=true]{border-bottom-width:1px}.list-item a,.list-item button:not(.button-default),.menu-item a,.menu-item button:not(.button-default){background:none;border:none;color:var(--text);display:inline;font-family:inherit;font-size:100%;line-height:unset;outline:none;padding:0;text-align:initial}.list-item:first-child,.menu-item:first-child{border-top-left-radius:var(--roundness);border-top-right-radius:var(--roundness);border-top-width:0}.list-item:last-child,.menu-item:last-child{border-bottom-left-radius:var(--roundness);border-bottom-right-radius:var(--roundness);border-bottom-width:0}.button-unstyled{background-color:transparent;border:none;box-shadow:var(--shadow);box-sizing:content-box;color:inherit;cursor:pointer;display:inline;font-family:inherit;font-size:100%;line-height:unset;outline:none;padding:0;text-align:initial}.button-unstyled.-link{color:var(--link)!important}input,textarea{outline:none}.input,input,textarea{border:none;display:inline-block}.input{--_padding:0.5em;background-color:var(--background);box-shadow:var(--shadow);box-sizing:border-box;color:var(--text);font-family:var(--font);font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:2;margin:0;padding:0 var(--_padding);position:relative}.input.unstyled{background:none!important;border-radius:0;box-shadow:none;height:unset}.input.disabled,.input:disabled,.input[disabled=disabled]{cursor:not-allowed}.input[type=range]{background:none;border:none;box-shadow:none;flex:1;margin:0}.input[type=radio]{display:none}.input[type=radio]:checked+label:before{background-color:var(--background);box-shadow:var(--shadow);color:var(--text)}.input[type=radio]:disabled,.input[type=radio]:disabled+label,.input[type=radio]:disabled+label:before{opacity:.5}.input[type=radio]+label:before{background-color:var(--background);border-radius:100%;box-shadow:var(--shadow);box-sizing:border-box;color:transparent;content:"•";display:inline-block;flex-shrink:0;font-size:1.1em;height:1.1em;line-height:1.1;margin-right:.5em;overflow:hidden;text-align:center;transition:box-shadow .2s;vertical-align:top;width:1.1em}.input[type=checkbox]:checked+label:before{background-color:var(--background);box-shadow:var(--shadow);color:var(--text)}.input[type=checkbox]:disabled,.input[type=checkbox]:disabled+label,.input[type=checkbox]:disabled+label:before{opacity:.5}.input[type=checkbox]+label:before{border-radius:var(--roundness);box-shadow:var(--shadow);box-sizing:border-box;color:transparent;content:"✓";display:inline-block;flex-shrink:0;font-size:1.1em;height:1.1em;line-height:1.1;margin-right:.5em;overflow:hidden;text-align:center;transition:color .2s;vertical-align:top;width:1.1em}.input.resize-height{resize:vertical}.button-default,.input{--_roundness-left:var(--roundness);--_roundness-right:var(--roundness);border-bottom-left-radius:var(--_roundness-left);border-bottom-right-radius:var(--_roundness-right);border-top-left-radius:var(--_roundness-left);border-top-right-radius:var(--_roundness-right)}textarea.input{line-height:var(--post-line-height);padding:var(--_padding)}option{background-color:var(--background);color:var(--text)}.hide-number-spinner{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.hide-number-spinner[type=number]::-webkit-inner-spin-button,.hide-number-spinner[type=number]::-webkit-outer-spin-button{display:none;opacity:0}.cards-list{display:grid;grid-auto-flow:row dense;grid-template-columns:1fr 1fr;list-style:none}.cards-list li{border:1px solid var(--border);border-radius:var(--roundness);margin:.25em;padding:.5em}.btn-block{display:block;width:100%}.btn-group{display:inline-flex;position:relative;vertical-align:middle}.btn-group>*,.btn-group>* .button-default{--_roundness-left:0;--_roundness-right:0;flex:1 1 auto;position:relative}.btn-group>:first-child,.btn-group>:first-child .button-default{--_roundness-left:var(--roundness)}.btn-group>:last-child,.btn-group>:last-child .button-default{--_roundness-right:var(--roundness)}.fa{color:gray}.mobile-shown{display:none}.badge{border-radius:99px;box-sizing:border-box;display:inline-block;font-size:.9em;font-style:normal;font-weight:400;height:1.3em;line-height:1;max-width:10em;min-width:1.7em;overflow:hidden;padding:.15em;text-align:center;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.badge.-counter,.badge.-dot{margin:0;position:absolute}.badge.-dot{font-size:0;left:calc(50% - 4px);line-height:0;margin-left:6px;margin-top:-6px;max-height:8px;max-width:8px;min-height:8px;min-width:8px;padding:0;top:calc(50% - 4px)}.badge.-counter{font-size:.75em;left:calc(50% - .5em);line-height:1;margin-left:.7em;margin-top:-1em;min-width:0;padding:.2em;text-align:right;top:calc(50% - .4em)}.alert,.badge.-counter{border-radius:var(--roundness)}.alert{border:1px solid var(--border);margin:0 .35em;padding:0 .25em}.faint{--text:var(--textFaint);--link:var(--linkFaint);color:var(--text)}.visibility-notice{border:1px solid var(--textFaint);border-radius:var(--roundness);padding:.5em}.notice-dismissible{padding-right:4rem;position:relative}.notice-dismissible .dismiss{color:inherit;padding:.5em;position:absolute;right:0;top:0}.fa-scale-110.iconLetter,.fa-scale-110.svg-inline--fa{font-size:1.1em}.fa-scale-110.svg-inline--fa{vertical-align:-.15em}.fa-old-padding-layer,.fa-old-padding.iconLetter,.fa-old-padding.svg-inline--fa{padding:0 .3em}.veryfaint{opacity:.25}.timeago{--link:var(--text);--linkFaint:var(--textFaint)}.login-hint{text-align:center}@media (min-width:801px){.login-hint{display:none}}.login-hint a{display:inline-block;padding:1em 0;width:100%}.btn.button-default{min-height:2em}.new-status-notification{flex:1;font-size:1.1em;position:relative;z-index:1}@media (max-width:800px){.mobile-hidden{display:none}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}@keyframes shakeError{0%{transform:translateX(0)}15%{transform:translateX(.375rem)}30%{transform:translateX(-.375rem)}45%{transform:translateX(.375rem)}60%{transform:translateX(-.375rem)}75%{transform:translateX(.375rem)}90%{transform:translateX(-.375rem)}to{transform:translateX(0)}}.fade-enter-active,.fade-leave-active{transition:opacity .3s}.fade-enter-from,.fade-leave-active{opacity:0}.visible-for-screenreader-only{clip:rect(0 0 0 0);display:block;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;visibility:visible;width:1px}::-moz-selection{background-color:var(--selectionBackground);color:var(--selectionText)}::selection{background-color:var(--selectionBackground);color:var(--selectionText)}.thread-tree-replies{border-left:2px solid var(--border);margin-left:var(--status-margin)}.thread-tree-replies-hidden{align-items:stretch;display:flex;flex-direction:column;padding:var(--status-margin)}.Conversation{z-index:1}.Conversation.-hidden{-webkit-backdrop-filter:var(--__panel-backdrop-filter);backdrop-filter:var(--__panel-backdrop-filter);background:var(--__panel-background)}.Conversation .conversation-dive-to-top-level-box{align-items:stretch;border-bottom:1px solid var(--border);border-radius:0;display:flex;flex-direction:column;padding:var(--status-margin)}.Conversation .thread-ancestors{border-left:2px solid var(--border);margin-left:var(--status-margin)}.Conversation .thread-ancestor.-faded .RichContent{--text:var(--textFaint)!important;--link:var(--linkFaint)!important;--funtextGreentext:var(--funtextGreentextFaint)!important;--funtextCyantext:var(--funtextCyantextFaint)!important}.Conversation .thread-ancestor-dive-box{border-bottom:1px solid var(--border);border-radius:0;padding-left:var(--status-margin)}.Conversation .thread-ancestor-dive-box,.Conversation .thread-ancestor-dive-box-inner{align-items:stretch;display:flex;flex-direction:column}.Conversation .thread-ancestor-dive-box-inner{padding:var(--status-margin)}.Conversation .conversation-status{border-bottom:1px solid var(--border);border-radius:0}.Conversation .thread-ancestor-has-other-replies .conversation-status,.Conversation .thread-ancestor:last-child .conversation-status,.Conversation .thread-ancestor:last-child .thread-ancestor-dive-box,.Conversation.-expanded .conversation-status:last-child,.Conversation.-expanded .thread-tree .conversation-status,.Conversation:last-child:not(.-expanded) .conversation-status{border-bottom:none}.Conversation .thread-ancestors+.thread-tree>.conversation-status{border-top:1px solid var(--border)}.Conversation.status-fadein.-expanded .thread-body{border-bottom:1px solid var(--border);border-left:4px solid var(--cRed);border-radius:var(--roundness);border-top-left-radius:0;border-top-right-radius:0}.Conversation.-expanded.status-fadein{--___margin:calc(var(--status-margin)/2);background:var(--background);margin:var(--___margin)}.Conversation.-expanded.status-fadein:before{-webkit-backdrop-filter:var(--__panel-backdrop-filter);backdrop-filter:var(--__panel-backdrop-filter);background:var(--background);bottom:calc(var(--___margin)*-1);content:"";display:block;left:calc(var(--___margin)*-1);position:absolute;right:calc(var(--___margin)*-1);top:calc(var(--___margin)*-1);z-index:-1}.timeline-menu-popover{border-top-left-radius:0;border-top-right-radius:0;font-size:1rem;margin-top:.6rem;max-width:100vw;min-width:24rem}.timeline-menu-popover ul{list-style:none;margin:0;padding:0}.TimelineMenu{margin-right:auto;min-width:0}.TimelineMenu .popover-trigger-button{vertical-align:bottom}.TimelineMenu .panel:after{border-top-left-radius:0;border-top-right-radius:0}.TimelineMenu .timeline-menu-title{cursor:pointer;display:flex;margin:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.TimelineMenu .timeline-menu-title .timeline-menu-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.TimelineMenu .timeline-menu-title svg{margin-left:.6em;transition:transform .1s}.TimelineMenu .timeline-menu-title .click-blocker{cursor:default;flex-grow:1}.TimelineMenu.open .timeline-menu-title svg{transform:rotate(180deg)}.TimelineMenu .panel{box-shadow:var(--popoverShadow)}.Timeline .timeline-body{-webkit-backdrop-filter:none;backdrop-filter:none;background:none}.Timeline .alert-badge{border-radius:var(--roundness);font-size:.75em;left:calc(50% - .5em);line-height:1;margin-left:.7em;margin-top:-1em;padding:.2em;position:absolute;text-align:right;top:calc(50% - .4em)}.Timeline .loadmore-button{position:relative}.Timeline.-blocked{cursor:progress}.Timeline .conversation-heading{top:calc(var(--__panel-heading-height)*var(--currentPanelStack, 2));z-index:2}.Timeline.-embedded .timeline-heading{line-height:2.75em;padding:0 .5em;text-align:center}.Timeline.-embedded .timeline-heading:empty:before{content:normal}.Timeline.-embedded .timeline-heading .alert,.Timeline.-embedded .timeline-heading .button-default{line-height:2em;width:100%}.tab-switcher{display:flex}.tab-switcher .tab-icon{display:block;margin:.2em auto}.tab-switcher.top-tabs{flex-direction:column}.tab-switcher.top-tabs>.tabs{flex:0 0 auto;flex-direction:row;overflow-x:auto;overflow-y:hidden;padding-top:5px;width:100%}.tab-switcher.top-tabs>.tabs:after,.tab-switcher.top-tabs>.tabs:before{border-bottom:1px solid;border-bottom-color:var(--border);content:"";flex:1 1 auto}.tab-switcher.top-tabs>.tabs .tab-wrapper{height:2em}.tab-switcher.top-tabs>.tabs .tab-wrapper:not(.active):after{border-bottom:1px solid;border-bottom-color:var(--border);bottom:0;left:0;right:0}.tab-switcher.top-tabs>.tabs .tab{border-bottom-left-radius:0;border-bottom-right-radius:0;margin-bottom:-93px;min-width:1px;padding-bottom:99px;width:100%}.tab-switcher.top-tabs .contents.scrollable-tabs{flex-basis:0}.tab-switcher.side-tabs{flex-direction:row}@media (max-width:800px){.tab-switcher.side-tabs{overflow-x:auto}}.tab-switcher.side-tabs>.contents{flex:1 1 auto}.tab-switcher.side-tabs>.tabs{flex:0 0 auto;flex-direction:column;overflow-x:hidden;overflow-y:auto}.tab-switcher.side-tabs>.tabs:after,.tab-switcher.side-tabs>.tabs:before{border-right:1px solid;border-right-color:var(--border);content:"";flex-basis:.5em;flex-shrink:0}.tab-switcher.side-tabs>.tabs:after{flex-grow:1}.tab-switcher.side-tabs>.tabs:before{flex-grow:0}.tab-switcher.side-tabs>.tabs .tab-wrapper{display:flex;flex-direction:column;min-width:10em}@media (max-width:800px){.tab-switcher.side-tabs>.tabs .tab-wrapper{min-width:4em}}.tab-switcher.side-tabs>.tabs .tab-wrapper:not(.active):after{border-right:1px solid;border-right-color:var(--border);bottom:0;right:0;top:0}.tab-switcher.side-tabs>.tabs .tab-wrapper:before{border-right:1px solid;border-right-color:var(--border);content:"";flex:0 0 6px}.tab-switcher.side-tabs>.tabs .tab-wrapper:last-child .tab{margin-bottom:0}.tab-switcher.side-tabs>.tabs .tab{border-bottom-right-radius:0;border-top-right-radius:0;box-sizing:content-box;flex:1;margin-left:1em;margin-right:-200px;min-width:10em;min-width:1px;padding-left:1em;padding-right:calc(1em + 200px)}@media (max-width:800px){.tab-switcher.side-tabs>.tabs .tab{margin-left:.25em;margin-right:calc(.25em - 200px);padding-left:.25em;padding-right:calc(.25em + 200px)}.tab-switcher.side-tabs>.tabs .tab .text{display:none}}.tab-switcher .contents{flex:1 0 auto;min-height:0}.tab-switcher .contents .hidden{display:none}.tab-switcher .contents .full-height:not(.hidden){display:flex;flex-direction:column;height:100%}.tab-switcher .contents .full-height:not(.hidden)>:not(.mobile-label){flex:1}.tab-switcher .contents.scrollable-tabs{overflow-y:auto}.tab-switcher .tab{background-color:var(--background);border:none;border-radius:var(--roundness);box-shadow:var(--shadow);color:var(--text);cursor:pointer;font-family:var(--font);font-size:1em;padding:6px 1em;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.tab-switcher .tab:not(.active){z-index:4}.tab-switcher .tab:not(.active):hover{z-index:6}.tab-switcher .tab.active{background:transparent;z-index:5}.tab-switcher .tab img{margin-top:-5px;max-height:26px;vertical-align:top}.tab-switcher .tabs{box-sizing:border-box;display:flex;position:relative}.tab-switcher .tabs:after,.tab-switcher .tabs:before{display:block;flex:1 1 auto}.tab-switcher .tab-wrapper{display:flex;flex:0 0 auto;position:relative}.tab-switcher .tab-wrapper:not(.active):after{content:"";position:absolute;z-index:7}.tab-switcher .mobile-label{border-bottom:1px solid var(--border);margin-bottom:.25em;margin-left:.2em;margin-top:.5em;padding-bottom:.25em;padding-left:.3em}@media (min-width:800px){.tab-switcher .mobile-label{display:none}}.chat-title{--emoji-size:14px;display:flex}.chat-title,.chat-title .username{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-title .username{word-wrap:break-word;display:inline;max-width:100%}.chat-title .avatar-container{align-self:center;line-height:1}.chat-title .titlebar-avatar{border-radius:var(--roundness);height:1.5em;margin-right:.5em;width:1.5em}.chat-title .titlebar-avatar.animated:before{display:none}.chat-list-item{box-sizing:border-box;cursor:pointer;display:flex;flex-direction:row;overflow:hidden}.chat-list-item :focus{outline:none}.chat-list-item .chat-list-item-left{margin-right:1em}.chat-list-item .chat-list-item-center{word-wrap:break-word;box-sizing:border-box;overflow:hidden;width:100%}.chat-list-item .heading{display:flex;justify-content:space-between;line-height:1em;width:100%}.chat-list-item .heading-right{white-space:nowrap}.chat-list-item .name-and-account-name{flex-shrink:1;line-height:var(--post-line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-list-item .chat-preview{color:var(--textFaint);display:flex;margin:.35em 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.chat-list-item a{color:var(--linkFaint);pointer-events:none;text-decoration:none}.chat-list-item:hover .animated.avatar canvas{display:none}.chat-list-item:hover .animated.avatar img{visibility:visible}.chat-list-item .chat-preview-body{--emoji-size:1.4em;padding-right:1em}.chat-list-item .time-wrapper{line-height:var(--post-line-height)}.basic-user-card{--emoji-size:14px;display:flex;flex:1 0;margin:0}.basic-user-card-collapsed-content{flex:1;margin-left:.7em;min-width:0;text-align:left}.basic-user-card-user-name img{height:16px;-o-object-fit:contain;object-fit:contain;vertical-align:middle;width:16px}.basic-user-card-screen-name,.basic-user-card-user-name-value{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.basic-user-card-expanded-content{flex:1;margin-left:.7em;min-width:0}.chat-new .input-wrap{display:flex;margin:.7em .5em}.chat-new .input-wrap input{width:100%}.chat-new .search-icon{margin-right:.3em}.chat-new .member-list{padding-bottom:.7rem}.chat-new .go-back-button{align-self:start;height:100%;line-height:1;text-align:center;width:var(--__panel-heading-height-inner)}.chat-list{margin-bottom:0;min-height:25em}.emtpy-chat-list-alert{color:var(--textFaint);display:flex;font-size:1.2em;justify-content:center;padding:3em}.chat-message-wrapper.hovered-message-chain .animated.Avatar canvas{display:none}.chat-message-wrapper.hovered-message-chain .animated.Avatar img{visibility:visible}.chat-message-wrapper .chat-message-menu{opacity:0;position:absolute;top:-.8em;transition:opacity .1s}.chat-message-wrapper .chat-message-menu button{padding-bottom:.2em;padding-top:.2em}.chat-message-wrapper .menu-icon{cursor:pointer}.chat-message-wrapper .popover{width:12em}.chat-message-wrapper .chat-message{display:flex;padding-bottom:.5em}.chat-message-wrapper .chat-message .status-body:hover{--_still-image-img-visibility:visible;--_still-image-canvas-visibility:hidden;--_still-image-label-visibility:hidden}.chat-message-wrapper .avatar-wrapper{margin-right:.72em;width:32px}.chat-message-wrapper .attachments,.chat-message-wrapper .link-preview{margin-bottom:1em}.chat-message-wrapper .status{background-color:var(--background);border:1px solid var(--border);border-radius:var(--roundness);color:var(--text);display:flex;padding:.75em}.chat-message-wrapper .created-at{float:right;font-size:.8em;font-style:italic;margin:-1em 0 -.5em;opacity:.8;position:relative}.chat-message-wrapper .without-attachment .message-content .RichContent:after{content:" ";display:inline-block;margin-right:5.4em}.chat-message-wrapper .pending .created-at,.chat-message-wrapper .pending .status-content.media-body{color:var(--faint)}.chat-message-wrapper .error .created-at,.chat-message-wrapper .error .status-content.media-body{color:var(--badgeNotification)}.chat-message-wrapper .chat-message-inner{align-items:flex-start;display:flex;flex-direction:column;max-width:80%;min-width:10em;width:100%}.chat-message-wrapper .outgoing{align-content:end;display:flex;flex-flow:row wrap;justify-content:flex-end}.chat-message-wrapper .outgoing .chat-message-inner{align-items:flex-end}.chat-message-wrapper .outgoing .chat-message-menu{right:.4rem}.chat-message-wrapper .incoming .chat-message-menu{left:.4rem}.chat-message-wrapper .chat-message-inner.with-media,.chat-message-wrapper .chat-message-inner.with-media .status{width:100%}.chat-message-wrapper .visible{opacity:1}.chat-message-date-separator{color:var(--textFaint);font-size:.9em;margin:1.4em 0;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-view{display:flex;height:100%}.chat-view .chat-view-inner{display:flex;height:auto;overflow:visible;width:100%}.chat-view .chat-view-body{border-radius:var(--roundness);border-bottom-left-radius:0;border-bottom-right-radius:0;box-sizing:border-box;display:flex;flex-direction:column;margin:0;min-height:calc(100vh - var(--navbar-height));overflow:visible;width:100%}.chat-view .chat-view-body:after{border-radius:0}.chat-view .message-list{display:flex;flex-direction:column;height:100%;justify-content:end;padding:0 .8em}.chat-view .footer{bottom:0;position:sticky;z-index:1}.chat-view .chat-view-heading{grid-template-columns:auto minmax(50%,1fr)}.chat-view .go-back-button{align-self:start;height:100%;line-height:1;text-align:center;width:var(--__panel-heading-height-inner)}.chat-view .jump-to-bottom-button{align-items:center;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.3),0 2px 4px rgba(0,0,0,.3);cursor:pointer;display:flex;height:2.5em;justify-content:center;opacity:0;position:absolute;right:1.3em;top:-3.2em;transition:all .35s;transition-timing-function:cubic-bezier(0,1,.5,1);visibility:hidden;width:2.5em;z-index:10}.chat-view .jump-to-bottom-button.visible{opacity:1;visibility:visible}.chat-view .jump-to-bottom-button .unread-message-count{border-radius:50px;font-size:.8em;left:50%;margin-top:-1rem;padding:.1em;position:absolute}.chat-view .jump-to-bottom-button .chat-loading-error{align-items:flex-end;display:flex;height:100%;width:100%}.chat-view .jump-to-bottom-button .chat-loading-error .error{width:100%}.follow-card-content-container{display:flex;flex-flow:row wrap;flex-shrink:0;justify-content:space-between;line-height:1.5em}.follow-card-button{margin-left:1em;margin-top:.5em;padding:0 1.5em}.follow-card-follow-button{margin-left:auto;margin-top:.5em;width:10em}.with-load-more-footer{border-top:1px solid;border-top-color:var(--border);padding:10px;text-align:center}.with-load-more-footer .error{font-size:1rem}.with-load-more-footer a{cursor:pointer}.user-profile{--currentPanelStack:1;flex:2;flex-basis:500px}.user-profile .user-birthday{margin:0 .75em .5em}.user-profile .user-profile-fields{margin:0 .5em}.user-profile .user-profile-fields img{max-height:400px;max-width:100%;-o-object-fit:contain;object-fit:contain;vertical-align:middle}.user-profile .user-profile-fields img.emoji{height:18px;width:18px}.user-profile .user-profile-fields .user-profile-field{border:1px solid var(--border);border-radius:var(--roundness);display:flex;margin:.25em}.user-profile .user-profile-fields .user-profile-field .user-profile-field-name{border-right:1px solid var(--border);color:var(--lightText);flex:0 1 30%;font-weight:500;min-width:120px;text-align:right}.user-profile .user-profile-fields .user-profile-field .user-profile-field-value{color:var(--text);flex:1 1 70%;margin:0 0 0 .25em}.user-profile .user-profile-fields .user-profile-field .user-profile-field-name,.user-profile .user-profile-fields .user-profile-field .user-profile-field-value{box-sizing:border-box;line-height:1.3;overflow:hidden;padding:.5em 1.5em;text-overflow:ellipsis;white-space:nowrap}.user-profile .userlist-placeholder{align-items:middle;display:flex;justify-content:center;padding:2em}.user-profile-placeholder .panel-body{align-items:middle;display:flex;justify-content:center;padding:7em}.search-result-heading{color:var(--faint);padding:.75rem;text-align:center}@media (max-width:800px){.search-nav-heading .tab-switcher .tabs .tab-wrapper{display:block;flex:1 1 auto;justify-content:center;text-align:center}}.search-result{border-bottom:1px solid;border-color:var(--border);box-sizing:border-box}.search-input-container{display:flex;justify-content:center;padding:.8rem}.search-input-container .search-input{box-sizing:border-box;font-size:1rem;line-height:1.125rem;padding:.5rem;width:100%}.search-input-container .search-button{margin-left:.5em}.loading-icon{padding:1em}.trend{align-items:center;display:flex}.trend .hashtag{color:var(--text);flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trend .count{color:var(--text);flex:0 0 auto;font-size:1.5rem;font-weight:500;line-height:2.25rem;text-align:center;width:2rem}.more-statuses-button{height:3.5em;line-height:3.5em;width:100%}.interface-language-switcher .language-select{margin-right:1em}.registration-form{display:flex;flex-direction:column;margin:.6em}.registration-form .container{display:flex;flex-direction:row}.registration-form .container>*{min-width:0}.registration-form .terms-of-service{flex:0 1 50%;margin:.8em}.registration-form .text-fields{display:flex;flex:1 0;flex-direction:column;margin-top:.6em}.registration-form textarea{min-height:100px;resize:vertical}.registration-form .form-group{display:flex;flex-direction:column;line-height:2;margin-bottom:1em;padding:.3em 0}.registration-form .form-group--error{animation-duration:.6s;animation-name:shakeError;animation-timing-function:ease-in-out}.registration-form .form-group--error .form--label{color:var(--cRed)}.registration-form .form-error{margin-top:-.7em;text-align:left}.registration-form .form-error span{font-size:.85em}.registration-form .form-error ul{list-style:none;margin-top:0;padding:0 0 0 5px}.registration-form .form-error ul li:before{content:"• "}.registration-form form textarea{line-height:16px;resize:vertical}.registration-form .captcha{margin-bottom:.4em;max-width:350px}.registration-form .btn{height:2em;margin-top:.6em}.registration-form .error{text-align:center}.registration-notice{margin:.6em}@media (max-width:800px){.registration-form .container{flex-direction:column-reverse}}.password-reset-form{align-items:center;display:flex;flex-direction:column;margin:.6em}.password-reset-form .container{display:flex;flex:1 0;flex-direction:column;margin-top:.6em;max-width:18rem}.password-reset-form .container>*{min-width:0}.password-reset-form .form-group{display:flex;flex-direction:column;line-height:1.85em;margin-bottom:1em;padding:.3em 0}.password-reset-form .error{animation-duration:.4s;animation-name:shakeError;animation-timing-function:ease-in-out;text-align:center}.password-reset-form .alert{margin:.3em 0 1em;padding:.5em}.password-reset-form .notice-dismissible{padding-right:2rem}.password-reset-form .dismiss{cursor:pointer}.follow-request-card-content-container{display:flex;flex-flow:row wrap}.follow-request-card-content-container button{flex:1 1;margin-right:.5em;margin-top:.5em;max-width:12em;min-width:8em}.follow-request-card-content-container button:last-child{margin-right:0}.tos-content{margin:1em}.staff-group{padding-left:1em;padding-top:1em}.staff-group .basic-user-card{padding-left:0}.mrf-section{margin:1em}.mrf-section table{padding-bottom:20px;padding-left:10px;text-align:left;width:100%}.mrf-section table td,.mrf-section table th{max-width:360px;overflow:hidden;vertical-align:text-top;width:180px}.mrf-section table td+td,.mrf-section table th+th{width:auto}.list-card{display:flex}.list-name{flex-grow:1}.button-list-edit,.list-name{color:var(--link);margin:0;padding:1em}.Lists .new-list-button{padding:0 .5em}.ListsUserSearch .input-wrap{display:flex;margin:.7em .5em}.ListsUserSearch .input-wrap input{width:100%}.ListsUserSearch .search-icon{margin-right:.3em}.panel-loading{align-items:center;color:var(--text);display:flex;font-size:2em;height:100%;justify-content:center}.panel-loading .loading-text svg{color:var(--text);line-height:0;vertical-align:middle}.ListEdit{--panel-body-padding:0.5em;display:flex;flex-direction:column;height:calc(100vh - var(--navbar-height));overflow:hidden}.ListEdit .list-edit-heading{grid-template-columns:auto minmax(50%,1fr)}.ListEdit .panel-body{display:flex;flex:1;flex-direction:column;overflow:hidden}.ListEdit .list-member-management{flex:1 0 auto}.ListEdit .search-icon{margin-right:.3em}.ListEdit .users-list{overflow-y:auto;padding-bottom:.7rem}.ListEdit .members-list,.ListEdit .search-list{flex-direction:column;min-height:0;overflow:hidden}.ListEdit .go-back-button{align-self:start;height:100%;line-height:1;text-align:center;width:var(--__panel-heading-height-inner)}.ListEdit .btn{margin:0 .5em}.ListEdit .panel-footer{grid-template-columns:minmax(10%,1fr)}.ListEdit .panel-footer .footer-button{min-width:9em}.announcement-editor{align-items:stretch;display:flex;flex-direction:column}.announcement-editor .announcement-metadata{margin-top:.5em}.announcement-editor .post-textarea{box-sizing:content-box;height:10em;overflow:none;resize:vertical}.announcement{border-bottom:1px solid var(--border);border-radius:0;padding:var(--status-margin)}.announcement .body,.announcement .heading{margin-bottom:var(--status-margin)}.announcement .footer,.announcement .footer .times{display:flex;flex-direction:column}.announcement .footer .actions{display:flex;flex-direction:row;justify-content:space-evenly}.announcement .footer .actions .btn{flex:1;margin:1em;max-width:10em}.announcements-page .post-form{padding:var(--status-margin)}.announcements-page .post-form .body,.announcements-page .post-form .heading{margin-bottom:var(--status-margin)}.announcements-page .post-form .post-button{min-width:10em} +/*# sourceMappingURL=app.75b043cffb8e922bc29e.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/app.75b043cffb8e922bc29e.css.map b/priv/static/static/css/app.75b043cffb8e922bc29e.css.map new file mode 100644 index 000000000..71326425d --- /dev/null +++ b/priv/static/static/css/app.75b043cffb8e922bc29e.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/app.75b043cffb8e922bc29e.css","mappings":"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BAEA,0BACA,wBAJA,sBACA,CAnBA,WACA,CAUA,0BACA,mBACA,CACA,oBACA,CAhBA,qBACA,CAQA,UACA,CAFA,aACA,CAFA,cACA,CAVF,aAEE,CAKA,mBACA,CAFA,iBACA,CACA,eACA,CAUA,gCACA,CAhBA,YACA,CAeA,qDACA,CATA,iBACA,CARA,kBACA,CAOA,kBACA,CAIA,UAQA,yDAEA,WACE,yEAKA,wBAFF,oBAGE,CAKA,wwBAGF,kBAEE,+DAGF,uBACE,yGAMA,eACA,YACA,CAKA,kBAJA,cACA,CACA,mBACA,CAFA,cACA,CACA,iBACA,CALA,YACA,CAJA,SACA,CAHF,kBAWE,+CAIA,uCACA,CAFF,wCACE,CACA,kBACA,6CAIA,0CACA,CAFF,2CACE,CACA,qBACA,kBAWF,4BACA,CARF,WACE,CAKA,wBACA,CAIA,sBACA,eAFA,cACA,CATA,cACA,CAEA,mBACA,CAFA,cACA,CAIA,iBACA,CATA,YACA,CAMA,SACA,CANA,kBAUA,wBAEA,2BAEE,gBAOF,YACA,uBAJF,WAEE,qBA4BA,CA1BA,OAGF,gBASE,CAEA,kCACA,CACA,wBACA,CAGA,qBACA,CANA,iBACA,CACA,uBACA,cACA,CAKA,oBACA,CADA,YACA,CAFA,aACA,CALA,QACA,CAKA,0BAHA,iBAIA,iBArBE,yBAEA,CAHF,eACE,CAEA,eACA,aACA,2DAmBF,kBAGE,oBAGF,eACE,YACA,CACA,eACA,QAFA,QAGA,oBAGF,YACE,yCAGE,kCACA,CAFF,wBACE,CACA,iBACA,wGAIA,UAGE,iCAWF,kCACA,CAFA,kBACA,CACA,wBACA,CAKA,qBACA,kBACA,CAdA,WACA,CAFA,oBACA,CAFF,aACE,CAYA,eACA,CATA,YACA,CAMA,eACA,CAJA,iBACA,CAMA,gBALA,iBACA,CATA,yBACA,CAMA,kBACA,CAPA,WAaA,4CAMA,kCACA,0BAFF,iBAGE,iHAIA,UAGE,oCAUF,8BACA,yBACA,CAKA,qBACA,kBACA,CAbA,WACA,CAFA,oBACA,CAFF,aACE,CAWA,eACA,CARA,YACA,CAKA,eACA,CAJA,iB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","sources":["webpack://pleroma_fe/./src/components/modal/modal.vue","webpack://pleroma_fe/./node_modules/vue-virtual-scroller/dist/vue-virtual-scroller.css","webpack://pleroma_fe/./src/components/login_form/login_form.vue","webpack://pleroma_fe/./src/components/media_upload/media_upload.vue","webpack://pleroma_fe/./src/components/scope_selector/scope_selector.vue","webpack://pleroma_fe/./src/components/checkbox/checkbox.vue","webpack://pleroma_fe/./src/components/popover/popover.vue","webpack://pleroma_fe/./src/components/still-image/still-image.vue","webpack://pleroma_fe/./src/components/emoji_picker/emoji_picker.scss","webpack://pleroma_fe/./src/components/emoji_input/emoji_input.vue","webpack://pleroma_fe/./src/components/select/select.vue","webpack://pleroma_fe/./src/components/poll/poll_form.vue","webpack://pleroma_fe/./src/components/flash/flash.vue","webpack://pleroma_fe/./src/components/attachment/attachment.scss","webpack://pleroma_fe/./src/components/gallery/gallery.vue","webpack://pleroma_fe/./src/components/user_avatar/user_avatar.vue","webpack://pleroma_fe/./src/components/mention_link/mention_link.scss","webpack://pleroma_fe/./src/components/mentions_line/mentions_line.scss","webpack://pleroma_fe/./src/components/hashtag_link/hashtag_link.scss","webpack://pleroma_fe/./src/components/rich_content/rich_content.scss","webpack://pleroma_fe/./src/components/poll/poll.vue","webpack://pleroma_fe/./src/components/status_body/status_body.scss","webpack://pleroma_fe/./src/components/link-preview/link-preview.vue","webpack://pleroma_fe/./src/components/status_content/status_content.vue","webpack://pleroma_fe/./src/components/post_status_form/post_status_form.vue","webpack://pleroma_fe/./src/components/remote_follow/remote_follow.vue","webpack://pleroma_fe/./src/components/dialog_modal/dialog_modal.vue","webpack://pleroma_fe/./src/components/moderation_tools/moderation_tools.vue","webpack://pleroma_fe/./src/components/account_actions/account_actions.vue","webpack://pleroma_fe/./src/components/user_note/user_note.vue","webpack://pleroma_fe/./src/components/user_card/user_card.scss","webpack://pleroma_fe/./src/components/user_panel/user_panel.vue","webpack://pleroma_fe/./src/components/navigation/navigation_entry.vue","webpack://pleroma_fe/./src/components/navigation/navigation_pins.vue","webpack://pleroma_fe/./src/components/nav_panel/nav_panel.vue","webpack://pleroma_fe/./src/components/features_panel/features_panel.vue","webpack://pleroma_fe/./src/components/who_to_follow_panel/who_to_follow_panel.vue","webpack://pleroma_fe/./src/components/shout_panel/shout_panel.vue","webpack://pleroma_fe/./src/components/media_modal/media_modal.vue","webpack://pleroma_fe/./src/components/side_drawer/side_drawer.vue","webpack://pleroma_fe/./src/components/mobile_post_status_button/mobile_post_status_button.vue","webpack://pleroma_fe/./src/components/reply_button/reply_button.vue","webpack://pleroma_fe/./src/components/favorite_button/favorite_button.vue","webpack://pleroma_fe/./src/components/react_button/react_button.vue","webpack://pleroma_fe/./src/components/retweet_button/retweet_button.vue","webpack://pleroma_fe/./src/components/extra_buttons/extra_buttons.vue","webpack://pleroma_fe/./src/components/avatar_list/avatar_list.vue","webpack://pleroma_fe/./src/components/status_popover/status_popover.vue","webpack://pleroma_fe/./src/components/user_list_popover/user_list_popover.vue","webpack://pleroma_fe/./src/components/emoji_reactions/emoji_reactions.vue","webpack://pleroma_fe/./src/components/status/status.scss","webpack://pleroma_fe/./src/components/report/report.scss","webpack://pleroma_fe/./src/components/notification/notification.scss","webpack://pleroma_fe/./src/components/extra_notifications/extra_notifications.vue","webpack://pleroma_fe/./src/components/notifications/notifications.scss","webpack://pleroma_fe/./src/components/mobile_nav/mobile_nav.vue","webpack://pleroma_fe/./src/components/search_bar/search_bar.vue","webpack://pleroma_fe/./src/components/desktop_nav/desktop_nav.scss","webpack://pleroma_fe/./src/components/user_reporting_modal/user_reporting_modal.vue","webpack://pleroma_fe/./src/components/edit_status_modal/edit_status_modal.vue","webpack://pleroma_fe/./src/components/post_status_modal/post_status_modal.vue","webpack://pleroma_fe/./src/components/status_history_modal/status_history_modal.vue","webpack://pleroma_fe/./src/components/global_notice_list/global_notice_list.vue","webpack://pleroma_fe/./src/App.scss","webpack://pleroma_fe/./src/panel.scss","webpack://pleroma_fe/./src/components/thread_tree/thread_tree.vue","webpack://pleroma_fe/./src/components/conversation/conversation.vue","webpack://pleroma_fe/./src/components/timeline_menu/timeline_menu.vue","webpack://pleroma_fe/./src/components/timeline/timeline.scss","webpack://pleroma_fe/./src/components/tab_switcher/tab_switcher.scss","webpack://pleroma_fe/./src/components/chat_title/chat_title.vue","webpack://pleroma_fe/./src/components/chat_list_item/chat_list_item.scss","webpack://pleroma_fe/./src/components/basic_user_card/basic_user_card.vue","webpack://pleroma_fe/./src/components/chat_new/chat_new.scss","webpack://pleroma_fe/./src/components/chat_list/chat_list.vue","webpack://pleroma_fe/./src/components/chat_message/chat_message.scss","webpack://pleroma_fe/./src/components/chat/chat.scss","webpack://pleroma_fe/./src/components/follow_card/follow_card.vue","webpack://pleroma_fe/./src/hocs/with_load_more/with_load_more.scss","webpack://pleroma_fe/./src/components/user_profile/user_profile.vue","webpack://pleroma_fe/./src/components/search/search.vue","webpack://pleroma_fe/./src/components/interface_language_switcher/interface_language_switcher.vue","webpack://pleroma_fe/./src/components/registration/registration.vue","webpack://pleroma_fe/./src/components/password_reset/password_reset.vue","webpack://pleroma_fe/./src/components/follow_request_card/follow_request_card.vue","webpack://pleroma_fe/./src/components/terms_of_service_panel/terms_of_service_panel.vue","webpack://pleroma_fe/./src/components/staff_panel/staff_panel.vue","webpack://pleroma_fe/./src/components/mrf_transparency_panel/mrf_transparency_panel.scss","webpack://pleroma_fe/./src/components/lists_card/lists_card.vue","webpack://pleroma_fe/./src/components/lists/lists.vue","webpack://pleroma_fe/./src/components/lists_user_search/lists_user_search.vue","webpack://pleroma_fe/./src/components/panel_loading/panel_loading.vue","webpack://pleroma_fe/./src/components/lists_edit/lists_edit.vue","webpack://pleroma_fe/./src/components/announcement_editor/announcement_editor.vue","webpack://pleroma_fe/./src/components/announcement/announcement.vue","webpack://pleroma_fe/./src/components/announcements_page/announcements_page.vue"],"sourcesContent":["\n.modal-view {\n z-index: var(--ZI_modals);\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: auto;\n pointer-events: none;\n animation-duration: 0.2s;\n animation-name: modal-background-fadein;\n opacity: 0;\n\n > * {\n pointer-events: initial;\n }\n\n &.modal-background {\n pointer-events: initial;\n background-color: rgb(0 0 0 / 50%);\n }\n\n &.open {\n opacity: 1;\n }\n}\n\n@keyframes modal-background-fadein {\n from {\n background-color: rgb(0 0 0 / 0%);\n }\n\n to {\n background-color: rgb(0 0 0 / 50%);\n }\n}\n",".vue-recycle-scroller{position:relative}.vue-recycle-scroller.direction-vertical:not(.page-mode){overflow-y:auto}.vue-recycle-scroller.direction-horizontal:not(.page-mode){overflow-x:auto}.vue-recycle-scroller.direction-horizontal{display:flex}.vue-recycle-scroller__slot{flex:auto 0 0}.vue-recycle-scroller__item-wrapper{flex:1;box-sizing:border-box;overflow:hidden;position:relative}.vue-recycle-scroller.ready .vue-recycle-scroller__item-view{position:absolute;top:0;left:0;will-change:transform}.vue-recycle-scroller.direction-vertical .vue-recycle-scroller__item-wrapper{width:100%}.vue-recycle-scroller.direction-horizontal .vue-recycle-scroller__item-wrapper{height:100%}.vue-recycle-scroller.ready.direction-vertical .vue-recycle-scroller__item-view{width:100%}.vue-recycle-scroller.ready.direction-horizontal .vue-recycle-scroller__item-view{height:100%}.resize-observer[data-v-b329ee4c]{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;border:none;background-color:transparent;pointer-events:none;display:block;overflow:hidden;opacity:0}.resize-observer[data-v-b329ee4c] object{display:block;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}","\n.login-form {\n display: flex;\n flex-direction: column;\n padding: 0.6em;\n\n .btn {\n min-height: 2em;\n width: 10em;\n }\n\n .register {\n flex: 1 1;\n }\n\n .login-bottom {\n margin-top: 1em;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n padding: 0.3em 0.5em 0.6em;\n line-height: 24px;\n }\n\n .form-bottom {\n display: flex;\n padding: 0.5em;\n height: 32px;\n\n button {\n width: 10em;\n }\n\n p {\n margin: 0.35em;\n padding: 0.35em;\n display: flex;\n }\n }\n\n .error {\n text-align: center;\n animation-name: shakeError;\n animation-duration: 0.4s;\n animation-timing-function: ease-in-out;\n }\n}\n","\n.media-upload {\n .hidden-input-file {\n display: none;\n }\n}\n\nlabel.media-upload {\n cursor: pointer; // We use