mirror of
https://github.com/iv-org/invidious.git
synced 2025-08-02 02:38:30 +00:00
Responsive Side Menu
A layout example with a side menu that hides on mobile, just like the Pure website.
This commit is contained in:
parent
b9c7501012
commit
7218c70ce8
248
assets/css/side-menu.css
Normal file
248
assets/css/side-menu.css
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
body {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pure-img-responsive {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Add transition to containers so they can push in and out.
|
||||||
|
*/
|
||||||
|
#layout,
|
||||||
|
#menu,
|
||||||
|
.menu-link {
|
||||||
|
-webkit-transition: all 0.2s ease-out;
|
||||||
|
-moz-transition: all 0.2s ease-out;
|
||||||
|
-ms-transition: all 0.2s ease-out;
|
||||||
|
-o-transition: all 0.2s ease-out;
|
||||||
|
transition: all 0.2s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This is the parent `<div>` that contains the menu and the content area.
|
||||||
|
*/
|
||||||
|
#layout {
|
||||||
|
position: relative;
|
||||||
|
left: 0;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
#layout.active #menu {
|
||||||
|
left: 160px;
|
||||||
|
width: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#layout.active .menu-link {
|
||||||
|
left: 160px;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
The content `<div>` is where all your content goes.
|
||||||
|
*/
|
||||||
|
.content {
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0 2em;
|
||||||
|
max-width: 800px;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
line-height: 1.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
margin: 0;
|
||||||
|
color: #333;
|
||||||
|
text-align: center;
|
||||||
|
padding: 2.5em 2em 0;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.header h1 {
|
||||||
|
margin: 0.2em 0;
|
||||||
|
font-size: 3em;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
.header h2 {
|
||||||
|
font-weight: 300;
|
||||||
|
color: #ccc;
|
||||||
|
padding: 0;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-subhead {
|
||||||
|
margin: 50px 0 20px 0;
|
||||||
|
font-weight: 300;
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
The `#menu` `<div>` is the parent `<div>` that contains the `.pure-menu` that
|
||||||
|
appears on the left side of the page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#menu {
|
||||||
|
margin-left: -160px; /* "#menu" width */
|
||||||
|
width: 160px;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 1000; /* so the menu or its navicon stays above all content */
|
||||||
|
background: #191818;
|
||||||
|
overflow-y: auto;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
All anchors inside the menu should be styled like this.
|
||||||
|
*/
|
||||||
|
#menu a {
|
||||||
|
color: #999;
|
||||||
|
border: none;
|
||||||
|
padding: 0.6em 0 0.6em 0.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Remove all background/borders, since we are applying them to #menu.
|
||||||
|
*/
|
||||||
|
#menu .pure-menu,
|
||||||
|
#menu .pure-menu ul {
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Add that light border to separate items into groups.
|
||||||
|
*/
|
||||||
|
#menu .pure-menu ul,
|
||||||
|
#menu .pure-menu .menu-item-divided {
|
||||||
|
border-top: 1px solid #333;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Change color of the anchor links on hover/focus.
|
||||||
|
*/
|
||||||
|
#menu .pure-menu li a:hover,
|
||||||
|
#menu .pure-menu li a:focus {
|
||||||
|
background: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This styles the selected menu item `<li>`.
|
||||||
|
*/
|
||||||
|
#menu .pure-menu-selected,
|
||||||
|
#menu .pure-menu-heading {
|
||||||
|
background: #1f8dd6;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
This styles a link within a selected menu item `<li>`.
|
||||||
|
*/
|
||||||
|
#menu .pure-menu-selected a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This styles the menu heading.
|
||||||
|
*/
|
||||||
|
#menu .pure-menu-heading {
|
||||||
|
font-size: 110%;
|
||||||
|
color: #fff;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- Dynamic Button For Responsive Menu -------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
The button to open/close the Menu is custom-made and not part of Pure. Here's
|
||||||
|
how it works:
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
`.menu-link` represents the responsive menu toggle that shows/hides on
|
||||||
|
small screens.
|
||||||
|
*/
|
||||||
|
.menu-link {
|
||||||
|
position: fixed;
|
||||||
|
display: block; /* show this only on small screens */
|
||||||
|
top: 0;
|
||||||
|
left: 0; /* "#menu width" */
|
||||||
|
background: #000;
|
||||||
|
background: rgba(0,0,0,0.7);
|
||||||
|
font-size: 10px; /* change this value to increase/decrease button size */
|
||||||
|
z-index: 10;
|
||||||
|
width: 2em;
|
||||||
|
height: auto;
|
||||||
|
padding: 2.1em 1.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-link:hover,
|
||||||
|
.menu-link:focus {
|
||||||
|
background: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-link span {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-link span,
|
||||||
|
.menu-link span:before,
|
||||||
|
.menu-link span:after {
|
||||||
|
background-color: #fff;
|
||||||
|
width: 100%;
|
||||||
|
height: 0.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-link span:before,
|
||||||
|
.menu-link span:after {
|
||||||
|
position: absolute;
|
||||||
|
margin-top: -0.6em;
|
||||||
|
content: " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-link span:after {
|
||||||
|
margin-top: 0.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -- Responsive Styles (Media Queries) ------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Hides the menu at `48em`, but modify this based on your app's needs.
|
||||||
|
*/
|
||||||
|
@media (min-width: 48em) {
|
||||||
|
|
||||||
|
.header,
|
||||||
|
.content {
|
||||||
|
padding-left: 2em;
|
||||||
|
padding-right: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#layout {
|
||||||
|
padding-left: 160px; /* left col width "#menu" */
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
#menu {
|
||||||
|
left: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-link {
|
||||||
|
position: fixed;
|
||||||
|
left: 160px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#layout.active .menu-link {
|
||||||
|
left: 160px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 48em) {
|
||||||
|
/* Only apply this when the window is small. Otherwise, the following
|
||||||
|
case results in extra padding on the left:
|
||||||
|
* Make the window small.
|
||||||
|
* Tap the menu to trigger the active state.
|
||||||
|
* Make the window large again.
|
||||||
|
*/
|
||||||
|
#layout.active {
|
||||||
|
position: relative;
|
||||||
|
left: 160px;
|
||||||
|
}
|
||||||
|
}
|
46
assets/js/ui.js
Normal file
46
assets/js/ui.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
(function (window, document) {
|
||||||
|
|
||||||
|
var layout = document.getElementById('layout'),
|
||||||
|
menu = document.getElementById('menu'),
|
||||||
|
menuLink = document.getElementById('menuLink'),
|
||||||
|
content = document.getElementById('main');
|
||||||
|
|
||||||
|
function toggleClass(element, className) {
|
||||||
|
var classes = element.className.split(/\s+/),
|
||||||
|
length = classes.length,
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
for(; i < length; i++) {
|
||||||
|
if (classes[i] === className) {
|
||||||
|
classes.splice(i, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The className is not found
|
||||||
|
if (length === classes.length) {
|
||||||
|
classes.push(className);
|
||||||
|
}
|
||||||
|
|
||||||
|
element.className = classes.join(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleAll(e) {
|
||||||
|
var active = 'active';
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
toggleClass(layout, active);
|
||||||
|
toggleClass(menu, active);
|
||||||
|
toggleClass(menuLink, active);
|
||||||
|
}
|
||||||
|
|
||||||
|
menuLink.onclick = function (e) {
|
||||||
|
toggleAll(e);
|
||||||
|
};
|
||||||
|
|
||||||
|
content.onclick = function(e) {
|
||||||
|
if (menu.className.indexOf('active') !== -1) {
|
||||||
|
toggleAll(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}(this, this.document));
|
@ -14,6 +14,7 @@
|
|||||||
<meta name="msapplication-TileColor" content="#575757">
|
<meta name="msapplication-TileColor" content="#575757">
|
||||||
<meta name="theme-color" content="#575757">
|
<meta name="theme-color" content="#575757">
|
||||||
<link title="Invidious" type="application/opensearchdescription+xml" rel="search" href="/opensearch.xml">
|
<link title="Invidious" type="application/opensearchdescription+xml" rel="search" href="/opensearch.xml">
|
||||||
|
<link rel="stylesheet" href="/css/side-menu.css">
|
||||||
<link rel="stylesheet" href="/css/pure-min.css">
|
<link rel="stylesheet" href="/css/pure-min.css">
|
||||||
<link rel="stylesheet" href="/css/grids-responsive-min.css">
|
<link rel="stylesheet" href="/css/grids-responsive-min.css">
|
||||||
<link rel="stylesheet" href="/css/ionicons.min.css">
|
<link rel="stylesheet" href="/css/ionicons.min.css">
|
||||||
@ -28,113 +29,180 @@
|
|||||||
<% locale = LOCALES[env.get("locale").as(String)]? %>
|
<% locale = LOCALES[env.get("locale").as(String)]? %>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="pure-g">
|
<div id="layout">
|
||||||
<div class="pure-u-1 pure-u-md-2-24"></div>
|
<!-- Menu toggle -->
|
||||||
<div class="pure-u-1 pure-u-md-20-24">
|
<a href="#menu" id="menuLink" class="menu-link">
|
||||||
<div class="pure-g navbar h-box">
|
<!-- Hamburger icon -->
|
||||||
<div class="pure-u-1 pure-u-md-4-24">
|
<span></span>
|
||||||
<a href="/" class="index-link pure-menu-heading">Invidious</a>
|
</a>
|
||||||
</div>
|
<div id="menu">
|
||||||
<div class="pure-u-1 pure-u-md-12-24 searchbar">
|
<div class="pure-menu">
|
||||||
<form class="pure-form" action="/search" method="get">
|
<a class="pure-menu-heading" href="/">
|
||||||
<fieldset>
|
<i class="icon ion-ios-home"></i>
|
||||||
<input type="search" style="width:100%;" name="q" placeholder="<%= translate(locale, "search") %>" value="<%= env.get?("search").try {|x| HTML.escape(x.as(String)) } || env.params.query["q"]?.try {|x| HTML.escape(x)} %>">
|
Home
|
||||||
</fieldset>
|
</a>
|
||||||
</form>
|
<ul class="pure-menu-list">
|
||||||
</div>
|
<li class="pure-menu-item">
|
||||||
<div class="pure-u-1 pure-u-md-8-24 user-field">
|
<a title="<%= translate(locale, " Subscriptions") %>" href="/feed/subscriptions" class="pure-menu-link">
|
||||||
<% if env.get? "user" %>
|
<i class="icon ion-logo-rss"></i>
|
||||||
<div class="pure-u-1-4">
|
<%= translate(locale, "Subscriptions") %>
|
||||||
<a href="/toggle_theme?referer=<%= env.get?("current_page") %>" class="pure-menu-heading">
|
|
||||||
<% preferences = env.get("user").as(User).preferences %>
|
|
||||||
<% if preferences.dark_mode %>
|
|
||||||
<i class="icon ion-ios-sunny"></i>
|
|
||||||
<% else %>
|
|
||||||
<i class="icon ion-ios-moon"></i>
|
|
||||||
<% end %>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="pure-u-1-4">
|
|
||||||
<a title="<%= translate(locale, "Subscriptions") %>" href="/feed/subscriptions" class="pure-menu-heading">
|
|
||||||
<% notification_count = env.get("user").as(User).notifications.size %>
|
|
||||||
<% if notification_count > 0 %>
|
|
||||||
<%= notification_count %> <i class="icon ion-ios-notifications"></i>
|
|
||||||
<% else %>
|
|
||||||
<i class="icon ion-ios-notifications-outline"></i>
|
|
||||||
<% end %>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="pure-u-1-4">
|
|
||||||
<a title="<%= translate(locale, "Preferences") %>" href="/preferences?referer=<%= env.get?("current_page") %>" class="pure-menu-heading">
|
|
||||||
<i class="icon ion-ios-cog"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="pure-u-1-4">
|
|
||||||
<a href="/signout?referer=<%= env.get?("current_page") %>&token=<%= env.get?("token") %>&challenge=<%= env.get?("challenge") %>" class="pure-menu-heading">
|
|
||||||
<%= translate(locale, "Sign out") %>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<% else %>
|
|
||||||
<div class="pure-u-1-3">
|
|
||||||
<a href="/toggle_theme?referer=<%= env.get?("current_page") %>" class="pure-menu-heading">
|
|
||||||
<% if env.get?("preferences").try &.as(Preferences).dark_mode %>
|
|
||||||
<i class="icon ion-ios-sunny"></i>
|
|
||||||
<% else %>
|
|
||||||
<i class="icon ion-ios-moon"></i>
|
|
||||||
<% end %>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="pure-u-1-3">
|
|
||||||
<a title="<%= translate(locale, "Preferences") %>" href="/preferences?referer=<%= env.get?("current_page") %>" class="pure-menu-heading">
|
|
||||||
<i class="icon ion-ios-cog"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<% if config.login_enabled %>
|
|
||||||
<div class="pure-u-1-3">
|
|
||||||
<a href="/login?referer=<%= env.get?("current_page") %>" class="pure-menu-heading">
|
|
||||||
<%= translate(locale, "Login") %>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<%= content %>
|
|
||||||
<div class="footer">
|
|
||||||
<div class="pure-g">
|
|
||||||
<div class="pure-u-1 pure-u-md-1-3">
|
|
||||||
<a href="https://github.com/omarroth/invidious">
|
|
||||||
<%= translate(locale, "Released under the AGPLv3 by Omar Roth.") %>
|
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</li>
|
||||||
<div class="pure-u-1 pure-u-md-1-3">
|
<li class="pure-menu-item">
|
||||||
<i class="icon ion-logo-bitcoin"></i>
|
<a title="<%= translate(locale, " Trending") %>" href="/feed/trending" class="pure-menu-link">
|
||||||
<%= translate(locale, "BTC: ") %>356DpZyMXu6rYd55Yqzjs29n79kGKWcYrY</div>
|
<i class="icon ion-ios-flame"></i>
|
||||||
<div class="pure-u-1 pure-u-md-1-3">
|
<%= translate(locale, "Trending") %>
|
||||||
<i class="icon ion-logo-bitcoin"></i>
|
|
||||||
<%= translate(locale, "BCH: ") %>qq4ptclkzej5eza6a50et5ggc58hxsq5aylqut2npk</div>
|
|
||||||
<div class="pure-u-1 pure-u-md-1-3">
|
|
||||||
<i class="icon ion-logo-usd"></i>
|
|
||||||
<a href="https://liberapay.com/omarroth"><%= translate(locale, "Liberapay") %></a>
|
|
||||||
/
|
|
||||||
<a href="https://patreon.com/omarroth"><%= translate(locale, "Patreon") %></a>
|
|
||||||
</div>
|
|
||||||
<div class="pure-u-1 pure-u-md-1-3">
|
|
||||||
<i class="icon ion-logo-javascript"></i>
|
|
||||||
<a rel="jslicense" href="/licenses">
|
|
||||||
<%= translate(locale, "View JavaScript license information.") %>
|
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</li>
|
||||||
<div class="pure-u-1 pure-u-md-1-3">
|
<li class="pure-menu-item">
|
||||||
<i class="icon ion-logo-github"></i>
|
<a title="<%= translate(locale, " History") %>" href="feed/history" class="pure-menu-link">
|
||||||
<%= translate(locale, "Current version: ") %> <%= CURRENT_VERSION %>-<%= CURRENT_COMMIT %>
|
<i class="icon ion-ios-timer"></i>
|
||||||
<i class="icon ion-logo-github"></i>
|
<%= translate(locale, "History") %>
|
||||||
<%= CURRENT_BRANCH %></div>
|
</a>
|
||||||
</div>
|
</li>
|
||||||
|
<li class="pure-menu-item menu-item-divided">
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item">
|
||||||
|
<a title="<%= translate(locale, " Preferences") %>" href="/preferences?referer=
|
||||||
|
<%= env.get?("current_page") %>" class="pure-menu-link">
|
||||||
|
<i class="icon ion-ios-options"></i>
|
||||||
|
<%= translate(locale, "Preferences") %>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item menu-item-divided">
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item"><a href="https://github.com/omarroth/invidious/wiki" class="pure-menu-link">
|
||||||
|
<i class="icon ion-ios-information-circle"></i>
|
||||||
|
<%= translate(locale, "Wiki") %>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item"><a href="https://github.com/omarroth/invidious/issues" class="pure-menu-link">
|
||||||
|
<i class="icon ion-ios-create"></i>
|
||||||
|
<%= translate(locale, "Send Feedback") %>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="pure-u-1 pure-u-md-2-24"></div>
|
<div class="pure-g">
|
||||||
|
<div class="pure-u-1 pure-u-md-2-24"></div>
|
||||||
|
<div class="pure-u-1 pure-u-md-20-24">
|
||||||
|
<div class="pure-g navbar h-box">
|
||||||
|
<div class="pure-u-1 pure-u-md-4-24">
|
||||||
|
<a href="/" class="index-link pure-menu-heading">Invidious</a>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-12-24 searchbar">
|
||||||
|
<form class="pure-form" action="/search" method="get">
|
||||||
|
<fieldset>
|
||||||
|
<input type="search" style="width:100%;" name="q" placeholder="<%= translate(locale, " search") %>" value="
|
||||||
|
<%= env.get?("search").try {|x| HTML.escape(x.as(String)) } || env.params.query["q"]?.try {|x| HTML.escape(x)} %>">
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-8-24 user-field">
|
||||||
|
<% if env.get? "user" %>
|
||||||
|
<div class="pure-u-1-4">
|
||||||
|
<a href="/toggle_theme?referer=<%= env.get?(" current_page") %>" class="pure-menu-heading">
|
||||||
|
<% preferences = env.get("user").as(User).preferences %>
|
||||||
|
<% if preferences.dark_mode %>
|
||||||
|
<i class="icon ion-ios-sunny"></i>
|
||||||
|
<% else %>
|
||||||
|
<i class="icon ion-ios-moon"></i>
|
||||||
|
<% end %>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1-4">
|
||||||
|
<a title="<%= translate(locale, " Subscriptions") %>" href="/feed/subscriptions" class="pure-menu-heading">
|
||||||
|
<% notification_count = env.get("user").as(User).notifications.size %>
|
||||||
|
<% if notification_count > 0 %>
|
||||||
|
<%= notification_count %> <i class="icon ion-ios-notifications"></i>
|
||||||
|
<% else %>
|
||||||
|
<i class="icon ion-ios-notifications-outline"></i>
|
||||||
|
<% end %>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1-4">
|
||||||
|
<a title="<%= translate(locale, " Preferences") %>" href="/preferences?referer=
|
||||||
|
<%= env.get?("current_page") %>" class="pure-menu-heading">
|
||||||
|
<i class="icon ion-ios-cog"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1-4">
|
||||||
|
<a href="/signout?referer=<%= env.get?(" current_page") %>&token=
|
||||||
|
<%= env.get?("token") %>&challenge=
|
||||||
|
<%= env.get?("challenge") %>" class="pure-menu-heading">
|
||||||
|
<%= translate(locale, "Sign out") %>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<% else %>
|
||||||
|
<div class="pure-u-1-3">
|
||||||
|
<a href="/toggle_theme?referer=<%= env.get?(" current_page") %>" class="pure-menu-heading">
|
||||||
|
<% if env.get?("preferences").try &.as(Preferences).dark_mode %>
|
||||||
|
<i class="icon ion-ios-sunny"></i>
|
||||||
|
<% else %>
|
||||||
|
<i class="icon ion-ios-moon"></i>
|
||||||
|
<% end %>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1-3">
|
||||||
|
<a title="<%= translate(locale, " Preferences") %>" href="/preferences?referer=
|
||||||
|
<%= env.get?("current_page") %>" class="pure-menu-heading">
|
||||||
|
<i class="icon ion-ios-cog"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<% if config.login_enabled %>
|
||||||
|
<div class="pure-u-1-3">
|
||||||
|
<a href="/login?referer=<%= env.get?(" current_page") %>" class="pure-menu-heading">
|
||||||
|
<%= translate(locale, "Login") %>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<%= content %>
|
||||||
|
<div class="footer">
|
||||||
|
<div class="pure-g">
|
||||||
|
<div class="pure-u-1 pure-u-md-1-3">
|
||||||
|
<a href="https://github.com/omarroth/invidious">
|
||||||
|
<%= translate(locale, "Released under the AGPLv3 by Omar Roth.") %>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-1-3">
|
||||||
|
<i class="icon ion-logo-bitcoin"></i>
|
||||||
|
<%= translate(locale, "BTC: ") %>356DpZyMXu6rYd55Yqzjs29n79kGKWcYrY</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-1-3">
|
||||||
|
<i class="icon ion-logo-bitcoin"></i>
|
||||||
|
<%= translate(locale, "BCH: ") %>qq4ptclkzej5eza6a50et5ggc58hxsq5aylqut2npk</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-1-3">
|
||||||
|
<i class="icon ion-logo-usd"></i>
|
||||||
|
<a href="https://liberapay.com/omarroth">
|
||||||
|
<%= translate(locale, "Liberapay") %></a>
|
||||||
|
/
|
||||||
|
<a href="https://patreon.com/omarroth">
|
||||||
|
<%= translate(locale, "Patreon") %></a>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-1-3">
|
||||||
|
<i class="icon ion-logo-javascript"></i>
|
||||||
|
<a rel="jslicense" href="/licenses">
|
||||||
|
<%= translate(locale, "View JavaScript license information.") %>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-1-3">
|
||||||
|
<i class="icon ion-logo-github"></i>
|
||||||
|
<%= translate(locale, "Current version: ") %>
|
||||||
|
<%= CURRENT_VERSION %>-
|
||||||
|
<%= CURRENT_COMMIT %>
|
||||||
|
<i class="icon ion-logo-github"></i>
|
||||||
|
<%= CURRENT_BRANCH %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1 pure-u-md-2-24"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<script src="/js/ui.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
Loading…
Reference in New Issue
Block a user