1
0
mirror of https://github.com/taigrr/homer synced 2025-01-18 04:53:12 -08:00

Merge pull request #27 from traeblain/feature-burger

Added Hamburger Menu for small screens per Bulma spec.
This commit is contained in:
Bastien Wirtz 2020-03-17 22:17:07 -07:00 committed by GitHub
commit 2cf93f3881
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 389 additions and 272 deletions

441
app.css
View File

@ -1,190 +1,260 @@
@charset "UTF-8";
/* raleway-regular - latin */ /* raleway-regular - latin */
@font-face { @font-face {
font-family: 'Raleway'; font-family: "Raleway";
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
font-display: swap; font-display: swap;
src: local("Raleway"), local("Raleway-Regular"), url("./webfonts/raleway/raleway-v14-latin-regular.woff2") format("woff2"), url("./webfonts/raleway/raleway-v14-latin-regular.woff") format("woff"); src: local("Raleway"), local("Raleway-Regular"), url("./webfonts/raleway/raleway-v14-latin-regular.woff2") format("woff2"), url("./webfonts/raleway/raleway-v14-latin-regular.woff") format("woff");
/* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
/* lato-regular - latin */ /* lato-regular - latin */
@font-face { @font-face {
font-family: 'Lato'; font-family: "Lato";
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
font-display: swap; font-display: swap;
src: local("Lato Regular"), local("Lato-Regular"), url("./webfonts/lato/lato-v16-latin-regular.woff2") format("woff2"), url("./webfonts/lato/lato-v16-latin-regular.woff") format("woff"); src: local("Lato Regular"), local("Lato-Regular"), url("./webfonts/lato/lato-v16-latin-regular.woff2") format("woff2"), url("./webfonts/lato/lato-v16-latin-regular.woff") format("woff");
/* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
html { html {
height: 100%; } height: 100%;
}
body { body {
font-family: 'Raleway', sans-serif; font-family: "Raleway", sans-serif;
height: 100%; } height: 100%;
body #app { }
body #app {
min-height: 100%; min-height: 100%;
transition: background-color cubic-bezier(0.165, 0.84, 0.44, 1) 300ms; transition: background-color cubic-bezier(0.165, 0.84, 0.44, 1) 300ms;
background-color: #f5f5f5; background-color: #f5f5f5;
color: #363636; } color: #363636;
body #app a:hover { }
color: #363636; } body #app a:hover {
body #app .title { color: #363636;
color: #303030; } }
body #app .subtitle { body #app .title {
color: #424242; } color: #303030;
body #app .card { }
body #app .subtitle {
color: #424242;
}
body #app .card {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1); } box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
body #app .card:hover { }
background-color: #ffffff; } body #app .card:hover {
body #app .footer {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1); } }
@media (prefers-color-scheme: light), (prefers-color-scheme: no-preference) { body #app .footer {
background-color: #ffffff;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
}
@media (prefers-color-scheme: light), (prefers-color-scheme: no-preference) {
body #app { body #app {
background-color: #f5f5f5; background-color: #f5f5f5;
color: #363636; } color: #363636;
}
body #app a:hover { body #app a:hover {
color: #363636; } color: #363636;
}
body #app .title { body #app .title {
color: #303030; } color: #303030;
}
body #app .subtitle { body #app .subtitle {
color: #424242; } color: #424242;
}
body #app .card { body #app .card {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1); } box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
}
body #app .card:hover { body #app .card:hover {
background-color: #ffffff; } background-color: #ffffff;
}
body #app .footer { body #app .footer {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1); } } box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
@media (prefers-color-scheme: dark) { }
}
@media (prefers-color-scheme: dark) {
body #app { body #app {
background-color: #131313; background-color: #131313;
color: #eaeaea; } color: #eaeaea;
}
body #app a:hover { body #app a:hover {
color: #ffdd57; } color: #ffdd57;
}
body #app .title { body #app .title {
color: #fafafa; } color: #fafafa;
}
body #app .subtitle { body #app .subtitle {
color: #f5f5f5; } color: #f5f5f5;
}
body #app .card { body #app .card {
background-color: #2b2b2b; background-color: #2b2b2b;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.4); } box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.4);
}
body #app .card:hover { body #app .card:hover {
background-color: #2b2b2b; } background-color: #2b2b2b;
}
body #app .footer { body #app .footer {
background-color: #2b2b2b; background-color: #2b2b2b;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.4); } } box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.4);
body #app.is-light { }
}
body #app.is-light {
background-color: #f5f5f5; background-color: #f5f5f5;
color: #363636; } color: #363636;
body #app.is-light a:hover { }
color: #363636; } body #app.is-light a:hover {
body #app.is-light .title { color: #363636;
color: #303030; } }
body #app.is-light .subtitle { body #app.is-light .title {
color: #424242; } color: #303030;
body #app.is-light .card { }
body #app.is-light .subtitle {
color: #424242;
}
body #app.is-light .card {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1); } box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
body #app.is-light .card:hover { }
background-color: #ffffff; } body #app.is-light .card:hover {
body #app.is-light .footer {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1); } }
body #app.is-dark { body #app.is-light .footer {
background-color: #ffffff;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
}
body #app.is-dark {
background-color: #131313; background-color: #131313;
color: #eaeaea; } color: #eaeaea;
body #app.is-dark a:hover { }
color: #ffdd57; } body #app.is-dark a:hover {
body #app.is-dark .title { color: #ffdd57;
color: #fafafa; } }
body #app.is-dark .subtitle { body #app.is-dark .title {
color: #f5f5f5; } color: #fafafa;
body #app.is-dark .card { }
body #app.is-dark .subtitle {
color: #f5f5f5;
}
body #app.is-dark .card {
background-color: #2b2b2b; background-color: #2b2b2b;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.4); } box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.4);
body #app.is-dark .card:hover { }
background-color: #2b2b2b; } body #app.is-dark .card:hover {
body #app.is-dark .footer {
background-color: #2b2b2b; background-color: #2b2b2b;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.4); } }
body h1, body h2, body h3, body h4, body h5, body h6 { body #app.is-dark .footer {
font-family: 'Lato', sans-serif; } background-color: #2b2b2b;
body h1 { box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.4);
font-size: 2rem; } }
body h2 { body h1, body h2, body h3, body h4, body h5, body h6 {
font-family: "Lato", sans-serif;
}
body h1 {
font-size: 2rem;
}
body h2 {
font-size: 1.7rem; font-size: 1.7rem;
margin-top: 2rem; margin-top: 2rem;
margin-bottom: 1rem; } margin-bottom: 1rem;
body h2 .fas, body h2 .fab, body h2 .far { }
margin-right: 10px; } body h2 .fas, body h2 .fab, body h2 .far {
body h2 span { margin-right: 10px;
}
body h2 span {
font-weight: bold; font-weight: bold;
color: #4285f4; } color: #4285f4;
body [v-cloak] { }
display: none; } body [v-cloak] {
body #bighead { display: none;
color: #ffffff; } }
body #bighead .dashboard-title { body #bighead {
padding: 6px 0 0 80px; } color: #ffffff;
body #bighead .first-line { }
body #bighead .dashboard-title {
padding: 6px 0 0 80px;
}
body #bighead .first-line {
height: 100px; height: 100px;
vertical-align: center; vertical-align: center;
background-color: #3367d6; } background-color: #3367d6;
body #bighead .first-line h1 { }
body #bighead .first-line h1 {
margin-top: -12px; margin-top: -12px;
font-size: 2rem; } font-size: 2rem;
body #bighead .first-line .headline { }
body #bighead .first-line .headline {
margin-top: 5px; margin-top: 5px;
font-size: 0.9rem; } font-size: 0.9rem;
body #bighead .first-line .container { }
body #bighead .first-line .container {
height: 80px; height: 80px;
padding: 10px 0; } padding: 10px 0;
body #bighead .first-line .logo { }
float: left; } body #bighead .first-line .logo {
body #bighead .first-line .logo i { float: left;
}
body #bighead .first-line .logo i {
vertical-align: top; vertical-align: top;
padding: 8px 15px; padding: 8px 15px;
font-size: 50px; } font-size: 50px;
body #bighead .first-line .logo img { }
body #bighead .first-line .logo img {
padding: 10px; padding: 10px;
max-height: 70px; max-height: 70px;
max-width: 70px; } max-width: 70px;
body #bighead .navbar { }
background-color: #4285f4; } body #bighead .navbar, body #bighead .navbar-menu {
body #bighead .navbar a { background-color: #4285f4;
color: #ffffff; } }
body #bighead .navbar a:hover, body #bighead .navbar a:focus { body #bighead .navbar a, body #bighead .navbar-menu a {
color: #ffffff; color: #ffffff;
background-color: #5a95f5; } }
body #main-section { body #bighead .navbar a:hover, body #bighead .navbar a:focus, body #bighead .navbar-menu a:hover, body #bighead .navbar-menu a:focus {
color: #ffffff;
background-color: #5a95f5;
}
body #bighead .navbar-end {
text-align: right;
}
body #main-section {
margin-bottom: 2rem; margin-bottom: 2rem;
padding: 0; } padding: 0;
body #main-section h2 { }
body #main-section h2 {
border-bottom: 1px dashed #ccc; border-bottom: 1px dashed #ccc;
padding-bottom: 10px; } padding-bottom: 10px;
body #main-section .title { }
font-size: 1.1em; } body #main-section .title {
body #main-section .subtitle { font-size: 1.1em;
font-size: .9em; }
body #main-section .subtitle {
font-size: 0.9em;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; } text-overflow: ellipsis;
body #main-section .container { }
padding: 1.2rem .75rem; } body #main-section .container {
body #main-section .message { padding: 1.2rem 0.75rem;
}
body #main-section .message {
margin-top: 45px; margin-top: 45px;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1); } box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
body #main-section .message .message-header { }
font-weight: bold; } body #main-section .message .message-header {
body #main-section .message .message-body { font-weight: bold;
border: none; } }
body .media-content { body #main-section .message .message-body {
overflow: inherit; } border: none;
body .tag { }
body .media-content {
overflow: inherit;
}
body .tag {
color: #4285f4; color: #4285f4;
background-color: #4285f4; background-color: #4285f4;
position: absolute; position: absolute;
@ -193,34 +263,45 @@ body {
width: 3px; width: 3px;
overflow: hidden; overflow: hidden;
transition: all 0.2s ease-out; transition: all 0.2s ease-out;
padding: 0; } padding: 0;
body .tag .tag-text { }
display: none; } body .tag .tag-text {
body .card { display: none;
}
body .card {
border-radius: 5px; border-radius: 5px;
border: none; border: none;
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1); box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
transition: cubic-bezier(0.165, 0.84, 0.44, 1) 300ms; } transition: cubic-bezier(0.165, 0.84, 0.44, 1) 300ms;
body .card a { }
outline: none; } body .card a {
body .card:hover { outline: none;
transform: translate(0, -3px); } }
body .card:hover .tag { body .card:hover {
transform: translate(0, -3px);
}
body .card:hover .tag {
width: auto; width: auto;
color: #ffffff; color: #ffffff;
padding: 0 0.75em; } padding: 0 0.75em;
body .card:hover .tag .tag-text { }
display: block; } body .card:hover .tag .tag-text {
body .card-content { display: block;
}
body .card-content {
height: 85px; height: 85px;
padding: 1.3rem; } padding: 1.3rem;
body .layout-vertical .card { }
border-radius: 0; } body .layout-vertical .card {
body .layout-vertical .column div:first-of-type .card { border-radius: 0;
border-radius: 5px 5px 0 0; } }
body .layout-vertical .column div:last-child .card { body .layout-vertical .column div:first-of-type .card {
border-radius: 0 0 5px 5px; } border-radius: 5px 5px 0 0;
body .footer { }
body .layout-vertical .column div:last-child .card {
border-radius: 0 0 5px 5px;
}
body .footer {
position: fixed; position: fixed;
left: 0; left: 0;
right: 0; right: 0;
@ -229,49 +310,63 @@ body {
text-align: left; text-align: left;
color: #676767; color: #676767;
font-size: 0.85rem; font-size: 0.85rem;
transition: background-color cubic-bezier(0.165, 0.84, 0.44, 1) 300ms; } transition: background-color cubic-bezier(0.165, 0.84, 0.44, 1) 300ms;
body .no-footer #main-section { }
margin-bottom: 0; } body .no-footer #main-section {
body .no-footer .footer { margin-bottom: 0;
display: none; } }
body .search-bar { body .no-footer .footer {
display: none;
}
body .search-bar {
position: relative; position: relative;
display: inline-block; } display: inline-block;
body .search-bar #search { }
body .search-bar #search {
border: none; border: none;
background-color: #5f98f6; background-color: #5f98f6;
border-radius: 5px; border-radius: 5px;
padding: 2px 12px 2px 30px; padding: 2px 12px 2px 30px;
margin: 10px 0; margin: 0 0 0 12px;
transition: all 100ms linear; transition: all 100ms linear;
color: #ffffff; color: #ffffff;
height: 30px; height: 30px;
width: 100px; } width: 100px;
body .search-bar #search:focus { }
body .search-bar #search:focus {
color: #000000; color: #000000;
width: 250px; width: 250px;
background-color: #ffffff; } background-color: #ffffff;
body .search-bar .search-label::before { }
font-family: 'Font Awesome 5 Free'; body .search-bar .search-label::before {
font-family: "Font Awesome 5 Free";
position: absolute; position: absolute;
top: 12px; top: 4px;
left: 8px; left: 16px;
content: "\f002"; content: "";
font-weight: 900; font-weight: 900;
width: 20px; width: 20px;
height: 20px; } height: 20px;
body .search-bar:focus-within .search-label::before { color: #ffffff;
color: #4a4a4a; } }
body .icon-button { body .search-bar:focus-within .search-label::before {
display: inline-block; } color: #4a4a4a;
body .offline-message { }
body .icon-button {
display: inline-block;
padding: 0 12px;
}
body .offline-message {
text-align: center; text-align: center;
margin: 35px 0; } margin: 35px 0;
body .offline-message i { }
font-size: 2rem; } body .offline-message i {
body .offline-message i.fa-redo-alt { font-size: 2rem;
}
body .offline-message i.fa-redo-alt {
font-size: 1.3rem; font-size: 1.3rem;
line-height: 1rem; line-height: 1rem;
vertical-align: middle; vertical-align: middle;
cursor: pointer; cursor: pointer;
color: #3273dc; } color: #3273dc;
}

6
app.js
View File

@ -5,7 +5,8 @@ const app = new Vue({
offline: false, offline: false,
filter: '', filter: '',
vlayout: true, vlayout: true,
isDark: null isDark: null,
showMenu: false
}, },
created: async function () { created: async function () {
let that = this; let that = this;
@ -81,6 +82,9 @@ const app = new Vue({
this.vlayout = !this.vlayout; this.vlayout = !this.vlayout;
localStorage.vlayout = this.vlayout; localStorage.vlayout = this.vlayout;
}, },
toggleMenu: function() {
this.showMenu = !this.showMenu;
}
} }
}); });

View File

@ -175,7 +175,7 @@ body {
} }
} }
} }
.navbar { .navbar, .navbar-menu {
background-color: $secondary-color; background-color: $secondary-color;
a { a {
@ -186,6 +186,9 @@ body {
} }
} }
} }
.navbar-end {
text-align: right;
}
} }
#main-section { #main-section {
@ -320,7 +323,7 @@ body {
background-color: lighten( $secondary-color, 6% ); background-color: lighten( $secondary-color, 6% );
border-radius: 5px; border-radius: 5px;
padding: 2px 12px 2px 30px; padding: 2px 12px 2px 30px;
margin: 10px 0; margin: 0 0 0 12px;
transition: all 100ms linear; transition: all 100ms linear;
color: #ffffff; color: #ffffff;
height: 30px; height: 30px;
@ -337,12 +340,13 @@ body {
.search-label::before { .search-label::before {
font-family: 'Font Awesome 5 Free'; font-family: 'Font Awesome 5 Free';
position: absolute; position: absolute;
top: 12px; top: 4px;
left: 8px; left: 16px;
content: "\f002"; content: "\f002";
font-weight: 900; font-weight: 900;
width: 20px; width: 20px;
height: 20px; height: 20px;
color: #ffffff;
} }
&:focus-within .search-label::before { &:focus-within .search-label::before {
@ -352,6 +356,7 @@ body {
.icon-button { .icon-button {
display: inline-block; display: inline-block;
padding: 0 12px;
} }
.offline-message { .offline-message {

View File

@ -30,20 +30,32 @@
<div v-cloak v-if="config.links" class="container-fluid"> <div v-cloak v-if="config.links" class="container-fluid">
<nav class="navbar" role="navigation" aria-label="main navigation"> <nav class="navbar" role="navigation" aria-label="main navigation">
<div class="container"> <div class="container">
<div class="navbar-menu"> <div class="navbar-brand">
<a role="button"
class="navbar-burger" :class="{ 'is-active': showMenu }"
aria-label="menu" aria-expanded="false"
v-on:click="toggleMenu()">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div class="navbar-menu" :class="{ 'is-active': showMenu }">
<div class="navbar-start"> <div class="navbar-start">
<a v-for="link in config.links" class="navbar-item" :href="link.url" :target="link.target"> <a v-for="link in config.links" class="navbar-item" :href="link.url" :target="link.target">
<i v-if="link.icon" style="margin-right: 6px;" :class="link.icon"></i> <i v-if="link.icon" style="margin-right: 6px;" :class="link.icon"></i>
{{ link.name }} {{ link.name }}
</a> </a>
</div> </div>
<div class="end"> <div class="navbar-end">
<div class="navbar-item">
<a <a
v-on:click="toggleTheme()" v-on:click="toggleTheme()"
aria-label="Toggle dark mode" aria-label="Toggle dark mode"
class="icon-button"
><i class="fas fa-adjust"></i> ><i class="fas fa-adjust"></i>
</a> </a>
<a v-on:click="toggleLayout()" class="icon-button navbar-item"><i <a v-on:click="toggleLayout()" class="icon-button"><i
:class="['fas', vlayout ? 'fa-list' : 'fa-columns']"></i></a> :class="['fas', vlayout ? 'fa-list' : 'fa-columns']"></i></a>
<div class="search-bar"> <div class="search-bar">
<label for="search" class="search-label"></label> <label for="search" class="search-label"></label>
@ -52,6 +64,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</nav> </nav>
</div> </div>
</div> </div>