about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/helpers/application_helper.rb8
-rw-r--r--app/javascript/flavours/glitch/components/hashtag.js6
-rw-r--r--app/javascript/flavours/glitch/features/ui/index.js1
-rw-r--r--app/javascript/flavours/glitch/packs/public.js6
-rw-r--r--app/javascript/flavours/glitch/styles/about.scss3
-rw-r--r--app/javascript/flavours/glitch/styles/admin.scss10
-rw-r--r--app/javascript/mastodon/components/hashtag.js6
-rw-r--r--app/javascript/mastodon/features/ui/index.js1
-rw-r--r--app/javascript/mastodon/locales/ar.json8
-rw-r--r--app/javascript/mastodon/locales/ca.json4
-rw-r--r--app/javascript/mastodon/locales/co.json4
-rw-r--r--app/javascript/mastodon/locales/cs.json4
-rw-r--r--app/javascript/mastodon/locales/cy.json42
-rw-r--r--app/javascript/mastodon/locales/de.json12
-rw-r--r--app/javascript/mastodon/locales/fr.json4
-rw-r--r--app/javascript/mastodon/locales/gl.json6
-rw-r--r--app/javascript/mastodon/locales/ja.json8
-rw-r--r--app/javascript/mastodon/locales/ko.json4
-rw-r--r--app/javascript/mastodon/locales/nl.json16
-rw-r--r--app/javascript/mastodon/locales/oc.json4
-rw-r--r--app/javascript/mastodon/locales/pl.json28
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json4
-rw-r--r--app/javascript/mastodon/locales/sk.json18
-rw-r--r--app/javascript/mastodon/service_worker/web_push_notifications.js7
-rw-r--r--app/javascript/packs/public.js6
-rw-r--r--app/javascript/styles/mastodon/about.scss3
-rw-r--r--app/javascript/styles/mastodon/admin.scss10
-rw-r--r--app/services/fetch_oembed_service.rb2
-rw-r--r--app/views/stream_entries/_attachment_list.html.haml8
-rw-r--r--app/views/stream_entries/_detailed_status.html.haml6
-rw-r--r--app/views/stream_entries/_simple_status.html.haml6
31 files changed, 145 insertions, 110 deletions
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 5e7fdffb0..fc006d777 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -69,8 +69,12 @@ module ApplicationHelper
     tag(:meta, content: content, property: property)
   end
 
-  def react_component(name, props = {})
-    content_tag(:div, nil, data: { component: name.to_s.camelcase, props: Oj.dump(props) })
+  def react_component(name, props = {}, &block)
+    if block.nil?
+      content_tag(:div, nil, data: { component: name.to_s.camelcase, props: Oj.dump(props) })
+    else
+      content_tag(:div, data: { component: name.to_s.camelcase, props: Oj.dump(props) }, &block)
+    end
   end
 
   def body_classes
diff --git a/app/javascript/flavours/glitch/components/hashtag.js b/app/javascript/flavours/glitch/components/hashtag.js
index 88689cc6c..d75edd994 100644
--- a/app/javascript/flavours/glitch/components/hashtag.js
+++ b/app/javascript/flavours/glitch/components/hashtag.js
@@ -1,16 +1,16 @@
 import React from 'react';
 import { Sparklines, SparklinesCurve } from 'react-sparklines';
-import { Link } from 'react-router-dom';
 import { FormattedMessage } from 'react-intl';
 import ImmutablePropTypes from 'react-immutable-proptypes';
+import Permalink from './permalink';
 import { shortNumberFormat } from 'flavours/glitch/util/numbers';
 
 const Hashtag = ({ hashtag }) => (
   <div className='trends__item'>
     <div className='trends__item__name'>
-      <Link to={`/timelines/tag/${hashtag.get('name')}`}>
+      <Permalink href={hashtag.get('url')} to={`/timelines/tag/${hashtag.get('name')}`}>
         #<span>{hashtag.get('name')}</span>
-      </Link>
+      </Permalink>
 
       <FormattedMessage id='trends.count_by_accounts' defaultMessage='{count} {rawCount, plural, one {person} other {people}} talking' values={{ rawCount: hashtag.getIn(['history', 0, 'accounts']), count: <strong>{shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))}</strong> }} />
     </div>
diff --git a/app/javascript/flavours/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js
index f043f767e..7928dfe6c 100644
--- a/app/javascript/flavours/glitch/features/ui/index.js
+++ b/app/javascript/flavours/glitch/features/ui/index.js
@@ -182,6 +182,7 @@ export default class UI extends React.Component {
     e.preventDefault();
 
     this.setState({ draggingOver: false });
+    this.dragTargets = [];
 
     if (e.dataTransfer && e.dataTransfer.files.length === 1) {
       this.props.dispatch(uploadCompose(e.dataTransfer.files));
diff --git a/app/javascript/flavours/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js
index 342c5265e..56012ba78 100644
--- a/app/javascript/flavours/glitch/packs/public.js
+++ b/app/javascript/flavours/glitch/packs/public.js
@@ -61,6 +61,12 @@ function main() {
     if (reactComponents.length > 0) {
       import(/* webpackChunkName: "containers/media_container" */ 'flavours/glitch/containers/media_container')
         .then(({ default: MediaContainer }) => {
+          [].forEach.call(reactComponents, (component) => {
+            [].forEach.call(component.children, (child) => {
+              component.removeChild(child);
+            });
+          });
+
           const content = document.createElement('div');
 
           ReactDOM.render(<MediaContainer locale={locale} components={reactComponents} />, content);
diff --git a/app/javascript/flavours/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss
index f676a8c77..c8d144e5b 100644
--- a/app/javascript/flavours/glitch/styles/about.scss
+++ b/app/javascript/flavours/glitch/styles/about.scss
@@ -1270,8 +1270,7 @@ $small-breakpoint: 960px;
       }
 
       #mastodon-timeline {
-        display: block;
-        width: 100vw;
+        display: flex;
         height: 100vh;
         border-radius: 0;
       }
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index e7124a2c0..4e969601b 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -1,4 +1,6 @@
 $no-columns-breakpoint: 600px;
+$sidebar-width: 240px;
+$content-width: 840px;
 
 .admin-wrapper {
   display: flex;
@@ -6,7 +8,7 @@ $no-columns-breakpoint: 600px;
   height: 100%;
 
   .sidebar-wrapper {
-    flex: 1;
+    flex: 1 1 $sidebar-width;
     height: 100%;
     background: $ui-base-color;
     display: flex;
@@ -14,7 +16,7 @@ $no-columns-breakpoint: 600px;
   }
 
   .sidebar {
-    width: 240px;
+    width: $sidebar-width;
     height: 100%;
     padding: 0;
     overflow-y: auto;
@@ -95,12 +97,12 @@ $no-columns-breakpoint: 600px;
   }
 
   .content-wrapper {
-    flex: 2;
+    flex: 2 1 $content-width;
     overflow: auto;
   }
 
   .content {
-    max-width: 700px;
+    max-width: $content-width;
     padding: 20px 15px;
     padding-top: 60px;
     padding-left: 25px;
diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js
index a407df31e..f091d7893 100644
--- a/app/javascript/mastodon/components/hashtag.js
+++ b/app/javascript/mastodon/components/hashtag.js
@@ -1,16 +1,16 @@
 import React from 'react';
 import { Sparklines, SparklinesCurve } from 'react-sparklines';
-import { Link } from 'react-router-dom';
 import { FormattedMessage } from 'react-intl';
 import ImmutablePropTypes from 'react-immutable-proptypes';
+import Permalink from './permalink';
 import { shortNumberFormat } from '../utils/numbers';
 
 const Hashtag = ({ hashtag }) => (
   <div className='trends__item'>
     <div className='trends__item__name'>
-      <Link to={`/timelines/tag/${hashtag.get('name')}`}>
+      <Permalink href={hashtag.get('url')} to={`/timelines/tag/${hashtag.get('name')}`}>
         #<span>{hashtag.get('name')}</span>
-      </Link>
+      </Permalink>
 
       <FormattedMessage id='trends.count_by_accounts' defaultMessage='{count} {rawCount, plural, one {person} other {people}} talking' values={{ rawCount: hashtag.getIn(['history', 0, 'accounts']), count: <strong>{shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))}</strong> }} />
     </div>
diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index cb88e538a..a59c0a257 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -259,6 +259,7 @@ class UI extends React.PureComponent {
     e.preventDefault();
 
     this.setState({ draggingOver: false });
+    this.dragTargets = [];
 
     if (e.dataTransfer && e.dataTransfer.files.length === 1) {
       this.props.dispatch(uploadCompose(e.dataTransfer.files));
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index f558a6ddc..45b074a52 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -132,8 +132,8 @@
   "follow_request.authorize": "ترخيص",
   "follow_request.reject": "رفض",
   "getting_started.developers": "المُطوِّرون",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
+  "getting_started.directory": "دليل المستخدِمين والمستخدِمات",
+  "getting_started.documentation": "الدليل",
   "getting_started.heading": "إستعدّ للبدء",
   "getting_started.invite": "دعوة أشخاص",
   "getting_started.open_source_notice": "ماستدون برنامج مفتوح المصدر. يمكنك المساهمة، أو الإبلاغ عن تقارير الأخطاء، على جيت هب {github}.",
@@ -156,7 +156,7 @@
   "introduction.federation.home.text": "سوف تُعرَض منشورات الأشخاص الذين تُتابِعهم على الخيط الرئيسي. بإمكانك متابعة أي حساب أيا كان الخادم الذي هو عليه!",
   "introduction.federation.local.headline": "Local",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
+  "introduction.interactions.action": "إنهاء العرض التوضيحي!",
   "introduction.interactions.favourite.headline": "الإضافة إلى المفضلة",
   "introduction.interactions.favourite.text": "يمكِنك إضافة أي تبويق إلى المفضلة و إعلام صاحبه أنك أعجِبت بذاك التبويق.",
   "introduction.interactions.reblog.headline": "الترقية",
@@ -293,7 +293,7 @@
   "search_results.total": "{count, number} {count, plural, one {result} و {results}}",
   "standalone.public_title": "نظرة على ...",
   "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_status": "افتح هذا المنشور على واجهة الإشراف",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "إلغاء الترقية",
   "status.cannot_reblog": "تعذرت ترقية هذا المنشور",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 6b911711e..302ff2573 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -292,8 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, un {result} altres {results}}",
   "standalone.public_title": "Una mirada a l'interior ...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Obre l'interfície de moderació per a @{name}",
+  "status.admin_status": "Obre aquest estat a la interfície de moderació",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Desfer l'impuls",
   "status.cannot_reblog": "Aquesta publicació no pot ser retootejada",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 0277a513b..496f13e7d 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -292,8 +292,8 @@
   "search_results.statuses": "Statuti",
   "search_results.total": "{count, number} {count, plural, one {risultatu} other {risultati}}",
   "standalone.public_title": "Una vista à l'internu...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Apre l'interfaccia di muderazione per @{name}",
+  "status.admin_status": "Apre stu statutu in l'interfaccia di muderazione",
   "status.block": "Bluccà @{name}",
   "status.cancel_reblog_private": "Ùn sparte più",
   "status.cannot_reblog": "Stu statutu ùn pò micca esse spartutu",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 31c21cce5..7e8d7b8d3 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -292,8 +292,8 @@
   "search_results.statuses": "Tooty",
   "search_results.total": "{count, number} {count, plural, one {výsledek} few {výsledky} many {výsledku} other {výsledků}}",
   "standalone.public_title": "Nahlédněte dovnitř...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Otevřít moderační rozhraní pro uživatele @{name}",
+  "status.admin_status": "Otevřít tento příspěvek v moderačním rozhraní",
   "status.block": "Zablokovat uživatele @{name}",
   "status.cancel_reblog_private": "Zrušit boost",
   "status.cannot_reblog": "Tento příspěvek nemůže být boostnutý",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index a25497f78..471b70439 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -139,29 +139,29 @@
   "getting_started.open_source_notice": "Mae Mastodon yn feddalwedd côd agored. Mae modd cyfrannu neu adrodd materion ar GitHUb ar {github}.",
   "getting_started.security": "Diogelwch",
   "getting_started.terms": "Telerau Gwasanaeth",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_header.tag_mode.all": "a {additional}",
+  "hashtag.column_header.tag_mode.any": "neu {additional}",
+  "hashtag.column_header.tag_mode.none": "heb {additional}",
+  "hashtag.column_settings.tag_mode.all": "Pob un o'r rhain",
+  "hashtag.column_settings.tag_mode.any": "Unrhyw un o'r rhain",
+  "hashtag.column_settings.tag_mode.none": "Dim o'r rhain",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "Syml",
   "home.column_settings.show_reblogs": "Dangos bŵstiau",
   "home.column_settings.show_replies": "Dangos ymatebion",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.action": "Nesaf",
+  "introduction.federation.federated.headline": "Ffederasiwn",
   "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
   "introduction.federation.home.headline": "Home",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
   "introduction.federation.local.headline": "Local",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
   "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.headline": "Ffefryn",
   "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.headline": "Hwb",
   "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.headline": "Ateb",
   "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
   "introduction.welcome.action": "Let's go!",
   "introduction.welcome.headline": "First steps",
@@ -244,17 +244,17 @@
   "notifications.column_settings.favourite": "Ffefrynnau:",
   "notifications.column_settings.filter_bar.advanced": "Display all categories",
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.show": "Dangos",
   "notifications.column_settings.follow": "Dilynwyr newydd:",
   "notifications.column_settings.mention": "Crybwylliadau:",
   "notifications.column_settings.push": "Hysbysiadau push",
-  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.reblog": "Hybiadau:",
   "notifications.column_settings.show": "Dangos yn y golofn",
   "notifications.column_settings.sound": "Chwarae sain",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
+  "notifications.filter.all": "Pob",
+  "notifications.filter.boosts": "Hybiadau",
+  "notifications.filter.favourites": "Ffefrynnau",
+  "notifications.filter.follows": "Yn dilyn",
   "notifications.filter.mentions": "Mentions",
   "notifications.group": "{count} o hysbysiadau",
   "privacy.change": "Addasu preifatrwdd y statws",
@@ -302,7 +302,7 @@
   "status.direct": "Neges breifat @{name}",
   "status.embed": "Plannu",
   "status.favourite": "Hoffi",
-  "status.filtered": "Filtered",
+  "status.filtered": "Wedi'i hidlo",
   "status.load_more": "Llwythwch mwy",
   "status.media_hidden": "Cyfryngau wedi'u cuddio",
   "status.mention": "Crybwyll @{name}",
@@ -328,12 +328,12 @@
   "status.show_less_all": "Dangos llai i bawb",
   "status.show_more": "Dangos mwy",
   "status.show_more_all": "Dangos mwy i bawb",
-  "status.show_thread": "Show thread",
+  "status.show_thread": "Dangos edefyn",
   "status.unmute_conversation": "Dad-dawelu sgwrs",
   "status.unpin": "Dadbinio o'r proffil",
   "suggestions.dismiss": "Dismiss suggestion",
   "suggestions.header": "You might be interested in…",
-  "tabs_bar.federated_timeline": "Wedi'i ffedereiddio",
+  "tabs_bar.federated_timeline": "Ffederasiwn",
   "tabs_bar.home": "Hafan",
   "tabs_bar.local_timeline": "Lleol",
   "tabs_bar.notifications": "Hysbysiadau",
@@ -343,7 +343,7 @@
   "upload_area.title": "Llusgwch & gollwing i uwchlwytho",
   "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg",
-  "upload_form.focus": "Cropio",
+  "upload_form.focus": "Newid rhagolwg",
   "upload_form.undo": "Dileu",
   "upload_progress.label": "Uwchlwytho...",
   "video.close": "Cau fideo",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 7d5f0348a..69a139c57 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -160,7 +160,7 @@
   "introduction.interactions.favourite.headline": "Favorisieren",
   "introduction.interactions.favourite.text": "Du kannst einen Beitrag für später speichern und dem Autor wissen lassen, dass du ihn magst, indem du ihn favorisierst.",
   "introduction.interactions.reblog.headline": "Teilen",
-  "introduction.interactions.reblog.text": "Du kannst Beiträge von anderen Leuten an deine Follower teilen (oder auch \"boosten\").",
+  "introduction.interactions.reblog.text": "Du kannst Beiträge von anderen Leuten an deine Follower teilen.",
   "introduction.interactions.reply.headline": "Antworten",
   "introduction.interactions.reply.text": "Du kannst auf die Beiträge von anderen Leuten antworten und die Beiträge werden dann in eine Konversation zusammengebunden.",
   "introduction.welcome.action": "Lasst uns loslegen!",
@@ -168,7 +168,7 @@
   "introduction.welcome.text": "Willkommen im Fediverse! In wenigen Momenten wirst du in der Lage sein Nachrichten zu versenden und mit deinen Freunden über Server hinweg in Kontakt zu treten. Aber dieser Server, {domain}, ist sehr speziell — er hostet dein Profil, also merke dir den Namen.",
   "keyboard_shortcuts.back": "zurück navigieren",
   "keyboard_shortcuts.blocked": "Liste blockierter Profile öffnen",
-  "keyboard_shortcuts.boost": "boosten",
+  "keyboard_shortcuts.boost": "teilen",
   "keyboard_shortcuts.column": "einen Status in einer der Spalten fokussieren",
   "keyboard_shortcuts.compose": "fokussiere das Eingabefeld",
   "keyboard_shortcuts.description": "Beschreibung",
@@ -252,9 +252,9 @@
   "notifications.column_settings.show": "In der Spalte anzeigen",
   "notifications.column_settings.sound": "Ton abspielen",
   "notifications.filter.all": "Alle",
-  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.boosts": "Erneut geteilte Beiträge",
   "notifications.filter.favourites": "Favoriten",
-  "notifications.filter.follows": "Follows",
+  "notifications.filter.follows": "Folgende",
   "notifications.filter.mentions": "Erwähnungen",
   "notifications.group": "{count} Benachrichtigungen",
   "privacy.change": "Sichtbarkeit des Beitrags anpassen",
@@ -292,8 +292,8 @@
   "search_results.statuses": "Beiträge",
   "search_results.total": "{count, number} {count, plural, one {Ergebnis} other {Ergebnisse}}",
   "standalone.public_title": "Ein kleiner Einblick …",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Öffne Moderationsoberfläche für @{name}",
+  "status.admin_status": "Öffne diesen Status in der Moderationsoberfläche",
   "status.block": "Blockiere @{name}",
   "status.cancel_reblog_private": "Nicht mehr teilen",
   "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 35e41d7bb..762896887 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -292,8 +292,8 @@
   "search_results.statuses": "Pouets",
   "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}",
   "standalone.public_title": "Un aperçu …",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Ouvrir l'interface de modération pour @{name}",
+  "status.admin_status": "Ouvrir ce statut dans l'interface de modération",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Dé-booster",
   "status.cannot_reblog": "Cette publication ne peut être boostée",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 23bbed74d..c1ece163d 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rexeitar",
   "getting_started.developers": "Desenvolvedoras",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Directorio do perfil",
   "getting_started.documentation": "Documentation",
   "getting_started.heading": "Comezando",
   "getting_started.invite": "Convide a xente",
@@ -292,8 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count,plural,one {result} outros {results}}",
   "standalone.public_title": "Ollada dentro...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Abrir interface de moderación para @{name}",
+  "status.admin_status": "Abrir este estado na interface de moderación",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Non promover",
   "status.cannot_reblog": "Esta mensaxe non pode ser promovida",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 7ddd95f60..6f7d5cf7e 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -136,7 +136,7 @@
   "follow_request.authorize": "許可",
   "follow_request.reject": "拒否",
   "getting_started.developers": "開発",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "ディレクトリ",
   "getting_started.documentation": "ドキュメント",
   "getting_started.heading": "スタート",
   "getting_started.invite": "招待",
@@ -262,7 +262,7 @@
   "notifications.filter.follows": "フォロー",
   "notifications.filter.mentions": "返信",
   "notifications.group": "{count} 件の通知",
-  "privacy.change": "投稿のプライバシーを変更",
+  "privacy.change": "公開範囲を変更",
   "privacy.direct.long": "メンションしたユーザーだけに公開",
   "privacy.direct.short": "ダイレクト",
   "privacy.private.long": "フォロワーだけに公開",
@@ -297,8 +297,8 @@
   "search_results.statuses": "トゥート",
   "search_results.total": "{count, number}件の結果",
   "standalone.public_title": "今こんな話をしています...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "@{name} のモデレーション画面を開く",
+  "status.admin_status": "この投稿をモデレーション画面で開く",
   "status.block": "@{name}さんをブロック",
   "status.cancel_reblog_private": "ブースト解除",
   "status.cannot_reblog": "この投稿はブーストできません",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 0d707afb1..ceb474a3e 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -292,8 +292,8 @@
   "search_results.statuses": "툿",
   "search_results.total": "{count, number}건의 결과",
   "standalone.public_title": "지금 이런 이야기를 하고 있습니다…",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "@{name}에 대한 모더레이션 인터페이스 열기",
+  "status.admin_status": "모더레이션 인터페이스에서 이 게시물 열기",
   "status.block": "@{name} 차단",
   "status.cancel_reblog_private": "부스트 취소",
   "status.cannot_reblog": "이 포스트는 부스트 할 수 없습니다",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index e5f7b0bdf..871142195 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -118,8 +118,8 @@
   "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!",
   "empty_column.direct": "Je hebt nog geen directe berichten. Wanneer je er een verzend of ontvangt, zijn deze hier te zien.",
   "empty_column.domain_blocks": "Er zijn nog geen genegeerde domeinen.",
-  "empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een als favoriet markeert, valt deze hier te zien.",
-  "empty_column.favourites": "Niemand heeft nog deze toot als favoriet gemarkeerd. Wanneer iemand dit doet, valt dat hier te zien.",
+  "empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.",
+  "empty_column.favourites": "Niemand heeft deze toot nog aan hun favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.",
   "empty_column.follow_requests": "Jij hebt nog enkel volgverzoek ontvangen. Wanneer je er eentje ontvangt, valt dat hier te zien.",
   "empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.",
   "empty_column.home": "Jij volgt nog niemand. Bezoek {public} of gebruik het zoekvenster om andere mensen te ontmoeten.",
@@ -158,7 +158,7 @@
   "introduction.federation.local.text": "Openbare toots van mensen die ook op jouw server zitten verschijnen op de lokale tijdlijn.",
   "introduction.interactions.action": "Introductie beëindigen!",
   "introduction.interactions.favourite.headline": "Favorieten",
-  "introduction.interactions.favourite.text": "Je kunt door een toot als favoriet te markeren, deze voor later bewaren en de auteur laten weten dat je het leuk vond.",
+  "introduction.interactions.favourite.text": "Je kunt door een toot aan jouw favorieten toe te voegen, deze voor later bewaren en de auteur laten weten dat je de toot leuk vind.",
   "introduction.interactions.reblog.headline": "Boost",
   "introduction.interactions.reblog.text": "Je kunt toots van andere mensen met jouw volgers delen door deze te boosten.",
   "introduction.interactions.reply.headline": "Reageren",
@@ -175,7 +175,7 @@
   "keyboard_shortcuts.direct": "om jouw directe berichten te tonen",
   "keyboard_shortcuts.down": "om naar beneden door de lijst te bewegen",
   "keyboard_shortcuts.enter": "om toot volledig te tonen",
-  "keyboard_shortcuts.favourite": "om als favoriet te markeren",
+  "keyboard_shortcuts.favourite": "om aan jouw favorieten toe te voegen",
   "keyboard_shortcuts.favourites": "om jouw lijst met favorieten te tonen",
   "keyboard_shortcuts.federated": "om de globale tijdlijn te tonen",
   "keyboard_shortcuts.heading": "Sneltoetsen",
@@ -234,7 +234,7 @@
   "navigation_bar.preferences": "Instellingen",
   "navigation_bar.public_timeline": "Globale tijdlijn",
   "navigation_bar.security": "Beveiliging",
-  "notification.favourite": "{name} markeerde jouw toot als favoriet",
+  "notification.favourite": "{name} voegde jouw toot als favoriet toe",
   "notification.follow": "{name} volgt jou nu",
   "notification.mention": "{name} vermeldde jou",
   "notification.reblog": "{name} boostte jouw toot",
@@ -292,8 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}",
   "standalone.public_title": "Een kijkje binnenin...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Moderatie-omgeving van @{name} openen",
+  "status.admin_status": "Deze toot in de moderatie-omgeving openen",
   "status.block": "Blokkeer @{name}",
   "status.cancel_reblog_private": "Niet langer boosten",
   "status.cannot_reblog": "Deze toot kan niet geboost worden",
@@ -331,7 +331,7 @@
   "status.show_thread": "Gesprek tonen",
   "status.unmute_conversation": "Gesprek niet langer negeren",
   "status.unpin": "Van profielpagina losmaken",
-  "suggestions.dismiss": "Suggestie verwerpen",
+  "suggestions.dismiss": "Voorstel verwerpen",
   "suggestions.header": "Je bent waarschijnlijk ook geïnteresseerd in…",
   "tabs_bar.federated_timeline": "Globaal",
   "tabs_bar.home": "Start",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 87fbf54c3..c28e9f5b8 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -292,8 +292,8 @@
   "search_results.statuses": "Tuts",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
   "standalone.public_title": "Una ulhada dedins…",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Dobrir l’interfàcia de moderacion per @{name}",
+  "status.admin_status": "Dobrir aqueste estatut dins l’interfàcia de moderacion",
   "status.block": "Blocar @{name}",
   "status.cancel_reblog_private": "Quitar de partejar",
   "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 6a1b8a0c6..9f78c430f 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "Dodaj lub usuń z list",
   "account.badges.bot": "Bot",
   "account.block": "Blokuj @{name}",
   "account.block_domain": "Blokuj wszystko z {domain}",
@@ -117,7 +117,7 @@
   "emoji_button.search_results": "Wyniki wyszukiwania",
   "emoji_button.symbols": "Symbole",
   "emoji_button.travel": "Podróże i miejsca",
-  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_timeline": "Brak wpisów tutaj!",
   "empty_column.blocks": "Nie zablokowałeś(-aś) jeszcze żadnego użytkownika.",
   "empty_column.community": "Lokalna oś czasu jest pusta. Napisz coś publicznie, aby zagaić!",
   "empty_column.direct": "Nie masz żadnych wiadomości bezpośrednich. Kiedy dostaniesz lub wyślesz jakąś, pojawi się ona tutaj.",
@@ -136,19 +136,19 @@
   "follow_request.authorize": "Autoryzuj",
   "follow_request.reject": "Odrzuć",
   "getting_started.developers": "Dla programistów",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Katalog profilów",
   "getting_started.documentation": "Dokumentacja",
   "getting_started.heading": "Rozpocznij",
   "getting_started.invite": "Zaproś znajomych",
   "getting_started.open_source_notice": "Mastodon jest oprogramowaniem o otwartym źródle. Możesz pomóc w rozwoju lub zgłaszać błędy na GitHubie tutaj: {github}.",
   "getting_started.security": "Bezpieczeństwo",
   "getting_started.terms": "Zasady użytkowania",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_header.tag_mode.all": "i {additional}",
+  "hashtag.column_header.tag_mode.any": "lub {additional}",
+  "hashtag.column_header.tag_mode.none": "bez {additional}",
+  "hashtag.column_settings.tag_mode.all": "Wszystkie",
+  "hashtag.column_settings.tag_mode.any": "Dowolne",
+  "hashtag.column_settings.tag_mode.none": "Żadne",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "Podstawowe",
   "home.column_settings.show_reblogs": "Pokazuj podbicia",
@@ -297,8 +297,8 @@
   "search_results.statuses": "Wpisy",
   "search_results.total": "{count, number} {count, plural, one {wynik} few {wyniki} many {wyników} more {wyników}}",
   "standalone.public_title": "Spojrzenie w głąb…",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Otwórz interfejs moderacyjny dla @{name}",
+  "status.admin_status": "Otwórz ten wpis w interfejsie moderacyjnym",
   "status.block": "Zablokuj @{name}",
   "status.cancel_reblog_private": "Cofnij podbicie",
   "status.cannot_reblog": "Ten wpis nie może zostać podbity",
@@ -333,11 +333,11 @@
   "status.show_less_all": "Zwiń wszystkie",
   "status.show_more": "Rozwiń",
   "status.show_more_all": "Rozwiń wszystkie",
-  "status.show_thread": "Show thread",
+  "status.show_thread": "Pokaż wątek",
   "status.unmute_conversation": "Cofnij wyciszenie konwersacji",
   "status.unpin": "Odepnij z profilu",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "suggestions.dismiss": "Odrzuć sugestię",
+  "suggestions.header": "Może Cię zainteresować…",
   "tabs_bar.federated_timeline": "Globalne",
   "tabs_bar.home": "Strona główna",
   "tabs_bar.local_timeline": "Lokalne",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index b0555bd0c..392e7f485 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -292,8 +292,8 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "standalone.public_title": "Dê uma espiada...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Abrir interface de moderação para @{name}",
+  "status.admin_status": "Abrir esse status na interface de moderação",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Desfazer compartilhamento",
   "status.cannot_reblog": "Esta postagem não pode ser compartilhada",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index d874ed0aa..91ecbbce7 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -24,8 +24,8 @@
   "account.mute": "Ignorovať @{name}",
   "account.mute_notifications": "Stĺmiť oboznámenia od @{name}",
   "account.muted": "Utíšený/á",
-  "account.posts": "Hlášky",
-  "account.posts_with_replies": "Hlášky s odpoveďami",
+  "account.posts": "Príspevky",
+  "account.posts_with_replies": "Príspevky aj s odpoveďami",
   "account.report": "Nahlás @{name}",
   "account.requested": "Čaká na schválenie. Kliknite pre zrušenie žiadosti",
   "account.share": "Zdieľať @{name} profil",
@@ -56,7 +56,7 @@
   "column.lists": "Zoznamy",
   "column.mutes": "Ignorovaní užívatelia",
   "column.notifications": "Oboznámenia",
-  "column.pins": "Pripnuté hlášky",
+  "column.pins": "Pripnuté príspevky",
   "column.public": "Federovaná časová os",
   "column_back_button.label": "Späť",
   "column_header.hide_settings": "Skryť nastavenia",
@@ -203,8 +203,8 @@
   "lists.account.add": "Pridať do zoznamu",
   "lists.account.remove": "Odobrať zo zoznamu",
   "lists.delete": "Vymazať list",
-  "lists.edit": "Upraviť zoznam",
-  "lists.new.create": "Pridať zoznam",
+  "lists.edit": "Uprav zoznam",
+  "lists.new.create": "Pridaj zoznam",
   "lists.new.title_placeholder": "Názov nového zoznamu",
   "lists.search": "Vyhľadávajte medzi užívateľmi ktorých sledujete",
   "lists.subheading": "Tvoje zoznamy",
@@ -220,7 +220,7 @@
   "navigation_bar.direct": "Súkromné správy",
   "navigation_bar.discover": "Objavuj",
   "navigation_bar.domain_blocks": "Skryté domény",
-  "navigation_bar.edit_profile": "Upraviť profil",
+  "navigation_bar.edit_profile": "Uprav profil",
   "navigation_bar.favourites": "Obľúbené",
   "navigation_bar.filters": "Utĺmené slová",
   "navigation_bar.follow_requests": "Žiadosti o sledovanie",
@@ -289,11 +289,11 @@
   "search_popout.tips.user": "používateľ",
   "search_results.accounts": "Ľudia",
   "search_results.hashtags": "Haštagy",
-  "search_results.statuses": "Hlášky",
+  "search_results.statuses": "Príspevky",
   "search_results.total": "{count, number} {count, plural, one {výsledok} many {výsledkov} other {výsledky}}",
   "standalone.public_title": "Náhľad dovnútra...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Otvor moderovacie rozhranie užívateľa @{name}",
+  "status.admin_status": "Otvor tento príspevok v moderovacom rozhraní",
   "status.block": "Blokovať @{name}",
   "status.cancel_reblog_private": "Nezdieľaj",
   "status.cannot_reblog": "Tento príspevok nemôže byť re-tootnutý",
diff --git a/app/javascript/mastodon/service_worker/web_push_notifications.js b/app/javascript/mastodon/service_worker/web_push_notifications.js
index 80a4fb329..1ab0dc0fa 100644
--- a/app/javascript/mastodon/service_worker/web_push_notifications.js
+++ b/app/javascript/mastodon/service_worker/web_push_notifications.js
@@ -92,11 +92,14 @@ const handlePush = (event) => {
       options.image     = notification.status && notification.status.media_attachments.length > 0 && notification.status.media_attachments[0].preview_url || undefined;
       options.data      = { access_token, preferred_locale, id: notification.status ? notification.status.id : notification.account.id, url: notification.status ? `/web/statuses/${notification.status.id}` : `/web/accounts/${notification.account.id}` };
 
-      if (notification.status && notification.status.sensitive) {
+      if (notification.status && notification.status.spoiler_text || notification.status.sensitive) {
         options.data.hiddenBody  = htmlToPlainText(notification.status.content);
         options.data.hiddenImage = notification.status.media_attachments.length > 0 && notification.status.media_attachments[0].preview_url;
 
-        options.body    = notification.status.spoiler_text;
+        if (notification.status.spoiler_text) {
+          options.body    = notification.status.spoiler_text;
+        }
+
         options.image   = undefined;
         options.actions = [actionExpand(preferred_locale)];
       } else if (notification.type === 'mention') {
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index 196d2d02f..69441d315 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -66,6 +66,12 @@ function main() {
     if (reactComponents.length > 0) {
       import(/* webpackChunkName: "containers/media_container" */ '../mastodon/containers/media_container')
         .then(({ default: MediaContainer }) => {
+          [].forEach.call(reactComponents, (component) => {
+            [].forEach.call(component.children, (child) => {
+              component.removeChild(child);
+            });
+          });
+
           const content = document.createElement('div');
 
           ReactDOM.render(<MediaContainer locale={locale} components={reactComponents} />, content);
diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss
index dc456be3e..47ac9265b 100644
--- a/app/javascript/styles/mastodon/about.scss
+++ b/app/javascript/styles/mastodon/about.scss
@@ -1267,8 +1267,7 @@ $small-breakpoint: 960px;
       }
 
       #mastodon-timeline {
-        display: block;
-        width: 100vw;
+        display: flex;
         height: 100vh;
         border-radius: 0;
       }
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index e7124a2c0..4e969601b 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -1,4 +1,6 @@
 $no-columns-breakpoint: 600px;
+$sidebar-width: 240px;
+$content-width: 840px;
 
 .admin-wrapper {
   display: flex;
@@ -6,7 +8,7 @@ $no-columns-breakpoint: 600px;
   height: 100%;
 
   .sidebar-wrapper {
-    flex: 1;
+    flex: 1 1 $sidebar-width;
     height: 100%;
     background: $ui-base-color;
     display: flex;
@@ -14,7 +16,7 @@ $no-columns-breakpoint: 600px;
   }
 
   .sidebar {
-    width: 240px;
+    width: $sidebar-width;
     height: 100%;
     padding: 0;
     overflow-y: auto;
@@ -95,12 +97,12 @@ $no-columns-breakpoint: 600px;
   }
 
   .content-wrapper {
-    flex: 2;
+    flex: 2 1 $content-width;
     overflow: auto;
   }
 
   .content {
-    max-width: 700px;
+    max-width: $content-width;
     padding: 20px 15px;
     padding-top: 60px;
     padding-left: 25px;
diff --git a/app/services/fetch_oembed_service.rb b/app/services/fetch_oembed_service.rb
index 9ddf9b13b..10176cfb9 100644
--- a/app/services/fetch_oembed_service.rb
+++ b/app/services/fetch_oembed_service.rb
@@ -43,7 +43,7 @@ class FetchOEmbedService
       res.code != 200 ? nil : res.body_with_limit
     end
 
-    validate(parse_for_format(body)) unless body.nil?
+    validate(parse_for_format(body)) if body.present?
   rescue Oj::ParseError, Ox::ParseError
     nil
   end
diff --git a/app/views/stream_entries/_attachment_list.html.haml b/app/views/stream_entries/_attachment_list.html.haml
new file mode 100644
index 000000000..d9706f47b
--- /dev/null
+++ b/app/views/stream_entries/_attachment_list.html.haml
@@ -0,0 +1,8 @@
+.attachment-list
+  .attachment-list__icon
+    = fa_icon 'link'
+  %ul.attachment-list__list
+    - attachments.each do |media|
+      %li
+        - url = media.remote_url.presence || media.file.url
+        = link_to File.basename(url), url, title: media.description
diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml
index 9298ecbb0..18265e110 100644
--- a/app/views/stream_entries/_detailed_status.html.haml
+++ b/app/views/stream_entries/_detailed_status.html.haml
@@ -25,9 +25,11 @@
   - if !status.media_attachments.empty?
     - if status.media_attachments.first.video?
       - video = status.media_attachments.first
-      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description
+      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description do
+        = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments }
     - else
-      = react_component :media_gallery, height: 380, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, 'reduceMotion': current_account&.user&.setting_reduce_motion, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
+      = react_component :media_gallery, height: 380, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, 'reduceMotion': current_account&.user&.setting_reduce_motion, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
+        = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments }
   - elsif status.preview_card
     = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 
diff --git a/app/views/stream_entries/_simple_status.html.haml b/app/views/stream_entries/_simple_status.html.haml
index 1d44be791..28b4e3217 100644
--- a/app/views/stream_entries/_simple_status.html.haml
+++ b/app/views/stream_entries/_simple_status.html.haml
@@ -30,9 +30,11 @@
   - if !status.media_attachments.empty?
     - if status.media_attachments.first.video?
       - video = status.media_attachments.first
-      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description
+      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description do
+        = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments }
     - else
-      = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
+      = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
+        = render partial: 'stream_entries/attachment_list', locals: { attachments: status.media_attachments }
   - elsif status.preview_card
     = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json