about summary refs log tree commit diff
path: root/app/views
diff options
context:
space:
mode:
authorAnthony Bellew <anthonyreflected@gmail.com>2017-01-25 20:53:57 -0700
committerGitHub <noreply@github.com>2017-01-25 20:53:57 -0700
commit3d890c407356c8e0e7dd9b64e8e232ededcff8e8 (patch)
treea22df9a8737250f97a6024943af3445a163917b3 /app/views
parentfebe2449bb14f3d877fb934ceb6d52e320712bac (diff)
parent905c82917959a5afe24cb85c62c0b0ba13f0da8b (diff)
Merge pull request #3 from tootsuite/master
Updating to current
Diffstat (limited to 'app/views')
-rw-r--r--app/views/about/index.html.haml12
-rw-r--r--app/views/about/more.html.haml56
-rw-r--r--app/views/accounts/_grid_card.html.haml4
-rw-r--r--app/views/accounts/_header.html.haml14
-rw-r--r--app/views/accounts/show.html.haml24
-rw-r--r--app/views/admin/domain_blocks/index.html.haml2
-rw-r--r--app/views/admin/settings/index.html.haml36
-rw-r--r--app/views/api/v1/apps/show.rabl3
-rw-r--r--app/views/api/v1/statuses/_show.rabl6
-rw-r--r--app/views/api/v1/statuses/card.rabl5
-rw-r--r--app/views/authorize_follow/_card.html.haml4
-rw-r--r--app/views/errors/404.html.haml5
-rw-r--r--app/views/errors/410.html.haml5
-rw-r--r--app/views/errors/422.html.haml5
-rw-r--r--app/views/home/index.html.haml3
-rw-r--r--app/views/home/initial_state.json.rabl24
-rw-r--r--app/views/layouts/error.html.haml36
-rw-r--r--app/views/layouts/public.html.haml2
-rw-r--r--app/views/settings/preferences/show.html.haml4
-rw-r--r--app/views/settings/shared/_links.html.haml1
-rw-r--r--app/views/stream_entries/_detailed_status.html.haml30
-rw-r--r--app/views/stream_entries/_favourite.html.haml2
-rw-r--r--app/views/stream_entries/_follow.html.haml2
-rw-r--r--app/views/stream_entries/_simple_status.html.haml20
-rw-r--r--app/views/stream_entries/show.html.haml8
-rw-r--r--app/views/tags/show.html.haml2
26 files changed, 266 insertions, 49 deletions
diff --git a/app/views/about/index.html.haml b/app/views/about/index.html.haml
index 6dd182205..88bfe3d61 100644
--- a/app/views/about/index.html.haml
+++ b/app/views/about/index.html.haml
@@ -1,3 +1,6 @@
+- content_for :header_tags do
+  = javascript_include_tag 'application_public'
+
 - content_for :page_title do
   = Rails.configuration.x.local_domain
 
@@ -5,10 +8,11 @@
   %meta{ property: 'og:site_name', content: 'Mastodon' }/
   %meta{ property: 'og:type', content: 'website' }/
   %meta{ property: 'og:title', content: Rails.configuration.x.local_domain }/
-  %meta{ property: 'og:description', content: "Mastodon is a free, open-source social network server. A decentralized alternative to commercial platforms, it avoids the risks of a single company monopolizing your communication. Anyone can run Mastodon and participate in the social network seamlessly" }/
+  %meta{ property: 'og:description', content: @description.blank? ? "Mastodon is a free, open-source social network server. A decentralized alternative to commercial platforms, it avoids the risks of a single company monopolizing your communication. Anyone can run Mastodon and participate in the social network seamlessly" : strip_tags(@description) }/
   %meta{ property: 'og:image', content: asset_url('mastodon_small.jpg') }/
   %meta{ property: 'og:image:width', content: '400' }/
   %meta{ property: 'og:image:height', content: '400' }/
+  %meta{ property: 'twitter:card', content: 'summary' }/
 
 .wrapper
   %h1
@@ -20,10 +24,14 @@
 
   .screenshot= image_tag 'screenshot.png'
 
+  - unless @description.blank?
+    %p= @description.html_safe
+
   .actions
     .info
+      = link_to t('about.learn_more'), about_more_path
       = link_to t('about.terms'), terms_path
-      = link_to t('about.source_code'), 'https://github.com/Gargron/mastodon'
+      = link_to t('about.source_code'), 'https://github.com/tootsuite/mastodon'
 
     = link_to t('about.get_started'), new_user_registration_path, class: 'button webapp-btn'
     = link_to t('auth.login'), new_user_session_path, class: 'button webapp-btn'
diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml
new file mode 100644
index 000000000..2de3bf986
--- /dev/null
+++ b/app/views/about/more.html.haml
@@ -0,0 +1,56 @@
+- content_for :page_title do
+  #{Rails.configuration.x.local_domain}
+
+.wrapper.thicc
+  .sidebar-layout
+    .main
+      .panel
+        %h2= Rails.configuration.x.local_domain
+
+        - unless @description.blank?
+          %p= @description.html_safe
+
+      .information-board
+        .section
+          %span= t 'about.user_count_before'
+          %strong= number_with_delimiter @user_count
+          %span= t 'about.user_count_after'
+        .section
+          %span= t 'about.status_count_before'
+          %strong= number_with_delimiter @status_count
+          %span= t 'about.status_count_after'
+        .section
+          %span= t 'about.domain_count_before'
+          %strong= number_with_delimiter @domain_count
+          %span= t 'about.domain_count_after'
+
+      - unless @extended_description.blank?
+        .panel= @extended_description.html_safe
+
+    .sidebar
+      .panel
+        .panel-header= t 'about.contact'
+        .panel-body
+          - if @contact_account
+            .owner
+              .avatar= image_tag @contact_account.avatar.url
+              .name
+                = link_to TagManager.instance.url_for(@contact_account) do
+                  %span.display_name.emojify= display_name(@contact_account)
+                  %span.username= "@#{@contact_account.acct}"
+
+          - unless @contact_email.blank?
+            .contact-email
+              = t 'about.business_email'
+              %strong= @contact_email
+      .panel
+        .panel-header= t 'about.links'
+        .panel-list
+          %ul
+            - if user_signed_in?
+              %li= link_to t('about.get_started'), root_path
+            - else
+              %li= link_to t('about.get_started'), new_user_registration_path
+              %li= link_to t('auth.login'), new_user_session_path
+            %li= link_to t('about.terms'), terms_path
+            %li= link_to t('about.source_code'), 'https://github.com/tootsuite/mastodon'
diff --git a/app/views/accounts/_grid_card.html.haml b/app/views/accounts/_grid_card.html.haml
index dfdb23161..d5418fca5 100644
--- a/app/views/accounts/_grid_card.html.haml
+++ b/app/views/accounts/_grid_card.html.haml
@@ -3,6 +3,6 @@
     .avatar= image_tag account.avatar.url(:original)
     .name
       = link_to TagManager.instance.url_for(account) do
-        %span.display_name= display_name(account)
+        %span.display_name.emojify= display_name(account)
         %span.username= "@#{account.acct}"
-  %p.note= truncate(strip_tags(account.note), length: 150)
+  %p.note.emojify= truncate(strip_tags(account.note), length: 150)
diff --git a/app/views/accounts/_header.html.haml b/app/views/accounts/_header.html.haml
index 1c6b5f0f6..f575e855e 100644
--- a/app/views/accounts/_header.html.haml
+++ b/app/views/accounts/_header.html.haml
@@ -1,27 +1,27 @@
-.card{ style: "background-image: url(#{@account.header.url( :original)})" }
+.card.h-card.p-author{ style: "background-image: url(#{@account.header.url( :original)})" }
   - if user_signed_in? && current_account.id != @account.id && !current_account.requested?(@account)
     .controls
       - if current_account.following?(@account)
         = link_to t('accounts.unfollow'), unfollow_account_path(@account), data: { method: :post }, class: 'button'
       - else
         = link_to t('accounts.follow'), follow_account_path(@account), data: { method: :post }, class: 'button'
-  - else
+  - elsif !user_signed_in?
     .controls
       .remote-follow
         = link_to t('accounts.remote_follow'), account_remote_follow_path(@account), class: 'button'
-  .avatar= image_tag @account.avatar.url(:original)
+  .avatar= image_tag @account.avatar.url(:original), class: 'u-photo'
   %h1.name
-    = display_name(@account)
+    %span.p-name.emojify= display_name(@account)
     %small
-      = "@#{@account.username}"
+      %span.p-nickname= "@#{@account.username}"
       = fa_icon('lock') if @account.locked?
   .details
     .bio
-      .account__header__content= Formatter.instance.simplified_format(@account)
+      .account__header__content.p-note.emojify= Formatter.instance.simplified_format(@account)
 
     .details-counters
       .counter{ class: active_nav_class(account_url(@account)) }
-        = link_to account_url(@account) do
+        = link_to account_url(@account), class: 'u-url u-uid' do
           %span.counter-label= t('accounts.posts')
           %span.counter-number= number_with_delimiter @account.statuses.count
       .counter{ class: active_nav_class(following_account_url(@account)) }
diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml
index 7afeb68a9..c194ce33d 100644
--- a/app/views/accounts/show.html.haml
+++ b/app/views/accounts/show.html.haml
@@ -12,16 +12,20 @@
   %meta{ property: 'og:image', content: full_asset_url(@account.avatar.url(:original)) }/
   %meta{ property: 'og:image:width', content: '120' }/
   %meta{ property: 'og:image:height', content: '120' }/
+  %meta{ property: 'twitter:card', content: 'summary' }/
 
-= render partial: 'header'
+.h-feed
+  %data.p-name{ value: "#{@account.username} on #{Rails.configuration.x.local_domain}" }/
 
-- if @statuses.empty?
-  .accounts-grid
-    = render partial: 'nothing_here'
-- else
-  .activity-stream
-    = render partial: 'stream_entries/status', collection: @statuses, as: :status
+  = render partial: 'header'
 
-.pagination
-  - if @statuses.size == 20
-    = link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), account_url(@account, max_id: @statuses.last.id), class: 'next_page', rel: 'next'
+  - if @statuses.empty?
+    .accounts-grid
+      = render partial: 'nothing_here'
+  - else
+    .activity-stream
+      = render partial: 'stream_entries/status', collection: @statuses, as: :status
+
+  .pagination
+    - if @statuses.size == 20
+      = link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), account_url(@account, max_id: @statuses.last.id), class: 'next_page', rel: 'next'
diff --git a/app/views/admin/domain_blocks/index.html.haml b/app/views/admin/domain_blocks/index.html.haml
index aedf163f7..dbaeb4716 100644
--- a/app/views/admin/domain_blocks/index.html.haml
+++ b/app/views/admin/domain_blocks/index.html.haml
@@ -5,10 +5,12 @@
   %thead
     %tr
       %th Domain
+      %th Severity
   %tbody
     - @blocks.each do |block|
       %tr
         %td
           %samp= block.domain
+        %td= block.severity
 
 = will_paginate @blocks, pagination_options
diff --git a/app/views/admin/settings/index.html.haml b/app/views/admin/settings/index.html.haml
new file mode 100644
index 000000000..5b482213b
--- /dev/null
+++ b/app/views/admin/settings/index.html.haml
@@ -0,0 +1,36 @@
+- content_for :page_title do
+  Site Settings
+
+%table.table
+  %colgroup
+    %col{ width: '35%' }/
+  %thead
+    %tr
+      %th Setting
+      %th Click to edit
+  %tbody
+    %tr
+      %td{ rowspan: 2 }
+        %strong Contact information
+      %td= best_in_place @settings['site_contact_username'], :value, url: admin_setting_path(@settings['site_contact_username']), place_holder: 'Enter a username'
+    %tr
+      %td= best_in_place @settings['site_contact_email'], :value, url: admin_setting_path(@settings['site_contact_email']), place_holder: 'Enter a public e-mail address'
+    %tr
+      %td
+        %strong Site description
+        %br/
+        Displayed as a paragraph on the frontpage and used as a meta tag.
+        %br/
+        You can use HTML tags, in particular
+        %code= '<a>'
+        and
+        %code= '<em>'
+      %td= best_in_place @settings['site_description'], :value, as: :textarea, url: admin_setting_path(@settings['site_description'])
+    %tr
+      %td
+        %strong Extended site description
+        %br/
+        Displayed on extended information page
+        %br/
+        You can use HTML tags
+      %td= best_in_place @settings['site_extended_description'], :value, as: :textarea, url: admin_setting_path(@settings['site_extended_description'])
\ No newline at end of file
diff --git a/app/views/api/v1/apps/show.rabl b/app/views/api/v1/apps/show.rabl
new file mode 100644
index 000000000..6d9e607db
--- /dev/null
+++ b/app/views/api/v1/apps/show.rabl
@@ -0,0 +1,3 @@
+object @application
+
+attributes :name, :website
diff --git a/app/views/api/v1/statuses/_show.rabl b/app/views/api/v1/statuses/_show.rabl
index a3391a67e..7309a78b8 100644
--- a/app/views/api/v1/statuses/_show.rabl
+++ b/app/views/api/v1/statuses/_show.rabl
@@ -1,4 +1,4 @@
-attributes :id, :created_at, :in_reply_to_id, :sensitive, :visibility
+attributes :id, :created_at, :in_reply_to_id, :sensitive, :spoiler_text, :visibility
 
 node(:uri)              { |status| TagManager.instance.uri_for(status) }
 node(:content)          { |status| Formatter.instance.format(status) }
@@ -6,6 +6,10 @@ node(:url)              { |status| TagManager.instance.url_for(status) }
 node(:reblogs_count)    { |status| defined?(@reblogs_counts_map)    ? (@reblogs_counts_map[status.id]    || 0) : status.reblogs.count }
 node(:favourites_count) { |status| defined?(@favourites_counts_map) ? (@favourites_counts_map[status.id] || 0) : status.favourites.count }
 
+child :application do
+  extends 'api/v1/apps/show'
+end
+
 child :account do
   extends 'api/v1/accounts/show'
 end
diff --git a/app/views/api/v1/statuses/card.rabl b/app/views/api/v1/statuses/card.rabl
new file mode 100644
index 000000000..8ba8dcbb1
--- /dev/null
+++ b/app/views/api/v1/statuses/card.rabl
@@ -0,0 +1,5 @@
+object @card
+
+attributes :url, :title, :description
+
+node(:image) { |card| card.image? ? full_asset_url(card.image.url(:original)) : nil }
diff --git a/app/views/authorize_follow/_card.html.haml b/app/views/authorize_follow/_card.html.haml
index a9b02c746..eef0bec07 100644
--- a/app/views/authorize_follow/_card.html.haml
+++ b/app/views/authorize_follow/_card.html.haml
@@ -4,8 +4,8 @@
       = image_tag account.avatar.url(:original), alt: '', width: 48, height: 48, class: 'avatar'
 
     %span.display-name
-      %strong= display_name(account)
+      %strong.emojify= display_name(account)
       %span= "@#{account.acct}"
 
   - unless account.note.blank?
-    .account__header__content= Formatter.instance.simplified_format(account)
+    .account__header__content.emojify= Formatter.instance.simplified_format(account)
diff --git a/app/views/errors/404.html.haml b/app/views/errors/404.html.haml
new file mode 100644
index 000000000..ba1d5f72d
--- /dev/null
+++ b/app/views/errors/404.html.haml
@@ -0,0 +1,5 @@
+- content_for :page_title do
+  The page you were looking for doesn't exist
+
+- content_for :content do
+  The page you were looking for doesn't exist
diff --git a/app/views/errors/410.html.haml b/app/views/errors/410.html.haml
new file mode 100644
index 000000000..07cf3742f
--- /dev/null
+++ b/app/views/errors/410.html.haml
@@ -0,0 +1,5 @@
+- content_for :page_title do
+  The page you were looking for doesn't exist anymore
+
+- content_for :content do
+  The page you were looking for doesn't exist anymore
diff --git a/app/views/errors/422.html.haml b/app/views/errors/422.html.haml
new file mode 100644
index 000000000..e369cded6
--- /dev/null
+++ b/app/views/errors/422.html.haml
@@ -0,0 +1,5 @@
+- content_for :page_title do
+  Security verification failed
+
+- content_for :content do
+  Security verification failed. Are you blocking cookies?
diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml
index 498fae105..0147f4064 100644
--- a/app/views/home/index.html.haml
+++ b/app/views/home/index.html.haml
@@ -1,4 +1,7 @@
 - content_for :header_tags do
+  :javascript
+    window.INITIAL_STATE = #{json_escape(render(file: 'home/initial_state', formats: :json))}
+
   = javascript_include_tag 'application'
 
 = react_component 'Mastodon', default_props, class: 'app-holder', prerender: false
diff --git a/app/views/home/initial_state.json.rabl b/app/views/home/initial_state.json.rabl
new file mode 100644
index 000000000..0e9736f5f
--- /dev/null
+++ b/app/views/home/initial_state.json.rabl
@@ -0,0 +1,24 @@
+object false
+
+node(:meta) {
+  {
+    access_token: @token,
+    locale: I18n.locale,
+    me: current_account.id,
+  }
+}
+
+node(:compose) {
+  {
+    me: current_account.id,
+    private: current_account.locked?,
+  }
+}
+
+node(:accounts) {
+  {
+    current_account.id => partial('api/v1/accounts/show', object: current_account),
+  }
+}
+
+node(:settings) { @web_settings }
diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml
new file mode 100644
index 000000000..54563f7d8
--- /dev/null
+++ b/app/views/layouts/error.html.haml
@@ -0,0 +1,36 @@
+!!!
+%html{:lang => "en"}
+  %head
+    %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
+    %meta{:charset => "utf-8"}/
+    %title= yield :page_title
+    %meta{:content => "width=device-width,initial-scale=1", :name => "viewport"}/
+    %link{:href => "https://fonts.googleapis.com/css?family=Roboto:400", :rel => "stylesheet"}/
+    :css
+      body {
+        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+        background: #282c37;
+        color: #9baec8;
+        text-align: center;
+        margin: 0;
+        padding: 20px;
+      }
+
+      .dialog img {
+        display: block;
+        margin: 20px auto;
+        margin-top: 50px;
+        max-width: 600px;
+        width: 100%;
+        height: auto;
+      }
+
+      .dialog h1 {
+        font: 20px/28px -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+        font-weight: 400;
+      }
+  %body
+    .dialog
+      %img{:alt => "Mastodon", :src => "/oops.png"}/
+      %div
+        %h1= yield :content
diff --git a/app/views/layouts/public.html.haml b/app/views/layouts/public.html.haml
index e6de7d017..808fb0a0e 100644
--- a/app/views/layouts/public.html.haml
+++ b/app/views/layouts/public.html.haml
@@ -6,6 +6,6 @@
   .footer
     %span.domain= link_to Rails.configuration.x.local_domain, root_path
     %span.powered-by
-      = t('generic.powered_by', link: link_to('Mastodon', 'https://github.com/Gargron/mastodon')).html_safe
+      = t('generic.powered_by', link: link_to('Mastodon', 'https://github.com/tootsuite/mastodon')).html_safe
 
 = render template: "layouts/application"
diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml
index a0860c94b..a9a1d21ac 100644
--- a/app/views/settings/preferences/show.html.haml
+++ b/app/views/settings/preferences/show.html.haml
@@ -6,14 +6,14 @@
 
   = f.input :locale, collection: I18n.available_locales, wrapper: :with_label, include_blank: false, label_method: lambda { |locale| human_locale(locale) }
 
-  = f.simple_fields_for :notification_emails, current_user.settings(:notification_emails) do |ff|
+  = f.simple_fields_for :notification_emails, hash_to_object(current_user.settings.notification_emails) do |ff|
     = ff.input :follow, as: :boolean, wrapper: :with_label
     = ff.input :follow_request, as: :boolean, wrapper: :with_label
     = ff.input :reblog, as: :boolean, wrapper: :with_label
     = ff.input :favourite, as: :boolean, wrapper: :with_label
     = ff.input :mention, as: :boolean, wrapper: :with_label
 
-  = f.simple_fields_for :interactions, current_user.settings(:interactions) do |ff|
+  = f.simple_fields_for :interactions, hash_to_object(current_user.settings.interactions) do |ff|
     = ff.input :must_be_follower, as: :boolean, wrapper: :with_label
     = ff.input :must_be_following, as: :boolean, wrapper: :with_label
 
diff --git a/app/views/settings/shared/_links.html.haml b/app/views/settings/shared/_links.html.haml
index 44f097950..a6e90f457 100644
--- a/app/views/settings/shared/_links.html.haml
+++ b/app/views/settings/shared/_links.html.haml
@@ -5,3 +5,4 @@
     %li= link_to t('settings.preferences'), settings_preferences_path
   - if controller_name != 'registrations'
     %li= link_to t('auth.change_password'), edit_user_registration_path
+  %li= link_to t('settings.back'), root_path
\ No newline at end of file
diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml
index 94451d3bd..6ee8c9e5b 100644
--- a/app/views/stream_entries/_detailed_status.html.haml
+++ b/app/views/stream_entries/_detailed_status.html.haml
@@ -1,36 +1,46 @@
 .detailed-status.light
-  = link_to TagManager.instance.url_for(status.account), class: 'detailed-status__display-name', target: @external_links ? '_blank' : nil, rel: 'noopener' do
+  = link_to TagManager.instance.url_for(status.account), class: 'detailed-status__display-name p-author h-card', target: @external_links ? '_blank' : nil, rel: 'noopener' do
     %div
       %div.avatar
-        = image_tag status.account.avatar.url(:original), width: 48, height: 48, alt: ''
+        = image_tag status.account.avatar.url(:original), width: 48, height: 48, alt: '', class: 'u-photo'
     %span.display-name
-      %strong= display_name(status.account)
-      %span= acct(status.account)
+      %strong.p-name.emojify= display_name(status.account)
+      %span.p-nickname= acct(status.account)
 
-  .status__content= Formatter.instance.format(status)
+  .status__content.e-content.p-name.emojify<
+    - unless status.spoiler_text.blank?
+      %p= status.spoiler_text
+    = Formatter.instance.format(status)
 
   - unless status.media_attachments.empty?
     - if status.media_attachments.first.video?
       .video-player
         - if status.sensitive?
           = render partial: 'stream_entries/content_spoiler'
-        %video{ src: status.media_attachments.first.file.url(:original), loop: true }
+        %video{ src: status.media_attachments.first.file.url(:original), loop: true, class: 'u-video' }
     - else
       .detailed-status__attachments
         - if status.sensitive?
           = render partial: 'stream_entries/content_spoiler'
         - status.media_attachments.each do |media|
           .media-item
-            = link_to '', (media.remote_url.blank? ? media.file.url(:original) : media.remote_url), style: "background-image: url(#{media.file.url(:original)})", target: '_blank', rel: 'noopener'
+            = link_to '', (media.remote_url.blank? ? media.file.url(:original) : media.remote_url), style: "background-image: url(#{media.file.url(:original)})", target: '_blank', rel: 'noopener', class: "u-#{media.video? ? 'video' : 'photo'}"
 
   %div.detailed-status__meta
-    = link_to TagManager.instance.url_for(status), class: 'detailed-status__datetime', target: @external_links ? '_blank' : nil, rel: 'noopener' do
+    %data.dt-published{ value: status.created_at.to_time.iso8601 }
+    = link_to TagManager.instance.url_for(status), class: 'detailed-status__datetime u-url u-uid', target: @external_links ? '_blank' : nil, rel: 'noopener' do
       %span= l(status.created_at)
     ·
-    %span
+    - if status.application
+      - if status.application.website.blank?
+        %strong.detailed-status__application= status.application.name
+      - else
+        = link_to status.application.name, status.application.website, class: 'detailed-status__application', target: '_blank', rel: 'noopener'
+      ·
+    %span<
       = fa_icon('retweet')
       %span= status.reblogs.count
     ·
-    %span
+    %span<
       = fa_icon('star')
       %span= status.favourites.count
diff --git a/app/views/stream_entries/_favourite.html.haml b/app/views/stream_entries/_favourite.html.haml
index aac90dcdf..ea4879328 100644
--- a/app/views/stream_entries/_favourite.html.haml
+++ b/app/views/stream_entries/_favourite.html.haml
@@ -1,5 +1,5 @@
 .entry.entry-favourite
-  .content
+  .content.emojify
     %strong= favourite.account.acct
     = t('stream_entries.favourited')
     %strong= favourite.status.account.acct
diff --git a/app/views/stream_entries/_follow.html.haml b/app/views/stream_entries/_follow.html.haml
index 1a2e2c554..da6d062f0 100644
--- a/app/views/stream_entries/_follow.html.haml
+++ b/app/views/stream_entries/_follow.html.haml
@@ -1,5 +1,5 @@
 .entry.entry-follow
-  .content
+  .content.emojify
     %strong= link_to follow.account.acct, account_path(follow.account)
     = t('stream_entries.is_now_following')
     %strong= link_to follow.target_account.acct, TagManager.instance.url_for(follow.target_account)
diff --git a/app/views/stream_entries/_simple_status.html.haml b/app/views/stream_entries/_simple_status.html.haml
index da3bc0ccb..95f90abd9 100644
--- a/app/views/stream_entries/_simple_status.html.haml
+++ b/app/views/stream_entries/_simple_status.html.haml
@@ -1,17 +1,21 @@
 .status.light
   .status__header
     .status__meta
-      = link_to time_ago_in_words(status.created_at), TagManager.instance.url_for(status), class: 'status__relative-time', title: l(status.created_at), target: @external_links ? '_blank' : nil, rel: 'noopener'
+      = link_to time_ago_in_words(status.created_at), TagManager.instance.url_for(status), class: 'status__relative-time u-url u-uid', title: l(status.created_at), target: @external_links ? '_blank' : nil, rel: 'noopener'
+      %data.dt-published{ value: status.created_at.to_time.iso8601 }
 
-    = link_to TagManager.instance.url_for(status.account), class: 'status__display-name', target: @external_links ? '_blank' : nil, rel: 'noopener' do
+    = link_to TagManager.instance.url_for(status.account), class: 'status__display-name p-author h-card', target: @external_links ? '_blank' : nil, rel: 'noopener' do
       .status__avatar
         %div
-          = image_tag status.account.avatar(:original), width: 48, height: 48, alt: ''
+          = image_tag status.account.avatar(:original), width: 48, height: 48, alt: '', class: 'u-photo'
       %span.display-name
-        %strong= display_name(status.account)
-        %span= acct(status.account)
+        %strong.p-name.emojify= display_name(status.account)
+        %span.p-nickname= acct(status.account)
 
-  .status__content= Formatter.instance.format(status)
+  .status__content.e-content.p-name.emojify<
+    - unless status.spoiler_text.blank?
+      %p= status.spoiler_text
+    = Formatter.instance.format(status)
 
   - unless status.media_attachments.empty?
     .status__attachments
@@ -19,10 +23,10 @@
         = render partial: 'stream_entries/content_spoiler'
       - if status.media_attachments.first.video?
         .video-item
-          = link_to (status.media_attachments.first.remote_url.blank? ? status.media_attachments.first.file.url(:original) : status.media_attachments.first.remote_url), style: "background-image: url(#{status.media_attachments.first.file.url(:small)})", target: '_blank', rel: 'noopener' do
+          = link_to (status.media_attachments.first.remote_url.blank? ? status.media_attachments.first.file.url(:original) : status.media_attachments.first.remote_url), style: "background-image: url(#{status.media_attachments.first.file.url(:small)})", target: '_blank', rel: 'noopener', class: 'u-video' do
             .video-item__play
               = fa_icon('play')
       - else
         - status.media_attachments.each do |media|
           .media-item
-            = link_to '', (media.remote_url.blank? ? media.file.url(:original) : media.remote_url), style: "background-image: url(#{media.file.url(:original)})", target: '_blank', rel: 'noopener'
+            = link_to '', (media.remote_url.blank? ? media.file.url(:original) : media.remote_url), style: "background-image: url(#{media.file.url(:original)})", target: '_blank', rel: 'noopener', class: "u-#{media.video? ? 'video' : 'photo'}"
diff --git a/app/views/stream_entries/show.html.haml b/app/views/stream_entries/show.html.haml
index 43935da60..6bad45705 100644
--- a/app/views/stream_entries/show.html.haml
+++ b/app/views/stream_entries/show.html.haml
@@ -5,7 +5,11 @@
   %meta{ property: 'og:site_name', content: 'Mastodon' }/
   %meta{ property: 'og:type', content: 'article' }/
   %meta{ property: 'og:title', content: "#{@account.username} on #{Rails.configuration.x.local_domain}" }/
-  %meta{ property: 'og:description', content: @stream_entry.activity.content }/
+
+  - if @stream_entry.activity.is_a?(Status) && !@stream_entry.activity.spoiler_text.blank?
+    %meta{ property: 'og:description', content: @stream_entry.activity.spoiler_text }/
+  - else
+    %meta{ property: 'og:description', content: @stream_entry.activity.content }/
 
   - if @stream_entry.activity.is_a?(Status) && @stream_entry.activity.media_attachments.size > 0
     %meta{ property: 'og:image', content: full_asset_url(@stream_entry.activity.media_attachments.first.file.url(:small)) }/
@@ -14,5 +18,7 @@
     %meta{ property: 'og:image:width', content: '120' }/
     %meta{ property: 'og:image:height', content: '120' }/
 
+  %meta{ property: 'twitter:card', content: 'summary' }/
+
 .activity-stream.activity-stream-headless
   = render partial: @type, locals: { @type.to_sym => @stream_entry.activity, include_threads: true }
diff --git a/app/views/tags/show.html.haml b/app/views/tags/show.html.haml
index dd42fe22c..412ec4fa5 100644
--- a/app/views/tags/show.html.haml
+++ b/app/views/tags/show.html.haml
@@ -2,7 +2,7 @@
   .accounts-grid
     = render partial: 'accounts/nothing_here'
 - else
-  .activity-stream
+  .activity-stream.h-feed
     = render partial: 'stream_entries/status', collection: @statuses, as: :status, cached: true
 
 .pagination