From 0c4dc26808c3bb7508bf9005f3c3430f1c7e2039 Mon Sep 17 00:00:00 2001
From: Henry Jameson <me@hjkos.com>
Date: Mon, 12 Mar 2018 02:31:33 +0300
Subject: after nine years of development, hopefully, it has been worth the
 weight

---
 src/components/notifications/notifications.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/components/notifications/notifications.vue')

diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index b341fcef..8e6f12b2 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -10,7 +10,7 @@
         <div v-for="notification in visibleNotifications" :key="notification" class="notification" :class='{"unseen": !notification.seen}'>
           <div>
             <a :href="notification.action.user.statusnet_profile_url" target="_blank">
-              <img class='avatar' :src="notification.action.user.profile_image_url_original">
+              <StillImage class='avatar' :src="notification.action.user.profile_image_url_original"/>
             </a>
           </div>
           <div class='text' style="width: 100%;">
-- 
cgit v1.2.3-70-g09d2


From aa0564406a95824cc45c815571292716b65806a1 Mon Sep 17 00:00:00 2001
From: Henry Jameson <me@hjkos.com>
Date: Sat, 31 Mar 2018 21:14:36 +0300
Subject: getting rid of baseXX, some small fixes. Seems to be usable.

---
 src/App.scss                                       |  79 ++++-
 src/App.vue                                        |   8 +-
 src/_variables.scss                                |   7 +-
 src/components/attachment/attachment.vue           | 200 +++++++------
 src/components/chat_panel/chat_panel.vue           |   4 +-
 src/components/conversation/conversation.vue       |   2 +-
 src/components/delete_button/delete_button.vue     |   5 +-
 src/components/favorite_button/favorite_button.vue |   6 +-
 .../instance_specific_panel.vue                    |   2 +-
 src/components/login_form/login_form.vue           |  62 ++--
 src/components/media_upload/media_upload.vue       |   4 +-
 src/components/nav_panel/nav_panel.vue             |  81 +++---
 src/components/notifications/notifications.js      |   2 +-
 src/components/notifications/notifications.scss    |  27 +-
 src/components/notifications/notifications.vue     |   8 +-
 .../post_status_form/post_status_form.vue          | 295 +++++++++----------
 src/components/registration/registration.vue       | 104 ++++---
 src/components/retweet_button/retweet_button.vue   |  10 +-
 src/components/settings/settings.vue               |   4 +-
 src/components/status/status.js                    |   5 -
 src/components/status/status.vue                   | 319 +++++++++++----------
 src/components/style_switcher/style_switcher.js    |   8 +-
 src/components/style_switcher/style_switcher.vue   |  14 +-
 src/components/timeline/timeline.vue               |  28 +-
 src/components/user_card/user_card.vue             |  34 +--
 .../user_card_content/user_card_content.js         |   4 +-
 .../user_card_content/user_card_content.vue        |  28 +-
 src/components/user_finder/user_finder.vue         |   8 +-
 src/components/user_panel/user_panel.vue           |  10 +-
 src/components/user_profile/user_profile.vue       |   5 +-
 src/components/user_settings/user_settings.vue     |  36 +--
 src/services/style_setter/style_setter.js          |  48 ++--
 32 files changed, 791 insertions(+), 666 deletions(-)

(limited to 'src/components/notifications/notifications.vue')

diff --git a/src/App.scss b/src/App.scss
index 95a653ce..6e0378db 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -33,14 +33,18 @@ body {
     font-family: sans-serif;
     font-size: 14px;
     margin: 0;
+    color: var(--fg);
 }
 
 a {
     text-decoration: none;
+    color: var(--link);
 }
 
 button{
     user-select: none;
+    color: var(--faint);
+    background-color: var(--btn);
     border: none;
     border-radius: 5px;
     cursor: pointer;
@@ -50,6 +54,8 @@ button{
     font-size: 14px;
     font-family: sans-serif;
 
+
+
     &:hover {
         box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
     }
@@ -58,8 +64,72 @@ button{
       cursor: not-allowed;
       opacity: 0.5;
     }
+
+    &.pressed {
+      color: var(--faint);
+      background-color: var(--bg)
+    }
+}
+
+
+input, textarea, select {
+  border: none;
+  border-radius: 5px;
+  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+  border-top: 1px solid rgba(0, 0, 0, 0.2);
+  box-shadow: 0px 0px 2px black inset;
+  background-color: var(--lightBg);
+  color: var(--lightFg);
+  font-family: sans-serif;
+  font-size: 14px;
+  padding: 5px;
+
+  // TODO: Restyle <select> in a decent way. Needs different markup
+  // -webkit-appearance:none;
+  // -moz-appearance:none;
+  // appearance:none;
+
+  &[type=radio],
+  &[type=checkbox] {
+    display: none;
+    &:checked + label::before {
+      color: var(--fg);
+    }
+    + label::before {
+      display: inline-block;
+      content: '✔';
+      transition: color 200ms;
+      width: 1.1em;
+      height: 1.1em;
+      border-radius: 2px;
+      border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+      border-top: 1px solid rgba(0, 0, 0, 0.2);
+      box-shadow: 0px 0px 2px black inset;
+      margin-right: .5em;
+      background-color: var(--btn);
+      vertical-align: baseline;
+      text-align: center;
+      line-height: 1.1em;
+      font-size: 1.1em;
+      box-sizing: border-box;
+      color: transparent;
+      overflow: hidden;
+    }
+  }
 }
 
+.icon-cancel,
+.icon-reply,
+.icon-retweet,
+.icon-star-empty,
+.icon-eye-off,
+.icon-binoculars,
+.icon-plus-squared,
+.icon-spin4 {
+  color: var(--icon)
+}
+
+
 .container {
     display: flex;
     flex-wrap: wrap;
@@ -73,8 +143,8 @@ button{
 
 .item {
     flex: 1;
-    line-height: 21px;
-    height: 21px;
+    line-height: 25px;
+    height: 25px;
     overflow: hidden;
 
     .nav-icon {
@@ -132,6 +202,8 @@ main-router {
     flex-direction: column;
     margin: 0.5em;
 
+    background-color: var(--bg);
+
     border-radius: 10px;
     box-shadow: 1px 1px 4px rgba(0,0,0,.6);
     overflow: hidden;
@@ -151,6 +223,7 @@ main-router {
     text-align: left;
     font-size: 1.3em;
     line-height: 24px;
+    background-color: var(--btn);
 }
 
 .panel-footer {
@@ -173,6 +246,8 @@ main-router {
 
 nav {
     z-index: 1000;
+    background-color: var(--bg);
+    color: var(--faint);
     box-shadow: 0px 0px 4px rgba(0,0,0,.6);
 }
 
diff --git a/src/App.vue b/src/App.vue
index 2a910bc0..051c601d 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,6 +1,6 @@
 <template>
-  <div id="app" v-bind:style="style" class="base02-background">
-    <nav class='container base02-background base05' @click="scrollToTop()" id="nav">
+  <div id="app" v-bind:style="style">
+    <nav class='container' @click="scrollToTop()" id="nav">
       <div class='inner-nav' :style="logoStyle">
         <div class='item'>
           <router-link :to="{ name: 'root'}">{{sitename}}</router-link>
@@ -14,8 +14,8 @@
     </nav>
     <div class="container" id="content">
       <div class="panel-switcher">
-        <button @click="activatePanel('sidebar')" class="base02-background base05">Sidebar</button>
-        <button @click="activatePanel('timeline')" class="base02-background base05">Timeline</button>
+        <button @click="activatePanel('sidebar')">Sidebar</button>
+        <button @click="activatePanel('timeline')">Timeline</button>
       </div>
       <div class="sidebar-flexer" :class="{ 'mobile-hidden': mobileActivePanel != 'sidebar'}">
         <div class="sidebar-bounds">
diff --git a/src/_variables.scss b/src/_variables.scss
index d2b7065d..fa7eaec1 100644
--- a/src/_variables.scss
+++ b/src/_variables.scss
@@ -1,7 +1,6 @@
 $main-color: #f58d2c;
 $main-background: white;
 $darkened-background: whitesmoke;
-$green: #0fa00f;
-$blue: #0095ff;
-$red: #ff0000;
-
+$green_: #0fa00f;
+$blue_: #0095ff;
+$red_: #ff0000;
diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue
index a1b35d91..eeb6e6b8 100644
--- a/src/components/attachment/attachment.vue
+++ b/src/components/attachment/attachment.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="attachment base03-border" :class="{[type]: true, loading}" v-show="!isEmpty">
+  <div class="attachment" :class="{[type]: true, loading}" v-show="!isEmpty">
     <a class="image-attachment" v-if="hidden" @click.prevent="toggleHidden()">
       <img :key="nsfwImage" :src="nsfwImage"/>
     </a>
@@ -8,10 +8,10 @@
     </div>
 
     <a v-if="type === 'image' && !hidden" class="image-attachment" :href="attachment.url" target="_blank">
-      <StillImage class="base03-border" referrerpolicy="no-referrer" :mimetype="attachment.mimetype" :src="attachment.large_thumb_url || attachment.url"/>
+      <StillImage referrerpolicy="no-referrer" :mimetype="attachment.mimetype" :src="attachment.large_thumb_url || attachment.url"/>
     </a>
 
-    <video class="base03" v-if="type === 'video' && !hidden" :src="attachment.url" controls loop></video>
+    <video v-if="type === 'video' && !hidden" :src="attachment.url" controls loop></video>
 
     <audio v-if="type === 'audio'" :src="attachment.url" controls></audio>
 
@@ -30,115 +30,111 @@
 <script src="./attachment.js"></script>
 
 <style lang="scss">
-  .attachments {
-      display: flex;
-      flex-wrap: wrap;
-      margin-right: -0.7em;
+.attachments {
+    display: flex;
+    flex-wrap: wrap;
+    margin-right: -0.7em;
 
-      .attachment.media-upload-container {
+    .attachment.media-upload-container {
         flex: 0 0 auto;
         max-height: 300px;
         max-width: 100%;
-      }
-      
-      .attachment {
-          flex: 1 0 30%;
-          margin: 0.5em 0.7em 0.6em 0.0em;
-          align-self: flex-start;
-
-          border-style: solid;
-          border-width: 1px;
-          border-radius: 5px;
-          overflow: hidden;
-
-          // fixes small gap below video
-          &.video {
+    }
+
+    .attachment {
+        flex: 1 0 30%;
+        margin: 0.5em 0.7em 0.6em 0.0em;
+        align-self: flex-start;
+        border-color: var(--border);
+
+        border-style: solid;
+        border-width: 1px;
+        border-radius: 5px;
+        overflow: hidden;
+
+        // fixes small gap below video
+        &.video {
             line-height: 0;
-          }
+        }
 
-          &.html {
+        &.html {
             flex-basis: 90%;
             width: 100%;
             display: flex;
-          }
+        }
 
-          &.loading {
+        &.loading {
             cursor: progress;
-          }
-
-          .hider {
-              position: absolute;
-              margin: 10px;
-              padding: 5px;
-              background: rgba(230,230,230,0.6);
-              font-weight: bold;
-              z-index: 4;
-          }
-
-          video {
-              max-height: 500px;
-              height: 100%;
-              width: 100%;
-              z-index: 0;
-          }
-
-          audio {
-              width: 100%;
-          }
-
-          img.media-upload {
-              margin-bottom: -2px;
-              max-height: 300px;
-              max-width: 100%;
-          }
-
-          .oembed {
-              width: 100%;
-              margin-right: 15px;
-              display: flex;
-
-              img {
-                  width: 100%;
-              }
-
-              .image {
-                  flex: 1;
-                  img {
-                      border: 0px;
-                      border-radius: 5px;
-                      height: 100%;
-                      object-fit: cover;
-                  }
-              }
-
-              .text {
-                  flex: 2;
-                  margin: 8px;
-                  word-break: break-all;
-                  h1 {
-                      font-size: 14px;
-                      margin: 0px;
-                  }
-              }
-          }
-
-          a.image-attachment {
-              display: flex;
-              flex: 1;
-
-              .still-image {
-                  width: 100%;
-                  height: 100%;
-              }
-
-              img {
-                  object-fit: contain;
-                  width: 100%;
-                  height: 100%; /* If this isn't here, chrome will stretch the images */
-                  max-height: 500px;
-                  image-orientation: from-image;
-              }
-          }
-      }
+        }
+
+        .hider {
+            position: absolute;
+            margin: 10px;
+            padding: 5px;
+            background: rgba(230,230,230,0.6);
+            font-weight: bold;
+            z-index: 4;
+        }
+
+        video {
+            max-height: 500px;
+            height: 100%;
+            width: 100%;
+            z-index: 0;
+        }
+
+        audio {
+            width: 100%;
+        }
+
+        img.media-upload {
+            margin-bottom: -2px;
+            max-height: 300px;
+            max-width: 100%;
+        }
+
+        .oembed {
+            width: 100%;
+            margin-right: 15px;
+            display: flex;
+
+            img {
+                width: 100%;
+            }
+
+            .image {
+                flex: 1;
+                img {
+                    border: 0px;
+                    border-radius: 5px;
+                    height: 100%;
+                    object-fit: cover;
+                }
+            }
+
+            .text {
+                flex: 2;
+                margin: 8px;
+                word-break: break-all;
+                h1 {
+                    font-size: 14px;
+                    margin: 0px;
+                }
+            }
+        }
+
+        a.image-attachment {
+            display: flex;
+            flex: 1;
+
+            img {
+                object-fit: contain;
+                width: 100%;
+                height: 100%; /* If this isn't here, chrome will stretch the images */
+                max-height: 500px;
+                image-orientation: from-image;
+            }
+        }
+    }
  }
 </style>
diff --git a/src/components/chat_panel/chat_panel.vue b/src/components/chat_panel/chat_panel.vue
index ec379db5..69996f76 100644
--- a/src/components/chat_panel/chat_panel.vue
+++ b/src/components/chat_panel/chat_panel.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="chat-panel">
-    <div class="panel panel-default base01-background">
-      <div class="panel-heading timeline-heading base02-background base04">
+    <div class="panel panel-default">
+      <div class="panel-heading timeline-heading">
         <div class="title">
           {{$t('chat.title')}}
         </div>
diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue
index 60d43fff..2ff122c2 100644
--- a/src/components/conversation/conversation.vue
+++ b/src/components/conversation/conversation.vue
@@ -1,6 +1,6 @@
 <template>
   <div class="timeline panel panel-default">
-    <div class="panel-heading base02-background base04 base03-border conversation-heading">
+    <div class="panel-heading conversation-heading">
       {{ $t('timeline.conversation') }}
       <span v-if="collapsable" style="float:right;">
         <small><a href="#" @click.prevent="$emit('toggleExpanded')">Collapse</a></small>
diff --git a/src/components/delete_button/delete_button.vue b/src/components/delete_button/delete_button.vue
index 845ac777..66727e7c 100644
--- a/src/components/delete_button/delete_button.vue
+++ b/src/components/delete_button/delete_button.vue
@@ -1,7 +1,7 @@
 <template>
   <div v-if="canDelete">
     <a href="#" v-on:click.prevent="deleteStatus()">
-      <i class='base09 icon-cancel delete-status'></i>
+      <i class='icon-cancel delete-status'></i>
     </a>
   </div>
 </template>
@@ -14,7 +14,8 @@
   .icon-cancel,.delete-status {
     cursor: pointer;
     &:hover {
-      color: $red;
+      color: $red_;
+      color: var(--red);
     }
   }
 </style>
diff --git a/src/components/favorite_button/favorite_button.vue b/src/components/favorite_button/favorite_button.vue
index 65d368c7..a6e4c46b 100644
--- a/src/components/favorite_button/favorite_button.vue
+++ b/src/components/favorite_button/favorite_button.vue
@@ -1,10 +1,10 @@
 <template>
   <div v-if="loggedIn">
-    <i :class='classes' class='favorite-button fav-active base09' @click.prevent='favorite()'/>
+    <i :class='classes' class='favorite-button fav-active' @click.prevent='favorite()'/>
     <span v-if='status.fave_num > 0'>{{status.fave_num}}</span>
   </div>
   <div v-else>
-    <i :class='classes' class='favorite-button base09'/>
+    <i :class='classes' class='favorite-button'/>
     <span v-if='status.fave_num > 0'>{{status.fave_num}}</span>
   </div>
 </template>
@@ -17,10 +17,12 @@
       animation-duration: 0.6s;
       &:hover {
         color: orange;
+        color: var(--cOrange);
       }
   }
   .favorite-button.icon-star {
       color: orange;
+      color: var(--cOrange);
   }
 
 </style>
diff --git a/src/components/instance_specific_panel/instance_specific_panel.vue b/src/components/instance_specific_panel/instance_specific_panel.vue
index b3ea019d..ca8e00c0 100644
--- a/src/components/instance_specific_panel/instance_specific_panel.vue
+++ b/src/components/instance_specific_panel/instance_specific_panel.vue
@@ -1,6 +1,6 @@
 <template>
   <div class="instance-specific-panel">
-    <div class="panel panel-default base01-background">
+    <div class="panel panel-default">
       <div class="panel-body">
         <div v-html="instanceSpecificPanelContent">
         </div>
diff --git a/src/components/login_form/login_form.vue b/src/components/login_form/login_form.vue
index c293d611..553858a3 100644
--- a/src/components/login_form/login_form.vue
+++ b/src/components/login_form/login_form.vue
@@ -1,7 +1,7 @@
 <template>
-  <div class="login panel panel-default base00-background">
+  <div class="login panel panel-default">
     <!-- Default panel contents -->
-    <div class="panel-heading base02-background base04">
+    <div class="panel-heading">
       {{$t('login.login')}}
     </div>
     <div class="panel-body">
@@ -17,11 +17,11 @@
         <div class='form-group'>
           <div class='login-bottom'>
             <div><router-link :to="{name: 'registration'}" v-if='registrationOpen' class='register'>{{$t('login.register')}}</router-link></div>
-            <button :disabled="loggingIn" type='submit' class='btn btn-default base04 base02-background'>{{$t('login.login')}}</button>
+            <button :disabled="loggingIn" type='submit' class='btn btn-default'>{{$t('login.login')}}</button>
           </div>
         </div>
         <div v-if="authError" class='form-group'>
-          <div class='error base05'>{{authError}}</div>
+          <div class='error'>{{authError}}</div>
         </div>
       </form>
     </div>
@@ -33,38 +33,36 @@
 <style lang="scss">
 
 .login-form {
-  input {
-    border-width: 1px;
-    border-style: solid;
-    border-color: silver;
-    border-radius: 5px;
-    padding: 0.1em 0.2em 0.2em 0.2em;
-  }
+    input {
+        border-radius: 5px;
+        padding: 0.1em 0.2em 0.2em 0.2em;
+    }
 
-  .btn {
-    min-height: 28px;
-    width: 10em;
-  }
+    .btn {
+        min-height: 28px;
+        width: 10em;
+    }
 
-  .error {
-    border-radius: 5px;
-    text-align: center;
-    background-color: rgba(255, 48, 16, 0.65);
-    min-height: 28px;
-    line-height: 28px;
-  }
+    .error {
+        border-radius: 5px;
+        text-align: center;
+        background-color: rgba(255, 48, 16, 0.65);
+        background-color: var(--cRed);
+        min-height: 28px;
+        line-height: 28px;
+    }
 
-  .register {
-    flex: 1 1;
-  }
+    .register {
+        flex: 1 1;
+    }
 
-  .login-bottom {
-    margin-top: 1.0em;
-    display: flex;
-    flex-direction: row;
-    align-items: center;
-    justify-content: space-between;
-  }
+    .login-bottom {
+        margin-top: 1.0em;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        justify-content: space-between;
+    }
 }
 
 </style>
diff --git a/src/components/media_upload/media_upload.vue b/src/components/media_upload/media_upload.vue
index 9e6ad608..8e83e7f1 100644
--- a/src/components/media_upload/media_upload.vue
+++ b/src/components/media_upload/media_upload.vue
@@ -1,8 +1,8 @@
 <template>
   <div class="media-upload" @drop.prevent @dragover.prevent="fileDrag" @drop="fileDrop">
     <label class="btn btn-default">
-      <i class="base09 icon-spin4 animate-spin" v-if="uploading"></i>
-      <i class="base09 icon-upload" v-if="!uploading"></i>
+      <i class="animate-spin" v-if="uploading"></i>
+      <i class="icon-upload" v-if="!uploading"></i>
       <input type=file style="position: fixed; top: -100em"></input>
     </label>
   </div>
diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue
index aea841e9..2a92586b 100644
--- a/src/components/nav_panel/nav_panel.vue
+++ b/src/components/nav_panel/nav_panel.vue
@@ -1,24 +1,24 @@
 <template>
   <div class="nav-panel">
-    <div class="panel panel-default base01-background">
-      <ul class="base03-border">
+    <div class="panel panel-default">
+      <ul>
         <li v-if='currentUser'>
-          <router-link class="base00-background" to='/main/friends'>
+          <router-link to='/main/friends'>
             {{ $t("nav.timeline") }}
           </router-link>
         </li>
         <li v-if='currentUser'>
-          <router-link class="base00-background" :to="{ name: 'mentions', params: { username: currentUser.screen_name } }">
+          <router-link :to="{ name: 'mentions', params: { username: currentUser.screen_name } }">
             {{ $t("nav.mentions") }}
           </router-link>
         </li>
         <li>
-          <router-link class="base00-background" to='/main/public'>
+          <router-link to='/main/public'>
             {{ $t("nav.public_tl") }}
           </router-link>
         </li>
         <li>
-          <router-link class="base00-background" to='/main/all'>
+          <router-link to='/main/all'>
             {{ $t("nav.twkn") }}
           </router-link>
         </li>
@@ -30,43 +30,44 @@
 <script src="./nav_panel.js" ></script>
 
 <style lang="scss">
- .nav-panel ul {
-     list-style: none;
-     margin: 0;
-     padding: 0;
- }
+.nav-panel ul {
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
 
- .nav-panel li {
-     border-bottom: 1px solid;
-     border-color: inherit;
-     padding: 0;
-     &:first-child a {
-       border-top-right-radius: 10px;
-       border-top-left-radius: 10px;
-     }
-     &:last-child a {
-       border-bottom-right-radius: 10px;
-       border-bottom-left-radius: 10px;
-     }
- }
+.nav-panel li {
+    border-bottom: 1px solid;
+    border-color: var(--border);
+    background-color: var(--bg);
+    padding: 0;
+    &:first-child a {
+        border-top-right-radius: 10px;
+        border-top-left-radius: 10px;
+    }
+    &:last-child a {
+        border-bottom-right-radius: 10px;
+        border-bottom-left-radius: 10px;
+    }
+}
 
- .nav-panel li:last-child {
-     border: none;
- }
+.nav-panel li:last-child {
+    border: none;
+}
 
- .nav-panel a {
-     display: block;
-     padding: 0.8em 0.85em;
-     &:hover {
-       background-color: transparent;
-     }
-     &.router-link-active {
-       font-weight: bolder;
-       background-color: transparent;
-       &:hover {
-         text-decoration: underline;
-       }
-     }
+.nav-panel a {
+    display: block;
+    padding: 0.8em 0.85em;
+    &:hover {
+        background-color: var(--lightBg);
+    }
+    &.router-link-active {
+        font-weight: bolder;
+        background-color: var(--lightBg);
+        &:hover {
+            text-decoration: underline;
+        }
+    }
  }
 
 </style>
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index e9b83bf0..58d82a09 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -27,7 +27,7 @@ const Notifications = {
     },
     hiderStyle () {
       return {
-        background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors['base00']} 80%)`
+        background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors.bg} 80%)`
       }
     }
   },
diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss
index 3c500b36..a739d52e 100644
--- a/src/components/notifications/notifications.scss
+++ b/src/components/notifications/notifications.scss
@@ -4,21 +4,33 @@
   // a bit of a hack to allow scrolling below notifications
   padding-bottom: 15em;
 
+  .panel {
+    background: var(--bg)
+  }
+
+  .panel-body {
+    border-color: var(--border)
+  }
+
   .panel-heading {
     // force the text to stay centered, while keeping
     // the button in the right side of the panel heading
     position: relative;
+    background: var(--btn);
+    color: var(--faint);
     .read-button {
       position: absolute;
       right: 0.7em;
       height: 1.8em;
       line-height: 100%;
+      background-color: var(--btn);
+      color: var(--faint);
     }
   }
 
   .unseen-count {
     display: inline-block;
-    background-color: rgba(255, 16, 8, 0.8);
+    background-color: var(--cRed);
     text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.5);
     min-width: 1.3em;
     border-radius: 1.3em;
@@ -27,6 +39,7 @@
     font-size: 0.9em;
     text-align: center;
     line-height: 1.3em;
+    padding: 1px;
   }
 
   .notification {
@@ -48,19 +61,23 @@
       overflow: hidden;
 
       .icon-retweet.lit {
-        color: $green;
+        color: $green_;
+        color: var(--cGreen);
       }
 
       .icon-user-plus.lit {
-        color: $blue;
+        color: $blue_;
+        color: var(--cBlue);
       }
 
       .icon-reply.lit {
-        color: $blue;
+        color: $blue_;
+        color: var(--cBlue);
       }
 
       .icon-star.lit {
         color: orange;
+        color: var(--cOrange);
       }
 
       .status-content {
@@ -134,7 +151,7 @@
   }
 
   .unseen {
-    border-left: 4px solid rgba(255, 16, 8, 0.75);
+    border-left: 4px solid var(--cRed);
     padding-left: 6px;
   }
 }
diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index 8e6f12b2..77e29426 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -1,12 +1,12 @@
 <template>
   <div class="notifications">
-    <div class="panel panel-default base00-background">
-      <div class="panel-heading base02-background base04">
+    <div class="panel panel-default">
+      <div class="panel-heading">
         <span class="unseen-count" v-if="unseenCount">{{unseenCount}}</span>
         {{$t('notifications.notifications')}}
-        <button v-if="unseenCount" @click.prevent="markAsSeen" class="base04 base02-background read-button">{{$t('notifications.read')}}</button>
+        <button v-if="unseenCount" @click.prevent="markAsSeen" class="read-button">{{$t('notifications.read')}}</button>
       </div>
-      <div class="panel-body base03-border">
+      <div class="panel-body">
         <div v-for="notification in visibleNotifications" :key="notification" class="notification" :class='{"unseen": !notification.seen}'>
           <div>
             <a :href="notification.action.user.statusnet_profile_url" target="_blank">
diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue
index 4871bcae..3f268ff5 100644
--- a/src/components/post_status_form/post_status_form.vue
+++ b/src/components/post_status_form/post_status_form.vue
@@ -1,21 +1,21 @@
 <template>
   <div class="post-status-form">
     <form @submit.prevent="postStatus(newStatus)">
-      <div class="form-group base03-border" >
+      <div class="form-group" >
         <textarea @click="setCaret" @keyup="setCaret" v-model="newStatus.status" :placeholder="$t('post_status.default')" rows="1" class="form-control" @keydown.down="cycleForward" @keydown.up="cycleBackward" @keydown.shift.tab="cycleBackward" @keydown.tab="cycleForward" @keydown.enter="replaceCandidate" @keydown.meta.enter="postStatus(newStatus)" @keyup.ctrl.enter="postStatus(newStatus)" @drop="fileDrop" @dragover.prevent="fileDrag" @input="resize" @paste="paste"></textarea>
       </div>
       <div style="position:relative;" v-if="candidates">
-        <div class="autocomplete-panel base05-background">
+        <div class="autocomplete-panel">
           <div v-for="candidate in candidates" @click="replace(candidate.utf || (candidate.screen_name + ' '))">
-            <div v-if="candidate.highlighted" class="autocomplete base02">
+            <div v-if="candidate.highlighted" class="autocomplete">
               <span v-if="candidate.img"><img :src="candidate.img"></span>
               <span v-else>{{candidate.utf}}</span>
-              <span>{{candidate.screen_name}}<small class="base02">{{candidate.name}}</small></span>
+              <span>{{candidate.screen_name}}<small>{{candidate.name}}</small></span>
             </div>
-            <div v-else class="autocomplete base04">
+            <div v-else class="autocomplete">
               <span v-if="candidate.img"><img :src="candidate.img"></img></span>
               <span v-else>{{candidate.utf}}</span>
-              <span>{{candidate.screen_name}}<small class="base02">{{candidate.name}}</small></span>
+              <span>{{candidate.screen_name}}<small>{{candidate.name}}</small></span>
             </div>
           </div>
         </div>
@@ -24,18 +24,18 @@
         <media-upload @uploading="disableSubmit" @uploaded="addMediaFile" @upload-failed="enableSubmit" :drop-files="dropFiles"></media-upload>
 
         <p v-if="isOverLengthLimit" class="error">{{ charactersLeft }}</p>
-        <p v-else-if="hasStatusLengthLimit" class="base04">{{ charactersLeft }}</p>
+        <p v-else-if="hasStatusLengthLimit">{{ charactersLeft }}</p>
 
-        <button v-if="posting" disabled class="btn btn-default base05 base02-background">{{$t('post_status.posting')}}</button>
-        <button v-else-if="isOverLengthLimit" disabled class="btn btn-default base05 base02-background">{{$t('general.submit')}}</button>
-        <button v-else :disabled="submitDisabled" type="submit" class="btn btn-default base05 base02-background">{{$t('general.submit')}}</button>
+        <button v-if="posting" disabled class="btn btn-default">{{$t('post_status.posting')}}</button>
+        <button v-else-if="isOverLengthLimit" disabled class="btn btn-default">{{$t('general.submit')}}</button>
+        <button v-else :disabled="submitDisabled" type="submit" class="btn btn-default">{{$t('general.submit')}}</button>
       </div>
       <div class='error' v-if="error">
         Error: {{ error }}
         <i class="icon-cancel" @click="clearError"></i>
       </div>
       <div class="attachments">
-        <div class="media-upload-container attachment base03-border" v-for="file in newStatus.files">
+        <div class="media-upload-container attachment" v-for="file in newStatus.files">
           <i class="fa icon-cancel" @click="removeMediaFile(file)"></i>
           <img class="thumbnail media-upload" :src="file.image" v-if="type(file) === 'image'"></img>
           <video v-if="type(file) === 'video'" :src="file.image" controls></video>
@@ -51,146 +51,149 @@
 
 <style lang="scss">
 
- .tribute-container {
-   ul {
-     padding: 0px;
-     li {
-       display: flex;
-       align-items: center;
-     }
-   }
-   img {
-     padding: 3px;
-     width: 16px;
-     height: 16px;
-     border-radius: 50%;
-   }
- }
-
- .post-status-form, .login {
-     .form-bottom {
-         display: flex;
-         padding: 0.5em;
-         height: 32px;
-
-         button {
-             width: 10em;
-         }
-
-         p {
-           margin: 0.35em;
-           padding: 0.35em;
-           display: flex;
-         }
-     }
-     .error {
-       border-radius: 5px;
-       text-align: center;
-       background-color: rgba(255, 48, 16, 0.65);
-       padding: 0.25em;
-       margin: 0.35em;
-       display: flex;
-     }
-
-     .attachments {
-         padding: 0 0.5em;
-
-         .attachment {
-           position: relative;
-           margin: 0.5em 0.8em 0.2em 0;
-         }
-
-         i {
+.tribute-container {
+    ul {
+        padding: 0px;
+        li {
+            display: flex;
+            align-items: center;
+        }
+    }
+    img {
+        padding: 3px;
+        width: 16px;
+        height: 16px;
+        border-radius: 50%;
+    }
+}
+
+.post-status-form, .login {
+    .form-bottom {
+        display: flex;
+        padding: 0.5em;
+        height: 32px;
+
+        button {
+            width: 10em;
+        }
+
+        p {
+            margin: 0.35em;
+            padding: 0.35em;
+            display: flex;
+        }
+    }
+    .error {
+        border-radius: 5px;
+        text-align: center;
+        background-color: rgba(255, 48, 16, 0.65);
+        background-color: var(--cRed);
+        padding: 0.25em;
+        margin: 0.35em;
+        display: flex;
+    }
+
+    .attachments {
+        padding: 0 0.5em;
+
+        .attachment {
+            position: relative;
+            border: var(--border);
+            margin: 0.5em 0.8em 0.2em 0;
+        }
+
+        i {
             position: absolute;
             margin: 10px;
             padding: 5px;
             background: rgba(230,230,230,0.6);
             border-radius: 5px;
             font-weight: bold;
-         }
-     }
-
-
-     .btn {
-         cursor: pointer;
-     }
-
-     .btn[disabled] {
-         cursor: not-allowed;
-     }
-
-     .icon-cancel {
-         cursor: pointer;
-     }
-     form {
-         display: flex;
-         flex-direction: column;
-         padding: 0.6em;
-     }
-
-     .form-group {
-         display: flex;
-         flex-direction: column;
-         padding: 0.3em 0.5em 0.6em;
-         line-height:24px;
-     }
-
-     form textarea {
-         border: solid;
-         border-width: 1px;
-         border-color: inherit;
-         border-radius: 5px;
-         line-height:16px;
-         padding: 5px;
-         resize: none;
-         overflow: hidden;
-     }
-
-     form textarea:focus {
-       min-height: 48px;
-     }
-
-     .btn {
-         cursor: pointer;
-     }
-
-     .btn[disabled] {
-         cursor: not-allowed;
-     }
-
-     .icon-cancel {
-         cursor: pointer;
-         z-index: 4;
-     }
-
-     .autocomplete-panel {
-       margin: 0 0.5em 0 0.5em;
-       border-radius: 5px;
-       position: absolute;
-       z-index: 1;
-       box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
-       min-width: 75%;
-     }
-
-     .autocomplete {
-       cursor: pointer;
-       padding: 0.2em 0.4em 0.2em 0.4em;
-       border-bottom: 1px solid rgba(0, 0, 0, 0.4);
-       display: flex;
-       img {
-         width: 24px;
-         height: 24px;
-         border-radius: 2px;
-         object-fit: contain;
-       }
-       span {
-         line-height: 24px;
-         margin: 0 0.1em 0 0.2em;
-       }
-       small {
-         font-style: italic;
-       }
-     }
- }
+        }
+    }
+
+
+    .btn {
+        cursor: pointer;
+    }
+
+    .btn[disabled] {
+        cursor: not-allowed;
+    }
+
+    .icon-cancel {
+        cursor: pointer;
+    }
+
+    form {
+        display: flex;
+        flex-direction: column;
+        padding: 0.6em;
+    }
+
+    .form-group {
+        display: flex;
+        flex-direction: column;
+        padding: 0.3em 0.5em 0.6em;
+        line-height:24px;
+    }
+
+    form textarea {
+        border-radius: 5px;
+        line-height:16px;
+        padding: 5px;
+        resize: none;
+        overflow: hidden;
+    }
+
+    form textarea:focus {
+        min-height: 48px;
+    }
+
+    .btn {
+        cursor: pointer;
+    }
+
+    .btn[disabled] {
+        cursor: not-allowed;
+    }
+
+    .icon-cancel {
+        cursor: pointer;
+        z-index: 4;
+    }
+
+    .autocomplete-panel {
+        margin: 0 0.5em 0 0.5em;
+        border-radius: 5px;
+        position: absolute;
+        z-index: 1;
+        box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
+        min-width: 75%;
+        background: var(--btn);
+        color: var(--lightFg);
+    }
+
+    .autocomplete {
+        cursor: pointer;
+        padding: 0.2em 0.4em 0.2em 0.4em;
+        border-bottom: 1px solid rgba(0, 0, 0, 0.4);
+        display: flex;
+        img {
+            width: 24px;
+            height: 24px;
+            border-radius: 2px;
+            object-fit: contain;
+        }
+        span {
+            line-height: 24px;
+            margin: 0 0.1em 0 0.2em;
+        }
+        small {
+            margin-left: .5em;
+            color: var(--faint);
+        }
+    }
+}
 
 </style>
diff --git a/src/components/registration/registration.vue b/src/components/registration/registration.vue
index adc751a3..786a59e3 100644
--- a/src/components/registration/registration.vue
+++ b/src/components/registration/registration.vue
@@ -1,6 +1,6 @@
 <template>
-  <div class="settings panel panel-default base00-background">
-    <div class="panel-heading base02-background base04">
+  <div class="settings panel panel-default">
+    <div class="panel-heading">
       {{$t('registration.registration')}}
     </div>
     <div class="panel-body">
@@ -39,14 +39,14 @@
             </div>
             -->
             <div class='form-group'>
-              <button :disabled="registering" type='submit' class='btn btn-default base05 base02-background'>{{$t('general.submit')}}</button>
+              <button :disabled="registering" type='submit' class='btn btn-default'>{{$t('general.submit')}}</button>
             </div>
           </div>
           <div class='terms-of-service' v-html="termsofservice">
           </div>
         </div>
         <div v-if="error" class='form-group'>
-          <div class='error base05'>{{error}}</div>
+          <div class='error'>{{error}}</div>
         </div>
       </form>
     </div>
@@ -57,63 +57,60 @@
 <style lang="scss">
 
 .registration-form {
-  display: flex;
-  flex-direction: column;
-  margin: 0.6em;
-
-  .container {
     display: flex;
-    flex-direction: row;
-    //margin-bottom: 1em;
-  }
+    flex-direction: column;
+    margin: 0.6em;
 
-  .terms-of-service {
-    flex: 0 1 50%;
-    margin: 0.8em;
-  }
+    .container {
+        display: flex;
+        flex-direction: row;
+        //margin-bottom: 1em;
+    }
 
-  .text-fields {
-    margin-top: 0.6em;
-    flex: 1 0;
-    display: flex;
-    flex-direction: column;
-  }
+    .terms-of-service {
+        flex: 0 1 50%;
+        margin: 0.8em;
+    }
 
-  .form-group {
-    display: flex;
-    flex-direction: column;
-    padding: 0.3em 0.0em 0.3em;
-    line-height:24px;
-  }
+    .text-fields {
+        margin-top: 0.6em;
+        flex: 1 0;
+        display: flex;
+        flex-direction: column;
+    }
 
-  form textarea {
-    border: solid;
-    border-width: 1px;
-    border-color: silver;
-    border-radius: 5px;
-    line-height:16px;
-    padding: 5px;
-    resize: vertical;
-  }
+    .form-group {
+        display: flex;
+        flex-direction: column;
+        padding: 0.3em 0.0em 0.3em;
+        line-height:24px;
+    }
 
-  input {
-    border-width: 1px;
-    border-style: solid;
-    border-color: silver;
-    border-radius: 5px;
-    padding: 0.1em 0.2em 0.2em 0.2em;
-  }
+    form textarea {
+        border: solid;
+        border-width: 1px;
+        border-color: silver;
+        border-radius: 5px;
+        line-height:16px;
+        padding: 5px;
+        resize: vertical;
+    }
 
-  .captcha {
-    max-width: 350px;
-    margin-bottom: 0.4em;
-  }
+    input {
+        border-radius: 5px;
+        padding: 0.1em 0.2em 0.2em 0.2em;
+    }
+
+    .captcha {
+        max-width: 350px;
+        margin-bottom: 0.4em;
+    }
 
-  .btn {
-    //align-self: flex-start;
-    //width: 10em;
-    margin-top: 0.6em;
-    height: 28px;
+    .btn {
+        //align-self: flex-start;
+        //width: 10em;
+        margin-top: 0.6em;
+        height: 28px;
   }
 
   .error {
@@ -121,6 +118,7 @@
     text-align: center;
     margin: 0.5em 0.6em 0;
     background-color: rgba(255, 48, 16, 0.65);
+    background-color: var(--cRed);
     min-height: 28px;
     line-height: 28px;
   }
diff --git a/src/components/retweet_button/retweet_button.vue b/src/components/retweet_button/retweet_button.vue
index 7a7ea763..7c75f3bc 100644
--- a/src/components/retweet_button/retweet_button.vue
+++ b/src/components/retweet_button/retweet_button.vue
@@ -1,10 +1,10 @@
 <template>
   <div v-if="loggedIn">
-    <i :class='classes' class='icon-retweet rt-active base09' v-on:click.prevent='retweet()'></i>
+    <i :class='classes' class='icon-retweet rt-active' v-on:click.prevent='retweet()'></i>
     <span v-if='status.repeat_num > 0'>{{status.repeat_num}}</span>
   </div>
   <div v-else>
-    <i :class='classes' class='icon-retweet base09'></i>
+    <i :class='classes' class='icon-retweet'></i>
     <span v-if='status.repeat_num > 0'>{{status.repeat_num}}</span>
   </div>
 </template>
@@ -17,10 +17,12 @@
      cursor: pointer;
      animation-duration: 0.6s;
      &:hover {
-      color: $green;
+      color: $green_;
+      color: var(--cGreen);
      }
   }
   .icon-retweet.retweeted {
-     color: $green;
+     color: $green_;
+     color: var(--cGreen);
   }
 </style>
diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue
index 5aa7596a..b842c9e9 100644
--- a/src/components/settings/settings.vue
+++ b/src/components/settings/settings.vue
@@ -1,6 +1,6 @@
 <template>
-  <div class="settings panel panel-default base00-background">
-    <div class="panel-heading base02-background base04">
+  <div class="settings panel panel-default">
+    <div class="panel-heading">
       {{$t('settings.settings')}}
     </div>
     <div class="panel-body">
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 7397e80c..56fb2e27 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -55,11 +55,6 @@ const Status = {
     },
     muted () { return !this.unmuted && (this.status.user.muted || this.muteWordHits.length > 0) },
     isReply () { return !!this.status.in_reply_to_status_id },
-    borderColor () {
-      return {
-        borderBottomColor: this.$store.state.config.colors['base02']
-      }
-    },
     isFocused () {
       // retweet or root of an expanded conversation
       if (this.focused) {
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index d451b67c..8410aeba 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -1,11 +1,11 @@
 <template>
-  <div class="status-el base00-background" v-if="compact">
+  <div class="status-el" v-if="compact">
     <div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div>
     <div v-if="loggedIn">
       <div class='status-actions'>
         <div>
           <a href="#" v-on:click.prevent="toggleReplying">
-            <i class="base09 icon-reply" :class="{'icon-reply-active': replying}"></i>
+            <i class="icon-reply" :class="{'icon-reply-active': replying}"></i>
           </a>
         </div>
         <retweet-button :loggedIn="loggedIn" :status=status></retweet-button>
@@ -14,12 +14,12 @@
     </div>
     <post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying" v-if="replying"/>
   </div>
-  <div class="status-el base00-background base03-border status-fadein" v-else-if="!status.deleted" v-bind:class="[{ 'base01-background': isFocused }, { 'status-conversation': inConversation }]" >
+  <div class="status-el status-fadein" v-else-if="!status.deleted" v-bind:class="[{ 'status-el_focused': isFocused }, { 'status-conversation': inConversation }]" >
     <template v-if="muted">
       <div class="media status container muted">
         <small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
         <small class="muteWords">{{muteWordHits.join(', ')}}</small>
-        <a href="#" class="unmute" @click.prevent="toggleMute"><i class="base09 icon-eye-off"></i></a>
+        <a href="#" class="unmute" @click.prevent="toggleMute"><i class="icon-eye-off"></i></a>
       </div>
     </template>
     <template v-if="!muted">
@@ -39,7 +39,7 @@
           </a>
         </div>
         <div class="media-body">
-          <div class="base03-border usercard" v-if="userExpanded">
+          <div class="usercard" v-if="userExpanded">
             <user-card-content :user="status.user" :switcher="false"></user-card-content>
           </div>
           <div class="user-content">
@@ -75,15 +75,15 @@
                 </h4>
               </div>
               <div class="heading-icons">
-                <a href="#" @click.prevent="toggleMute" v-if="unmuted"><i class="base09 icon-eye-off"></i></a>
-                <a :href="status.external_url" target="_blank" v-if="!status.is_local" class="source_url"><i class="base09 icon-binoculars"></i></a>
+                <a href="#" @click.prevent="toggleMute" v-if="unmuted"><i class="icon-eye-off"></i></a>
+                <a :href="status.external_url" target="_blank" v-if="!status.is_local" class="source_url"><i class="icon-binoculars"></i></a>
                 <template v-if="expandable">
-                  <a href="#" @click.prevent="toggleExpanded" class="expand"><i class="base09 icon-plus-squared"></i></a>
+                  <a href="#" @click.prevent="toggleExpanded" class="expand"><i class="icon-plus-squared"></i></a>
                 </template>
               </div>
             </div>
 
-            <div class="status-preview base00-background base03-border" v-if="showPreview && preview">
+            <div class="status-preview" v-if="showPreview && preview">
               <StillImage class="avatar" :src="preview.user.profile_image_url_original"/>
               <div class="text">
                 <h4>
@@ -93,8 +93,8 @@
                 <div @click.prevent="linkClicked" class="status-content" v-html="preview.statusnet_html"></div>
               </div>
             </div>
-            <div class="status-preview status-preview-loading base00-background base03-border" v-else-if="showPreview">
-              <i class="base09 icon-spin4 animate-spin"></i>
+            <div class="status-preview status-preview-loading" v-else-if="showPreview">
+              <i class="icon-spin4 animate-spin"></i>
             </div>
 
             <div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div>
@@ -108,7 +108,7 @@
           <div class='status-actions'>
             <div v-if="loggedIn">
               <a href="#" v-on:click.prevent="toggleReplying">
-                <i class="base09 icon-reply" :class="{'icon-reply-active': replying}"></i>
+                <i class="icon-reply" :class="{'icon-reply-active': replying}"></i>
               </a>
             </div>
             <retweet-button :loggedIn="loggedIn" :status=status></retweet-button>
@@ -117,7 +117,7 @@
           </div>
         </div>
       </div>
-      <div class="status base00-background container" v-if="replying">
+      <div class="status container" v-if="replying">
         <div class="reply-left"/>
         <post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying"/>
       </div>
@@ -128,18 +128,19 @@
 <script src="./status.js" ></script>
 
 <style lang="scss">
- @import '../../_variables.scss';
+@import '../../_variables.scss';
 
- status-text-container {
+status-text-container {
     display: block;
-  }
+}
 
-  .status-preview {
+.status-preview {
     position: absolute;
     max-width: 34em;
     padding: 0.5em;
     display: flex;
-    border-color: inherit;
+    background-color: var(--bg);
+    border-color: var(--border);
     border-style: solid;
     border-width: 1px;
     border-radius: 4px;
@@ -149,182 +150,198 @@
     z-index: 50;
 
     .avatar {
-      flex-shrink: 0;
-      width: 32px;
-      height: 32px;
-      border-radius: 50%;
+        flex-shrink: 0;
+        width: 32px;
+        height: 32px;
+        border-radius: 50%;
     }
+
     .text {
-      h4 {
-        margin-bottom: 0.4em;
-        small {
-          font-weight: lighter;
+        h4 {
+            margin-bottom: 0.4em;
+            small {
+                font-weight: lighter;
+            }
         }
-      }
-      padding: 0 0.5em 0.5em 0.5em;
+        padding: 0 0.5em 0.5em 0.5em;
     }
-  }
+}
 
-  .status-preview-loading {
+.status-preview-loading {
     display: block;
     font-size: 2em;
     min-width: 8em;
     text-align: center;
-  }
+}
+
+.status-el {
+    hyphens: auto;
+    overflow-wrap: break-word;
+    word-wrap: break-word;
+    word-break: break-word;
+    border-left-width: 0px;
+    line-height: 18px;
+    background-color: var(--bg);
+    border-color: var(--border);
+
+    &_focused {
+        background-color: var(--lightBg);
+    }
 
- .status-el {
-     hyphens: auto;
-     overflow-wrap: break-word;
-     word-wrap: break-word;
-     word-break: break-word;
-     border-left-width: 0px;
-     line-height: 18px;
+    .usercard {
+        border-color: var(--border);
+    }
 
-     .timeline & {
+    .timeline & {
         border-bottom-width: 1px;
         border-bottom-style: solid;
-     }
+    }
 
-     .notify {
-         .avatar {
-             border-width: 3px;
-             border-style: solid;
-         }
-     }
+    .notify {
+        .avatar {
+            border-width: 3px;
+            border-style: solid;
+        }
+    }
 
-     .media-body {
-       flex: 1;
-       padding-left: 0.5em;
-     }
+    .media-body {
+        flex: 1;
+        padding-left: 0.5em;
+    }
 
 
-     .user-content {
+    .user-content {
 
-       min-height: 52px;
-       padding-top: 1px;
-     }
+        min-height: 52px;
+        padding-top: 1px;
+    }
 
-     .media-heading {
-       display: flex;
-       min-height: 1.4em;
-       margin-bottom: 0.3em;
-
-       small {
-           font-weight: lighter;
-       }
-       h4 {
-         margin-right: 0.4em;
-       }
-       .name-and-links {
-         flex: 1 0;
-         display: flex;
-         flex-wrap: wrap;
-       }
-       .replies {
-         flex-basis: 100%;
-       }
-     }
+    .media-heading {
+        display: flex;
+        min-height: 1.4em;
+        margin-bottom: 0.3em;
 
-     .source_url {
+        small {
+            font-weight: lighter;
+        }
+        h4 {
+            margin-right: 0.4em;
+        }
+        .name-and-links {
+            flex: 1 0;
+            display: flex;
+            flex-wrap: wrap;
+        }
+        .replies {
+            flex-basis: 100%;
+        }
+    }
 
-     }
+    .source_url {
 
-     .expand {
-       margin-right: -0.3em;
-     }
+    }
 
-     a {
-         display: inline-block;
-         word-break: break-all;
-     }
+    .expand {
+        margin-right: -0.3em;
+    }
 
-     .status-content {
-         margin: 3px 15px 4px 0;
-         max-height: 400px;
-         overflow-y: auto;
-         overflow-x: hidden;
-
-         img, video {
-           max-width: 100%;
-           max-height: 400px;
-           vertical-align: middle;
-           object-fit: contain;
-         }
-
-         blockquote {
-           margin: 0.2em 0 0.2em 2em;
-           font-style: italic;
-         }
-     }
+    a {
+        display: inline-block;
+        word-break: break-all;
+    }
 
-     p {
-         margin: 0;
-         margin-top: 0.2em;
-         margin-bottom: 0.5em;
-     }
+    .status-content {
+        margin: 3px 15px 4px 0;
+        max-height: 400px;
+        overflow-y: auto;
+        overflow-x: hidden;
+
+        img, video {
+            max-width: 100%;
+            max-height: 400px;
+            vertical-align: middle;
+            object-fit: contain;
+        }
+
+        blockquote {
+            margin: 0.2em 0 0.2em 2em;
+            font-style: italic;
+        }
+    }
+
+    p {
+        margin: 0;
+        margin-top: 0.2em;
+        margin-bottom: 0.5em;
+    }
 
-     .media-left {
+    .media-left {
         margin: 0.2em 0.3em 0 0;
         .avatar {
-          float: right;
+            float: right;
+            border-radius: 5px;
         }
-     }
+    }
 
-     .retweet-info {
-         padding: 0.7em 0 0 0.6em;
+    .retweet-info {
+        padding: 0.7em 0 0 0.6em;
 
-         .media-left {
-             display: flex;
+        .media-left {
+            display: flex;
 
-             i {
-                 align-self: center;
-                 text-align: right;
-                 flex: 1;
-                 padding-right: 0.3em;
-             }
-         }
-     }
- }
+            i {
+                align-self: center;
+                text-align: right;
+                flex: 1;
+                padding-right: 0.3em;
+            }
+        }
+    }
 
- .status-fadein {
-   animation-duration: 0.5s;
-   animation-name: fadein;
- }
 
- @keyframes fadein {
-   from {
-     opacity: 0;
-   }
-   to {
-     opacity: 1;
-   }
- }
+}
 
- .greentext {
-     color: green;
- }
+.status-fadein {
+    animation-duration: 0.5s;
+    animation-name: fadein;
+}
 
- .status-conversation {
-   border-left-style: solid;
- }
+@keyframes fadein {
+    from {
+        opacity: 0;
+    }
+    to {
+        opacity: 1;
+    }
+}
+
+.greentext {
+    color: green;
+}
 
- .status-actions {
-     padding-top: 0.15em;
-     width: 100%;
-     display: flex;
+.status-conversation {
+    border-left-style: solid;
+}
+
+.status-actions {
+    padding-top: 0.15em;
+    width: 100%;
+    display: flex;
 
-     div, favorite-button {
+    div, favorite-button {
         max-width: 6em;
         flex: 1;
-     }
- }
+    }
+}
 
- .icon-reply:hover {
-     color: $blue;
+.icon-reply:hover {
+    color: $blue_;
+    color: var(--cBlue);
  }
 
  .icon-reply.icon-reply-active {
-     color: $blue;
+     color: $blue_;
+     color: var(--cBlue);
  }
 
  .status .avatar {
@@ -373,7 +390,7 @@
 
  .status {
      padding: 0.4em 0.7em 0.45em 0.7em;
-     border-left: 4px rgba(255, 48, 16, 0.65);
+     border-left: 4px var(--cRed);
      border-left-style: inherit;
  }
 
diff --git a/src/components/style_switcher/style_switcher.js b/src/components/style_switcher/style_switcher.js
index a762f914..6e414338 100644
--- a/src/components/style_switcher/style_switcher.js
+++ b/src/components/style_switcher/style_switcher.js
@@ -21,10 +21,10 @@ export default {
       })
   },
   mounted () {
-    this.bgColorLocal = rgbstr2hex(this.$store.state.config.colors['base00'])
-    this.fgColorLocal = rgbstr2hex(this.$store.state.config.colors['base02'])
-    this.textColorLocal = rgbstr2hex(this.$store.state.config.colors['base05'])
-    this.linkColorLocal = rgbstr2hex(this.$store.state.config.colors['base08'])
+    this.bgColorLocal = rgbstr2hex(this.$store.state.config.colors.bg)
+    this.fgColorLocal = rgbstr2hex(this.$store.state.config.colors.lightBg)
+    this.textColorLocal = rgbstr2hex(this.$store.state.config.colors.fg)
+    this.linkColorLocal = rgbstr2hex(this.$store.state.config.colors.link)
   },
   methods: {
     setCustomTheme () {
diff --git a/src/components/style_switcher/style_switcher.vue b/src/components/style_switcher/style_switcher.vue
index 31bf546d..6c0cc6e7 100644
--- a/src/components/style_switcher/style_switcher.vue
+++ b/src/components/style_switcher/style_switcher.vue
@@ -7,22 +7,22 @@
     <p>{{$t('settings.theme_help')}}</p>
     <div class="color-container">
       <div class="color-item">
-        <label for="bgcolor" class="base04 theme-color-lb">{{$t('settings.background')}}</label>
+        <label for="bgcolor" class="theme-color-lb">{{$t('settings.background')}}</label>
         <input id="bgcolor" class="theme-color-cl" type="color" v-model="bgColorLocal">
         <input id="bgcolor-t" class="theme-color-in" type="text" v-model="bgColorLocal">
       </div>
       <div class="color-item">
-        <label for="fgcolor" class="base04 theme-color-lb">{{$t('settings.foreground')}}</label>
+        <label for="fgcolor" class="theme-color-lb">{{$t('settings.foreground')}}</label>
         <input id="fgcolor" class="theme-color-cl" type="color" v-model="fgColorLocal">
         <input id="fgcolor-t" class="theme-color-in" type="text" v-model="fgColorLocal">
       </div>
       <div class="color-item">
-        <label for="textcolor" class="base04 theme-color-lb">{{$t('settings.text')}}</label>
+        <label for="textcolor" class="theme-color-lb">{{$t('settings.text')}}</label>
         <input id="textcolor" class="theme-color-cl" type="color" v-model="textColorLocal">
         <input id="textcolor-t" class="theme-color-in" type="text" v-model="textColorLocal">
       </div>
       <div class="color-item">
-        <label for="linkcolor" class="base04 theme-color-lb">{{$t('settings.links')}}</label>
+        <label for="linkcolor" class="theme-color-lb">{{$t('settings.links')}}</label>
         <input id="linkcolor" class="theme-color-cl" type="color" v-model="linkColorLocal">
         <input id="linkcolor-t" class="theme-color-in" type="text" v-model="linkColorLocal">
       </div>
@@ -40,7 +40,7 @@
         </div>
       </div>
     </div>
-    <button class="btn base02-background base04" @click="setCustomTheme">{{$t('general.apply')}}</button>
+    <button class="btn" @click="setCustomTheme">{{$t('general.apply')}}</button>
   </div>
 </template>
 
@@ -63,6 +63,10 @@
     flex: 1 1 0;
     align-items: baseline;
     margin: 5px 6px 5px 0;
+
+    label {
+        color: var(--faint);
+    }
 }
 .theme-color-cl,
 .theme-color-in {
diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue
index d6ecfd2f..b6a5ab14 100644
--- a/src/components/timeline/timeline.vue
+++ b/src/components/timeline/timeline.vue
@@ -1,48 +1,48 @@
 <template>
   <div class="timeline panel panel-default" v-if="viewing == 'statuses'">
-    <div class="panel-heading timeline-heading base02-background base04">
+    <div class="panel-heading timeline-heading">
       <div class="title">
         {{title}}
       </div>
-      <button @click.prevent="showNewStatuses" class="base05 base02-background loadmore-button" v-if="timeline.newStatusCount > 0 && !timelineError">
+      <button @click.prevent="showNewStatuses" class="loadmore-button" v-if="timeline.newStatusCount > 0 && !timelineError">
         {{$t('timeline.show_new')}}{{newStatusCountStr}}
       </button>
-      <div @click.prevent class="base06 error  loadmore-text" v-if="timelineError">
+      <div @click.prevent class="loadmore-text" v-if="timelineError">
         {{$t('timeline.error_fetching')}}
       </div>
-      <div @click.prevent class="base04 base02-background loadmore-text" v-if="!timeline.newStatusCount > 0 && !timelineError">
+      <div @click.prevent class="loadmore-text" v-if="!timeline.newStatusCount > 0 && !timelineError">
         {{$t('timeline.up_to_date')}}
       </div>
     </div>
-    <div class="panel-body base01-background">
+    <div class="panel-body">
       <div class="timeline">
         <status-or-conversation v-for="status in timeline.visibleStatuses" :key="status.id" v-bind:statusoid="status"></status-or-conversation>
         <a href="#" v-on:click.prevent='fetchOlderStatuses()' v-if="!timeline.loading">
-          <div class="base02-background base03-border new-status-notification text-center">{{$t('timeline.load_older')}}</div>
+          <div class="new-status-notification text-center">{{$t('timeline.load_older')}}</div>
         </a>
-          <div class="base02-background base03-border new-status-notification text-center" v-else>...</div>
+          <div class="new-status-notification text-center" v-else>...</div>
       </div>
     </div>
   </div>
   <div class="timeline panel panel-default" v-else-if="viewing == 'followers'">
-    <div class="panel-heading timeline-heading base02-background base04">
+    <div class="panel-heading timeline-heading">
       <div class="title">
         {{$t('user_card.followers')}}
       </div>
     </div>
-    <div class="panel-body base01-background">
+    <div class="panel-body">
       <div class="timeline">
         <user-card v-for="follower in followers" :key="follower.id" :user="follower" :showFollows="false"></user-card>
       </div>
     </div>
   </div>
   <div class="timeline panel panel-default" v-else-if="viewing == 'friends'">
-    <div class="panel-heading timeline-heading base02-background base04">
+    <div class="panel-heading timeline-heading">
       <div class="title">
         {{$t('user_card.followees')}}
       </div>
     </div>
-    <div class="panel-body base01-background">
+    <div class="panel-body">
       <div class="timeline">
         <user-card v-for="friend in friends" :key="friend.id" :user="friend" :showFollows="true"></user-card>
       </div>
@@ -79,13 +79,16 @@
       font-size: 14px;
       min-width: 6em;
       border-radius: 5px;
+      background-color: transparent;
+      color: var(--faint);
       font-family: sans-serif;
       text-align: center;
       padding: 0 0.5em 0 0.5em;
       opacity: 0.8;
     }
     .error {
-      background-color: rgba(255, 48, 16, 0.65);
+      color: var(--lightFg);
+      background-color: var(--cRed);
     }
   }
 
@@ -96,6 +99,7 @@
     border-width: 1px 0 0 0;
     border-style: solid;
     border-radius: 0 0 10px 10px;
+    border-color: var(--border);
     padding: 10px;
     z-index: 1;
   }
diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue
index dd14d1b4..0561fa95 100644
--- a/src/components/user_card/user_card.vue
+++ b/src/components/user_card/user_card.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="card base00-background">
+  <div class="card">
     <a href="#">
       <img @click.prevent="toggleUserExpanded" class="avatar" :src="user.profile_image_url">
     </a>
@@ -21,24 +21,24 @@
 <script src="./user_card.js"></script>
 
 <style lang="scss">
-  .name-and-screen-name {
+.name-and-screen-name {
     margin-left: 0.7em;
     margin-top:0.0em;
     margin-right: 2em;
     text-align: left;
     width: 100%;
-  }
+}
 
-  .follows-you {
+.follows-you {
     margin-left: 2em;
     float: right;
-  }
+}
 
-  .follows {
+.follows {
 
-  }
+}
 
-  .card {
+.card {
     display: flex;
     flex: 1 0;
     padding-top: 0.6em;
@@ -47,18 +47,17 @@
     padding-left: 1em;
     border-bottom: 1px solid;
     margin: 0;
-    border-bottom-color: inherit;
-
+    border-bottom-color: var(--border);
 
     .avatar {
-      margin-top: 0.2em;
-      width:32px;
-      height: 32px;
-      border-radius: 50%;
+        margin-top: 0.2em;
+        width:32px;
+        height: 32px;
+        border-radius: 50%;
     }
-  }
+}
 
-  .usercard {
+.usercard {
     width: fill-available;
     margin: 0.2em 0 0.7em 0;
     border-radius: 10px;
@@ -67,6 +66,9 @@
     border-width: 1px;
     overflow: hidden;
 
+    .panel-heading {
+        background: transparent;
+    }
     p {
       margin-bottom: 0;
     }
diff --git a/src/components/user_card_content/user_card_content.js b/src/components/user_card_content/user_card_content.js
index 8c9ccda1..b7f156d2 100644
--- a/src/components/user_card_content/user_card_content.js
+++ b/src/components/user_card_content/user_card_content.js
@@ -5,7 +5,7 @@ export default {
   props: [ 'user', 'switcher' ],
   computed: {
     headingStyle () {
-      const color = this.$store.state.config.colors['base00']
+      const color = this.$store.state.config.colors.bg
       if (color) {
         const rgb = hex2rgb(color)
         console.log(rgb)
@@ -17,7 +17,7 @@ export default {
     },
     bodyStyle () {
       return {
-        background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors['base00']} 80%)`
+        background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors.bg} 80%)`
       }
     },
     isOtherUser () {
diff --git a/src/components/user_card_content/user_card_content.vue b/src/components/user_card_content/user_card_content.vue
index 71a879df..e3c9b5f9 100644
--- a/src/components/user_card_content/user_card_content.vue
+++ b/src/components/user_card_content/user_card_content.vue
@@ -18,30 +18,30 @@
           </div>
         </div>
         <div v-if="isOtherUser" class="user-interactions">
-          <div v-if="user.follows_you && loggedIn" class="following base06">
+          <div v-if="user.follows_you && loggedIn" class="following">
             {{ $t('user_card.follows_you') }}
           </div>
           <div class="follow" v-if="loggedIn">
             <span v-if="user.following">
               <!--Following them!-->
-              <button @click="unfollowUser" class="base04 base00-background pressed">
+              <button @click="unfollowUser" class="pressed">
                 {{ $t('user_card.following') }}
               </button>
             </span>
             <span v-if="!user.following">
-              <button @click="followUser" class="base05 base02-background">
+              <button @click="followUser">
                 {{ $t('user_card.follow') }}
               </button>
             </span>
           </div>
           <div class='mute' v-if='isOtherUser'>
             <span v-if='user.muted'>
-              <button @click="toggleMute" class="base04 base00-background pressed">
+              <button @click="toggleMute" class="pressed">
                 {{ $t('user_card.muted') }}
               </button>
             </span>
             <span v-if='!user.muted'>
-              <button @click="toggleMute" class="base05 base02-background">
+              <button @click="toggleMute">
                 {{ $t('user_card.mute') }}
               </button>
             </span>
@@ -50,19 +50,19 @@
             <form method="POST" :action='subscribeUrl'>
               <input type="hidden" name="nickname" :value="user.screen_name">
               <input type="hidden" name="profile" value="">
-              <button click="submit" class="remote-button base05 base02-background">
+              <button click="submit" class="remote-button">
                 {{ $t('user_card.remote_follow') }}
               </button>
             </form>
           </div>
           <div class='block' v-if='isOtherUser && loggedIn'>
             <span v-if='user.statusnet_blocking'>
-              <button @click="unblockUser" class="base04 base00-background pressed">
+              <button @click="unblockUser" class="pressed">
                 {{ $t('user_card.blocked') }}
               </button>
             </span>
             <span v-if='!user.statusnet_blocking'>
-              <button @click="blockUser" class="base05 base02-background">
+              <button @click="blockUser">
                 {{ $t('user_card.block') }}
               </button>
             </span>
@@ -73,19 +73,19 @@
     <div class="panel-body profile-panel-body" :style="bodyStyle">
       <div class="user-counts">
         <div class="user-count">
-          <a href="#" v-on:click.prevent="setProfileView('statuses')" v-if="switcher"><h5 class="base05">{{ $t('user_card.statuses') }}</h5></a>
+          <a href="#" v-on:click.prevent="setProfileView('statuses')" v-if="switcher"><h5>{{ $t('user_card.statuses') }}</h5></a>
           <h5 v-else>{{ $t('user_card.statuses') }}</h5>
-          <span class="base05">{{user.statuses_count}} <br><span class="dailyAvg">{{dailyAvg}} {{ $t('user_card.per_day') }}</span></span>
+          <span>{{user.statuses_count}} <br><span class="dailyAvg">{{dailyAvg}} {{ $t('user_card.per_day') }}</span></span>
         </div>
         <div class="user-count">
-          <a href="#" v-on:click.prevent="setProfileView('friends')" v-if="switcher"><h5 class="base05">{{ $t('user_card.followees') }}</h5></a>
+          <a href="#" v-on:click.prevent="setProfileView('friends')" v-if="switcher"><h5>{{ $t('user_card.followees') }}</h5></a>
           <h5 v-else>{{ $t('user_card.followees') }}</h5>
-          <span class="base05">{{user.friends_count}}</span>
+          <span>{{user.friends_count}}</span>
         </div>
         <div class="user-count">
-          <a href="#" v-on:click.prevent="setProfileView('followers')" v-if="switcher"><h5 class="base05">{{ $t('user_card.followers') }}</h5></a>
+          <a href="#" v-on:click.prevent="setProfileView('followers')" v-if="switcher"><h5>{{ $t('user_card.followers') }}</h5></a>
           <h5 v-else>{{ $t('user_card.followers') }}</h5>
-          <span class="base05">{{user.followers_count}}</span>
+          <span>{{user.followers_count}}</span>
         </div>
       </div>
       <p>{{user.description}}</p>
diff --git a/src/components/user_finder/user_finder.vue b/src/components/user_finder/user_finder.vue
index 3c69e3b4..66b2fc87 100644
--- a/src/components/user_finder/user_finder.vue
+++ b/src/components/user_finder/user_finder.vue
@@ -1,13 +1,13 @@
 <template>
   <span class="user-finder-container">
-    <span class="finder-error base05" v-if="error">
+    <span class="finder-error" v-if="error">
       <i class="icon-cancel user-finder-icon" @click="dismissError"/>
       {{$t('finder.error_fetching_user')}}
     </span>
     <i class="icon-spin4 user-finder-icon animate-spin-slow" v-if="loading" />
     <a href="#" v-if="hidden"><i class="icon-user-plus user-finder-icon" @click.prevent.stop="toggleHidden"/></a>
     <span v-else>
-      <input class="user-finder-input base03-border" @keyup.enter="findUser(username)" v-model="username" :placeholder="$t('finder.find_user')" id="user-finder-input" type="text"/>
+      <input class="user-finder-input" @keyup.enter="findUser(username)" v-model="username" :placeholder="$t('finder.find_user')" id="user-finder-input" type="text"/>
       <i class="icon-cancel user-finder-icon" @click.prevent.stop="toggleHidden"/>
     </span>
   </span>
@@ -25,9 +25,6 @@
  }
 
  .user-finder-input {
-   border-width: 1px;
-   border-style: solid;
-   border-color: inherit;
    border-radius: 5px;
    max-width: 80%;
    padding: 0.1em 0.2em 0.2em 0.2em;
@@ -38,5 +35,6 @@
    margin: 0.35em;
    border-radius: 5px;
    padding: 0.25em;
+   color: var(--faint);
  }
 </style>
diff --git a/src/components/user_panel/user_panel.vue b/src/components/user_panel/user_panel.vue
index 1a5e20fb..7da767b7 100644
--- a/src/components/user_panel/user_panel.vue
+++ b/src/components/user_panel/user_panel.vue
@@ -2,7 +2,7 @@
   <div class="user-panel">
     <div v-if='user' class="panel panel-default" style="overflow: visible;">
       <user-card-content :user="user" :switcher="false"></user-card-content>
-      <div class="panel-footer base00-background">
+      <div class="panel-footer">
         <post-status-form v-if='user'></post-status-form>
       </div>
     </div>
@@ -11,3 +11,11 @@
 </template>
 
 <script src="./user_panel.js"></script>
+
+<style lang="scss">
+  .user-panel {
+    .panel-heading {
+      background: transparent;
+    }
+  }
+</style>
diff --git a/src/components/user_profile/user_profile.vue b/src/components/user_profile/user_profile.vue
index 359abfef..14d8cfe9 100644
--- a/src/components/user_profile/user_profile.vue
+++ b/src/components/user_profile/user_profile.vue
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div v-if="user" class="user-profile panel panel-default base00-background">
+    <div v-if="user" class="user-profile panel panel-default">
       <user-card-content :user="user" :switcher="true"></user-card-content>
     </div>
     <Timeline :title="$t('user_profile.timeline_title')" :timeline="timeline" :timeline-name="'user'" :user-id="userId"/>
@@ -16,6 +16,9 @@
   flex-basis: 500px;
   padding-bottom: 10px;
   border-radius: 10px;
+  .panel-heading {
+      background: transparent;
+  }
 }
 
 </style>
diff --git a/src/components/user_settings/user_settings.vue b/src/components/user_settings/user_settings.vue
index 1ef52bbf..fecc67b8 100644
--- a/src/components/user_settings/user_settings.vue
+++ b/src/components/user_settings/user_settings.vue
@@ -1,16 +1,16 @@
 <template>
-  <div class="settings panel panel-default base00-background">
-    <div class="panel-heading base02-background base04">
+  <div class="settings panel panel-default">
+    <div class="panel-heading">
       {{$t('settings.user_settings')}}
     </div>
     <div class="panel-body profile-edit">
       <div class="setting-item">
         <h3>{{$t('settings.name_bio')}}</h3>
         <p>{{$t('settings.name')}}</p>
-        <input class='name-changer base03-border' id='username' v-model="newname"></input>
+        <input class='name-changer' id='username' v-model="newname"></input>
         <p>{{$t('settings.bio')}}</p>
-        <textarea class="bio base03-border" v-model="newbio"></textarea>
-        <button :disabled='newname.length <= 0' class="btn btn-default base05 base02-background" @click="updateProfile">{{$t('general.submit')}}</button>
+        <textarea class="bio" v-model="newbio"></textarea>
+        <button :disabled='newname.length <= 0' class="btn btn-default" @click="updateProfile">{{$t('general.submit')}}</button>
       </div>
       <div class="setting-item">
         <h3>{{$t('settings.avatar')}}</h3>
@@ -22,8 +22,8 @@
         <div>
           <input type="file" @change="uploadFile(0, $event)" ></input>
         </div>
-        <i class="base09 icon-spin4 animate-spin" v-if="uploading[0]"></i>
-        <button class="btn btn-default base05 base02-background" v-else-if="previews[0]" @click="submitAvatar">{{$t('general.submit')}}</button>
+        <i class="icon-spin4 animate-spin" v-if="uploading[0]"></i>
+        <button class="btn btn-default" v-else-if="previews[0]" @click="submitAvatar">{{$t('general.submit')}}</button>
       </div>
       <div class="setting-item">
         <h3>{{$t('settings.profile_banner')}}</h3>
@@ -35,8 +35,8 @@
         <div>
           <input type="file" @change="uploadFile(1, $event)" ></input>
         </div>
-        <i class="base09 icon-spin4 animate-spin uploading" v-if="uploading[1]"></i>
-        <button class="btn btn-default base05 base02-background" v-else-if="previews[1]" @click="submitBanner">{{$t('general.submit')}}</button>
+        <i class=" icon-spin4 animate-spin uploading" v-if="uploading[1]"></i>
+        <button class="btn btn-default" v-else-if="previews[1]" @click="submitBanner">{{$t('general.submit')}}</button>
       </div>
       <div class="setting-item">
         <h3>{{$t('settings.profile_background')}}</h3>
@@ -46,8 +46,8 @@
         <div>
           <input type="file" @change="uploadFile(2, $event)" ></input>
         </div>
-        <i class="base09 icon-spin4 animate-spin uploading" v-if="uploading[2]"></i>
-        <button class="btn btn-default base05 base02-background" v-else-if="previews[2]" @click="submitBg">{{$t('general.submit')}}</button>
+        <i class=" icon-spin4 animate-spin uploading" v-if="uploading[2]"></i>
+        <button class="btn btn-default" v-else-if="previews[2]" @click="submitBg">{{$t('general.submit')}}</button>
       </div>
       <div class="setting-item" v-if="pleromaBackend">
         <h3>{{$t('settings.follow_import')}}</h3>
@@ -55,8 +55,8 @@
         <form v-model="followImportForm">
           <input type="file" ref="followlist" v-on:change="followListChange"></input>
         </form>
-        <i class="base09 icon-spin4 animate-spin uploading" v-if="uploading[3]"></i>
-        <button class="btn btn-default base05 base02-background" v-else @click="importFollows">{{$t('general.submit')}}</button>
+        <i class=" icon-spin4 animate-spin uploading" v-if="uploading[3]"></i>
+        <button class="btn btn-default" v-else @click="importFollows">{{$t('general.submit')}}</button>
         <div v-if="followsImported">
           <i class="icon-cross" @click="dismissImported"></i>
           <p>{{$t('settings.follows_imported')}}</p>
@@ -76,8 +76,6 @@
 <style lang="scss">
 .profile-edit {
   .name-changer {
-    border-width: 1px;
-    border-style: solid;
     border-radius: 5px;
     padding: 0.2em 0.2em 0.2em 0.2em;
   }
@@ -85,11 +83,15 @@
     padding: 0.2em 0.5em 0.2em 0.5em;
   }
   .bio {
-    border-width: 1px;
-    border-style: solid;
     border-radius: 5px;
     margin: 0;
   }
+
+  input[type=file] {
+      padding: 5px;
+      border-radius: 5px;
+  }
+
   .banner {
     max-width: 400px;
     border-radius: 5px;
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index 6863bd0a..1bd8df51 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -45,12 +45,10 @@ const setStyle = (href, commit) => {
 
     const styleEl = document.createElement('style')
     head.appendChild(styleEl)
-    const styleSheet = styleEl.sheet
+    // const styleSheet = styleEl.sheet
 
-    styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max')
-    styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max')
-    styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max')
-    styleSheet.insertRule(`.base03-border { border-color: ${colors['base03']}`, 'index-max')
+    // styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max')
+    // styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max')
     body.style.display = 'initial'
   }
 
@@ -74,28 +72,30 @@ const setColors = (col, commit) => {
     mod = mod * -1
   }
 
-  colors['base00'] = rgb2hex(col.bg.r, col.bg.g, col.bg.b)                         // background
-  colors['base01'] = rgb2hex((col.bg.r + col.fg.r) / 2, (col.bg.g + col.fg.g) / 2, (col.bg.b + col.fg.b) / 2) // hilighted bg
-  colors['base02'] = rgb2hex(col.fg.r, col.fg.g, col.fg.b)                         // panels & buttons
-  colors['base03'] = rgb2hex(col.fg.r - mod, col.fg.g - mod, col.fg.b - mod)       // borders
-  colors['base04'] = rgb2hex(col.text.r + mod * 2, col.text.g + mod * 2, col.text.b + mod * 2) // faint text
-  colors['base05'] = rgb2hex(col.text.r, col.text.g, col.text.b)                   // text
-  colors['base06'] = rgb2hex(col.text.r - mod, col.text.g - mod, col.text.b - mod) // strong text
+  colors.bg = rgb2hex(col.bg.r, col.bg.g, col.bg.b)                         // background
+  colors.lightBg = rgb2hex((col.bg.r + col.fg.r) / 2, (col.bg.g + col.fg.g) / 2, (col.bg.b + col.fg.b) / 2) // hilighted bg
+  colors.btn = rgb2hex(col.fg.r, col.fg.g, col.fg.b)                         // panels & buttons
+  colors.border = rgb2hex(col.fg.r - mod, col.fg.g - mod, col.fg.b - mod)       // borders
+  colors.faint = rgb2hex(col.text.r + mod * 2, col.text.g + mod * 2, col.text.b + mod * 2) // faint text
+  colors.fg = rgb2hex(col.text.r, col.text.g, col.text.b)                   // text
+  colors.lightFg = rgb2hex(col.text.r - mod, col.text.g - mod, col.text.b - mod) // strong text
   colors['base07'] = rgb2hex(col.text.r - mod * 2, col.text.g - mod * 2, col.text.b - mod * 2)
-  colors['base08'] = rgb2hex(col.link.r, col.link.g, col.link.b)                   // links
-  colors['base09'] = rgb2hex((col.bg.r + col.text.r) / 2, (col.bg.g + col.text.g) / 2, (col.bg.b + col.text.b) / 2) // icons
-
-  const num = 10
-  times(num, (n) => {
-    const color = colors[`base0${num - 1 - n}`]
-    styleSheet.insertRule(`.base0${num - 1 - n} { color: ${color}`, 'index-max')
-    styleSheet.insertRule(`.base0${num - 1 - n}-background { background-color: ${color}`, 'index-max')
+  colors.link = rgb2hex(col.link.r, col.link.g, col.link.b)                   // links
+  colors.icon = rgb2hex((col.bg.r + col.text.r) / 2, (col.bg.g + col.text.g) / 2, (col.bg.b + col.text.b) / 2) // icons
+  colors.cBlue = 'blue'
+  colors.cRed = 'red'
+  colors.cGreen = 'green'
+  colors.cYellow = 'yellow'
+  colors.cOrange = 'orange'
+
+  const colorVars = Object.entries(colors).map(([k, v]) => {
+    return `--${k}: ${v}`
   })
+  console.log(colorVars)
 
-  styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max')
-  styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max')
-  styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max')
-  styleSheet.insertRule(`.base03-border { border-color: ${colors['base03']}`, 'index-max')
+  styleSheet.insertRule(`body { ${colorVars.join(';')} }`, 'index-max')
+  // styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max')
+  // styleSheet.insertRule(`.base03-border { border-color: ${colors['base03']}`, 'index-max')
   body.style.display = 'initial'
 
   commit('setOption', { name: 'colors', value: colors })
-- 
cgit v1.2.3-70-g09d2


From acdb5e5c7a2dac1908a5daafd94c31bc116a1799 Mon Sep 17 00:00:00 2001
From: Henry Jameson <me@hjkos.com>
Date: Sun, 1 Apr 2018 05:28:20 +0300
Subject: cleanup. added fallback mechanism for IE11 and unsupported browsers.

---
 src/App.scss                                       | 290 +++++++++++----------
 src/_variables.scss                                |  20 +-
 src/components/attachment/attachment.vue           |   5 +-
 src/components/delete_button/delete_button.vue     |   4 +-
 src/components/favorite_button/favorite_button.vue |  30 ++-
 src/components/login_form/login_form.vue           |   3 +-
 src/components/nav_panel/nav_panel.vue             |  20 +-
 src/components/notifications/notifications.js      |   5 -
 src/components/notifications/notifications.scss    |  43 +--
 src/components/notifications/notifications.vue     |   4 +-
 .../post_status_form/post_status_form.vue          |  24 +-
 src/components/registration/registration.vue       |  28 +-
 src/components/retweet_button/retweet_button.vue   |  28 +-
 src/components/settings/settings.vue               |   1 +
 src/components/status/status.vue                   | 169 ++++++------
 src/components/style_switcher/style_switcher.vue   |  11 +-
 src/components/timeline/timeline.vue               |  67 ++---
 src/components/user_card/user_card.vue             |  14 +-
 .../user_card_content/user_card_content.js         |   5 -
 .../user_card_content/user_card_content.vue        |  22 +-
 src/components/user_finder/user_finder.vue         |  36 +--
 src/services/style_setter/style_setter.js          |  16 +-
 22 files changed, 462 insertions(+), 383 deletions(-)

(limited to 'src/components/notifications/notifications.vue')

diff --git a/src/App.scss b/src/App.scss
index 6e0378db..ec80626b 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -1,10 +1,11 @@
 @import './_variables.scss';
+
 #app {
-    background-size: cover;
-    background-attachment: fixed;
-    background-repeat: no-repeat;
-    background-position: 0 50px;
-    min-height: 100vh;
+  background-size: cover;
+  background-attachment: fixed;
+  background-repeat: no-repeat;
+  background-position: 0 50px;
+  min-height: 100vh;
 }
 
 i {
@@ -12,7 +13,7 @@ i {
 }
 
 h4 {
-    margin: 0;
+  margin: 0;
 }
 
 #content {
@@ -26,49 +27,53 @@ h4 {
 }
 
 .text-center {
-    text-align: center;
+  text-align: center;
 }
 
 body {
-    font-family: sans-serif;
-    font-size: 14px;
-    margin: 0;
-    color: var(--fg);
+  font-family: sans-serif;
+  font-size: 14px;
+  margin: 0;
+  color: $fallback--fg;
+  color: var(--fg, $fallback--fg);
 }
 
 a {
-    text-decoration: none;
-    color: var(--link);
+  text-decoration: none;
+  color: $fallback--link;
+  color: var(--link, $fallback--link);
 }
 
 button{
-    user-select: none;
-    color: var(--faint);
-    background-color: var(--btn);
-    border: none;
-    border-radius: 5px;
-    cursor: pointer;
-    border-top: 1px solid rgba(255, 255, 255, 0.2);
-    border-bottom: 1px solid rgba(0, 0, 0, 0.2);
-    box-shadow: 0px 0px 2px black;
-    font-size: 14px;
-    font-family: sans-serif;
-
-
-
-    &:hover {
-        box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
-    }
+  user-select: none;
+  color: $fallback--faint;
+  color: var(--faint, $fallback--faint);
+  background-color: $fallback--btn;
+  background-color: var(--btn, $fallback--btn);
+  border: none;
+  border-radius: 5px;
+  cursor: pointer;
+  border-top: 1px solid rgba(255, 255, 255, 0.2);
+  border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+  box-shadow: 0px 0px 2px black;
+  font-size: 14px;
+  font-family: sans-serif;
 
-    &:disabled {
-      cursor: not-allowed;
-      opacity: 0.5;
-    }
+  &:hover {
+    box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
+  }
 
-    &.pressed {
-      color: var(--faint);
-      background-color: var(--bg)
-    }
+  &:disabled {
+    cursor: not-allowed;
+    opacity: 0.5;
+  }
+
+  &.pressed {
+    color: $fallback--faint;
+    color: var(--faint, $fallback--faint);
+    background-color: $fallback--bg;
+    background-color: var(--bg, $fallback--bg)
+  }
 }
 
 
@@ -78,11 +83,13 @@ input, textarea, select {
   border-bottom: 1px solid rgba(255, 255, 255, 0.2);
   border-top: 1px solid rgba(0, 0, 0, 0.2);
   box-shadow: 0px 0px 2px black inset;
-  background-color: var(--lightBg);
-  color: var(--lightFg);
+  background-color: $fallback--lightBg;
+  background-color: var(--lightBg, $fallback--lightBg);
+  color: $fallback--lightFg;
+  color: var(--lightFg, $fallback--lightFg);
   font-family: sans-serif;
   font-size: 14px;
-  padding: 5px;
+  padding: 8px 7px 4px;
 
   // TODO: Restyle <select> in a decent way. Needs different markup
   // -webkit-appearance:none;
@@ -93,7 +100,8 @@ input, textarea, select {
   &[type=checkbox] {
     display: none;
     &:checked + label::before {
-      color: var(--fg);
+      color: $fallback--fg;
+      color: var(--fg, $fallback--fg);
     }
     + label::before {
       display: inline-block;
@@ -106,7 +114,8 @@ input, textarea, select {
       border-top: 1px solid rgba(0, 0, 0, 0.2);
       box-shadow: 0px 0px 2px black inset;
       margin-right: .5em;
-      background-color: var(--btn);
+      background-color: $fallback--btn;
+      background-color: var(--btn, $fallback--btn);
       vertical-align: baseline;
       text-align: center;
       line-height: 1.1em;
@@ -126,129 +135,136 @@ input, textarea, select {
 .icon-binoculars,
 .icon-plus-squared,
 .icon-spin4 {
-  color: var(--icon)
+  color: $fallback--icon;
+  color: var(--icon, $fallback--icon)
 }
 
 
 .container {
-    display: flex;
-    flex-wrap: wrap;
-    margin: 0;
-    padding: 0 10px 0 10px;
+  display: flex;
+  flex-wrap: wrap;
+  margin: 0;
+  padding: 0 10px 0 10px;
 }
 
 .gaps {
-    margin: -1em 0 0 -1em;
+  margin: -1em 0 0 -1em;
 }
 
 .item {
-    flex: 1;
-    line-height: 25px;
-    height: 25px;
-    overflow: hidden;
+  flex: 1;
+  line-height: 25px;
+  height: 25px;
+  overflow: hidden;
 
-    .nav-icon {
-      font-size: 1.1em;
-      margin-left: 0.4em;
-    }
+  .nav-icon {
+    font-size: 1.1em;
+    margin-left: 0.4em;
+  }
 }
 
 .gaps > .item {
-    padding: 1em 0 0 1em;
+  padding: 1em 0 0 1em;
 }
 
 .auto-size {
-    flex: 1
+  flex: 1
 }
 
 nav {
-    width: 100%;
+  width: 100%;
+  align-items: center;
+  position: fixed;
+  height: 50px;
+
+  .inner-nav {
+    padding-left: 20px;
+    padding-right: 20px;
+    display: flex;
     align-items: center;
-    position: fixed;
+    flex-basis: 970px;
+    margin: auto;
     height: 50px;
-
-    .inner-nav {
-        padding-left: 20px;
-        padding-right: 20px;
-        display: flex;
-        align-items: center;
-        flex-basis: 970px;
-        margin: auto;
-        height: 50px;
-        background-repeat: no-repeat;
-        background-position: center;
-        background-size: contain;
-    }
+    background-repeat: no-repeat;
+    background-position: center;
+    background-size: contain;
+  }
 }
 
 main-router {
-    flex: 1;
+  flex: 1;
 }
 
 .status.compact {
-    color: rgba(0, 0, 0, 0.42);
-    font-weight: 300;
+  color: rgba(0, 0, 0, 0.42);
+  font-weight: 300;
 
-    p {
-        margin: 0;
-        font-size: 0.8em
-    }
+  p {
+    margin: 0;
+    font-size: 0.8em
+  }
 }
 
 /* Panel */
 
 .panel {
-    display: flex;
-    flex-direction: column;
-    margin: 0.5em;
+  display: flex;
+  flex-direction: column;
+  margin: 0.5em;
 
-    background-color: var(--bg);
+  background-color: $fallback--bg;
+  background-color: var(--bg, $fallback--bg);
 
-    border-radius: 10px;
-    box-shadow: 1px 1px 4px rgba(0,0,0,.6);
-    overflow: hidden;
+  border-radius: 10px;
+  border-radius: $fallback--panelRadius;
+  border-radius: var(--panelRadius, 10px);
+  box-shadow: 1px 1px 4px rgba(0,0,0,.6);
+  overflow: hidden;
 }
 
 .panel-body:empty::before {
-    content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations
-    display: block;
-    margin: 1em;
-    text-align: center;
+  content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations
+  display: block;
+  margin: 1em;
+  text-align: center;
 }
 
 .panel-heading {
-    border-radius: 10px 10px 0 0;
-    background-size: cover;
-    padding: 0.6em 1.0em;
-    text-align: left;
-    font-size: 1.3em;
-    line-height: 24px;
-    background-color: var(--btn);
+  border-radius: 10px 10px 0 0;
+  background-size: cover;
+  padding: 0.6em 1.0em;
+  text-align: left;
+  font-size: 1.3em;
+  line-height: 24px;
+  background-color: $fallback--btn;
+  background-color: var(--btn, $fallback--btn);
 }
 
 .panel-footer {
-    border-radius: 0 0 10px 10px;
+  border-radius: 0 0 10px 10px;
 }
 
 .panel-body > p {
-	line-height: 18px;
-    padding: 1em;
-    margin: 0;
+  line-height: 18px;
+  padding: 1em;
+  margin: 0;
 }
 
 .container > * {
-    min-width: 0px;
+  min-width: 0px;
 }
 
 .fa {
-    color: grey;
+  color: grey;
 }
 
 nav {
-    z-index: 1000;
-    background-color: var(--bg);
-    color: var(--faint);
-    box-shadow: 0px 0px 4px rgba(0,0,0,.6);
+  z-index: 1000;
+  background-color: $fallback--btn;
+  background-color: var(--btn, $fallback--btn);
+  color: $fallback--faint;
+  color: var(--faint, $fallback--faint);
+  box-shadow: 0px 0px 4px rgba(0,0,0,.6);
 }
 
 .fade-enter-active, .fade-leave-active {
@@ -259,9 +275,9 @@ nav {
 }
 
 .main {
-    flex-basis: 60%;
-    flex-grow: 1;
-    flex-shrink: 1;
+  flex-basis: 60%;
+  flex-grow: 1;
+  flex-shrink: 1;
 }
 
 .sidebar-bounds {
@@ -276,20 +292,20 @@ nav {
 }
 
 .mobile-shown {
-    display: none;
+  display: none;
 }
 
 .panel-switcher {
-    display: none;
-    width: 100%;
-    height: 46px;
-    button {
-        display: block;
-        flex: 1;
-        max-height: 32px;
-        margin: 0.5em;
-        padding: 0.5em;
-    }
+  display: none;
+  width: 100%;
+  height: 46px;
+  button {
+    display: block;
+    flex: 1;
+    max-height: 32px;
+    margin: 0.5em;
+    padding: 0.5em;
+  }
 }
 
 @media all and (min-width: 960px) {
@@ -324,24 +340,24 @@ nav {
 }
 
 @media all and (max-width: 959px) {
-    .mobile-hidden {
-        display: none;
-    }
+  .mobile-hidden {
+    display: none;
+  }
 
-    .panel-switcher {
-        display: flex;
-    }
+  .panel-switcher {
+    display: flex;
+  }
 
-    .container {
-        padding: 0 0 0 0;
-    }
+  .container {
+    padding: 0 0 0 0;
+  }
 
-    .panel {
-        margin: 0.5em 0 0.5em 0;
-    }
+  .panel {
+    margin: 0.5em 0 0.5em 0;
+  }
 }
 
 .item.right {
-    text-align: right;
-    padding-right: 20px;
+  text-align: right;
+  padding-right: 20px;
 }
diff --git a/src/_variables.scss b/src/_variables.scss
index fa7eaec1..eccc0aab 100644
--- a/src/_variables.scss
+++ b/src/_variables.scss
@@ -1,6 +1,20 @@
 $main-color: #f58d2c;
 $main-background: white;
 $darkened-background: whitesmoke;
-$green_: #0fa00f;
-$blue_: #0095ff;
-$red_: #ff0000;
+
+$fallback--bg: #121a24;
+$fallback--btn: #182230;
+$fallback--faint: #999;
+$fallback--fg: #b9b9ba;
+$fallback--link: #d8a070;
+$fallback--icon: #666;
+$fallback--lightBg: rgb(21, 30, 42);
+$fallback--lightFg: #b9b9ba;
+$fallback--border: #222;
+$fallback--cRed: #ff0000;
+$fallback--cBlue: #0095ff;
+$fallback--cGreen: #0fa00f;
+$fallback--cOrange: orange;
+$fallback--cYellow: yellow;
+
+$fallback--panelRadius: 10px;
diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue
index eeb6e6b8..e3b1e4d4 100644
--- a/src/components/attachment/attachment.vue
+++ b/src/components/attachment/attachment.vue
@@ -30,6 +30,8 @@
 <script src="./attachment.js"></script>
 
 <style lang="scss">
+@import '../../_variables.scss';
+
 .attachments {
     display: flex;
     flex-wrap: wrap;
@@ -45,7 +47,8 @@
         flex: 1 0 30%;
         margin: 0.5em 0.7em 0.6em 0.0em;
         align-self: flex-start;
-        border-color: var(--border);
+        border-color: $fallback--border;
+        border-color: var(--border, $fallback--border);
 
         border-style: solid;
         border-width: 1px;
diff --git a/src/components/delete_button/delete_button.vue b/src/components/delete_button/delete_button.vue
index 66727e7c..9966d85e 100644
--- a/src/components/delete_button/delete_button.vue
+++ b/src/components/delete_button/delete_button.vue
@@ -14,8 +14,8 @@
   .icon-cancel,.delete-status {
     cursor: pointer;
     &:hover {
-      color: $red_;
-      color: var(--red);
+      color: var(--cRed, $fallback--cRed);
+      color: $fallback--cRed;
     }
   }
 </style>
diff --git a/src/components/favorite_button/favorite_button.vue b/src/components/favorite_button/favorite_button.vue
index a6e4c46b..f25c589a 100644
--- a/src/components/favorite_button/favorite_button.vue
+++ b/src/components/favorite_button/favorite_button.vue
@@ -11,18 +11,22 @@
 
 <script src="./favorite_button.js" ></script>
 
-<style lang='scss'>
-  .fav-active {
-      cursor: pointer;
-      animation-duration: 0.6s;
-      &:hover {
-        color: orange;
-        color: var(--cOrange);
-      }
-  }
-  .favorite-button.icon-star {
-      color: orange;
-      color: var(--cOrange);
-  }
+<style lang="scss">
+@import '../../_variables.scss';
+
+.fav-active {
+    cursor: pointer;
+    animation-duration: 0.6s;
+
+    &:hover {
+        color: $fallback--cOrange;
+        color: var(--cOrange, $fallback--cOrange);
+    }
+}
+
+.favorite-button.icon-star {
+    color: $fallback--cOrange;
+    color: var(--cOrange, $fallback--cOrange);
+}
 
 </style>
diff --git a/src/components/login_form/login_form.vue b/src/components/login_form/login_form.vue
index 553858a3..82000d6b 100644
--- a/src/components/login_form/login_form.vue
+++ b/src/components/login_form/login_form.vue
@@ -31,6 +31,7 @@
 <script src="./login_form.js" ></script>
 
 <style lang="scss">
+@import '../../_variables.scss';
 
 .login-form {
     input {
@@ -47,7 +48,7 @@
         border-radius: 5px;
         text-align: center;
         background-color: rgba(255, 48, 16, 0.65);
-        background-color: var(--cRed);
+       background-color: $fallback--cRed;
         min-height: 28px;
         line-height: 28px;
     }
diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue
index 2a92586b..43b4c3dc 100644
--- a/src/components/nav_panel/nav_panel.vue
+++ b/src/components/nav_panel/nav_panel.vue
@@ -30,6 +30,8 @@
 <script src="./nav_panel.js" ></script>
 
 <style lang="scss">
+@import '../../_variables.scss';
+
 .nav-panel ul {
     list-style: none;
     margin: 0;
@@ -38,13 +40,17 @@
 
 .nav-panel li {
     border-bottom: 1px solid;
-    border-color: var(--border);
-    background-color: var(--bg);
+    border-color: $fallback--border;
+    border-color: var(--border, $fallback--border);
+    background-color: $fallback--bg;
+    background-color: var(--bg, $fallback--bg);
     padding: 0;
+
     &:first-child a {
         border-top-right-radius: 10px;
         border-top-left-radius: 10px;
     }
+
     &:last-child a {
         border-bottom-right-radius: 10px;
         border-bottom-left-radius: 10px;
@@ -58,16 +64,20 @@
 .nav-panel a {
     display: block;
     padding: 0.8em 0.85em;
+
     &:hover {
-        background-color: var(--lightBg);
+        background-color: $fallback--lightBg;
+        background-color: var(--lightBg, $fallback--lightBg);
     }
+
     &.router-link-active {
         font-weight: bolder;
-        background-color: var(--lightBg);
+        background-color: $fallback--lightBg;
+        background-color: var(--lightBg, $fallback--lightBg);
+
         &:hover {
             text-decoration: underline;
         }
     }
  }
-
 </style>
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index 58d82a09..e55c6e24 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -24,11 +24,6 @@ const Notifications = {
     },
     unseenCount () {
       return this.unseenNotifications.length
-    },
-    hiderStyle () {
-      return {
-        background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors.bg} 80%)`
-      }
     }
   },
   components: {
diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss
index a739d52e..5af2454e 100644
--- a/src/components/notifications/notifications.scss
+++ b/src/components/notifications/notifications.scss
@@ -5,32 +5,39 @@
   padding-bottom: 15em;
 
   .panel {
-    background: var(--bg)
+    background: $fallback--bg;
+    background: var(--bg, $fallback--bg)
   }
 
   .panel-body {
-    border-color: var(--border)
+    border-color: $fallback--border;
+    border-color: var(--border, $fallback--border)
   }
 
   .panel-heading {
     // force the text to stay centered, while keeping
     // the button in the right side of the panel heading
     position: relative;
-    background: var(--btn);
-    color: var(--faint);
+    background: $fallback--btn;
+    background: var(--btn, $fallback--btn);
+    color: $fallback--faint;
+    color: var(--faint, $fallback--faint);
     .read-button {
       position: absolute;
       right: 0.7em;
       height: 1.8em;
       line-height: 100%;
-      background-color: var(--btn);
-      color: var(--faint);
+      background-color: $fallback--btn;
+      background-color: var(--btn, $fallback--btn);
+      color: $fallback--faint;
+      color: var(--faint, $fallback--faint);
     }
   }
 
   .unseen-count {
     display: inline-block;
-    background-color: var(--cRed);
+    background-color: $fallback--cRed;
+    background-color: var(--cRed, $fallback--cRed);
     text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.5);
     min-width: 1.3em;
     border-radius: 1.3em;
@@ -52,6 +59,10 @@
     border-bottom: 1px solid;
     border-bottom-color: inherit;
 
+    .notification-gradient {
+      background: linear-gradient(to bottom, rgba(0, 0, 0, 0), $fallback--bg 80%);
+      background: linear-gradient(to bottom, rgba(0, 0, 0, 0), var(--bg, $fallback--bg) 80%)
+    }
 
     .text {
       min-width: 0px;
@@ -61,23 +72,24 @@
       overflow: hidden;
 
       .icon-retweet.lit {
-        color: $green_;
-        color: var(--cGreen);
+        color: $fallback--cGreen;
+        color: var(--cGreen, $fallback--cGreen);
       }
 
       .icon-user-plus.lit {
-        color: $blue_;
-        color: var(--cBlue);
+        color: $fallback--cBlue;
+        color: var(--cBlue, $fallback--cBlue);
       }
 
       .icon-reply.lit {
-        color: $blue_;
-        color: var(--cBlue);
+        color: $fallback--cBlue;
+        color: var(--cBlue, $fallback--cBlue);
       }
 
       .icon-star.lit {
         color: orange;
-        color: var(--cOrange);
+        color: $fallback--cOrange;
+        color: var(--cOrange, $fallback--cOrange);
       }
 
       .status-content {
@@ -151,7 +163,8 @@
   }
 
   .unseen {
-    border-left: 4px solid var(--cRed);
+    border-left: 4px solid $fallback--cRed;
+    border-left: 4px solid var(--cRed, $fallback--cRed);
     padding-left: 6px;
   }
 }
diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index 77e29426..17bae71e 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -20,7 +20,7 @@
                 <i class="fa icon-star lit"></i>
                 <small><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small>
               </h1>
-              <div class="notification-gradient" :style="hiderStyle"></div>
+              <div class="notification-gradient"></div>
               <div class="notification-content" v-html="notification.status.statusnet_html"></div>
             </div>
             <div v-if="notification.type === 'repeat'">
@@ -29,7 +29,7 @@
                 <i class="fa icon-retweet lit"></i>
                 <small><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small>
               </h1>
-              <div class="notification-gradient" :style="hiderStyle"></div>
+              <div class="notification-gradient"></div>
               <div class="notification-content" v-html="notification.status.statusnet_html"></div>
             </div>
             <div v-if="notification.type === 'mention'">
diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue
index 3f268ff5..d57418fb 100644
--- a/src/components/post_status_form/post_status_form.vue
+++ b/src/components/post_status_form/post_status_form.vue
@@ -50,6 +50,7 @@
 <script src="./post_status_form.js"></script>
 
 <style lang="scss">
+@import '../../_variables.scss';
 
 .tribute-container {
     ul {
@@ -83,11 +84,13 @@
             display: flex;
         }
     }
+
     .error {
         border-radius: 5px;
         text-align: center;
         background-color: rgba(255, 48, 16, 0.65);
-        background-color: var(--cRed);
+        background-color: $fallback--cRed;
+        background-color: var(--cRed, $fallback--cRed);
         padding: 0.25em;
         margin: 0.35em;
         display: flex;
@@ -98,7 +101,8 @@
 
         .attachment {
             position: relative;
-            border: var(--border);
+            border: $fallback--border;
+            border: var(--border, $fallback--border);
             margin: 0.5em 0.8em 0.2em 0;
         }
 
@@ -139,11 +143,11 @@
     }
 
     form textarea {
-        border-radius: 5px;
         line-height:16px;
-        padding: 5px;
         resize: none;
         overflow: hidden;
+        transition: min-height 200ms;
+        min-height: 1px;
     }
 
     form textarea:focus {
@@ -170,8 +174,10 @@
         z-index: 1;
         box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
         min-width: 75%;
-        background: var(--btn);
-        color: var(--lightFg);
+        background: $fallback--btn;
+        background: var(--btn, $fallback--btn);
+        color: $fallback--lightFg;
+        color: var(--lightFg, $fallback--lightFg);
     }
 
     .autocomplete {
@@ -179,19 +185,23 @@
         padding: 0.2em 0.4em 0.2em 0.4em;
         border-bottom: 1px solid rgba(0, 0, 0, 0.4);
         display: flex;
+
         img {
             width: 24px;
             height: 24px;
             border-radius: 2px;
             object-fit: contain;
         }
+
         span {
             line-height: 24px;
             margin: 0 0.1em 0 0.2em;
         }
+
         small {
             margin-left: .5em;
-            color: var(--faint);
+            color: $fallback--faint;
+            color: var(--faint, $fallback--faint);
         }
     }
 }
diff --git a/src/components/registration/registration.vue b/src/components/registration/registration.vue
index 786a59e3..0966645d 100644
--- a/src/components/registration/registration.vue
+++ b/src/components/registration/registration.vue
@@ -55,6 +55,7 @@
 
 <script src="./registration.js"></script>
 <style lang="scss">
+@import '../../_variables.scss';
 
 .registration-form {
     display: flex;
@@ -87,18 +88,13 @@
     }
 
     form textarea {
-        border: solid;
-        border-width: 1px;
-        border-color: silver;
         border-radius: 5px;
         line-height:16px;
-        padding: 5px;
         resize: vertical;
     }
 
     input {
         border-radius: 5px;
-        padding: 0.1em 0.2em 0.2em 0.2em;
     }
 
     .captcha {
@@ -111,21 +107,21 @@
         //width: 10em;
         margin-top: 0.6em;
         height: 28px;
-  }
+    }
 
-  .error {
-    border-radius: 5px;
-    text-align: center;
-    margin: 0.5em 0.6em 0;
-    background-color: rgba(255, 48, 16, 0.65);
-    background-color: var(--cRed);
-    min-height: 28px;
-    line-height: 28px;
-  }
+    .error {
+        border-radius: 5px;
+        text-align: center;
+        margin: 0.5em 0.6em 0;
+        background-color: $fallback--cRed;
+        background-color: var(--cRed, $fallback--cRed);
+        min-height: 28px;
+        line-height: 28px;
+    }
 }
 
 @media all and (max-width: 959px) {
-  .registration-form .container {
+    .registration-form .container {
     flex-direction: column-reverse;
   }
 }
diff --git a/src/components/retweet_button/retweet_button.vue b/src/components/retweet_button/retweet_button.vue
index 7c75f3bc..a21942c3 100644
--- a/src/components/retweet_button/retweet_button.vue
+++ b/src/components/retweet_button/retweet_button.vue
@@ -11,18 +11,18 @@
 
 <script src="./retweet_button.js" ></script>
 
-<style lang='scss'>
-  @import '../../_variables.scss';
-  .rt-active {
-     cursor: pointer;
-     animation-duration: 0.6s;
-     &:hover {
-      color: $green_;
-      color: var(--cGreen);
-     }
-  }
-  .icon-retweet.retweeted {
-     color: $green_;
-     color: var(--cGreen);
-  }
+<style lang="scss">
+@import '../../_variables.scss';
+.rt-active {
+    cursor: pointer;
+    animation-duration: 0.6s;
+    &:hover {
+        color: $fallback--cGreen;
+        color: var(--cGreen, $fallback--cGreen);
+    }
+}
+.icon-retweet.retweeted {
+    color: $fallback--cGreen;
+    color: var(--cGreen, $fallback--cGreen);
+}
 </style>
diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue
index b842c9e9..98f70f7b 100644
--- a/src/components/settings/settings.vue
+++ b/src/components/settings/settings.vue
@@ -56,6 +56,7 @@
 <style lang="scss">
  .setting-item {
    margin: 1em 1em 1.4em;
+
    textarea {
      width: 100%;
      height: 100px;
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 8410aeba..80f6a315 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -139,8 +139,10 @@ status-text-container {
     max-width: 34em;
     padding: 0.5em;
     display: flex;
-    background-color: var(--bg);
-    border-color: var(--border);
+    background-color: $fallback--bg;
+    background-color: var(--bg, $fallback--bg);
+    border-color: $fallback--border;
+    border-color: var(--border, $fallback--border);
     border-style: solid;
     border-width: 1px;
     border-radius: 4px;
@@ -181,15 +183,19 @@ status-text-container {
     word-break: break-word;
     border-left-width: 0px;
     line-height: 18px;
-    background-color: var(--bg);
-    border-color: var(--border);
+    background-color: $fallback--bg;
+    background-color: var(--bg, $fallback--bg);
+    border-color: $fallback--border;
+    border-color: var(--border, $fallback--border);
 
     &_focused {
-        background-color: var(--lightBg);
+        background-color: $fallback--lightBg;
+        background-color: var(--lightBg, $fallback--lightBg);
     }
 
     .usercard {
-        border-color: var(--border);
+        border-color: $fallback--border;
+        border-color: var(--border, $fallback--border);
     }
 
     .timeline & {
@@ -211,7 +217,6 @@ status-text-container {
 
 
     .user-content {
-
         min-height: 52px;
         padding-top: 1px;
     }
@@ -224,14 +229,17 @@ status-text-container {
         small {
             font-weight: lighter;
         }
+
         h4 {
             margin-right: 0.4em;
         }
+
         .name-and-links {
             flex: 1 0;
             display: flex;
             flex-wrap: wrap;
         }
+
         .replies {
             flex-basis: 100%;
         }
@@ -310,6 +318,7 @@ status-text-container {
     from {
         opacity: 0;
     }
+
     to {
         opacity: 1;
     }
@@ -335,14 +344,14 @@ status-text-container {
 }
 
 .icon-reply:hover {
-    color: $blue_;
-    color: var(--cBlue);
- }
+    color: $fallback--cBlue;
+    color: var(--cBlue, $fallback--cBlue);
+}
 
- .icon-reply.icon-reply-active {
-     color: $blue_;
-     color: var(--cBlue);
- }
+.icon-reply.icon-reply-active {
+    color: $fallback--cBlue;
+    color: var(--cBlue, $fallback--cBlue);
+}
 
  .status .avatar {
    width: 48px;
@@ -359,13 +368,13 @@ status-text-container {
        display: none;
    }
 
-   &.retweeted {
-     width: 40px;
-     height: 40px;
-     margin-right: 8px;
-     margin-bottom: 8px;
-   }
- }
+    &.retweeted {
+        width: 40px;
+        height: 40px;
+        margin-right: 8px;
+        margin-bottom: 8px;
+    }
+}
 
  .status:hover .animated.avatar {
      canvas {
@@ -376,79 +385,81 @@ status-text-container {
      }
  }
 
- .status .avatar-retweeter {
-   width: 24px;
-   height: 24px;
-   position: absolute;
-   margin-left: 24px;
-   margin-top: 24px;
- }
+.status img.avatar-retweeter {
+    width: 24px;
+    height: 24px;
+    position: absolute;
+    margin-left: 24px;
+    margin-top: 24px;
+}
 
- .status.compact .avatar {
-     width: 32px;
- }
+.status.compact .avatar {
+    width: 32px;
+}
 
- .status {
-     padding: 0.4em 0.7em 0.45em 0.7em;
-     border-left: 4px var(--cRed);
-     border-left-style: inherit;
- }
+.status {
+    padding: 0.4em 0.7em 0.45em 0.7em;
+    border-left: 4px $fallback--cRed;
+    border-left: 4px var(--cRed, $fallback--cRed);
+    border-left-style: inherit;
+}
 
- .status-conversation:last-child {
+.status-conversation:last-child {
     border-bottom: none;
- }
+}
 
- .timeline .panel.timeline {
+.timeline .panel.timeline {
     border-radius: 10px;
     overflow: hidden;
- }
+}
 
- .muted {
-   padding: 0.1em 0.4em 0.1em 0.8em;
-   button {
-     margin-left: auto;
-   }
+.muted {
+    padding: 0.1em 0.4em 0.1em 0.8em;
+    button {
+        margin-left: auto;
+    }
 
-   .muteWords {
-     margin-left: 10px;
-   }
- }
+    .muteWords {
+        margin-left: 10px;
+    }
+}
 
- a.unmute {
-   display: block;
-   margin-left: auto;
- }
+a.unmute {
+    display: block;
+    margin-left: auto;
+}
 
- .reply-left {
-   flex: 0;
-   min-width: 48px;
- }
+.reply-left {
+    flex: 0;
+    min-width: 48px;
+}
 
- .reply-body {
-   flex: 1;
- }
+.reply-body {
+    flex: 1;
+}
 
- @media all and (max-width: 960px) {
-   .status-el {
-     .name-and-links {
-       margin-left: -0.25em;
-     }
-   }
-   .status {
-     max-width: 100%;
-   }
+@media all and (max-width: 960px) {
+    .status-el {
+        .name-and-links {
+            margin-left: -0.25em;
+        }
+    }
 
-   .status .avatar {
-     width: 40px;
-     height: 40px;
+    .status {
+        max-width: 100%;
+    }
 
-     &.retweeted {
-       width: 34px;
-       height: 34px;
-       margin-right: 8px;
-       margin-bottom: 8px;
-     }
-   }
+    .status .avatar {
+        width: 40px;
+        height: 40px;
+
+        &.retweeted {
+            width: 34px;
+            height: 34px;
+            margin-right: 8px;
+            margin-bottom: 8px;
+        }
+    }
 
    .status .avatar-retweeter {
      width: 22px;
diff --git a/src/components/style_switcher/style_switcher.vue b/src/components/style_switcher/style_switcher.vue
index 6c0cc6e7..e6a00275 100644
--- a/src/components/style_switcher/style_switcher.vue
+++ b/src/components/style_switcher/style_switcher.vue
@@ -47,6 +47,7 @@
 <script src="./style_switcher.js"></script>
 
 <style lang="scss">
+@import '../../_variables.scss';
 .style-switcher {
     margin-right: 1em;
 }
@@ -65,14 +66,20 @@
     margin: 5px 6px 5px 0;
 
     label {
-        color: var(--faint);
+        color: var(--faint, $fallback--faint);
     }
 }
+
+.theme-color-cl {
+    border: 0;
+    box-shadow: none;
+    background: transparent;
+}
+
 .theme-color-cl,
 .theme-color-in {
     margin-left: 4px;
     border-radius: 2px;
-    border: 0;
 }
 
 .theme-color-in {
diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue
index b6a5ab14..c3cc939a 100644
--- a/src/components/timeline/timeline.vue
+++ b/src/components/timeline/timeline.vue
@@ -52,54 +52,63 @@
 <script src="./timeline.js"></script>
 
 <style lang="scss">
+@import '../../_variables.scss';
 
-  .timeline {
+.timeline {
     .timeline-heading {
-      position: relative;
-      display: flex;
+        position: relative;
+        display: flex;
     }
+
     .title {
-      white-space: nowrap;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      max-width: 70%;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        max-width: 70%;
     }
+
     .loadmore-button {
-      position: absolute;
-      right: 0.6em;
-      font-size: 14px;
+        position: absolute;
+        right: 0.6em;
+        font-size: 14px;
 
-      min-width: 6em;
-      height: 1.8em;
-      line-height: 100%;
+        min-width: 6em;
+        height: 1.8em;
+        line-height: 100%;
     }
+
     .loadmore-text {
-      position: absolute;
-      right: 0.6em;
-      font-size: 14px;
-      min-width: 6em;
-      border-radius: 5px;
-      background-color: transparent;
-      color: var(--faint);
-      font-family: sans-serif;
-      text-align: center;
-      padding: 0 0.5em 0 0.5em;
-      opacity: 0.8;
+        position: absolute;
+        right: 0.6em;
+        font-size: 14px;
+        min-width: 6em;
+        border-radius: 5px;
+        background-color: transparent;
+        color: $fallback--faint;
+        color: var(--faint, $fallback--faint);
+        font-family: sans-serif;
+        text-align: center;
+        padding: 0 0.5em 0 0.5em;
+        opacity: 0.8;
     }
+
     .error {
-      color: var(--lightFg);
-      background-color: var(--cRed);
+        color: $fallback--lightFg;
+        color: var(--lightFg, $fallback--lightFg);
+        background-color: $fallback--cRed;
+        background-color: var(--cRed, $fallback--cRed);
     }
-  }
+}
 
-  .new-status-notification {
+.new-status-notification {
     position:relative;
     margin-top: -1px;
     font-size: 1.1em;
     border-width: 1px 0 0 0;
     border-style: solid;
     border-radius: 0 0 10px 10px;
-    border-color: var(--border);
+    border-color: $fallback--border;
+    border-color: var(--border, $fallback--border);
     padding: 10px;
     z-index: 1;
   }
diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue
index 0561fa95..6487d2a6 100644
--- a/src/components/user_card/user_card.vue
+++ b/src/components/user_card/user_card.vue
@@ -21,6 +21,8 @@
 <script src="./user_card.js"></script>
 
 <style lang="scss">
+@import '../../_variables.scss';
+
 .name-and-screen-name {
     margin-left: 0.7em;
     margin-top:0.0em;
@@ -34,10 +36,6 @@
     float: right;
 }
 
-.follows {
-
-}
-
 .card {
     display: flex;
     flex: 1 0;
@@ -47,7 +45,8 @@
     padding-left: 1em;
     border-bottom: 1px solid;
     margin: 0;
-    border-bottom-color: var(--border);
+    border-bottom-color: $fallback--border;
+		border-bottom-color: var(--border, $fallback--border);
 
     .avatar {
         margin-top: 0.2em;
@@ -69,8 +68,9 @@
     .panel-heading {
         background: transparent;
     }
+
     p {
-      margin-bottom: 0;
+        margin-bottom: 0;
     }
-  }
+}
 </style>
diff --git a/src/components/user_card_content/user_card_content.js b/src/components/user_card_content/user_card_content.js
index b7f156d2..2e448f1c 100644
--- a/src/components/user_card_content/user_card_content.js
+++ b/src/components/user_card_content/user_card_content.js
@@ -15,11 +15,6 @@ export default {
         }
       }
     },
-    bodyStyle () {
-      return {
-        background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors.bg} 80%)`
-      }
-    },
     isOtherUser () {
       return this.user.id !== this.$store.state.users.currentUser.id
     },
diff --git a/src/components/user_card_content/user_card_content.vue b/src/components/user_card_content/user_card_content.vue
index e3c9b5f9..ca3da632 100644
--- a/src/components/user_card_content/user_card_content.vue
+++ b/src/components/user_card_content/user_card_content.vue
@@ -70,7 +70,7 @@
         </div>
       </div>
     </div>
-    <div class="panel-body profile-panel-body" :style="bodyStyle">
+    <div class="panel-body profile-panel-body">
       <div class="user-counts">
         <div class="user-count">
           <a href="#" v-on:click.prevent="setProfileView('statuses')" v-if="switcher"><h5>{{ $t('user_card.statuses') }}</h5></a>
@@ -99,19 +99,21 @@
 @import '../../_variables.scss';
 
 .profile-panel-background {
-  background-size: cover;
-  border-radius: 10px;
+    background-size: cover;
+    border-radius: 10px;
 
-  .panel-heading {
-    padding: 0.6em 0em;
-    text-align: center;
-  }
+    .panel-heading {
+        padding: 0.6em 0em;
+        text-align: center;
+    }
 }
 
 .profile-panel-body {
-  top: -0em;
-  padding-top: 4em;
-  word-wrap: break-word;
+    top: -0em;
+    padding-top: 4em;
+    word-wrap: break-word;
+    background: linear-gradient(to bottom, rgba(0, 0, 0, 0), $fallback--bg 80%);
+    background: linear-gradient(to bottom, rgba(0, 0, 0, 0), var(--bg, $fallback--bg) 80%)
 }
 
 .user-info {
diff --git a/src/components/user_finder/user_finder.vue b/src/components/user_finder/user_finder.vue
index 66b2fc87..e4453fe7 100644
--- a/src/components/user_finder/user_finder.vue
+++ b/src/components/user_finder/user_finder.vue
@@ -16,25 +16,25 @@
 <script src="./user_finder.js"></script>
 
 <style lang="scss">
- .user-finder-container {
-   height: 21px;
-   max-width: 100%;
- }
+@import '../../_variables.scss';
 
- .user-finder-icon {
- }
+.user-finder-container {
+    height: 21px;
+    max-width: 100%;
+}
 
- .user-finder-input {
-   border-radius: 5px;
-   max-width: 80%;
-   padding: 0.1em 0.2em 0.2em 0.2em;
- }
+.user-finder-input {
+    border-radius: 5px;
+    max-width: 80%;
+    padding: 0.1em 0.2em 0.2em 0.2em;
+}
 
- .finder-error {
-   background-color: rgba(255, 48, 16, 0.65);
-   margin: 0.35em;
-   border-radius: 5px;
-   padding: 0.25em;
-   color: var(--faint);
- }
+.finder-error {
+    background-color: rgba(255, 48, 16, 0.65);
+    margin: 0.35em;
+    border-radius: 5px;
+    padding: 0.25em;
+    color: $fallback--faint;
+    color: var(--faint, $fallback--faint);
+}
 </style>
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index 1bd8df51..bedadb12 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -47,8 +47,6 @@ const setStyle = (href, commit) => {
     head.appendChild(styleEl)
     // const styleSheet = styleEl.sheet
 
-    // styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max')
-    // styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max')
     body.style.display = 'initial'
   }
 
@@ -82,20 +80,14 @@ const setColors = (col, commit) => {
   colors['base07'] = rgb2hex(col.text.r - mod * 2, col.text.g - mod * 2, col.text.b - mod * 2)
   colors.link = rgb2hex(col.link.r, col.link.g, col.link.b)                   // links
   colors.icon = rgb2hex((col.bg.r + col.text.r) / 2, (col.bg.g + col.text.g) / 2, (col.bg.b + col.text.b) / 2) // icons
-  colors.cBlue = 'blue'
+  colors.cBlue = '#0095ff'
   colors.cRed = 'red'
-  colors.cGreen = 'green'
+  colors.cGreen = '#0fa00f'
   colors.cYellow = 'yellow'
   colors.cOrange = 'orange'
 
-  const colorVars = Object.entries(colors).map(([k, v]) => {
-    return `--${k}: ${v}`
-  })
-  console.log(colorVars)
-
-  styleSheet.insertRule(`body { ${colorVars.join(';')} }`, 'index-max')
-  // styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max')
-  // styleSheet.insertRule(`.base03-border { border-color: ${colors['base03']}`, 'index-max')
+  styleSheet.toString()
+  styleSheet.insertRule(`body { ${Object.entries(colors).map(([k, v]) => `--${k}: ${v}`).join(';')} }`, 'index-max')
   body.style.display = 'initial'
 
   commit('setOption', { name: 'colors', value: colors })
-- 
cgit v1.2.3-70-g09d2


From f4f9b3fa265df95ade97625cf2f870ded0825eb1 Mon Sep 17 00:00:00 2001
From: shpuld <shp@cock.li>
Date: Mon, 9 Apr 2018 19:43:31 +0300
Subject: small fixes

---
 src/components/attachment/attachment.js         |   6 +-
 src/components/attachment/attachment.vue        | 188 ++++---
 src/components/conversation/conversation.vue    |   2 +-
 src/components/notifications/notifications.js   |  14 +-
 src/components/notifications/notifications.scss |  97 ++--
 src/components/notifications/notifications.vue  |  62 +--
 src/components/status/status.js                 |  41 +-
 src/components/status/status.vue                | 709 ++++++++++++++----------
 src/i18n/messages.js                            |  16 +-
 9 files changed, 666 insertions(+), 469 deletions(-)

(limited to 'src/components/notifications/notifications.vue')

diff --git a/src/components/attachment/attachment.js b/src/components/attachment/attachment.js
index cd72e571..163dd74f 100644
--- a/src/components/attachment/attachment.js
+++ b/src/components/attachment/attachment.js
@@ -6,7 +6,8 @@ const Attachment = {
   props: [
     'attachment',
     'nsfw',
-    'statusId'
+    'statusId',
+    'size'
   ],
   data () {
     return {
@@ -29,6 +30,9 @@ const Attachment = {
     },
     isEmpty () {
       return (this.type === 'html' && !this.attachment.oembed) || this.type === 'unknown'
+    },
+    isSmall () {
+      return this.size === 'small'
     }
   },
   methods: {
diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue
index a1b35d91..2cc1ee57 100644
--- a/src/components/attachment/attachment.vue
+++ b/src/components/attachment/attachment.vue
@@ -1,5 +1,8 @@
 <template>
-  <div class="attachment base03-border" :class="{[type]: true, loading}" v-show="!isEmpty">
+  <div v-if="size==='hide'">
+    <a class="placeholder" v-if="type !== 'html'" :href="attachment.url">[{{nsfw ? "NSFW/" : ""}}{{type.toUpperCase()}}]</a>
+  </div>
+  <div v-else class="attachment base03-border" :class="{[type]: true, loading, 'small-attachment': isSmall}" v-show="!isEmpty">
     <a class="image-attachment" v-if="hidden" @click.prevent="toggleHidden()">
       <img :key="nsfwImage" :src="nsfwImage"/>
     </a>
@@ -8,10 +11,10 @@
     </div>
 
     <a v-if="type === 'image' && !hidden" class="image-attachment" :href="attachment.url" target="_blank">
-      <StillImage class="base03-border" referrerpolicy="no-referrer" :mimetype="attachment.mimetype" :src="attachment.large_thumb_url || attachment.url"/>
+      <StillImage :class="{'small': isSmall}" class="base03-border" referrerpolicy="no-referrer" :mimetype="attachment.mimetype" :src="attachment.large_thumb_url || attachment.url"/>
     </a>
 
-    <video class="base03" v-if="type === 'video' && !hidden" :src="attachment.url" controls loop></video>
+    <video :class="{'small': isSmall}" class="base03" v-if="type === 'video' && !hidden" :src="attachment.url" controls loop></video>
 
     <audio v-if="type === 'audio'" :src="attachment.url" controls></audio>
 
@@ -40,104 +43,123 @@
         max-height: 300px;
         max-width: 100%;
       }
-      
+
+      .placeholder {
+        margin-right: 0.5em;
+      }
+
+      .small-attachment {
+        &.image, &.video {
+          max-width: 35%;
+        }
+        max-height: 100px;
+      }
+
       .attachment {
-          flex: 1 0 30%;
-          margin: 0.5em 0.7em 0.6em 0.0em;
-          align-self: flex-start;
-
-          border-style: solid;
-          border-width: 1px;
-          border-radius: 5px;
-          overflow: hidden;
-
-          // fixes small gap below video
-          &.video {
-            line-height: 0;
-          }
+        flex: 1 0 30%;
+        margin: 0.5em 0.7em 0.6em 0.0em;
+        align-self: flex-start;
+
+        border-style: solid;
+        border-width: 1px;
+        border-radius: 5px;
+        overflow: hidden;
+      }
+      // fixes small gap below video
+      &.video {
+        line-height: 0;
+      }
 
-          &.html {
-            flex-basis: 90%;
-            width: 100%;
-            display: flex;
-          }
+      &.html {
+        flex-basis: 90%;
+        width: 100%;
+        display: flex;
+      }
 
-          &.loading {
-            cursor: progress;
-          }
+      &.loading {
+        cursor: progress;
+      }
 
-          .hider {
-              position: absolute;
-              margin: 10px;
-              padding: 5px;
-              background: rgba(230,230,230,0.6);
-              font-weight: bold;
-              z-index: 4;
-          }
+      .hider {
+          position: absolute;
+          margin: 10px;
+          padding: 5px;
+          background: rgba(230,230,230,0.6);
+          font-weight: bold;
+          z-index: 4;
+      }
 
-          video {
-              max-height: 500px;
-              height: 100%;
-              width: 100%;
-              z-index: 0;
-          }
+      .small {
+        max-height: 100px;
+      }
+      video {
+          max-height: 500px;
+          height: 100%;
+          width: 100%;
+          z-index: 0;
+      }
 
-          audio {
-              width: 100%;
-          }
+      audio {
+          width: 100%;
+      }
 
-          img.media-upload {
-              margin-bottom: -2px;
-              max-height: 300px;
-              max-width: 100%;
-          }
+      img.media-upload {
+          margin-bottom: -2px;
+          max-height: 300px;
+          max-width: 100%;
+      }
 
-          .oembed {
+      .oembed {
+          width: 100%;
+          margin-right: 15px;
+          display: flex;
+
+          img {
               width: 100%;
-              margin-right: 15px;
-              display: flex;
+          }
 
+          .image {
+              flex: 1;
               img {
-                  width: 100%;
-              }
-
-              .image {
-                  flex: 1;
-                  img {
-                      border: 0px;
-                      border-radius: 5px;
-                      height: 100%;
-                      object-fit: cover;
-                  }
+                  border: 0px;
+                  border-radius: 5px;
+                  height: 100%;
+                  object-fit: cover;
               }
+          }
 
-              .text {
-                  flex: 2;
-                  margin: 8px;
-                  word-break: break-all;
-                  h1 {
-                      font-size: 14px;
-                      margin: 0px;
-                  }
+          .text {
+              flex: 2;
+              margin: 8px;
+              word-break: break-all;
+              h1 {
+                  font-size: 14px;
+                  margin: 0px;
               }
           }
+      }
 
-          a.image-attachment {
-              display: flex;
-              flex: 1;
+      .image-attachment {
+          display: flex;
+          flex: 1;
 
-              .still-image {
-                  width: 100%;
-                  height: 100%;
-              }
+          .still-image {
+              width: 100%;
+              height: 100%;
+          }
 
-              img {
-                  object-fit: contain;
-                  width: 100%;
-                  height: 100%; /* If this isn't here, chrome will stretch the images */
-                  max-height: 500px;
-                  image-orientation: from-image;
-              }
+          .small {
+            img {
+              max-height: 100px;
+            }
+          }
+
+          img {
+              object-fit: contain;
+              width: 100%;
+              height: 100%; /* If this isn't here, chrome will stretch the images */
+              max-height: 500px;
+              image-orientation: from-image;
           }
       }
  }
diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue
index 60d43fff..e8eb2e5f 100644
--- a/src/components/conversation/conversation.vue
+++ b/src/components/conversation/conversation.vue
@@ -8,7 +8,7 @@
     </div>
     <div class="panel-body">
       <div class="timeline">
-        <status v-for="status in conversation" @goto="setHighlight" :key="status.id" :statusoid="status" :expandable='false' :focused="focused(status.id)" :inConversation='true' :highlight="highlight" :replies="getReplies(status.id)"></status>
+        <status v-for="status in conversation" @goto="setHighlight" :key="status.id" :inlineExpanded="collapsable" :statusoid="status" :expandable='false' :focused="focused(status.id)" :inConversation='true' :highlight="highlight" :replies="getReplies(status.id)"></status>
       </div>
     </div>
   </div>
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index e9b83bf0..19f767ab 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -1,12 +1,14 @@
 import Status from '../status/status.vue'
 import StillImage from '../still-image/still-image.vue'
+import UserCardContent from '../user_card_content/user_card_content.vue'
 
 import { sortBy, take, filter } from 'lodash'
 
 const Notifications = {
   data () {
     return {
-      visibleNotificationCount: 10
+      visibleNotificationCount: 10,
+      userExpanded: false
     }
   },
   computed: {
@@ -24,15 +26,10 @@ const Notifications = {
     },
     unseenCount () {
       return this.unseenNotifications.length
-    },
-    hiderStyle () {
-      return {
-        background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors['base00']} 80%)`
-      }
     }
   },
   components: {
-    Status, StillImage
+    Status, StillImage, UserCardContent
   },
   watch: {
     unseenCount (count) {
@@ -46,6 +43,9 @@ const Notifications = {
   methods: {
     markAsSeen () {
       this.$store.commit('markNotificationsAsSeen', this.visibleNotifications)
+    },
+    toggleUserExpanded () {
+      this.userExpanded = !this.userExpanded
     }
   }
 }
diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss
index 3c500b36..73a70a14 100644
--- a/src/components/notifications/notifications.scss
+++ b/src/components/notifications/notifications.scss
@@ -30,22 +30,52 @@
   }
 
   .notification {
-    // Will have to use pixels here to ensure consistent distance with
-    // pad alone and pad + border, browsers bad at rounding this with em,
-    // they love to give a 1 pixel ghost offset with 0.7em vs 0.3em + 0.4em,
-    // which does not happen with 10px vs 4px + 6px.
-    padding: 0.4em 0 0 10px;
+    padding-left: 4px;
+    box-sizing: border-box;
     display: flex;
     border-bottom: 1px solid;
     border-bottom-color: inherit;
 
+    .non-mention {
+      display: flex;
+      flex: 1;
+      flex-wrap: nowrap;
+      padding: 0.6em;
+      .status-el {
+        padding: 0;
+        .status-content.media-body {
+          margin: 0;
+        }
+      }
+    }
 
-    .text {
+    .status-el {
+      flex: 1;
+    }
+
+    .notification-right {
+      flex: 1;
+      margin-left: 0.8em;
+    }
+
+    .notification-details {
       min-width: 0px;
       word-wrap: break-word;
       line-height:18px;
       position: relative;
       overflow: hidden;
+      width: 100%;
+      padding: 0.5em;
+      flex: 1;
+      flex-wrap: nowrap;
+
+      .username {
+        font-weight: bolder;
+      }
+      .timeago {
+        float: right;
+        font-size: 12px;
+      }
 
       .icon-retweet.lit {
         color: $green;
@@ -79,7 +109,6 @@
         }
       }
 
-      padding: 0.3em 0.8em 0.5em;
       p {
         margin: 0;
         margin-top: 0;
@@ -87,29 +116,6 @@
       }
     }
 
-    .avatar {
-      margin-top: 0.3em;
-      width: 32px;
-      height: 32px;
-      border-radius: 50%;
-      overflow: hidden;
-      line-height: 0;
-
-      &.animated::before {
-        display: none;
-      }
-
-    }
-
-    &:hover .animated.avatar {
-      canvas {
-        display: none;
-      }
-      img {
-        visibility: visible;
-      }
-    }
-
     &:last-child {
       border-bottom: none;
       border-radius: 0 0 10px 10px;
@@ -135,6 +141,35 @@
 
   .unseen {
     border-left: 4px solid rgba(255, 16, 8, 0.75);
-    padding-left: 6px;
+    padding-left: 0px;
+  }
+}
+
+.notification {
+  .avatar-compact {
+    margin-top: 0.3em;
+    width: 32px;
+    height: 32px;
+    border-radius: 50%;
+    overflow: hidden;
+    line-height: 0;
+
+    &.animated::before {
+      display: none;
+    }
+
+  }
+
+  &:hover .animated.avatar {
+    canvas {
+      display: none;
+    }
+    img {
+      visibility: visible;
+    }
+  }
+
+  .notification-usercard {
+    margin-left: 0.8em;
   }
 }
diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index 8e6f12b2..99f00032 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -8,46 +8,32 @@
       </div>
       <div class="panel-body base03-border">
         <div v-for="notification in visibleNotifications" :key="notification" class="notification" :class='{"unseen": !notification.seen}'>
-          <div>
-            <a :href="notification.action.user.statusnet_profile_url" target="_blank">
-              <StillImage class='avatar' :src="notification.action.user.profile_image_url_original"/>
+          <status v-if="notification.type === 'mention'" :compact="true" :statusoid="notification.status"></status>
+          <div class="non-mention" v-else>
+            <a :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
+              <StillImage class='avatar-compact' :src="notification.action.user.profile_image_url_original"/>
             </a>
-          </div>
-          <div class='text' style="width: 100%;">
-            <div v-if="notification.type === 'favorite'">
-              <h1>
-                <span :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
-                <i class="fa icon-star lit"></i>
-                <small><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small>
-              </h1>
-              <div class="notification-gradient" :style="hiderStyle"></div>
-              <div class="notification-content" v-html="notification.status.statusnet_html"></div>
-            </div>
-            <div v-if="notification.type === 'repeat'">
-              <h1>
-                <span :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
-                <i class="fa icon-retweet lit"></i>
-                <small><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small>
-              </h1>
-              <div class="notification-gradient" :style="hiderStyle"></div>
-              <div class="notification-content" v-html="notification.status.statusnet_html"></div>
-            </div>
-            <div v-if="notification.type === 'mention'">
-              <h1>
-                <span :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
-                <i class="fa icon-reply lit"></i>
-                <small><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small>
-              </h1>
-              <status :compact="true" :statusoid="notification.status"></status>
-            </div>
-            <div v-if="notification.type === 'follow'">
-              <h1>
-                <span :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
-                <i class="fa icon-user-plus lit"></i>
-              </h1>
-              <div>
-                <router-link :to="{ name: 'user-profile', params: { id: notification.action.user.id } }">@{{ notification.action.user.screen_name }}</router-link> {{$t('notifications.followed_you')}}
+            <div class='notification-right'>
+              <div class="base03-border usercard" v-if="userExpanded">
+                <user-card-content :user="notification.action.user" :switcher="false"></user-card-content>
               </div>
+              <span class="notification-details">
+                <span class="username" :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
+                <span v-if="notification.type === 'favorite'">
+                  <i class="fa icon-star lit"></i>
+                  <small>{{$t('notifications.favorited_you')}}</small>
+                </span>
+                <span v-if="notification.type === 'repeat'">
+                  <i class="fa icon-retweet lit"></i>
+                  <small>{{$t('notifications.repeated_you')}}</small>
+                </span>
+                <span v-if="notification.type === 'follow'">
+                  <i class="fa icon-user-plus lit"></i>
+                  <small>{{$t('notifications.followed_you')}}</small>
+                </span>
+                <small class="timeago"><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small>
+              </span>
+              <status class="base04" :compact="true" :statusoid="notification.status" :noHeading="true"></status>
             </div>
           </div>
         </div>
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 7397e80c..a0b8ada2 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -8,6 +8,7 @@ import StillImage from '../still-image/still-image.vue'
 import { filter, find } from 'lodash'
 
 const Status = {
+  name: 'Status',
   props: [
     'statusoid',
     'expandable',
@@ -15,7 +16,10 @@ const Status = {
     'focused',
     'highlight',
     'compact',
-    'replies'
+    'replies',
+    'noReplyLinks',
+    'noHeading',
+    'inlineExpanded'
   ],
   data: () => ({
     replying: false,
@@ -23,7 +27,8 @@ const Status = {
     unmuted: false,
     userExpanded: false,
     preview: null,
-    showPreview: false
+    showPreview: false,
+    showingTall: false
   }),
   computed: {
     muteWords () {
@@ -69,6 +74,35 @@ const Status = {
       }
       // use conversation highlight only when in conversation
       return this.status.id === this.highlight
+    },
+    // This is a bit hacky, but we want to approximate post height before rendering
+    // so we count newlines (masto uses <p> for paragraphs, GS uses <br> between them)
+    // as well as approximate line count by counting characters and approximating ~80
+    // per line.
+    //
+    // Using max-height + overflow: auto for status components resulted in false positives
+    // very often with japanese characters, and it was very annoying.
+    hideTallStatus () {
+      if (this.showingTall) {
+        return false
+      }
+      const lengthScore = this.status.statusnet_html.split(/<p|<br/).length + this.status.text.length / 80
+      return lengthScore > 20
+    },
+    hiderStyle () {
+      const index = this.focused || this.inConversation || this.status.id === this.highlight ? 'base01' : 'base00'
+      return {
+        background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors[index]} 60%)`
+      }
+    },
+    attachmentSize () {
+      if ((this.$store.state.config.hideAttachments && !this.inConversation) ||
+        (this.$store.state.config.hideAttachmentsInConv && this.inConversation)) {
+        return 'hide'
+      } else if (this.compact) {
+        return 'small'
+      }
+      return 'normal'
     }
   },
   components: {
@@ -107,6 +141,9 @@ const Status = {
     toggleUserExpanded () {
       this.userExpanded = !this.userExpanded
     },
+    toggleShowTall () {
+      this.showingTall = !this.showingTall
+    },
     replyEnter (id, event) {
       this.showPreview = true
       const targetId = Number(id)
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index d451b67c..5bd5cec6 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -1,4 +1,4 @@
-<template>
+<!--<template>
   <div class="status-el base00-background" v-if="compact">
     <div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div>
     <div v-if="loggedIn">
@@ -124,322 +124,427 @@
     </template>
   </div>
 </template>
+-->
+
+<template>
+  <div class="status-el base00-background base03-border" :class="[{ 'base01-background': isFocused }, { 'status-conversation': inlineExpanded }]">
+    <template v-if="muted && !noReplyLinks">
+      <div class="media status container muted">
+        <small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
+        <small class="muteWords">{{muteWordHits.join(', ')}}</small>
+        <a href="#" class="unmute" @click.prevent="toggleMute"><i class="base09 icon-eye-off"></i></a>
+      </div>
+    </template>
+    <template v-else>
+      <div v-if="retweet && !noHeading" class="media container retweet-info">
+        <StillImage v-if="retweet" class='avatar' :src="statusoid.user.profile_image_url_original"/>
+        <div class="media-body base04">
+          <a :href="statusoid.user.statusnet_profile_url" style="font-weight: bold;" :title="'@'+statusoid.user.screen_name">{{retweeter}}</a>
+          <i class='fa icon-retweet retweeted'></i>
+          {{$t('timeline.repeated')}}
+        </div>
+      </div>
+
+      <div class="media status">
+        <div v-if="!noHeading" class="media-left">
+          <a :href="status.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
+            <StillImage class='avatar' :class="{'avatar-compact': compact}"  :src="status.user.profile_image_url_original"/>
+          </a>
+        </div>
+        <div class="status-body">
+          <div class="base03-border usercard media-body" v-if="userExpanded">
+            <user-card-content :user="status.user" :switcher="false"></user-card-content>
+          </div>
+          <div v-if="!noHeading" class="media-body container">
+            <div class="media-heading-left">
+              <div class="name-and-links">
+                <h4 class="user-name">{{status.user.name}}</h4>
+                <span class="links">
+                  <router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link>
+                  <span v-if="status.in_reply_to_screen_name"> &gt;
+                    <router-link :to="{ name: 'user-profile', params: { id: status.in_reply_to_user_id } }">
+                      {{status.in_reply_to_screen_name}}
+                    </router-link>
+                  </span>
+                  <a v-if="isReply && !noReplyLinks" href="#" @click.prevent="gotoOriginal(status.in_reply_to_status_id)">
+                    <i class="icon-reply base09" @mouseenter="replyEnter(status.in_reply_to_status_id, $event)" @mouseout="replyLeave()"></i>
+                  </a>
+                </span>
+              </div>
+              <h4 class="replies" v-if="inConversation && !noReplyLinks">
+                <small v-if="replies.length">Replies:</small>
+                <small class="reply-link" v-for="reply in replies">
+                  <a href="#" @click.prevent="gotoOriginal(reply.id)" @mouseenter="replyEnter(reply.id, $event)" @mouseout="replyLeave()">{{reply.name}}&nbsp;</a>
+                </small>
+              </h4>
+            </div>
+            <div class="media-heading-right">
+              <router-link class="timeago" :to="{ name: 'conversation', params: { id: status.id } }">
+                <timeago :since="status.created_at" :auto-update="60"></timeago>
+              </router-link>
+              <a :href="status.external_url" target="_blank" v-if="!status.is_local" class="source_url"><i class="base09 icon-binoculars"></i></a>
+              <template v-if="expandable">
+                <a href="#" @click.prevent="toggleExpanded"><i class="base09 icon-plus-squared"></i></a>
+              </template>
+              <a href="#" @click.prevent="toggleMute" v-if="unmuted"><i class="base09 icon-eye-off"></i></a>
+            </div>
+          </div>
+
+          <div v-if="showPreview" class="status-preview-container">
+            <status class="status-preview" v-if="preview" :noReplyLinks="true" :statusoid="preview" :compact=true></status>
+            <div class="status-preview status-preview-loading base00-background base03-border" v-else>
+              <i class="base09 icon-spin4 animate-spin"></i>
+            </div>
+          </div>
+
+          <div :class="{'tall-status': hideTallStatus}" class="status-content-wrapper">
+            <a class="tall-status-hider" :style="hiderStyle" v-if="hideTallStatus" href="#" @click.prevent="toggleShowTall">Show more</a>
+            <div @click.prevent="linkClicked" class="status-content media-body" v-html="status.statusnet_html"></div>
+            <a v-if="showingTall" href="#" class="tall-status-unhider" @click.prevent="toggleShowTall">Show less</a>
+          </div>
+
+          <div v-if='status.attachments' class='attachments media-body'>
+            <attachment :size="attachmentSize" :status-id="status.id" :nsfw="status.nsfw" :attachment="attachment" v-for="attachment in status.attachments" :key="attachment.id">
+            </attachment>
+          </div>
+
+          <div v-if="!noHeading && !noReplyLinks" class='status-actions media-body'>
+            <div v-if="loggedIn">
+              <a href="#" v-on:click.prevent="toggleReplying">
+                <i class="base09 icon-reply" :class="{'icon-reply-active': replying}"></i>
+              </a>
+            </div>
+            <retweet-button :loggedIn='loggedIn' :status='status'></retweet-button>
+            <favorite-button :loggedIn='loggedIn' :status='status'></favorite-button>
+            <delete-button :status='status'></delete-button>
+          </div>
+        </div>
+      </div>
+      <div class="container" v-if="replying">
+        <div class="reply-left"/>
+        <post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying"/>
+      </div>
+    </template>
+  </div>
+</template>
 
 <script src="./status.js" ></script>
 
 <style lang="scss">
- @import '../../_variables.scss';
+@import '../../_variables.scss';
+
+.status-body {
+  flex: 1;
+  min-width: 0;
+}
+
+.status-preview.status-el {
+  border-style: solid;
+  border-width: 1px;
+}
+
+.status-preview-container {
+  position: relative;
+  max-width: 100%;
+}
+
+.status-preview {
+  position: absolute;
+  max-width: 95%;
+  display: flex;
+  border-radius: 4px;
+  box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5);
+  margin-top: 0.5em;
+  margin-left: 1em;
+  z-index: 50;
+  .status {
+    flex: 1;
+    border: 0;
+  }
+}
+
+.status-preview-loading {
+  display: block;
+  font-size: 2em;
+  min-width: 8em;
+  padding: 0.5em;
+  text-align: center;
+  border-width: 1px;
+  border-style: solid;
+}
+
+.status-el {
+  hyphens: auto;
+  overflow-wrap: break-word;
+  word-wrap: break-word;
+  word-break: break-word;
+  border-left-width: 0px;
+  line-height: 18px;
+  min-width: 0;
+
+  .timeline & {
+    border-bottom-width: 1px;
+    border-bottom-style: solid;
+  }
 
- status-text-container {
-    display: block;
+  .media-body {
+    flex: 1;
+    padding: 0;
+    margin: 0 0 0.25em 0.8em;
+    flex-wrap: nowrap;
   }
 
-  .status-preview {
-    position: absolute;
-    max-width: 34em;
-    padding: 0.5em;
+  .media-heading-left {
+    padding: 0;
+    vertical-align: bottom;
+    flex-basis: 100%;
+
+    small {
+      font-weight: lighter;
+    }
+    h4 {
+      font-size: 14px;
+      margin-right: 0.25em;
+    }
+    .name-and-links {
+      padding: 0;
+      flex: 1 0;
+      display: flex;
+      flex-wrap: wrap;
+    }
+    .links {
+      padding-top: 1px;
+      font-size: 12px;
+    }
+    .replies {
+      line-height: 16px;
+    }
+    .reply-link {
+      margin-right: 0.2em;
+    }
+  }
+
+  .media-heading-right {
+    flex-shrink: 0;
     display: flex;
-    border-color: inherit;
-    border-style: solid;
-    border-width: 1px;
-    border-radius: 4px;
-    box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5);
-    margin-top: 0.5em;
-    margin-left: 1em;
-    z-index: 50;
+    flex-wrap: nowrap;
+    max-height: 1.5em;
+    margin-left: 0.25em;
+    .timeago {
+      margin-right: 0.2em;
+      font-size: 12px;
+      padding-top: 1px;
+    }
+    i {
+      margin-left: 0.2em;
+    }
+  }
+
+  a {
+    display: inline-block;
+    word-break: break-all;
+  }
+
+  .tall-status {
+    position: relative;
+    height: 220px;
+    overflow-x: hidden;
+    overflow-y: hidden;
+  }
+
+  .tall-status-hider {
+    position: absolute;
+    height: 70px;
+    margin-top: 150px;
+    width: 100%;
+    text-align: center;
+    line-height: 110px;
+  }
+
+  .tall-status-unhider {
+    width: 100%;
+    text-align: center;
+  }
+
+  .status-content {
+    margin-right: 0.5em;
+    img, video {
+      max-width: 100%;
+      max-height: 400px;
+      vertical-align: middle;
+      object-fit: contain;
+    }
+
+    blockquote {
+      margin: 0.2em 0 0.2em 2em;
+      font-style: italic;
+    }
+
+    p {
+      margin: 0;
+      margin-top: 0.2em;
+      margin-bottom: 0.5em;
+    }
+  }
 
+  .retweet-info {
+    padding: 0.3em 0.6em 0 0.6em;
+    margin: 0 0 -0.3em 0;
     .avatar {
-      flex-shrink: 0;
-      width: 32px;
-      height: 32px;
-      border-radius: 50%;
+      margin-left: 28px;
+      width: 20px;
+      height: 20px;
+      border-radius: 5px;
     }
-    .text {
-      h4 {
-        margin-bottom: 0.4em;
-        small {
-          font-weight: lighter;
-        }
-      }
-      padding: 0 0.5em 0.5em 0.5em;
+
+    .media-body {
+      font-size: 1em;
+      line-height: 22px;
     }
   }
+}
 
-  .status-preview-loading {
-    display: block;
-    font-size: 2em;
-    min-width: 8em;
-    text-align: center;
+.status-fadein {
+  animation-duration: 0.5s;
+  animation-name: fadein;
+}
+
+@keyframes fadein {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+.greentext {
+  color: green;
+}
+
+.status-conversation {
+  border-left-style: solid;
+}
+
+.status-actions {
+  width: 100%;
+  display: flex;
+
+  div, favorite-button {
+    padding-top: 0.25em;
+    max-width: 6em;
+    flex: 1;
+  }
+}
+
+.icon-reply:hover {
+  color: $blue;
+}
+
+.icon-reply.icon-reply-active {
+  color: $blue;
+}
+
+.status .avatar-compact {
+  width: 32px;
+  height: 32px;
+  border-radius: 50%;
+}
+
+.avatar {
+  width: 48px;
+  height: 48px;
+  border-radius: 5px;
+  overflow: hidden;
+  position: relative;
+
+  img {
+    width: 100%;
+    height: 100%;
+  }
+
+  &.animated::before {
+    display: none;
   }
 
- .status-el {
-     hyphens: auto;
-     overflow-wrap: break-word;
-     word-wrap: break-word;
-     word-break: break-word;
-     border-left-width: 0px;
-     line-height: 18px;
-
-     .timeline & {
-        border-bottom-width: 1px;
-        border-bottom-style: solid;
-     }
-
-     .notify {
-         .avatar {
-             border-width: 3px;
-             border-style: solid;
-         }
-     }
-
-     .media-body {
-       flex: 1;
-       padding-left: 0.5em;
-     }
-
-
-     .user-content {
-
-       min-height: 52px;
-       padding-top: 1px;
-     }
-
-     .media-heading {
-       display: flex;
-       min-height: 1.4em;
-       margin-bottom: 0.3em;
-
-       small {
-           font-weight: lighter;
-       }
-       h4 {
-         margin-right: 0.4em;
-       }
-       .name-and-links {
-         flex: 1 0;
-         display: flex;
-         flex-wrap: wrap;
-       }
-       .replies {
-         flex-basis: 100%;
-       }
-     }
-
-     .source_url {
-
-     }
-
-     .expand {
-       margin-right: -0.3em;
-     }
-
-     a {
-         display: inline-block;
-         word-break: break-all;
-     }
-
-     .status-content {
-         margin: 3px 15px 4px 0;
-         max-height: 400px;
-         overflow-y: auto;
-         overflow-x: hidden;
-
-         img, video {
-           max-width: 100%;
-           max-height: 400px;
-           vertical-align: middle;
-           object-fit: contain;
-         }
-
-         blockquote {
-           margin: 0.2em 0 0.2em 2em;
-           font-style: italic;
-         }
-     }
-
-     p {
-         margin: 0;
-         margin-top: 0.2em;
-         margin-bottom: 0.5em;
-     }
-
-     .media-left {
-        margin: 0.2em 0.3em 0 0;
-        .avatar {
-          float: right;
-        }
-     }
-
-     .retweet-info {
-         padding: 0.7em 0 0 0.6em;
-
-         .media-left {
-             display: flex;
-
-             i {
-                 align-self: center;
-                 text-align: right;
-                 flex: 1;
-                 padding-right: 0.3em;
-             }
-         }
-     }
- }
-
- .status-fadein {
-   animation-duration: 0.5s;
-   animation-name: fadein;
- }
-
- @keyframes fadein {
-   from {
-     opacity: 0;
-   }
-   to {
-     opacity: 1;
-   }
- }
-
- .greentext {
-     color: green;
- }
-
- .status-conversation {
-   border-left-style: solid;
- }
-
- .status-actions {
-     padding-top: 0.15em;
-     width: 100%;
-     display: flex;
-
-     div, favorite-button {
-        max-width: 6em;
-        flex: 1;
-     }
- }
-
- .icon-reply:hover {
-     color: $blue;
- }
-
- .icon-reply.icon-reply-active {
-     color: $blue;
- }
-
- .status .avatar {
-   width: 48px;
-   height: 48px;
-   border-radius: 5px;
-   overflow: hidden;
-
-   img {
-       width: 100%;
-       height: 100%;
-   }
-
-   &.animated::before {
-       display: none;
-   }
-
-   &.retweeted {
-     width: 40px;
-     height: 40px;
-     margin-right: 8px;
-     margin-bottom: 8px;
-   }
- }
-
- .status:hover .animated.avatar {
-     canvas {
-         display: none;
-     }
-     img {
-         visibility: visible;
-     }
- }
-
- .status .avatar-retweeter {
-   width: 24px;
-   height: 24px;
-   position: absolute;
-   margin-left: 24px;
-   margin-top: 24px;
- }
-
- .status.compact .avatar {
-     width: 32px;
- }
-
- .status {
-     padding: 0.4em 0.7em 0.45em 0.7em;
-     border-left: 4px rgba(255, 48, 16, 0.65);
-     border-left-style: inherit;
- }
-
- .status-conversation:last-child {
-    border-bottom: none;
- }
-
- .timeline .panel.timeline {
-    border-radius: 10px;
-    overflow: hidden;
- }
-
- .muted {
-   padding: 0.1em 0.4em 0.1em 0.8em;
-   button {
-     margin-left: auto;
-   }
-
-   .muteWords {
-     margin-left: 10px;
-   }
- }
-
- a.unmute {
-   display: block;
-   margin-left: auto;
- }
-
- .reply-left {
-   flex: 0;
-   min-width: 48px;
- }
-
- .reply-body {
-   flex: 1;
- }
-
- @media all and (max-width: 960px) {
-   .status-el {
-     .name-and-links {
-       margin-left: -0.25em;
-     }
-   }
-   .status {
-     max-width: 100%;
-   }
-
-   .status .avatar {
-     width: 40px;
-     height: 40px;
-
-     &.retweeted {
-       width: 34px;
-       height: 34px;
-       margin-right: 8px;
-       margin-bottom: 8px;
-     }
-   }
-
-   .status .avatar-retweeter {
-     width: 22px;
-     height: 22px;
-     position: absolute;
-     margin-left: 18px;
-     margin-top: 18px;
-   }
- }
+  &.retweeted {
+  }
+}
+
+.status:hover .animated.avatar {
+  canvas {
+    display: none;
+  }
+  img {
+    visibility: visible;
+  }
+}
+
+.status .avatar-retweeter {
+  width: 24px;
+  height: 24px;
+  position: absolute;
+  margin-left: 24px;
+  margin-top: 24px;
+}
+
+.status {
+  display: flex;
+  padding: 0.6em;
+  border-left: 4px rgba(255, 48, 16, 0.65);
+  border-left-style: inherit;
+}
+
+.status-conversation:last-child {
+  border-bottom: none;
+}
+
+.timeline .panel.timeline {
+  border-radius: 10px;
+  overflow: hidden;
+}
+
+.muted {
+  padding: 0.25em 0.5em;
+  button {
+    margin-left: auto;
+  }
+
+  .muteWords {
+    margin-left: 10px;
+  }
+}
+
+a.unmute {
+  display: block;
+  margin-left: auto;
+}
+
+.reply-left {
+  flex: 0;
+  min-width: 48px;
+}
+
+.reply-body {
+  flex: 1;
+}
+
+@media all and (max-width: 960px) {
+  .status-el {
+    .retweet-info {
+      .avatar {
+        margin-left: 20px;
+      }
+    }
+  }
+  .status {
+    max-width: 100%;
+  }
+
+  .status .avatar {
+    width: 40px;
+    height: 40px;
+  }
+}
 
 </style>
diff --git a/src/i18n/messages.js b/src/i18n/messages.js
index df923be4..46c9672e 100644
--- a/src/i18n/messages.js
+++ b/src/i18n/messages.js
@@ -124,7 +124,9 @@ const fi = {
     error_fetching: 'Virhe ladatessa viestejä',
     up_to_date: 'Ajantasalla',
     load_older: 'Lataa vanhempia viestejä',
-    conversation: 'Keskustelu'
+    conversation: 'Keskustelu',
+    collapse: 'Sulje',
+    repeated: 'toisti'
   },
   settings: {
     user_settings: 'Käyttäjän asetukset',
@@ -160,7 +162,9 @@ const fi = {
   notifications: {
     notifications: 'Ilmoitukset',
     read: 'Lue!',
-    followed_you: 'seuraa sinua'
+    followed_you: 'seuraa sinua',
+    favorited_you: 'tykkäsi viestistäsi',
+    repeated_you: 'toisti viestisi'
   },
   login: {
     login: 'Kirjaudu sisään',
@@ -220,7 +224,9 @@ const en = {
     error_fetching: 'Error fetching updates',
     up_to_date: 'Up-to-date',
     load_older: 'Load older statuses',
-    conversation: 'Conversation'
+    conversation: 'Conversation',
+    collapse: 'Collapse',
+    repeated: 'repeated'
   },
   settings: {
     user_settings: 'User Settings',
@@ -261,7 +267,9 @@ const en = {
   notifications: {
     notifications: 'Notifications',
     read: 'Read!',
-    followed_you: 'followed you'
+    followed_you: 'followed you',
+    favorited_you: 'favorited your status',
+    repeated_you: 'repeated your status'
   },
   login: {
     login: 'Log in',
-- 
cgit v1.2.3-70-g09d2


From c214197cee192d9ae511d145d8e28cef8ae9a0d1 Mon Sep 17 00:00:00 2001
From: shpuld <shp@cock.li>
Date: Mon, 9 Apr 2018 20:44:37 +0300
Subject: Separate notification into its own component, fix follow notification
 type

---
 src/components/notification/notification.js     | 24 +++++++++++++++++
 src/components/notification/notification.vue    | 35 +++++++++++++++++++++++++
 src/components/notifications/notifications.js   | 12 +++------
 src/components/notifications/notifications.scss | 12 +++++++--
 src/components/notifications/notifications.vue  | 29 +-------------------
 5 files changed, 73 insertions(+), 39 deletions(-)
 create mode 100644 src/components/notification/notification.js
 create mode 100644 src/components/notification/notification.vue

(limited to 'src/components/notifications/notifications.vue')

diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js
new file mode 100644
index 00000000..3a274374
--- /dev/null
+++ b/src/components/notification/notification.js
@@ -0,0 +1,24 @@
+import Status from '../status/status.vue'
+import StillImage from '../still-image/still-image.vue'
+import UserCardContent from '../user_card_content/user_card_content.vue'
+
+const Notification = {
+  data () {
+    return {
+      userExpanded: false
+    }
+  },
+  props: [
+    'notification'
+  ],
+  components: {
+    Status, StillImage, UserCardContent
+  },
+  methods: {
+    toggleUserExpanded () {
+      this.userExpanded = !this.userExpanded
+    }
+  }
+}
+
+export default Notification
diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
new file mode 100644
index 00000000..74563ff9
--- /dev/null
+++ b/src/components/notification/notification.vue
@@ -0,0 +1,35 @@
+<template>
+  <status v-if="notification.type === 'mention'" :compact="true" :statusoid="notification.status"></status>
+  <div class="non-mention" v-else>
+    <a :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
+      <StillImage class='avatar-compact' :src="notification.action.user.profile_image_url_original"/>
+    </a>
+    <div class='notification-right'>
+      <div class="base03-border usercard" v-if="userExpanded">
+        <user-card-content :user="notification.action.user" :switcher="false"></user-card-content>
+      </div>
+      <span class="notification-details">
+        <span class="username" :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
+        <span v-if="notification.type === 'favorite'">
+          <i class="fa icon-star lit"></i>
+          <small>{{$t('notifications.favorited_you')}}</small>
+        </span>
+        <span v-if="notification.type === 'repeat'">
+          <i class="fa icon-retweet lit"></i>
+          <small>{{$t('notifications.repeated_you')}}</small>
+        </span>
+        <span v-if="notification.type === 'follow'">
+          <i class="fa icon-user-plus lit"></i>
+          <small>{{$t('notifications.followed_you')}}</small>
+        </span>
+        <small class="timeago"><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small>
+      </span>
+      <div class="follow-text" v-if="notification.type === 'follow'">
+        <router-link :to="{ name: 'user-profile', params: { id: notification.action.user.id } }">@{{notification.action.user.screen_name}}</router-link>
+      </div>
+      <status v-else class="base04" :compact="true" :statusoid="notification.status" :noHeading="true"></status>
+    </div>
+  </div>
+</template>
+
+<script src="./notification.js"></script>
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index 19f767ab..f8314bfc 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -1,14 +1,11 @@
-import Status from '../status/status.vue'
-import StillImage from '../still-image/still-image.vue'
-import UserCardContent from '../user_card_content/user_card_content.vue'
+import Notification from '../notification/notification.vue'
 
 import { sortBy, take, filter } from 'lodash'
 
 const Notifications = {
   data () {
     return {
-      visibleNotificationCount: 10,
-      userExpanded: false
+      visibleNotificationCount: 20
     }
   },
   computed: {
@@ -29,7 +26,7 @@ const Notifications = {
     }
   },
   components: {
-    Status, StillImage, UserCardContent
+    Notification
   },
   watch: {
     unseenCount (count) {
@@ -43,9 +40,6 @@ const Notifications = {
   methods: {
     markAsSeen () {
       this.$store.commit('markNotificationsAsSeen', this.visibleNotifications)
-    },
-    toggleUserExpanded () {
-      this.userExpanded = !this.userExpanded
     }
   }
 }
diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss
index 73a70a14..b0136426 100644
--- a/src/components/notifications/notifications.scss
+++ b/src/components/notifications/notifications.scss
@@ -41,7 +41,11 @@
       flex: 1;
       flex-wrap: nowrap;
       padding: 0.6em;
+      min-width: 0;
       .status-el {
+        .status {
+          padding: 0.25em 0;
+        }
         padding: 0;
         .status-content.media-body {
           margin: 0;
@@ -49,13 +53,18 @@
       }
     }
 
+    .follow-text {
+      padding: 0.5em 0;
+    }
+
     .status-el {
       flex: 1;
     }
 
     .notification-right {
       flex: 1;
-      margin-left: 0.8em;
+      padding-left: 0.8em;
+      min-width: 0;
     }
 
     .notification-details {
@@ -65,7 +74,6 @@
       position: relative;
       overflow: hidden;
       width: 100%;
-      padding: 0.5em;
       flex: 1;
       flex-wrap: nowrap;
 
diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index 99f00032..71fd2604 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -8,34 +8,7 @@
       </div>
       <div class="panel-body base03-border">
         <div v-for="notification in visibleNotifications" :key="notification" class="notification" :class='{"unseen": !notification.seen}'>
-          <status v-if="notification.type === 'mention'" :compact="true" :statusoid="notification.status"></status>
-          <div class="non-mention" v-else>
-            <a :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded">
-              <StillImage class='avatar-compact' :src="notification.action.user.profile_image_url_original"/>
-            </a>
-            <div class='notification-right'>
-              <div class="base03-border usercard" v-if="userExpanded">
-                <user-card-content :user="notification.action.user" :switcher="false"></user-card-content>
-              </div>
-              <span class="notification-details">
-                <span class="username" :title="'@'+notification.action.user.screen_name">{{ notification.action.user.name }}</span>
-                <span v-if="notification.type === 'favorite'">
-                  <i class="fa icon-star lit"></i>
-                  <small>{{$t('notifications.favorited_you')}}</small>
-                </span>
-                <span v-if="notification.type === 'repeat'">
-                  <i class="fa icon-retweet lit"></i>
-                  <small>{{$t('notifications.repeated_you')}}</small>
-                </span>
-                <span v-if="notification.type === 'follow'">
-                  <i class="fa icon-user-plus lit"></i>
-                  <small>{{$t('notifications.followed_you')}}</small>
-                </span>
-                <small class="timeago"><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small>
-              </span>
-              <status class="base04" :compact="true" :statusoid="notification.status" :noHeading="true"></status>
-            </div>
-          </div>
+          <notification :notification="notification"></notification>
         </div>
       </div>
     </div>
-- 
cgit v1.2.3-70-g09d2


From a1f6ef1dcac2e79c5a116705ca11d6e7e51ed89c Mon Sep 17 00:00:00 2001
From: shpuld <shp@cock.li>
Date: Wed, 11 Apr 2018 19:34:40 +0300
Subject: Loads of fixes: notifs, autoload setting, overflow, faint text, reply
 form, status fadein.

---
 src/App.scss                                        |  6 +++---
 src/components/conversation/conversation.vue        | 11 ++++++++++-
 src/components/nav_panel/nav_panel.vue              |  3 +++
 src/components/notifications/notifications.scss     | 16 +++-------------
 src/components/notifications/notifications.vue      |  2 +-
 .../post_status_form/post_status_form.vue           |  2 +-
 src/components/settings/settings.vue                |  2 +-
 src/components/status/status.vue                    | 21 ++++++++++++++-------
 src/components/timeline/timeline.js                 |  2 +-
 src/components/timeline/timeline.vue                | 12 +++++++-----
 src/modules/statuses.js                             |  2 +-
 src/services/style_setter/style_setter.js           | 12 +++++-------
 12 files changed, 50 insertions(+), 41 deletions(-)

(limited to 'src/components/notifications/notifications.vue')

diff --git a/src/App.scss b/src/App.scss
index 61acc4ce..e3fba48a 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -46,8 +46,8 @@ a {
 
 button{
   user-select: none;
-  color: $fallback--faint;
-  color: var(--faint, $fallback--faint);
+  color: $fallback--fg;
+  color: var(--fg, $fallback--fg);
   background-color: $fallback--btn;
   background-color: var(--btn, $fallback--btn);
   border: none;
@@ -253,7 +253,7 @@ main-router {
   border-radius: $fallback--panelRadius;
   border-radius: var(--panelRadius, $fallback--panelRadius);
   box-shadow: 1px 1px 4px rgba(0,0,0,.6);
-  overflow: hidden;
+  //overflow: hidden;
 }
 
 .panel-body:empty::before {
diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue
index 4000bce2..308e5e7d 100644
--- a/src/components/conversation/conversation.vue
+++ b/src/components/conversation/conversation.vue
@@ -8,7 +8,16 @@
     </div>
     <div class="panel-body">
       <div class="timeline">
-        <status v-for="status in conversation" @goto="setHighlight" :key="status.id" :inlineExpanded="collapsable" :statusoid="status" :expandable='false' :focused="focused(status.id)" :inConversation='true' :highlight="highlight" :replies="getReplies(status.id)"></status>
+        <status
+          v-for="status in conversation"
+          @goto="setHighlight" :key="status.id"
+          :inlineExpanded="collapsable" :statusoid="status"
+          :expandable='false' :focused="focused(status.id)"
+          :inConversation='true'
+          :highlight="highlight"
+          :replies="getReplies(status.id)"
+          class="status-fadein">
+        </status>
       </div>
     </div>
   </div>
diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue
index 5db3f555..6f949afb 100644
--- a/src/components/nav_panel/nav_panel.vue
+++ b/src/components/nav_panel/nav_panel.vue
@@ -32,6 +32,9 @@
 <style lang="scss">
 @import '../../_variables.scss';
 
+.nav-panel .panel {
+  overflow: hidden;
+}
 .nav-panel ul {
   list-style: none;
   margin: 0;
diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss
index 65ab7f5e..651be058 100644
--- a/src/components/notifications/notifications.scss
+++ b/src/components/notifications/notifications.scss
@@ -20,8 +20,8 @@
     position: relative;
     background: $fallback--btn;
     background: var(--btn, $fallback--btn);
-    color: $fallback--faint;
-    color: var(--faint, $fallback--faint);
+    color: $fallback--fg;
+    color: var(--fg, $fallback--fg);
     .read-button {
       position: absolute;
       right: 0.7em;
@@ -105,7 +105,7 @@
         color: var($fallback--faint, --faint);
       }
       padding: 0;
-      .status-content.media-body {
+      .media-body {
         margin: 0;
       }
     }
@@ -200,13 +200,3 @@
     border-bottom: none;
   }
 }
-
-.notification-content {
-  max-height: 12em;
-  overflow-y: hidden;
-  //text-overflow: ellipsis;
-
-  img {
-      object-fit: contain;
-  }
-}
diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index f01234d3..4fa6e925 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -7,7 +7,7 @@
         <button v-if="unseenCount" @click.prevent="markAsSeen" class="read-button">{{$t('notifications.read')}}</button>
       </div>
       <div class="panel-body">
-        <div v-for="notification in visibleNotifications" :key="notification" class="notification" :class='{"unseen": !notification.seen}'>
+        <div v-for="notification in visibleNotifications" :key="notification.action.id" class="notification" :class='{"unseen": !notification.seen}'>
           <notification :notification="notification"></notification>
         </div>
       </div>
diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue
index a3b8acde..69234d66 100644
--- a/src/components/post_status_form/post_status_form.vue
+++ b/src/components/post_status_form/post_status_form.vue
@@ -24,7 +24,7 @@
         <media-upload @uploading="disableSubmit" @uploaded="addMediaFile" @upload-failed="enableSubmit" :drop-files="dropFiles"></media-upload>
 
         <p v-if="isOverLengthLimit" class="error">{{ charactersLeft }}</p>
-        <p v-else-if="hasStatusLengthLimit">{{ charactersLeft }}</p>
+        <p class="faint" v-else-if="hasStatusLengthLimit">{{ charactersLeft }}</p>
 
         <button v-if="posting" disabled class="btn btn-default">{{$t('post_status.posting')}}</button>
         <button v-else-if="isOverLengthLimit" disabled class="btn btn-default">{{$t('general.submit')}}</button>
diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue
index 0c9ddc3e..b4514ba1 100644
--- a/src/components/settings/settings.vue
+++ b/src/components/settings/settings.vue
@@ -29,7 +29,7 @@
                 <label for="hideNsfw">{{$t('settings.nsfw_clickthrough')}}</label>
             </li>
             <li>
-                <input type="checkbox" id="autoload" v-model="autoloadlocal">
+                <input type="checkbox" id="autoload" v-model="autoLoadLocal">
                 <label for="autoload">{{$t('settings.autoload')}}</label>
             </li>
             <li>
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 885083c4..6571159c 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="status-el status-fadein" :class="[{ 'status-el_focused': isFocused }, { 'status-conversation': inlineExpanded }]">
+  <div class="status-el" :class="[{ 'status-el_focused': isFocused }, { 'status-conversation': inlineExpanded }]">
     <template v-if="muted && !noReplyLinks">
       <div class="media status container muted">
         <small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
@@ -33,7 +33,7 @@
                 <h4 class="user-name">{{status.user.name}}</h4>
                 <span class="links">
                   <router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link>
-                  <span v-if="status.in_reply_to_screen_name"> &gt;
+                  <span v-if="status.in_reply_to_screen_name" class="faint"> &gt;
                     <router-link :to="{ name: 'user-profile', params: { id: status.in_reply_to_user_id } }">
                       {{status.in_reply_to_screen_name}}
                     </router-link>
@@ -167,6 +167,9 @@
   border-color: $fallback--border;
   border-color: var(--border, $fallback--border);
 
+  border-left: 4px $fallback--cRed;
+  border-left: 4px var(--cRed, $fallback--cRed);
+
   &_focused {
     background-color: $fallback--lightBg;
     background-color: var(--lightBg, $fallback--lightBg);
@@ -307,7 +310,7 @@
 }
 
 .status-fadein {
-  animation-duration: 0.3s;
+  animation-duration: 0.4s;
   animation-name: fadein;
 }
 
@@ -389,9 +392,6 @@
 .status {
   display: flex;
   padding: 0.6em;
-  border-left: 4px $fallback--cRed;
-  border-left: 4px var(--cRed, $fallback--cRed);
-  border-left-style: inherit;
 }
 
 .status-conversation:last-child {
@@ -399,7 +399,7 @@
 }
 
 .timeline .panel.timeline {
-  overflow: hidden;
+  //overflow: hidden;
 }
 
 .muted {
@@ -427,6 +427,13 @@ a.unmute {
   flex: 1;
 }
 
+.timeline > {
+  .status-el:last-child {
+    border-bottom-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;;
+    border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
+  }
+}
+
 @media all and (max-width: 960px) {
   .status-el {
     .retweet-info {
diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js
index 660a8752..74ab85d3 100644
--- a/src/components/timeline/timeline.js
+++ b/src/components/timeline/timeline.js
@@ -105,7 +105,7 @@ const Timeline = {
         .then((friends) => this.$store.dispatch('addFriends', { friends }))
     },
     scrollLoad (e) {
-      let height = Math.max(document.body.offsetHeight, document.body.scrollHeight)
+      const height = Math.max(document.body.offsetHeight, document.body.scrollHeight)
       if (this.timeline.loading === false &&
           this.$store.state.config.autoLoad &&
           this.$el.offsetHeight > 0 &&
diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue
index 4d2230cb..03f6ad3d 100644
--- a/src/components/timeline/timeline.vue
+++ b/src/components/timeline/timeline.vue
@@ -16,13 +16,15 @@
     </div>
     <div class="panel-body">
       <div class="timeline">
-        <status-or-conversation v-for="status in timeline.visibleStatuses" :key="status.id" v-bind:statusoid="status"></status-or-conversation>
-        <a href="#" v-on:click.prevent='fetchOlderStatuses()' v-if="!timeline.loading">
-          <div class="new-status-notification text-center">{{$t('timeline.load_older')}}</div>
-        </a>
-          <div class="new-status-notification text-center" v-else>...</div>
+        <status-or-conversation v-for="status in timeline.visibleStatuses" :key="status.id" v-bind:statusoid="status" class="status-fadein"></status-or-conversation>
       </div>
     </div>
+    <div class="panel-footer">
+      <a href="#" v-on:click.prevent='fetchOlderStatuses()' v-if="!timeline.loading">
+        <div class="new-status-notification text-center panel-footer">{{$t('timeline.load_older')}}</div>
+      </a>
+      <div class="new-status-notification text-center panel-footer" v-else>...</div>
+    </div>
   </div>
   <div class="timeline panel panel-default" v-else-if="viewing == 'followers'">
     <div class="panel-heading timeline-heading">
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index 18191424..8bc0631e 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -246,7 +246,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us
   const addNotification = ({type, status, action}) => {
     // Only add a new notification if we don't have one for the same action
     if (!find(state.notifications, (oldNotification) => oldNotification.action.id === action.id)) {
-      state.notifications.push({type, status, action, seen: false})
+      state.notifications.push({ type, status, action, seen: false })
 
       if ('Notification' in window && window.Notification.permission === 'granted') {
         const title = action.user.name
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index 532af1ba..b1d17270 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -66,17 +66,16 @@ const setColors = (col, commit) => {
   let colors = {}
   let radii = {}
 
-  let mod = 10
-  if (isDark) {
-    mod = mod * -1
-  }
-  console.log(JSON.stringify(col, null, ' '))
+  const mod = isDark ? -10 : 10
 
   colors.bg = rgb2hex(col.bg.r, col.bg.g, col.bg.b)                         // background
   colors.lightBg = rgb2hex((col.bg.r + col.fg.r) / 2, (col.bg.g + col.fg.g) / 2, (col.bg.b + col.fg.b) / 2) // hilighted bg
   colors.btn = rgb2hex(col.fg.r, col.fg.g, col.fg.b)                         // panels & buttons
   colors.border = rgb2hex(col.fg.r - mod, col.fg.g - mod, col.fg.b - mod)       // borders
-  colors.faint = rgb2hex(col.text.r + mod * 2, col.text.g + mod * 2, col.text.b + mod * 2) // faint text
+  colors.faint = rgb2hex(
+    col.text.r * 0.45 + col.fg.r * 0.55,
+    col.text.g * 0.45 + col.fg.g * 0.55,
+    col.text.b * 0.45 + col.fg.b * 0.55) // faint text
   colors.fg = rgb2hex(col.text.r, col.text.g, col.text.b)                   // text
   colors.lightFg = rgb2hex(col.text.r - mod, col.text.g - mod, col.text.b - mod) // strong text
 
@@ -92,7 +91,6 @@ const setColors = (col, commit) => {
 
   colors.cAlertRed = col.cRed && `rgba(${col.cRed.r}, ${col.cRed.g}, ${col.cRed.b}, .5)`
 
-  console.log('OMGGGG')
   console.log(JSON.stringify(col))
   radii.btnRadius = col.btnRadius
   radii.panelRadius = col.panelRadius
-- 
cgit v1.2.3-70-g09d2

