From c8337e9fbac6995bb56703bed588702bee628274 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Fri, 31 Mar 2017 20:06:54 +0200
Subject: [PATCH] Updated UI yet again

---
 res/css/{content.sass => _content.sass}       | 180 ++----
 res/css/{font.sass => _font.sass}             |   0
 res/css/{icons.sass => _icons.sass}           |   0
 res/css/_mirccolor.sass                       |  72 +++
 res/css/{nav.sass => _nav.sass}               |  26 +-
 .../{sendercolor.sass => _sendercolor.sass}   |   0
 res/css/{util.sass => _util.sass}             |   0
 res/css/oldsearch.css                         | 582 ------------------
 res/css/search.css                            | 319 +++++-----
 res/css/search.css.map                        |   4 +-
 res/js/app.js                                 |  13 +-
 res/js/component/buffer.js                    |  28 +-
 res/js/component/buffer.jsx                   |  15 +-
 res/js/component/history.js                   |  13 +-
 res/js/component/history.jsx                  |  15 +-
 res/js/component/historyelement.js            |   9 +-
 res/js/component/historyelement.jsx           |   9 +-
 res/js/component/nav.js                       |  11 +-
 res/js/component/nav.jsx                      |  11 +-
 res/js/component/urlbar.js                    |  24 -
 res/js/util/statehandler.js                   |  34 +
 res/search.js                                 | 441 -------------
 templates/search.phtml                        |   2 +-
 translations/de.json                          |  22 +-
 translations/en.json                          |   4 +
 25 files changed, 461 insertions(+), 1373 deletions(-)
 rename res/css/{content.sass => _content.sass} (57%)
 rename res/css/{font.sass => _font.sass} (100%)
 rename res/css/{icons.sass => _icons.sass} (100%)
 create mode 100644 res/css/_mirccolor.sass
 rename res/css/{nav.sass => _nav.sass} (86%)
 rename res/css/{sendercolor.sass => _sendercolor.sass} (100%)
 rename res/css/{util.sass => _util.sass} (100%)
 delete mode 100644 res/css/oldsearch.css
 delete mode 100644 res/js/component/urlbar.js
 create mode 100644 res/js/util/statehandler.js
 delete mode 100644 res/search.js

diff --git a/res/css/content.sass b/res/css/_content.sass
similarity index 57%
rename from res/css/content.sass
rename to res/css/_content.sass
index 2472ccc..c3b8d75 100644
--- a/res/css/content.sass
+++ b/res/css/_content.sass
@@ -1,5 +1,6 @@
 @import "util"
 @import "sendercolor"
+@import "mirccolor"
 
 .results
   max-width: 1136px
@@ -17,51 +18,47 @@
     display: block
     margin-top: 0
     margin-bottom: 20px
-    border: rgba(0, 0, 0, 0)
-    transition: all 400ms
+    position: relative
 
     .title
       border-bottom: 1px solid transparent
       border-top: 1px solid transparent
       color: #616161
       margin: 0
-      background: #f2f2f2
       padding: 20px 6px 10px 22px
       position: sticky
       top: 55px
       z-index: 1
       transition: all 400ms
-      will-change: transform, -webkit-transform
       display: flex
 
       &:before
         content: ""
         display: block
-        position: absolute
         left: -16px
-        width: 16px
+        right: -16px
         top: 0
         bottom: 0
-        background: #f2f2f2
+        background-color: #f2f2f2
+        position: absolute
+        z-index: -2
+
+        @media(max-width: 800px)
+          left: 0
+          right: 0
 
       &:after
         content: ""
         display: block
-        position: absolute
-        right: -16px
-        width: 16px
+        left: 0
+        right: 0
         top: 0
         bottom: 0
-        background: #f2f2f2
-
-      @media(max-width: 800px)
-        margin-left: 0
-        margin-right: 0
-        padding-left: 22px
-        padding-right: 6px
-
-        &:after, &:before
-          display: none
+        background-color: transparent
+        transition: margin-left 400ms, margin-right 400ms, background-color 400ms
+        will-change: margin-left, margin-right, background-color
+        position: absolute
+        z-index: -1
 
       h2
         flex: 1
@@ -91,6 +88,7 @@
         text-decoration: none
         box-sizing: border-box
         font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif
+        will-change: background
 
         &:hover
           background-color: rgba(0,0,0,0.06)
@@ -115,34 +113,50 @@
             opacity: .2
             transition: 0s
 
-        &:before
-          content: "Open"
+        .open
+          display: initial
+        .close
+          display: none
 
-    &:not(.selected) .context:nth-child(4)~.context
+    &:not(.focus) .context:nth-child(4)~.context
       display: none
 
-    &.selected
-      background-color: #ddd
-      border: rgba(0, 0, 0, .4)
-      padding: 0 16px 20px
-      margin: 0 -16px
 
-      @media(max-width: 800px)
-        margin: 0 0 20px 0
-        padding: 0
+    &:before
+      content: ""
+      display: block
+      left: 0
+      right: 0
+      top: 0
+      bottom: 0
+      background-color: transparent
+      transition: margin-left 400ms, margin-right 400ms, margin-bottom 400ms, background-color 400ms
+      will-change: margin-left, margin-right, margin-bottom, background-color
+      position: absolute
+      z-index: -1
+
+    &.focus
+      &:before
+        margin-bottom: -16px
+        background-color: #ddd
+
+        @media(min-width: 800px)
+          margin-left: -16px
+          margin-right: -16px
 
       .title
-        margin: 0 -16px
-        padding: 20px 22px 10px 38px
-        background: #ddd
+        &:after
+          background-color: #ddd
 
-        @media(max-width: 800px)
-          margin: 0
-          padding: 20px 6px 10px 22px
+          @media(min-width: 800px)
+            margin-left: -16px
+            margin-right: -16px
 
         button
-          &:before
-            content: "Close"
+          .open
+            display: none
+          .close
+            display: initial
 
       .container
         > .inline-button
@@ -167,23 +181,12 @@
         box-shadow: 0 -1px 0 #e5e5e5, 0 0 2px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24)
         transition: height 400ms
 
-        /*&:before
-          bottom: 0
-          box-shadow: 0 -1px 0 #e5e5e5, 0 0 2px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24)
-          content: ''
-          display: block
-          left: 0
-          pointer-events: none
-          position: absolute
-          right: 0
-          top: 0*/
-
       .context
         .container
         .before
         .after
 
-        &:not(.selected)
+        &:not(.focus)
           > .before, > .after
             display: none
 
@@ -270,77 +273,4 @@
               overflow: hidden
 
               @media(max-width: 800px)
-                display: inline
-
-              .irc_bold
-                font-weight: bold
-              .irc_italic
-                font-style: italic
-              .irc_underline
-                text-decoration: underline
-
-              [data-irc_foreground="0"]
-                color: #ffffff
-              [data-irc_foreground="1"]
-                color: #000000
-              [data-irc_foreground="2"]
-                color: #000080
-              [data-irc_foreground="3"]
-                color: #008000
-              [data-irc_foreground="4"]
-                color: #ff0000
-              [data-irc_foreground="5"]
-                color: #800000
-              [data-irc_foreground="6"]
-                color: #800080
-              [data-irc_foreground="7"]
-                color: #ffa500
-              [data-irc_foreground="8"]
-                color: #ffff00
-              [data-irc_foreground="9"]
-                color: #00ff00
-              [data-irc_foreground="10"]
-                color: #008080
-              [data-irc_foreground="11"]
-                color: #00ffff
-              [data-irc_foreground="12"]
-                color: #4169e1
-              [data-irc_foreground="13"]
-                color: #ff00ff
-              [data-irc_foreground="14"]
-                color: #808080
-              [data-irc_foreground="15"]
-                color: #c0c0c0
-
-              [data-irc_background="0"]
-                background-color: #ffffff
-              [data-irc_background="1"]
-                background-color: #000000
-              [data-irc_background="2"]
-                background-color: #000080
-              [data-irc_background="3"]
-                background-color: #008000
-              [data-irc_background="4"]
-                background-color: #ff0000
-              [data-irc_background="5"]
-                background-color: #800000
-              [data-irc_background="6"]
-                background-color: #800080
-              [data-irc_background="7"]
-                background-color: #ffa500
-              [data-irc_background="8"]
-                background-color: #ffff00
-              [data-irc_background="9"]
-                background-color: #00ff00
-              [data-irc_background="10"]
-                background-color: #008080
-              [data-irc_background="11"]
-                background-color: #00ffff
-              [data-irc_background="12"]
-                background-color: #4169e1
-              [data-irc_background="13"]
-                background-color: #ff00ff
-              [data-irc_background="14"]
-                background-color: #808080
-              [data-irc_background="15"]
-                background-color: #c0c0c0
+                display: inline
\ No newline at end of file
diff --git a/res/css/font.sass b/res/css/_font.sass
similarity index 100%
rename from res/css/font.sass
rename to res/css/_font.sass
diff --git a/res/css/icons.sass b/res/css/_icons.sass
similarity index 100%
rename from res/css/icons.sass
rename to res/css/_icons.sass
diff --git a/res/css/_mirccolor.sass b/res/css/_mirccolor.sass
new file mode 100644
index 0000000..2116826
--- /dev/null
+++ b/res/css/_mirccolor.sass
@@ -0,0 +1,72 @@
+.irc_bold
+  font-weight: bold
+.irc_italic
+  font-style: italic
+.irc_underline
+  text-decoration: underline
+
+[data-irc_foreground="0"]
+  color: #ffffff
+[data-irc_foreground="1"]
+  color: #000000
+[data-irc_foreground="2"]
+  color: #000080
+[data-irc_foreground="3"]
+  color: #008000
+[data-irc_foreground="4"]
+  color: #ff0000
+[data-irc_foreground="5"]
+  color: #800000
+[data-irc_foreground="6"]
+  color: #800080
+[data-irc_foreground="7"]
+  color: #ffa500
+[data-irc_foreground="8"]
+  color: #ffff00
+[data-irc_foreground="9"]
+  color: #00ff00
+[data-irc_foreground="10"]
+  color: #008080
+[data-irc_foreground="11"]
+  color: #00ffff
+[data-irc_foreground="12"]
+  color: #4169e1
+[data-irc_foreground="13"]
+  color: #ff00ff
+[data-irc_foreground="14"]
+  color: #808080
+[data-irc_foreground="15"]
+  color: #c0c0c0
+
+[data-irc_background="0"]
+  background-color: #ffffff
+[data-irc_background="1"]
+  background-color: #000000
+[data-irc_background="2"]
+  background-color: #000080
+[data-irc_background="3"]
+  background-color: #008000
+[data-irc_background="4"]
+  background-color: #ff0000
+[data-irc_background="5"]
+  background-color: #800000
+[data-irc_background="6"]
+  background-color: #800080
+[data-irc_background="7"]
+  background-color: #ffa500
+[data-irc_background="8"]
+  background-color: #ffff00
+[data-irc_background="9"]
+  background-color: #00ff00
+[data-irc_background="10"]
+  background-color: #008080
+[data-irc_background="11"]
+  background-color: #00ffff
+[data-irc_background="12"]
+  background-color: #4169e1
+[data-irc_background="13"]
+  background-color: #ff00ff
+[data-irc_background="14"]
+  background-color: #808080
+[data-irc_background="15"]
+  background-color: #c0c0c0
\ No newline at end of file
diff --git a/res/css/nav.sass b/res/css/_nav.sass
similarity index 86%
rename from res/css/nav.sass
rename to res/css/_nav.sass
index 7de0e91..219f60c 100644
--- a/res/css/nav.sass
+++ b/res/css/_nav.sass
@@ -9,14 +9,15 @@
   z-index: 2
 
   .bar
-    background: #0271B3
+    background-color: #0271B3
     z-index: 1
     position: absolute
     top: 0
     left: 0
     right: 0
     box-shadow: 0 -1px 0 #e0e0e0, 0 0 2px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24)
-    transition: background .15s
+    transition: background-color .15s
+    will-change: background-color
 
     .container
       max-width: 1136px
@@ -33,7 +34,6 @@
         display: flex
         position: relative
         border: none
-        transition: background .15s
         background: #358dc2
         border-radius: 2px
         padding: 0 0 0 72px
@@ -41,9 +41,10 @@
         flex-direction: row
         flex: 1
         box-shadow: 0 1px 1px rgba(0, 0, 0, .06)
+        transition: background-color .15s
 
         &:hover
-          background: rgba(255, 255, 255, .3)
+          background-color: rgba(255, 255, 255, .3)
 
         .icon
           display: inline-block
@@ -64,6 +65,9 @@
           line-height: 100%
           color: #ffffff
           font-size: 1rem
+          margin-right: 8px
+          -webkit-appearance: textfield
+          -webkit-box-sizing: content-box
 
           &::-moz-placeholder
             color: #ffffff
@@ -75,6 +79,9 @@
             opacity: 1
             -webkit-font-smoothing: antialiased
 
+          &::-webkit-search-decoration, &::-webkit-search-cancel-button
+            display: none
+
       .actions
         display: flex
         align-items: center
@@ -92,8 +99,8 @@
       text-align: center
       @include vendor-prefix('user-select', 'none')
 
-      &:hover:before
-        background-color: rgba(0, 0, 0, .12)
+      &:before
+        background-color: rgba(255, 255, 255, .12)
         bottom: 9px
         content: ' '
         left: 9px
@@ -104,6 +111,11 @@
         top: 9px
         z-index: -1
         border-radius: 50%
+        opacity: 0
+        transition: opacity 100ms
+
+      &:hover:before
+        opacity: 1
 
   .history
     top: 100%
@@ -132,7 +144,7 @@
         text-overflow: ellipsis
         white-space: nowrap
 
-        &:hover, &:focus, &.selected
+        &:hover, &:focus, &.focus
           background: rgba(0, 0, 0, 0.03)
 
         .icon
diff --git a/res/css/sendercolor.sass b/res/css/_sendercolor.sass
similarity index 100%
rename from res/css/sendercolor.sass
rename to res/css/_sendercolor.sass
diff --git a/res/css/util.sass b/res/css/_util.sass
similarity index 100%
rename from res/css/util.sass
rename to res/css/_util.sass
diff --git a/res/css/oldsearch.css b/res/css/oldsearch.css
deleted file mode 100644
index 2fecab7..0000000
--- a/res/css/oldsearch.css
+++ /dev/null
@@ -1,582 +0,0 @@
-* {
-    padding: 0;
-    margin: 0;
-    box-sizing: border-box;
-}
-
-body {
-    background: #F2F2F2;
-    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
-    font-size: 81.25%;
-    overflow-y: scroll;
-}
-
-section {
-    transition: opacity 400ms;
-    max-width: 1328px;
-    padding: 56px 6rem 8rem 6rem;
-    margin: 0 auto;
-}
-
-buffer {
-    display: block;
-    margin-top: 0;
-    margin-bottom: 20px;
-    border: rgba(0, 0, 0, 0);
-    transition: all 400ms;
-}
-
-buffer.selected {
-    background-color: #ddd;
-    border: rgba(0, 0, 0, .4);
-    padding: 20px 16px;
-    margin-top: 20px;
-    margin-left: -16px;
-    margin-right: -16px;
-}
-
-buffer > article {
-    font-size: 13px;
-}
-
-buffer > h2 {
-    border-bottom: 1px solid transparent;
-    border-top: 1px solid transparent;
-    color: #616161;
-    margin-top: 20px;
-    padding-bottom: 10px;
-    padding-left: 22px;
-    position: relative;
-    will-change: transform, -webkit-transform;
-}
-
-message {
-    display: flex;
-    line-height: 24px;
-    padding: 12px 24px;
-    border-bottom: 1px solid #e5e5e5;
-    color: #212121;
-    background: #fff;
-    position: relative;
-}
-
-message:not(.original) * {
-    opacity: .8
-}
-
-context:not(.selected) > .before, context:not(.selected) > .after {
-    display: none;
-}
-
-context:not(.selected) inline-button {
-    display: none;
-}
-
-buffer:not(.selected) context:nth-child(4)~context * {
-    display: none;
-}
-
-message sender {
-    width: 148px;
-    display: inline-block;
-    padding: 0 24px;
-    font-weight: bold;
-    flex-shrink: 0;
-}
-
-message time {
-    width: 132px;
-    display: inline-block;
-    text-align: right;
-    flex-shrink: 0;
-}
-
-message .container, message content {
-    flex-shrink: 1;
-    overflow: hidden;
-}
-
-message .container {
-    display: flex;
-}
-
-message:last-child {
-    border-bottom: none;
-}
-
-nav {
-    position: fixed;
-    left: 0;
-    right: 0;
-    top: 0;
-    height: 56px;
-    z-index: 2;
-}
-
-nav .wrapper {
-    background: #4285f4;
-    padding: 0 6rem;
-    z-index: 1;
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    box-shadow: 0 -1px 0 #e0e0e0, 0 0 2px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24);
-    transition: background .15s;
-}
-
-nav.search .wrapper {
-    background: #fff;
-}
-
-nav.search input[type=text]::-moz-placeholder {
-    color: #ffffff;
-    opacity: 1;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-}
-
-nav.search input[type=text]::-webkit-input-placeholder {
-    color: #ffffff;
-    opacity: 1;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-}
-
-nav.search input[type=text]::-moz-placeholder {
-    color: #757575;
-    opacity: 1;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-}
-
-nav.search input[type=text]::-webkit-input-placeholder {
-    color: #757575;
-    opacity: 1;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-}
-
-#searchbar {
-    max-width: 1136px;
-    margin: 10px auto;
-    height: 36px;
-    display: flex;
-    position: relative;
-    border: none;
-    -webkit-transition: background .15s;
-    transition: background .15s;
-    background: rgba(255, 255, 255, .15);
-    border-radius: 2px;
-    padding: 0 0 0 72px;
-    color: #ffffff;
-    flex-direction: row;
-}
-
-#searchbar label.clip {
-    display: inline-block;
-    height: 20px;
-    line-height: 20px;
-    margin: 8px 0;
-    background: #afb42b;
-    padding: 0 8px;
-    border-radius: 10px;
-    color: #ffffff;
-}
-
-#searchbar label.clip:not(:first-of-type) {
-    margin-left: 8px;
-}
-
-#searchbar label {
-    display: inline-block;
-    line-height: 36px;
-}
-
-#searchbar input[type=text] {
-    display: inline-block;
-    flex-grow: 1;
-    flex-shrink: 1;
-    background: none;
-    border: none;
-    line-height: 100%;
-    color: inherit !important;
-}
-
-#searchicon {
-    display: inline-block;
-    width: 72px;
-    height: 36px;
-    position: absolute;
-    text-align: center;
-    line-height: 36px;
-    color: inherit !important;
-    left: 0;
-    top: 0;
-}
-
-#no_more img {
-    margin: 8rem auto 0;
-    display: block;
-}
-
-#no_more h2 {
-    display: block;
-    text-align: center;
-    margin: 1rem;
-    color: rgb(113, 113, 113);
-    font-weight: 300;
-    font-size: 20pt;
-}
-
-inline-button {
-    display: block;
-    background: rgb(255, 255, 255) none repeat scroll 0 0;
-    font-size: 16px;
-    height: 48px;
-    line-height: 48px;
-    color: rgb(113, 113, 113);
-    text-align: center;
-    font-style: italic;
-    cursor: pointer;
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    position: relative;
-}
-
-context {
-    display: block;
-}
-
-context.selected {
-    padding: 50px 0;
-    margin: 0 -20px;
-}
-
-message:before, inline-button:before {
-    bottom: 0;
-    box-shadow: 0 -1px 0 #e5e5e5, 0 0 2px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24);
-    content: '';
-    display: block;
-    left: 0;
-    pointer-events: none;
-    position: absolute;
-    right: 0;
-    top: 0;
-}
-
-message content > b {
-    font-weight: initial;
-    background-color: rgba(251, 246, 167, 0.5);
-}
-
-section > inline-button {
-    margin-top: 20px;
-}
-
-article > inline-button {
-    background: #f5f5f5;
-}
-
-#searchbar:hover {
-    background: rgba(255, 255, 255, .25);
-}
-
-nav.search #searchbar {
-    background: #f6f6f6;
-    color: #212121 !important;
-}
-
-.icon {
-    font-family: 'Material Icons';
-    font-weight: normal;
-    font-style: normal;
-    font-size: 24px;
-    display: inline-block;
-    width: 1em;
-    height: 1em;
-    line-height: 1;
-    text-transform: none;
-    letter-spacing: normal;
-    word-wrap: normal;
-    white-space: nowrap;
-    direction: ltr;
-
-    /* Support for all WebKit browsers. */
-    -webkit-font-smoothing: antialiased;
-    /* Support for Safari and Chrome. */
-    text-rendering: optimizeLegibility;
-
-    /* Support for Firefox. */
-    -moz-osx-font-smoothing: grayscale;
-
-    /* Support for IE. */
-    font-feature-settings: 'liga';
-}
-
-.circular {
-    -webkit-animation: rotate 2s linear infinite;
-    animation: rotate 2s linear infinite;
-    height: 5rem;
-    -webkit-transform-origin: center center;
-    transform-origin: center center;
-    width: 5rem;
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    margin: auto;
-}
-
-.path {
-    stroke-dasharray: 1, 200;
-    stroke-dashoffset: 0;
-    -webkit-animation: dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite;
-    animation: dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite;
-    stroke-linecap: round;
-}
-
-@-webkit-keyframes rotate {
-    100% {
-        -webkit-transform: rotate(360deg);
-        transform: rotate(360deg);
-    }
-}
-
-@keyframes rotate {
-    100% {
-        -webkit-transform: rotate(360deg);
-        transform: rotate(360deg);
-    }
-}
-
-@-webkit-keyframes dash {
-    0% {
-        stroke-dasharray: 1, 200;
-        stroke-dashoffset: 0;
-    }
-    50% {
-        stroke-dasharray: 89, 200;
-        stroke-dashoffset: -35px;
-    }
-    100% {
-        stroke-dasharray: 89, 200;
-        stroke-dashoffset: -124px;
-    }
-}
-
-@keyframes dash {
-    0% {
-        stroke-dasharray: 1, 200;
-        stroke-dashoffset: 0;
-    }
-    50% {
-        stroke-dasharray: 89, 200;
-        stroke-dashoffset: -35px;
-    }
-    100% {
-        stroke-dasharray: 89, 200;
-        stroke-dashoffset: -124px;
-    }
-}
-
-@-webkit-keyframes color {
-    100%,
-    0% {
-        stroke: #d62d20;
-    }
-    40% {
-        stroke: #0057e7;
-    }
-    66% {
-        stroke: #008744;
-    }
-    80%,
-    90% {
-        stroke: #ffa700;
-    }
-}
-
-@keyframes color {
-    100%,
-    0% {
-        stroke: #d62d20;
-    }
-    40% {
-        stroke: #0057e7;
-    }
-    66% {
-        stroke: #008744;
-    }
-    80%,
-    90% {
-        stroke: #ffa700;
-    }
-}
-
-#autocomplete {
-    top: 100%;
-    max-width: 1328px;
-    margin: auto;
-    padding: 0 6rem;
-    transform: translateY(-200%);
-    transition: transform 400ms;
-    position: relative;
-}
-
-#actions {
-    position: absolute;
-    height: 56px;
-    z-index: 8;
-    right: 0;
-    display: flex;
-    align-items: center;
-    justify-content: flex-end;
-    -moz-user-select: -moz-none;
-    padding-left: 30px;
-    padding-right: 30px;
-}
-
-#actions > * {
-    height: 30px;
-    line-height: normal;
-    position: relative;
-    padding: 3px;
-    cursor: pointer;
-    color: #fff;
-    transition: all .15s;
-}
-
-nav.search #actions > * {
-    color: #000;
-    opacity: 0.6;
-}
-
-#actions > *:hover:before {
-    background-color: rgba(0, 0, 0, .12);
-    bottom: -4px;
-    content: ' ';
-    left: -4px;
-    margin: auto;
-    padding: 4px;
-    position: absolute;
-    right: -4px;
-    top: -4px;
-    z-index: -1;
-    border-radius: 50%;
-}
-
-#autocomplete.active {
-    transform: translateY(0);
-}
-
-#autocomplete ul {
-    list-style-type: none;
-    margin: 0;
-    padding: 6px 0;
-    background: #fff;
-    box-shadow: 0 -1px 0 #e0e0e0, 0 0 2px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24);
-}
-
-#autocomplete li {
-    cursor: pointer;
-    line-height: 36px;
-    overflow: hidden;
-    padding: 0 24px;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-}
-
-#autocomplete p {
-    cursor: default;
-    line-height: 36px;
-    overflow: hidden;
-    padding: 0 24px;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-    font-style: italic;
-    color: #646464;
-}
-
-#autocomplete li .icon {
-    border-radius: 12px;
-    height: 24px;
-    margin-right: 24px;
-    vertical-align: middle;
-    width: 24px;
-    display: inline-block;
-    background-size: cover;
-    opacity: 0.6;
-}
-
-#autocomplete li:hover, #autocomplete li:focus, #autocomplete li.selected {
-    background: rgba(0, 0, 0, 0.03);
-}
-
-#results {
-    transition: opacity 400ms;
-}
-
-#results.hidden {
-    opacity: 0;
-}
-
-#modal-background {
-    position: fixed;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 0;
-    display: none;
-}
-
-#results.hidden + #modal-background {
-    display: block;
-}
-
-@media(max-width: 800px) {
-    #results {
-        padding-left: 2rem;
-        padding-right: 2rem;
-    }
-
-    nav .wrapper, #autocomplete {
-        padding-left: 2rem;
-        padding-right: 4rem;
-    }
-
-    #actions {
-        padding-left: 1rem;
-        padding-right: 1rem;
-    }
-
-    message {
-        padding-left: 1rem;
-        padding-right: 1rem;
-        padding-bottom: 2rem;
-    }
-
-    message sender {
-        padding: 0;
-        width: initial;
-    }
-
-    message sender:after {
-        content: ":";
-        margin-right: 8px;
-    }
-
-    message .container {
-        display: block;
-    }
-
-    message time {
-        position: absolute;
-        right: 8px;
-        bottom: 8px;
-        width: initial;
-        font-style: italic;
-        color: #777;
-    }
-}
\ No newline at end of file
diff --git a/res/css/search.css b/res/css/search.css
index a5a16cf..b5d1857 100644
--- a/res/css/search.css
+++ b/res/css/search.css
@@ -61,14 +61,15 @@ body {
   height: 56px;
   z-index: 2; }
   .nav .bar {
-    background: #0271B3;
+    background-color: #0271B3;
     z-index: 1;
     position: absolute;
     top: 0;
     left: 0;
     right: 0;
     box-shadow: 0 -1px 0 #e0e0e0, 0 0 2px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.24);
-    transition: background 0.15s; }
+    transition: background-color 0.15s;
+    will-change: background-color; }
     .nav .bar .container {
       max-width: 1136px;
       margin: 0 auto;
@@ -83,16 +84,16 @@ body {
         display: flex;
         position: relative;
         border: none;
-        transition: background 0.15s;
         background: #358dc2;
         border-radius: 2px;
         padding: 0 0 0 72px;
         color: #ffffff;
         flex-direction: row;
         flex: 1;
-        box-shadow: 0 1px 1px rgba(0, 0, 0, 0.06); }
+        box-shadow: 0 1px 1px rgba(0, 0, 0, 0.06);
+        transition: background-color 0.15s; }
         .nav .bar .container .searchBar:hover {
-          background: rgba(255, 255, 255, 0.3); }
+          background-color: rgba(255, 255, 255, 0.3); }
         .nav .bar .container .searchBar .icon {
           display: inline-block;
           width: 72px;
@@ -110,7 +111,10 @@ body {
           border: none;
           line-height: 100%;
           color: #ffffff;
-          font-size: 1rem; }
+          font-size: 1rem;
+          margin-right: 8px;
+          -webkit-appearance: textfield;
+          -webkit-box-sizing: content-box; }
           .nav .bar .container .searchBar .search::-moz-placeholder {
             color: #ffffff;
             opacity: 1;
@@ -119,6 +123,8 @@ body {
             color: #ffffff;
             opacity: 1;
             -webkit-font-smoothing: antialiased; }
+          .nav .bar .container .searchBar .search::-webkit-search-decoration, .nav .bar .container .searchBar .search::-webkit-search-cancel-button {
+            display: none; }
       .nav .bar .container .actions {
         display: flex;
         align-items: center;
@@ -138,8 +144,8 @@ body {
       -ms-user-select: none;
       -o-user-select: none;
       user-select: none; }
-      .nav .bar a:hover:before {
-        background-color: rgba(0, 0, 0, 0.12);
+      .nav .bar a:before {
+        background-color: rgba(255, 255, 255, 0.12);
         bottom: 9px;
         content: " ";
         left: 9px;
@@ -149,7 +155,11 @@ body {
         right: 9px;
         top: 9px;
         z-index: -1;
-        border-radius: 50%; }
+        border-radius: 50%;
+        opacity: 0;
+        transition: opacity 100ms; }
+      .nav .bar a:hover:before {
+        opacity: 1; }
   .nav .history {
     top: 100%;
     max-width: 1136px;
@@ -174,7 +184,7 @@ body {
         padding: 0 24px;
         text-overflow: ellipsis;
         white-space: nowrap; }
-        .nav .history ul li:hover, .nav .history ul li:focus, .nav .history ul li.selected {
+        .nav .history ul li:hover, .nav .history ul li:focus, .nav .history ul li.focus {
           background: rgba(0, 0, 0, 0.03); }
         .nav .history ul li .icon {
           border-radius: 12px;
@@ -259,6 +269,111 @@ body {
 [data-sendercolor="f"] {
   color: #3176b3; }
 
+.irc_bold {
+  font-weight: bold; }
+
+.irc_italic {
+  font-style: italic; }
+
+.irc_underline {
+  text-decoration: underline; }
+
+[data-irc_foreground="0"] {
+  color: #ffffff; }
+
+[data-irc_foreground="1"] {
+  color: #000000; }
+
+[data-irc_foreground="2"] {
+  color: #000080; }
+
+[data-irc_foreground="3"] {
+  color: #008000; }
+
+[data-irc_foreground="4"] {
+  color: #ff0000; }
+
+[data-irc_foreground="5"] {
+  color: #800000; }
+
+[data-irc_foreground="6"] {
+  color: #800080; }
+
+[data-irc_foreground="7"] {
+  color: #ffa500; }
+
+[data-irc_foreground="8"] {
+  color: #ffff00; }
+
+[data-irc_foreground="9"] {
+  color: #00ff00; }
+
+[data-irc_foreground="10"] {
+  color: #008080; }
+
+[data-irc_foreground="11"] {
+  color: #00ffff; }
+
+[data-irc_foreground="12"] {
+  color: #4169e1; }
+
+[data-irc_foreground="13"] {
+  color: #ff00ff; }
+
+[data-irc_foreground="14"] {
+  color: #808080; }
+
+[data-irc_foreground="15"] {
+  color: #c0c0c0; }
+
+[data-irc_background="0"] {
+  background-color: #ffffff; }
+
+[data-irc_background="1"] {
+  background-color: #000000; }
+
+[data-irc_background="2"] {
+  background-color: #000080; }
+
+[data-irc_background="3"] {
+  background-color: #008000; }
+
+[data-irc_background="4"] {
+  background-color: #ff0000; }
+
+[data-irc_background="5"] {
+  background-color: #800000; }
+
+[data-irc_background="6"] {
+  background-color: #800080; }
+
+[data-irc_background="7"] {
+  background-color: #ffa500; }
+
+[data-irc_background="8"] {
+  background-color: #ffff00; }
+
+[data-irc_background="9"] {
+  background-color: #00ff00; }
+
+[data-irc_background="10"] {
+  background-color: #008080; }
+
+[data-irc_background="11"] {
+  background-color: #00ffff; }
+
+[data-irc_background="12"] {
+  background-color: #4169e1; }
+
+[data-irc_background="13"] {
+  background-color: #ff00ff; }
+
+[data-irc_background="14"] {
+  background-color: #808080; }
+
+[data-irc_background="15"] {
+  background-color: #c0c0c0; }
+
 .results {
   max-width: 1136px;
   padding: 56px 2rem 4rem 2rem;
@@ -273,47 +388,44 @@ body {
     display: block;
     margin-top: 0;
     margin-bottom: 20px;
-    border: transparent;
-    transition: all 400ms; }
+    position: relative; }
     .results .buffer .title {
       border-bottom: 1px solid transparent;
       border-top: 1px solid transparent;
       color: #616161;
       margin: 0;
-      background: #f2f2f2;
       padding: 20px 6px 10px 22px;
       position: sticky;
       top: 55px;
       z-index: 1;
       transition: all 400ms;
-      will-change: transform, -webkit-transform;
       display: flex; }
       .results .buffer .title:before {
         content: "";
         display: block;
-        position: absolute;
         left: -16px;
-        width: 16px;
+        right: -16px;
         top: 0;
         bottom: 0;
-        background: #f2f2f2; }
+        background-color: #f2f2f2;
+        position: absolute;
+        z-index: -2; }
+@media(max-width: 800px) {
+  .results .buffer .title:before {
+    left: 0;
+    right: 0; } }
       .results .buffer .title:after {
         content: "";
         display: block;
-        position: absolute;
-        right: -16px;
-        width: 16px;
+        left: 0;
+        right: 0;
         top: 0;
         bottom: 0;
-        background: #f2f2f2; }
-@media(max-width: 800px) {
-  .results .buffer .title {
-    margin-left: 0;
-    margin-right: 0;
-    padding-left: 22px;
-    padding-right: 6px; }
-    .results .buffer .title:after, .results .buffer .title:before {
-      display: none; } }
+        background-color: transparent;
+        transition: margin-left 400ms, margin-right 400ms, background-color 400ms;
+        will-change: margin-left, margin-right, background-color;
+        position: absolute;
+        z-index: -1; }
       .results .buffer .title h2 {
         flex: 1;
         line-height: 36px; }
@@ -340,7 +452,8 @@ body {
         -moz-user-select: none;
         text-decoration: none;
         box-sizing: border-box;
-        font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; }
+        font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
+        will-change: background; }
         .results .buffer .title button:hover {
           background-color: rgba(0, 0, 0, 0.06); }
         .results .buffer .title button:after {
@@ -360,31 +473,43 @@ body {
           background-size: 0 0;
           opacity: 0.2;
           transition: 0s; }
-        .results .buffer .title button:before {
-          content: "Open"; }
-    .results .buffer:not(.selected) .context:nth-child(4) ~ .context {
+        .results .buffer .title button .open {
+          display: initial; }
+        .results .buffer .title button .close {
+          display: none; }
+    .results .buffer:not(.focus) .context:nth-child(4) ~ .context {
       display: none; }
-    .results .buffer.selected {
-      background-color: #ddd;
-      border: rgba(0, 0, 0, 0.4);
-      padding: 0 16px 20px;
-      margin: 0 -16px; }
-@media(max-width: 800px) {
-  .results .buffer.selected {
-    margin: 0 0 20px 0;
-    padding: 0; } }
-      .results .buffer.selected .title {
-        margin: 0 -16px;
-        padding: 20px 22px 10px 38px;
-        background: #ddd; }
-@media(max-width: 800px) {
-  .results .buffer.selected .title {
-    margin: 0;
-    padding: 20px 6px 10px 22px; } }
-        .results .buffer.selected .title button:before {
-          content: "Close"; }
-      .results .buffer.selected .container > .inline-button {
-        height: 48px; }
+    .results .buffer:before {
+      content: "";
+      display: block;
+      left: 0;
+      right: 0;
+      top: 0;
+      bottom: 0;
+      background-color: transparent;
+      transition: margin-left 400ms, margin-right 400ms, margin-bottom 400ms, background-color 400ms;
+      will-change: margin-left, margin-right, margin-bottom, background-color;
+      position: absolute;
+      z-index: -1; }
+    .results .buffer.focus:before {
+      margin-bottom: -16px;
+      background-color: #ddd; }
+@media(min-width: 800px) {
+  .results .buffer.focus:before {
+    margin-left: -16px;
+    margin-right: -16px; } }
+    .results .buffer.focus .title:after {
+      background-color: #ddd; }
+@media(min-width: 800px) {
+  .results .buffer.focus .title:after {
+    margin-left: -16px;
+    margin-right: -16px; } }
+    .results .buffer.focus .title button .open {
+      display: none; }
+    .results .buffer.focus .title button .close {
+      display: initial; }
+    .results .buffer.focus .container > .inline-button {
+      height: 48px; }
     .results .buffer .container {
       font-size: 13px; }
       .results .buffer .container > .inline-button {
@@ -405,20 +530,10 @@ body {
         position: sticky;
         bottom: 0;
         box-shadow: 0 -1px 0 #e5e5e5, 0 0 2px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.24);
-        transition: height 400ms;
-        /*&:before
-         * bottom: 0
-         * box-shadow: 0 -1px 0 #e5e5e5, 0 0 2px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24)
-         * content: ''
-         * display: block
-         * left: 0
-         * pointer-events: none
-         * position: absolute
-         * right: 0
-         * top: 0 */ }
-      .results .buffer .container .context:not(.selected) > .before, .results .buffer .container .context:not(.selected) > .after {
+        transition: height 400ms; }
+      .results .buffer .container .context:not(.focus) > .before, .results .buffer .container .context:not(.focus) > .after {
         display: none; }
-      .results .buffer .container .context:not(.selected) > .inline-button {
+      .results .buffer .container .context:not(.focus) > .inline-button {
         display: none; }
       .results .buffer .container .context .message {
         display: flex;
@@ -492,75 +607,5 @@ body {
 @media(max-width: 800px) {
   .results .buffer .container .context .message .container .content {
     display: inline; } }
-            .results .buffer .container .context .message .container .content .irc_bold {
-              font-weight: bold; }
-            .results .buffer .container .context .message .container .content .irc_italic {
-              font-style: italic; }
-            .results .buffer .container .context .message .container .content .irc_underline {
-              text-decoration: underline; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="0"] {
-              color: #ffffff; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="1"] {
-              color: #000000; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="2"] {
-              color: #000080; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="3"] {
-              color: #008000; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="4"] {
-              color: #ff0000; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="5"] {
-              color: #800000; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="6"] {
-              color: #800080; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="7"] {
-              color: #ffa500; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="8"] {
-              color: #ffff00; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="9"] {
-              color: #00ff00; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="10"] {
-              color: #008080; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="11"] {
-              color: #00ffff; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="12"] {
-              color: #4169e1; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="13"] {
-              color: #ff00ff; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="14"] {
-              color: #808080; }
-            .results .buffer .container .context .message .container .content [data-irc_foreground="15"] {
-              color: #c0c0c0; }
-            .results .buffer .container .context .message .container .content [data-irc_background="0"] {
-              background-color: #ffffff; }
-            .results .buffer .container .context .message .container .content [data-irc_background="1"] {
-              background-color: #000000; }
-            .results .buffer .container .context .message .container .content [data-irc_background="2"] {
-              background-color: #000080; }
-            .results .buffer .container .context .message .container .content [data-irc_background="3"] {
-              background-color: #008000; }
-            .results .buffer .container .context .message .container .content [data-irc_background="4"] {
-              background-color: #ff0000; }
-            .results .buffer .container .context .message .container .content [data-irc_background="5"] {
-              background-color: #800000; }
-            .results .buffer .container .context .message .container .content [data-irc_background="6"] {
-              background-color: #800080; }
-            .results .buffer .container .context .message .container .content [data-irc_background="7"] {
-              background-color: #ffa500; }
-            .results .buffer .container .context .message .container .content [data-irc_background="8"] {
-              background-color: #ffff00; }
-            .results .buffer .container .context .message .container .content [data-irc_background="9"] {
-              background-color: #00ff00; }
-            .results .buffer .container .context .message .container .content [data-irc_background="10"] {
-              background-color: #008080; }
-            .results .buffer .container .context .message .container .content [data-irc_background="11"] {
-              background-color: #00ffff; }
-            .results .buffer .container .context .message .container .content [data-irc_background="12"] {
-              background-color: #4169e1; }
-            .results .buffer .container .context .message .container .content [data-irc_background="13"] {
-              background-color: #ff00ff; }
-            .results .buffer .container .context .message .container .content [data-irc_background="14"] {
-              background-color: #808080; }
-            .results .buffer .container .context .message .container .content [data-irc_background="15"] {
-              background-color: #c0c0c0; }
 
 /*# sourceMappingURL=search.css.map */
diff --git a/res/css/search.css.map b/res/css/search.css.map
index 4ac5e9e..45fd867 100644
--- a/res/css/search.css.map
+++ b/res/css/search.css.map
@@ -1,7 +1,7 @@
 {
 "version": 3,
-"mappings": "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",
-"sources": ["icons.sass","font.sass","search.sass","nav.sass","util.sass","sendercolor.sass","content.sass"],
+"mappings": ";EACE,WAAW,EAAE,gBAAgB;EAC7B,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,2KAA2K;AAElL,KAAK;EACH,WAAW,EAAE,4BAA4B;EACzC,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,CAAC;EACd,cAAc,EAAE,IAAI;EACpB,cAAc,EAAE,MAAM;EACtB,SAAS,EAAE,MAAM;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EAAE,GAAG;;EAGd,sBAAsB,EAAE,WAAW;;EAEnC,cAAc,EAAE,kBAAkB;;EAGlC,uBAAuB,EAAE,SAAS;;EAGlC,qBAAqB,EAAE,MAAM;;;EC7B7B,WAAW,EAAE,QAAQ;EACrB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,4RAA4R;;EAGjS,WAAW,EAAE,QAAQ;EACrB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,sRAAsR;ACN7R,CAAC;EACC,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,UAAU;EACtB,2BAA2B,EAAE,WAAgB;;AAE/C,IAAI;EACF,UAAU,EAAE,OAAO;EACnB,WAAW,EAAE,oBAAoB;EACjC,SAAS,EAAE,MAAM;;AAEnB,OAAO;EACL,OAAO,EAAE,IAAI;;AACf,kBAAkB;EAChB,MAAM,EAAE,CAAC;;AChBX,IAAI;EACF,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,GAAG,EAAE,CAAC;EACN,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,CAAC;EAEV,SAAI;IACF,gBAAgB,EAAE,OAAO;IACzB,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,UAAU,EAAE,4EAA0E;IACtF,UAAU,EAAE,sBAAqB;IACjC,WAAW,EAAE,gBAAgB;IAE7B,oBAAU;MACR,SAAS,EAAE,MAAM;MACjB,MAAM,EAAE,MAAM;MACd,OAAO,EAAE,MAAM;MACf,OAAO,EAAE,IAAI;;EAJf,oBAAU;IAON,OAAO,EAAE,SAAS;MAEpB,+BAAU;QACR,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,OAAO;QACnB,aAAa,EAAE,GAAG;QAClB,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,OAAO;QACd,cAAc,EAAE,GAAG;QACnB,IAAI,EAAE,CAAC;QACP,UAAU,EAAE,6BAA4B;QACxC,UAAU,EAAE,sBAAqB;QAEjC,qCAAO;UACL,gBAAgB,EAAE,wBAAuB;QAE3C,qCAAK;UACH,OAAO,EAAE,YAAY;UACrB,KAAK,EAAE,IAAI;UACX,MAAM,EAAE,IAAI;UACZ,QAAQ,EAAE,QAAQ;UAClB,UAAU,EAAE,MAAM;UAClB,WAAW,EAAE,IAAI;UACjB,IAAI,EAAE,CAAC;UACP,GAAG,EAAE,CAAC;QAER,uCAAO;UACL,OAAO,EAAE,YAAY;UACrB,SAAS,EAAE,CAAC;UACZ,WAAW,EAAE,CAAC;UACd,UAAU,EAAE,IAAI;UAChB,MAAM,EAAE,IAAI;UACZ,WAAW,EAAE,IAAI;UACjB,KAAK,EAAE,OAAO;UACd,SAAS,EAAE,IAAI;UACf,YAAY,EAAE,GAAG;UACjB,kBAAkB,EAAE,SAAS;UAC7B,kBAAkB,EAAE,WAAW;UAE/B,yDAAmB;YACjB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,CAAC;YACV,uBAAuB,EAAE,SAAS;UAEpC,kEAA4B;YAC1B,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,CAAC;YACV,sBAAsB,EAAE,WAAW;UAErC,yIAA6D;YAC3D,OAAO,EAAE,IAAI;MAEnB,6BAAQ;QACN,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,eAAe,EAAE,QAAQ;IAE7B,WAAC;MACC,MAAM,EAAE,IAAI;MACZ,KAAK,EAAE,IAAI;MACX,QAAQ,EAAE,QAAQ;MAClB,OAAO,EAAE,SAAS;MAClB,MAAM,EAAE,OAAO;MACf,KAAK,EAAE,IAAI;MACX,UAAU,EAAE,SAAQ;MACpB,eAAe,EAAE,IAAI;MACrB,UAAU,EAAE,MAAM;MChGpB,mBAAkB,EAAE,IAAS;MAA7B,gBAAkB,EAAE,IAAS;MAA7B,eAAkB,EAAE,IAAS;MAA7B,cAAkB,EAAE,IAAS;MAA7B,WAAkB,EAAE,IAAS;MDmG3B,kBAAQ;QACN,gBAAgB,EAAE,yBAAwB;QAC1C,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,GAAG;QACV,GAAG,EAAE,GAAG;QACR,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,GAAG;QAClB,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,aAAa;MAE3B,wBAAc;QACZ,OAAO,EAAE,CAAC;EAEhB,aAAQ;IACN,GAAG,EAAE,IAAI;IACT,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,iBAAiB;IAC5B,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,QAAQ;;EAPpB,aAAQ;IAUJ,OAAO,EAAE,CAAC;IAEZ,gBAAE;MACA,eAAe,EAAE,IAAI;MACrB,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,KAAK;MACd,UAAU,EAAE,IAAI;MAChB,UAAU,EAAE,4EAA0E;MAEtF,mBAAE;QACA,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,QAAQ;QACvB,WAAW,EAAE,MAAM;QAEnB,+EAAyB;UACvB,UAAU,EAAE,mBAAmB;QAEjC,yBAAK;UACH,aAAa,EAAE,IAAI;UACnB,MAAM,EAAE,IAAI;UACZ,YAAY,EAAE,IAAI;UAClB,cAAc,EAAE,MAAM;UACtB,KAAK,EAAE,IAAI;UACX,OAAO,EAAE,YAAY;UACrB,eAAe,EAAE,KAAK;UACtB,OAAO,EAAE,GAAG;MAEhB,kBAAC;QACC,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,QAAQ;QACvB,WAAW,EAAE,MAAM;QACnB,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,OAAO;EAGlB,eAAI;IACF,UAAU,EAAE,OAAO;IAIjB,qCAAU;MACR,UAAU,EAAE,OAAO;MAEnB,6CAAO;QACL,KAAK,EAAE,OAAO;QAEd,+DAAmB;UACjB,KAAK,EAAE,OAAO;QAEhB,wEAA4B;UAC1B,KAAK,EAAE,OAAO;IAEpB,gCAAK;MACH,KAAK,EAAE,OAAO;EAEpB,mBAAQ;IACN,SAAS,EAAE,aAAa;EAE1B,qBAAU;IACR,OAAO,EAAE,CAAC;;AElMhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AAEhB,sBAAsB;EACpB,KAAK,EAAE,OAAO;;AC9ChB,SAAS;EACP,WAAW,EAAE,IAAI;;AACnB,WAAW;EACT,UAAU,EAAE,MAAM;;AACpB,cAAc;EACZ,eAAe,EAAE,SAAS;;AAE5B,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,yBAAyB;EACvB,KAAK,EAAE,OAAO;;AAChB,0BAA0B;EACxB,KAAK,EAAE,OAAO;;AAChB,0BAA0B;EACxB,KAAK,EAAE,OAAO;;AAChB,0BAA0B;EACxB,KAAK,EAAE,OAAO;;AAChB,0BAA0B;EACxB,KAAK,EAAE,OAAO;;AAChB,0BAA0B;EACxB,KAAK,EAAE,OAAO;;AAChB,0BAA0B;EACxB,KAAK,EAAE,OAAO;;AAEhB,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,yBAAyB;EACvB,gBAAgB,EAAE,OAAO;;AAC3B,0BAA0B;EACxB,gBAAgB,EAAE,OAAO;;AAC3B,0BAA0B;EACxB,gBAAgB,EAAE,OAAO;;AAC3B,0BAA0B;EACxB,gBAAgB,EAAE,OAAO;;AAC3B,0BAA0B;EACxB,gBAAgB,EAAE,OAAO;;AAC3B,0BAA0B;EACxB,gBAAgB,EAAE,OAAO;;AAC3B,0BAA0B;EACxB,gBAAgB,EAAE,OAAO;;ACnE3B,QAAQ;EACN,SAAS,EAAE,MAAM;EACjB,OAAO,EAAE,mBAAmB;EAC5B,MAAM,EAAE,MAAM;EAEd,UAAU,EAAE,aAAa;;EAL3B,QAAQ;IAQJ,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,CAAC;EAEnB,gBAAO;IACL,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,IAAI;IACnB,QAAQ,EAAE,QAAQ;IAElB,uBAAM;MACJ,aAAa,EAAE,qBAAqB;MACpC,UAAU,EAAE,qBAAqB;MACjC,KAAK,EAAE,OAAO;MACd,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,kBAAkB;MAC3B,QAAQ,EAAE,MAAM;MAChB,GAAG,EAAE,IAAI;MACT,OAAO,EAAE,CAAC;MACV,UAAU,EAAE,SAAS;MACrB,OAAO,EAAE,IAAI;MAEb,8BAAQ;QACN,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,CAAC;QACN,MAAM,EAAE,CAAC;QACT,gBAAgB,EAAE,OAAO;QACzB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,EAAE;;EATb,8BAAQ;IAYJ,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;MAEZ,6BAAO;QACL,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,CAAC;QACN,MAAM,EAAE,CAAC;QACT,gBAAgB,EAAE,WAAW;QAC7B,UAAU,EAAE,6DAA6D;QACzE,WAAW,EAAE,2CAA2C;QACxD,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,EAAE;MAEb,0BAAE;QACA,IAAI,EAAE,CAAC;QACP,WAAW,EAAE,IAAI;MAEnB,8BAAM;QACJ,aAAa,EAAE,GAAG;QAClB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,cAAc,EAAE,SAAS;QACzB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,YAAY;QACrB,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE,MAAM;QACtB,YAAY,EAAE,YAAY;QAC1B,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,QAAQ;QACjB,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,KAAK;QAClB,gBAAgB,EAAE,IAAI;QACtB,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,UAAU;QAEvB,oCAAO;UACL,gBAAgB,EAAE,mBAAgB;QAEpC,oCAAO;UACL,OAAO,EAAE,EAAE;UACX,OAAO,EAAE,KAAK;UACd,QAAQ,EAAE,QAAQ;UAClB,KAAK,EAAE,IAAI;UACX,MAAM,EAAE,IAAI;UACZ,GAAG,EAAE,CAAC;UACN,IAAI,EAAE,CAAC;UACP,UAAU,EAAE,sEAAsE;UAClF,eAAe,EAAE,WAAW;UAC5B,OAAO,EAAE,CAAC;UACV,cAAc,EAAE,IAAI;UACpB,UAAU,EAAE,2BAA0B;QAGtC,2CAAO;UACL,eAAe,EAAE,GAAG;UACpB,OAAO,EAAE,GAAE;UACX,UAAU,EAAE,EAAE;QAElB,oCAAK;UACH,OAAO,EAAE,OAAO;QAClB,qCAAM;UACJ,OAAO,EAAE,IAAI;IAEnB,6DAA4C;MAC1C,OAAO,EAAE,IAAI;IAGf,uBAAQ;MACN,OAAO,EAAE,EAAE;MACX,OAAO,EAAE,KAAK;MACd,IAAI,EAAE,CAAC;MACP,KAAK,EAAE,CAAC;MACR,GAAG,EAAE,CAAC;MACN,MAAM,EAAE,CAAC;MACT,gBAAgB,EAAE,WAAW;MAC7B,UAAU,EAAE,kFAAkF;MAC9F,WAAW,EAAE,0DAA0D;MACvE,QAAQ,EAAE,QAAQ;MAClB,OAAO,EAAE,EAAE;IAGX,6BAAQ;MACN,aAAa,EAAE,KAAK;MACpB,gBAAgB,EAAE,IAAI;;EAFxB,6BAAQ;IAKJ,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,KAAK;IAGrB,mCAAO;MACL,gBAAgB,EAAE,IAAI;;EADxB,mCAAO;IAIH,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,KAAK;IAGrB,0CAAK;MACH,OAAO,EAAE,IAAI;IACf,2CAAM;MACJ,OAAO,EAAE,OAAO;IAGpB,kDAAgB;MACd,MAAM,EAAE,IAAI;IAElB,2BAAU;MACR,SAAS,EAAE,IAAI;MAEf,4CAAgB;QACd,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,OAAO;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,OAAkB;QACzB,UAAU,EAAE,MAAM;QAClB,UAAU,EAAE,MAAM;QAClB,MAAM,EAAE,OAAO;QH9KnB,mBAAkB,EAAE,IAAS;QAA7B,gBAAkB,EAAE,IAAS;QAA7B,eAAkB,EAAE,IAAS;QAA7B,cAAkB,EAAE,IAAS;QAA7B,WAAkB,EAAE,IAAS;QGgLzB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,CAAC;QACT,UAAU,EAAE,4EAA0E;QACtF,UAAU,EAAE,YAAY;MAQtB,qHAAmB;QACjB,OAAO,EAAE,IAAI;MAEf,iEAAgB;QACd,OAAO,EAAE,IAAI;MAEjB,6CAAQ;QACN,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,iBAAiB;QAChC,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,QAAQ;QAElB,oDAAQ;UACN,MAAM,EAAE,CAAC;UACT,UAAU,EAAE,4EAA0E;UACtF,OAAO,EAAE,EAAE;UACX,OAAO,EAAE,KAAK;UACd,IAAI,EAAE,CAAC;UACP,cAAc,EAAE,IAAI;UACpB,QAAQ,EAAE,QAAQ;UAClB,KAAK,EAAE,CAAC;UACR,GAAG,EAAE,CAAC;QAER,wDAAY;UACV,aAAa,EAAE,IAAI;QAErB,kDAAI;UACF,KAAK,EAAE,KAAK;UACZ,OAAO,EAAE,YAAY;UACrB,UAAU,EAAE,KAAK;UACjB,WAAW,EAAE,CAAC;;EAJhB,kDAAI;IAOA,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,MAAM;IAClB,KAAK,EAAE,IAAI;QAEf,wDAAU;UACR,OAAO,EAAE,IAAI;UACb,SAAS,EAAE,CAAC;UACZ,WAAW,EAAE,CAAC;UACd,QAAQ,EAAE,MAAM;;EAJlB,wDAAU;IAON,OAAO,EAAE,KAAK;IACd,cAAc,EAAE,IAAI;UAEtB,gEAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,CAAC;;EALhB,gEAAO;IAQH,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,CAAC;;EAEZ,sEAAO;IAEH,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,GAAG;UAEvB,iEAAQ;YACN,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,MAAM;;EAHlB,iEAAQ;IAMJ,OAAO,EAAE,IAAI;YAEf,gFAAc;cACZ,gBAAgB,EAAE,wBAAwB;UAE9C,iEAAQ;YACN,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,MAAM;;EAHlB,iEAAQ;IAMJ,OAAO,EAAE,MAAM",
+"sources": ["_icons.sass","_font.sass","search.sass","_nav.sass","_util.sass","_sendercolor.sass","_mirccolor.sass","_content.sass"],
 "names": [],
 "file": "search.css"
 }
\ No newline at end of file
diff --git a/res/js/app.js b/res/js/app.js
index 58a7a79..a942d8b 100644
--- a/res/js/app.js
+++ b/res/js/app.js
@@ -1,15 +1,16 @@
+const statehandler = new StateHandler();
+
 class App {
     constructor() {
         this.navigation = new Navigation();
-        this.urlBar = new UrlBar();
         this.buffers = [];
 
         this.loadingQuery = 0;
 
         this.render();
-        this.urlBar.addEventListener("search", (query) => this.search(query));
         this.navigation.addEventListener("search", (query) => this.search(query));
-        this.urlBar.init();
+        statehandler.addEventListener("update", (query) => this.search(query));
+        statehandler.init();
     }
 
     render() {
@@ -26,9 +27,11 @@ class App {
 
     search(query) {
         this.clear();
+        this.navigation.input.blur();
+        this.navigation.historyView.resetNavigation();
         this.navigation.historyView.add(new HistoryElement(query));
         this.navigation.input.value = query;
-        this.urlBar.set(query);
+        statehandler.replace(query);
 
         if (query.trim() === "")
             return;
@@ -58,7 +61,7 @@ class App {
     clearAll() {
         this.clear();
         this.navigation.historyView.clear();
-        this.urlBar.clear();
+        statehandler.clear();
     }
 
     insert(buffer) {
diff --git a/res/js/component/buffer.js b/res/js/component/buffer.js
index b5aa4ad..8803f08 100644
--- a/res/js/component/buffer.js
+++ b/res/js/component/buffer.js
@@ -22,24 +22,32 @@ class Buffer extends Component {
             $$c.appendChild($$e);
             $$c.appendChildren(this.name);
             var $$g = document.createElement('button');
-            $$g.addEventListener('click', () => this.selected());
+            $$g.addEventListener('click', () => this.focus());
             $$b.appendChild($$g);
+            var $$h = document.createElement('span');
+            $$h.setAttribute('class', 'open');
+            $$g.appendChild($$h);
+            $$h.appendChildren(translation.buffer.open);
+            var $$j = document.createElement('span');
+            $$j.setAttribute('class', 'close');
+            $$g.appendChild($$j);
+            $$j.appendChildren(translation.buffer.close);
             $$a.appendChildren(this.insertContainer = function () {
-                var $$i = document.createElement('div');
-                $$i.setAttribute('class', 'container');
-                $$i.appendChildren((this.loadMoreBtn = new LoadMore(translation.results.show_more, this.loadMore)).elem);
-                return $$i;
+                var $$m = document.createElement('div');
+                $$m.setAttribute('class', 'container');
+                $$m.appendChildren((this.loadMoreBtn = new LoadMore(translation.results.show_more, this.loadMore)).elem);
+                return $$m;
             }.call(this));
             return $$a;
         }.call(this);
     }
     loadMore() {
     }
-    selected(isSelected) {
-        if (isSelected === undefined)
-            isSelected = !this.elem.classList.contains('selected');
-        this.elem.classList.toggle('selected', isSelected);
-        this.sendEvent('expanded', isSelected);
+    focus(focus) {
+        if (focus === undefined)
+            focus = !this.elem.classList.contains('focus');
+        this.elem.classList.toggle('focus', focus);
+        this.sendEvent('focus', focus);
     }
     insert(context) {
         this.insertContainer.insertBefore(context.elem, this.loadMoreBtn.elem);
diff --git a/res/js/component/buffer.jsx b/res/js/component/buffer.jsx
index afa3000..8e30c72 100644
--- a/res/js/component/buffer.jsx
+++ b/res/js/component/buffer.jsx
@@ -16,7 +16,10 @@ class Buffer extends Component {
             <div className="buffer">
                 <div className="title">
                     <h2>{this.network} – {this.name}</h2>
-                    <button onClick={() => this.selected()}/>
+                    <button onClick={() => this.focus()}>
+                        <span className="open">{translation.buffer.open}</span>
+                        <span className="close">{translation.buffer.close}</span>
+                    </button>
                 </div>
                 {this.insertContainer = (
                     <div className="container">
@@ -31,12 +34,12 @@ class Buffer extends Component {
         /* load data */
     }
 
-    selected(isSelected) {
-        if (isSelected === undefined)
-            isSelected = !this.elem.classList.contains("selected");
+    focus(focus) {
+        if (focus === undefined)
+            focus = !this.elem.classList.contains("focus");
 
-        this.elem.classList.toggle("selected", isSelected);
-        this.sendEvent("expanded", isSelected);
+        this.elem.classList.toggle("focus", focus);
+        this.sendEvent("focus", focus);
     }
 
     insert(context) {
diff --git a/res/js/component/history.js b/res/js/component/history.js
index a744951..f7d4969 100644
--- a/res/js/component/history.js
+++ b/res/js/component/history.js
@@ -55,25 +55,30 @@ class HistoryView {
     }
     navigateBefore() {
         if (this.elements[this.index])
-            this.elements[this.index].selected(false);
+            this.elements[this.index].focus(false);
         this.index++;
         this.index %= this.elements.length;
         if (this.elements[this.index])
-            this.elements[this.index].selected(true);
+            this.elements[this.index].focus(true);
         console.log(this.index);
     }
     navigateLater() {
         if (this.elements[this.index])
-            this.elements[this.index].selected(false);
+            this.elements[this.index].focus(false);
         this.index--;
         if (this.index < 0)
             this.index = -1;
         else
             this.index %= this.elements.length;
         if (this.elements[this.index])
-            this.elements[this.index].selected(true);
+            this.elements[this.index].focus(true);
         console.log(this.index);
     }
+    resetNavigation() {
+        if (this.elements[this.index])
+            this.elements[this.index].focus(false);
+        this.index = -1;
+    }
     truncate() {
         while (this.elements.length > HISTORY_MAX_LENGTH)
             this.list.removeChild(this.elements.shift().elem);
diff --git a/res/js/component/history.jsx b/res/js/component/history.jsx
index d1219ab..0a9c089 100644
--- a/res/js/component/history.jsx
+++ b/res/js/component/history.jsx
@@ -68,20 +68,20 @@ class HistoryView {
 
     navigateBefore() {
         if (this.elements[this.index])
-            this.elements[this.index].selected(false);
+            this.elements[this.index].focus(false);
 
         this.index++;
         this.index %= this.elements.length;
 
         if (this.elements[this.index])
-            this.elements[this.index].selected(true);
+            this.elements[this.index].focus(true);
 
         console.log(this.index);
     }
 
     navigateLater() {
         if (this.elements[this.index])
-            this.elements[this.index].selected(false);
+            this.elements[this.index].focus(false);
 
         this.index--;
         if (this.index < 0)
@@ -90,11 +90,18 @@ class HistoryView {
             this.index %= this.elements.length;
 
         if (this.elements[this.index])
-            this.elements[this.index].selected(true);
+            this.elements[this.index].focus(true);
 
         console.log(this.index);
     }
 
+    resetNavigation() {
+        if (this.elements[this.index])
+            this.elements[this.index].focus(false);
+
+        this.index = -1;
+    }
+
     truncate() {
         while (this.elements.length > HISTORY_MAX_LENGTH)
             this.list.removeChild(this.elements.shift().elem);
diff --git a/res/js/component/historyelement.js b/res/js/component/historyelement.js
index 11f165f..d08ccb1 100644
--- a/res/js/component/historyelement.js
+++ b/res/js/component/historyelement.js
@@ -2,8 +2,9 @@ class HistoryElement {
     constructor(query) {
         this.query = query;
         this.render();
-        this.elem.addEventListener('click', () => {
-            window.location.href = '#' + encodeURIComponent(this.query);
+        this.elem.addEventListener('mousedown', event => {
+            statehandler.replace(this.query);
+            event.preventDefault();
         });
     }
     render() {
@@ -18,7 +19,7 @@ class HistoryElement {
             return $$a;
         }.call(this);
     }
-    selected(value) {
-        this.elem.classList.toggle('selected', value);
+    focus(focus) {
+        this.elem.classList.toggle('focus', focus);
     }
 }
\ No newline at end of file
diff --git a/res/js/component/historyelement.jsx b/res/js/component/historyelement.jsx
index 567c1d6..047c6d7 100644
--- a/res/js/component/historyelement.jsx
+++ b/res/js/component/historyelement.jsx
@@ -3,8 +3,9 @@ class HistoryElement {
         this.query = query;
 
         this.render();
-        this.elem.addEventListener("click", () => {
-            window.location.href = "#"+encodeURIComponent(this.query);
+        this.elem.addEventListener("mousedown", (event) => {
+            statehandler.replace(this.query);
+            event.preventDefault();
         });
     }
 
@@ -17,7 +18,7 @@ class HistoryElement {
         );
     }
 
-    selected(value) {
-        this.elem.classList.toggle("selected", value);
+    focus(focus) {
+        this.elem.classList.toggle("focus", focus);
     }
 }
\ No newline at end of file
diff --git a/res/js/component/nav.js b/res/js/component/nav.js
index bdbb562..7244de9 100644
--- a/res/js/component/nav.js
+++ b/res/js/component/nav.js
@@ -31,10 +31,13 @@ class Navigation extends Component {
                 var $$h = document.createElement('input');
                 $$h.setAttribute('class', 'search');
                 $$h.setAttribute('placeholder', translation.search);
-                $$h.setAttribute('type', 'text');
+                $$h.setAttribute('type', 'search');
                 $$h.setAttribute('autoComplete', 'off');
                 $$h.addEventListener('focus', () => this.elem.classList.add('focus'));
-                $$h.addEventListener('blur', () => this.elem.classList.remove('focus'));
+                $$h.addEventListener('blur', () => {
+                    this.elem.classList.remove('focus');
+                    this.historyView.resetNavigation();
+                });
                 $$h.addEventListener('keydown', e => this.inputKeyDown(e));
                 return $$h;
             }.call(this));
@@ -63,12 +66,12 @@ class Navigation extends Component {
             event.preventDefault();
             break;
         case 'Enter':
-            this.sendEvent('search', [this.historyView.index === -1 ? this.input.value : this.historyView.elements[this.historyView.index].query]);
-            this.input.blur();
+            statehandler.replace(this.historyView.index === -1 ? this.input.value : this.historyView.elements[this.historyView.index].query);
             event.preventDefault();
             break;
         case 'Escape':
             this.input.blur();
+            this.historyView.resetNavigation();
             event.preventDefault();
             break;
         }
diff --git a/res/js/component/nav.jsx b/res/js/component/nav.jsx
index 9c659a0..2837f5d 100644
--- a/res/js/component/nav.jsx
+++ b/res/js/component/nav.jsx
@@ -19,10 +19,13 @@ class Navigation extends Component {
                         <div className="searchBar">
                             <p className="icon">search</p>
                             {this.input = (
-                                <input className="search" placeholder={translation.search} type="text"
+                                <input className="search" placeholder={translation.search} type="search"
                                        autoComplete="off"
                                        onFocus={() => this.elem.classList.add("focus")}
-                                       onBlur={() => this.elem.classList.remove("focus")}
+                                       onBlur={() => {
+                                           this.elem.classList.remove("focus");
+                                           this.historyView.resetNavigation();
+                                       }}
                                        onKeyDown={(e) => this.inputKeyDown(e)}
                                 />
                             )}
@@ -49,12 +52,12 @@ class Navigation extends Component {
                 event.preventDefault();
                 break;
             case "Enter":
-                this.sendEvent("search", [this.historyView.index === -1 ? this.input.value : this.historyView.elements[this.historyView.index].query]);
-                this.input.blur();
+                statehandler.replace(this.historyView.index === -1 ? this.input.value : this.historyView.elements[this.historyView.index].query);
                 event.preventDefault();
                 break;
             case "Escape":
                 this.input.blur();
+                this.historyView.resetNavigation();
                 event.preventDefault();
                 break;
         }
diff --git a/res/js/component/urlbar.js b/res/js/component/urlbar.js
deleted file mode 100644
index 76108a0..0000000
--- a/res/js/component/urlbar.js
+++ /dev/null
@@ -1,24 +0,0 @@
-class UrlBar extends Component {
-    constructor() {
-        super();
-        window.addEventListener("hashchange", (e) => {
-            this.sendEvent("search", [this.get()]);
-        });
-    }
-
-    set(value) {
-        window.location.hash = value;
-    }
-
-    init() {
-        this.sendEvent("search", [this.get()]);
-    }
-
-    get() {
-        return decodeURIComponent(window.location.hash.substr(1));
-    }
-
-    clear() {
-        this.set("");
-    }
-}
\ No newline at end of file
diff --git a/res/js/util/statehandler.js b/res/js/util/statehandler.js
new file mode 100644
index 0000000..3115fd9
--- /dev/null
+++ b/res/js/util/statehandler.js
@@ -0,0 +1,34 @@
+class StateHandler extends Component {
+    constructor() {
+        super();
+        window.addEventListener("hashchange", () => {
+            this.sendEvent("update", [this.state]);
+        });
+    }
+
+    init() {
+        this.update();
+    }
+
+    replace(value) {
+        history.replaceState(null, null, "#"+encodeURIComponent(value));
+        this.update();
+    }
+
+    push(value) {
+        history.pushState(null, null, "#"+encodeURIComponent(value));
+        this.update();
+    }
+
+    update() {
+        const oldState = this.state;
+        this.state = decodeURIComponent(window.location.hash.substr(1));
+
+        if (this.state !== oldState)
+            this.sendEvent("update", [this.state]);
+    }
+
+    clear() {
+        this.replace("");
+    }
+}
\ No newline at end of file
diff --git a/res/search.js b/res/search.js
deleted file mode 100644
index 6091cae..0000000
--- a/res/search.js
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
-var state = {
-    query: "",
-    selected_history_entry: -1,
-    buffers: {},
-    open: []
-};
-
-var bind_click = function (elem, handler) {
-    elem.unbind("mousedown");
-    elem.unbind("mouseup");
-
-    elem.mousedown(function (e) {
-        getSelection().removeAllRanges();
-    });
-
-    elem.mouseup(function (e) {
-        if (e.which === 1 && getSelection().isCollapsed)
-            handler(e);
-    });
-};
-
-var make_select_buffer = function (buffer, id) {
-    state.buffers[buffer].selected = true;
-    apply_selection();
-};
-
-var make_select_context = function (buffer, id) {
-    state.buffers[buffer].selected = true;
-    state.buffers[buffer].contexts[id].selected = true;
-    apply_selection();
-};
-
-var search_history = {
-    max_size: 8,
-    get: function () {
-        return (JSON.parse(localStorage.getItem('history')) || []).reverse();
-    },
-    clear: function () {
-        localStorage.removeItem('history');
-    },
-    push: function (query) {
-        if (!query)
-            return;
-
-        var tmp = search_history.get().filter(function (x) {
-            return x != query;
-        }).reverse();
-        tmp.push(query);
-        localStorage.setItem('history', JSON.stringify(tmp.slice(Math.max(0, tmp.length - search_history.max_size))));
-    }
-};
-
-var render = {
-    overview: function (ids) {
-        $("#results").children().remove();
-
-        for (var i = 0; i < ids.length; i++) {
-            var buffer = ids[i];
-
-            if (!state.buffers.hasOwnProperty(buffer.bufferid)) {
-                var ctx = 0;
-                state.buffers[buffer.bufferid] = {
-                    id: buffer.bufferid,
-                    name: buffer.buffername,
-                    network: buffer.networkname,
-                    selected: false,
-                    contexts: buffer.messages.map(function (message) {
-                        return {
-                            "selected": false,
-                            "original": message,
-                            "before": [],
-                            "after": [],
-                            "buffer": buffer.bufferid,
-                            "id": ctx++
-                        };
-                    }),
-                    offset: 0
-                }
-            }
-
-            render.buffer.update(buffer.bufferid);
-        }
-
-        if (ids.length == 0)
-            render.no_more();
-    },
-    buffer: {
-        full: function (buffer) {
-            return (
-                "<buffer id='buffer" + buffer.id + "' data-bufferid='" + buffer.id + "'>" + (
-                    "<h2>" + buffer.network + " – " + buffer.name + "</h2>" +
-                    "<article>" + (
-                        buffer.contexts.map(render.context.full).join("") +
-                        "<inline-button class='load_more'>" + translation.results.load_more + "</inline-button>"
-                    ) + "</article>"
-                ) + "</buffer>"
-            )
-        },
-        update: function (id) {
-            $("#buffer" + id).unbind();
-            var renderedBuffer = render.buffer.full(state.buffers[id]);
-            if ($("#buffer" + id).length)
-                $("#buffer" + id).replaceWith(renderedBuffer);
-            else
-                $("#results").append(renderedBuffer);
-
-            render.buffer.attach($("#buffer" + id));
-        },
-        attach: function (elem) {
-            elem.unbind();
-            var id = elem.data("bufferid");
-            bind_click(elem, make_toggle_buffer(id));
-            bind_click(elem.find(".load_more"), function (e) {
-                e.stopPropagation();
-
-                if (state.buffers[id].selected || state.buffers[id].contexts.length <= 4)
-                    load.buffer.more(id);
-
-                deselect_buffers(id);
-                state.open.push(make_toggle_buffer(id));
-                state.buffers[id].selected = true;
-            });
-            state.buffers[id].contexts.forEach(function (context) {
-                var ctx = elem.find("#context" + context.id);
-                if (ctx.length) {
-                    ctx.unbind();
-                    render.context.attach(ctx);
-                }
-            })
-        }
-    },
-    context: {
-        full: function (context) {
-            return (
-                "<context id='context" + context.id + "' data-contextid='" + context.id + "' data-bufferid='" + context.buffer + "'>" + (
-                    "<div class='before'>" +(
-                        "<inline-button class='load_before'>" + translation.context.load_earlier + "</inline-button>" +
-                        context.before.map(render.message).join("")
-                    ) + "</div>" +
-                    render.message(context.original, true) +
-                    "<div class='after'>" +(
-                        context.after.map(render.message).join("")
-                        + "<inline-button class='load_after'>" + translation.context.load_later + "</inline-button>"
-                    ) + "</div>"
-                ) + "</context>"
-            )
-        },
-        attach: function (elem) {
-            elem.unbind();
-            var id = elem.data("contextid");
-            var bufferid = elem.data("bufferid");
-            if (state.buffers[bufferid] === undefined) {
-                console.log("Undefined buffer: " + bufferid);
-            }
-
-            bind_click(elem, function (e) {
-                e.stopPropagation();
-            });
-            $("#message" + state.buffers[bufferid].contexts[id].original.messageid).unbind();
-            bind_click($("#message" + state.buffers[bufferid].contexts[id].original.messageid), make_toggle_context(bufferid, id));
-            bind_click(elem.find(".load_before"), function (e) {
-                e.stopPropagation();
-
-                load.context.earlier(bufferid, id, 5);
-            });
-            bind_click(elem.find(".load_after"), function (e) {
-                e.stopPropagation();
-
-                load.context.later(bufferid, id, 5);
-            });
-        }
-    },
-    message: function (message, highlight, preview) {
-        var content = preview === true ? message.preview : message.message;
-        return (
-            "<message id='message" + message.messageid + "' data-messageid='" + message.messageid + "' " + (highlight === true ? "class='original'" : "") + ">" + (
-                "<time>" + new Date(message.time.replace(" ", "T") + "Z").toLocaleString() + "</time>" +
-                "<div class='container'>" + (
-                    "<sender style='color: " + sendercolor(message.sender.split("!")[0]) + "'>" + message.sender.split("!")[0] + "</sender>" +
-                    "<content>" + content + "</content>"
-                ) + "</div>"
-            ) + "</message>"
-        )
-    },
-    history: {
-        all: function (history) {
-            var container = $("#autocomplete ul");
-            container.children().remove();
-
-            for (var i = 0; i < history.length; i++) {
-                container.append(render.history.item(i, history[i]));
-                render.history.attach($("#history" + i));
-            }
-            if (history.length == 0) {
-                container.append("<p>" + translation.history.error_unavailable + "</p>");
-            }
- "<li id='history" + id + "' data-query='" + btoa(query) + "'>" + (
- "<span class='icon'>history</span>" +
- query
- ) + "</li>"
-        },
-        item: function (id, query) {
-            return (
-                "<li id='history" + id + "' data-query='" + btoa(query) + "'>" + (
-                    "<span class='icon'>history</span>" +
-                    query
-                ) + "</li>"
-            )
-        },
-        attach: function (elem) {
-            elem.unbind();
-            var query = atob(elem.data("query"));
-            bind_click(elem, function (e) {
-                e.stopPropagation();
-
-                $("#q").val(query);
-                search();
-            });
-        }
-    },
-    loader: function () {
-        $("#results").append("  <div class='loader'><svg class='circular' viewBox='25 25 50 50'><circle class='path' cx='50' cy='50' r='20' fill='none' stroke-width='4' stroke-miterlimit='10'/></svg></div>");
-    },
-    no_more: function () {
-        $("#results").append("<div id='no_more'><img src='res/error.png'><h2>No results</h2></div>");
-    }
-};
-
-var load = {
-    overview: function (query, callback) {
-        $.post("web/search/?" + $.param({"query": query}), callback, "json");
-    },
-    buffer: {
-        raw: function (query, buffer, offset, limit, callback) {
-            $.post("web/searchbuffer/?" + $.param({
-                    "query": query,
-                    "buffer": buffer,
-                    "offset": offset,
-                    "limit": limit
-                }), callback, "json");
-        },
-        more: function (id, limit) {
-            if (limit === undefined)
-                limit = 10;
-
-            load.buffer.raw(state.query, id, state.buffers[id].contexts.length, limit, function (data) {
-                var ctx = state.buffers[id].contexts.length;
-                state.buffers[id].contexts = state.buffers[id].contexts.concat(data.map(function (message) {
-                    return {
-                        "selected": false,
-                        "original": message,
-                        "before": [],
-                        "after": [],
-                        "buffer": id,
-                        "id": ctx++
-                    };
-                }));
-            });
-        }
-    },
-    context: {
-        raw: function (msg, buffer, before, after, callback) {
-            $.post("web/backlog/?" + $.param({
-                    "anchor": msg,
-                    "buffer": buffer,
-                    "before": before,
-                    "after": after
-                }), callback, "json");
-        },
-        earlier: function (bufferid, contextid, amount) {
-            var buffer = state.buffers[bufferid];
-            var context = buffer.contexts[contextid];
-            var earliest = (context.before[0] || context.original).messageid;
-            load.context.raw(earliest, bufferid, amount, 0, function (messages) {
-                var newmsgs = messages.slice(0, messages.length - 1);
-                context.before = newmsgs.concat(context.before);
-                $("#buffer"+bufferid+" #context"+contextid+" .before .load_before").after(newmsgs.map(render.message).join(""))
-            })
-        },
-        later: function (bufferid, contextid, amount) {
-            var buffer = state.buffers[bufferid];
-            var context = buffer.contexts[contextid];
-            var latest = (context.after[context.after.length - 1] || context.original).messageid;
-            load.context.raw(latest, bufferid, 0, amount, function (messages) {
-                var newmsgs = messages.slice(1);
-                context.after = context.after.concat(newmsgs);
-                $("#buffer"+bufferid+" #context"+contextid+" .after .load_after").before(newmsgs.map(render.message).join(""))
-            })
-        }
-    }
-};
-
-var search = function () {
-    var results = $("#results");
-    results.children().remove();
-    $("#q").blur();
-    bind_click(results, deselect_buffers);
-    state = {
-        "query": $("#q").val(),
-        "selected_history_entry": -1,
-        "buffers": {},
-        "open": []
-    };
-    window.location = "#" + encodeURIComponent(state.query);
-    if (state.query) {
-        render.loader();
-        load.overview(state.query, render.overview);
-        search_history.push(state.query);
-        render.history.all(search_history.get());
-    }
-};
-
-var deselect_buffers = function (except) {
-    $.each(state.buffers, function (key, buffer) {
-        if (key !== except && buffer.selected) {
-            buffer.selected = false;
-            unselect_contexts(key);
-        }
-    });
-    state.open = [];
-};
-
-var unselect_contexts = function (bufferid) {
-    state.buffers[bufferid].contexts.forEach(function (context) {
-        context.selected = false;
-    })
-};
-
-var make_toggle_buffer = function (id) {
-    return function (e) {
-        console.log("toggle buffer " + id);
-
-        e.stopPropagation();
-
-        if (state.buffers[id].selected) {
-            deselect_buffers();
-            state.open.pop();
-            state.buffers[id].selected = false;
-        } else {
-            deselect_buffers(id);
-            state.open.push(make_toggle_buffer(id));
-            state.buffers[id].selected = true;
-        }
-        apply_selection();
-    }
-};
-
-var make_toggle_context = function (buffer, id) {
-    return function (e) {
-        console.log("toggle_context " + buffer + " " + id);
-
-        e.stopPropagation();
-
-        var context = state.buffers[buffer].contexts[id];
-        if (context.selected) {
-            unselect_contexts(buffer);
-            context.selected = false;
-            state.open.pop();
-        } else {
-            deselect_buffers(buffer);
-            unselect_contexts(buffer);
-            if (!state.buffers[buffer].selected) {
-                state.open.push(make_toggle_buffer(buffer));
-                state.buffers[buffer].selected = true;
-            }
-            context.selected = true;
-            state.open.push(make_toggle_context(buffer, id));
-            if (context.before.length === 0) load.context.earlier(buffer, id, 5);
-            if (context.after.length === 0) load.context.later(buffer, id, 5);
-        }
-        apply_selection();
-    }
-};
-
-var apply_selection = function () {
-    $.each(state.buffers, function (key, buffer) {
-        $("#buffer"+key).toggleClass("selected", state.buffers[key].selected);
-        state.buffers[key].contexts.map(function (ctx) {
-            $("#buffer"+key+" #context"+ctx.id).toggleClass("selected", ctx.selected);
-        })
-    });
-};
-
-var hashChange = function () {
-    var input = $("#q");
-    var newquery = decodeURIComponent(location.hash.substr(1));
-    if (input.val() != newquery) {
-        input.val(newquery);
-        search();
-    }
-};
-
-var init = function () {
-    $("body").on("click", function (e) {
-        if (state.open.length)
-            state.open[state.open.length - 1](e);
-    });
-
-    $("nav").on("click", function (e) {
-        e.stopPropagation();
-    });
-
-    $(window).on("hashchange", hashChange);
-
-
-
-    $("#q").on("focus", function () {
-        $("#autocomplete").addClass("active");
-        $("#results").addClass("hidden");
-        $("nav").addClass("search");
-    });
-    $("#q").on("blur", function () {
-        $("#autocomplete").removeClass("active");
-        $("#results").removeClass("hidden");
-        $("nav").removeClass("search");
-    });
-
-    hashChange();
-    render.history.all(search_history.get());
-};
-init();
-
- $("#q").on("keypress", function (e) {
- const key = e.which || e.keyCode;
- if (key === 13) {
- search();
- }
-
- const index_before = historyHandler.index;
- if (key === 40) {
- historyHandler.navigateBefore();
- } else if (key === 38) {
- historyHandler.navigateLater();
- }
- if (index_before != historyHandler.index) {
- $("[data-history="+index_before+"]").removeClass("selected");
- $("[data-history="+historyHandler.index+"]").addClass("selected");
- }
- });
-*/
\ No newline at end of file
diff --git a/templates/search.phtml b/templates/search.phtml
index 0491b77..6ee22ff 100644
--- a/templates/search.phtml
+++ b/templates/search.phtml
@@ -24,6 +24,7 @@
 <script src="res/js/util/component.js"></script>
 <script src="res/js/util/mirccolorhandler.js"></script>
 <script src="res/js/util/sendercolorhandler.js"></script>
+<script src="res/js/util/statehandler.js"></script>
 <script src="res/js/component/nohistoryelement.js"></script>
 <script src="res/js/component/historyelement.js"></script>
 <script src="res/js/component/history.js"></script>
@@ -33,7 +34,6 @@
 <script src="res/js/component/loadmore.js"></script>
 <script src="res/js/component/context.js"></script>
 <script src="res/js/component/buffer.js"></script>
-<script src="res/js/component/urlbar.js"></script>
 <script src="res/js/app.js"></script>
 </body>
 </html>
diff --git a/translations/de.json b/translations/de.json
index 190ad83..f093b2c 100644
--- a/translations/de.json
+++ b/translations/de.json
@@ -1,24 +1,28 @@
 {
+  "buffer": {
+    "open": "Öffnen",
+    "close": "Schließen"
+  },
   "results": {
-    "show_more": "Show More Results",
-    "load_more": "Load More Results"
+    "show_more": "Mehr Suchergebnisse anzeigen",
+    "load_more": "Mehr Suchergebnisse laden"
   },
   "context": {
-    "load_later": "Load Later Context",
-    "load_earlier": "Load Earlier Context"
+    "load_later": "Ältere Nachrichten Laden",
+    "load_earlier": "Neuere Nachrichten Laden"
   },
   "history": {
-    "error_unavailable": "No search history available"
+    "error_unavailable": "Keine vorherigen Suchbegriffe vorhanden"
   },
   "login": {
-    "description": "You have to login to access this page",
+    "description": "Sie müssen sich einloggen, um diese Seite zu nutzen",
     "username": "Benutzername",
     "password": "Passwort",
     "submit": "Anmelden",
     "message": {
-      "success_logout": "You have successfully logged out.",
-      "error_invalid": "Invalid username/password combination.",
-      "error_unauthed": "You need to be logged in to access this page."
+      "success_logout": "Sie haben sich erfolgreich abgemeldet.",
+      "error_invalid": "Falsche Benutzername/Passwort Kombination",
+      "error_unauthed": "Sie müssen angemeldet sein, um diese Seite zu nutzen."
     }
   },
   "search": "Suchen",
diff --git a/translations/en.json b/translations/en.json
index 1d63a05..f115dba 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -1,4 +1,8 @@
 {
+  "buffer": {
+    "open": "Open",
+    "close": "Close"
+  },
   "results": {
     "show_more": "Show More Results",
     "load_more": "Load More Results"
-- 
GitLab