Please read the following Terms and Conditions carefully. By using Icy Network services, you signify that you have read, understood and agreed to be bound by these Terms and Conditions. Icy Network reserves the right to modify, replace or remove any of the Terms and Conditions written in this document at any given time without restrictions. We will try to notify you of any such amendments. If you do not agree to these Terms and Conditions, you may not use any of the services provided by Icy Network.
diff --git a/package-lock.json b/package-lock.json
index 3255d55..820a828 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -962,6 +962,12 @@
"hoek": "4.2.0"
}
},
+ "bootstrap": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0.tgz",
+ "integrity": "sha512-gulJE5dGFo6Q61V/whS6VM4WIyrlydXfCgkE+Gxe5hjrJ8rXLLZlALq7zq2RPhOc45PSwQpJkrTnc2KgD6cvmA==",
+ "dev": true
+ },
"brace-expansion": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
@@ -5690,6 +5696,12 @@
"integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
"dev": true
},
+ "popper.js": {
+ "version": "1.12.9",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.12.9.tgz",
+ "integrity": "sha1-DfvC3/lsRRuzMu3Pz6r1ZtMx1bM=",
+ "dev": true
+ },
"postcss": {
"version": "6.0.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz",
diff --git a/package.json b/package.json
index f7b64d7..b970fe7 100644
--- a/package.json
+++ b/package.json
@@ -62,11 +62,13 @@
"devDependencies": {
"babel-loader": "^7.1.2",
"babel-preset-env": "^1.6.1",
+ "bootstrap": "^4.0.0",
"concurrently": "^3.5.1",
"eslint-plugin-import": "^2.8.0",
"jquery": "^3.2.1",
"morgan": "^1.9.0",
"mustache": "^2.3.0",
+ "popper.js": "^1.12.9",
"standard": "^10.0.3",
"uglifyjs-webpack-plugin": "^1.1.2",
"vue-clickaway": "^2.1.0",
diff --git a/src/script/main.js b/src/script/main.js
index b510445..a71b8ea 100644
--- a/src/script/main.js
+++ b/src/script/main.js
@@ -1,4 +1,6 @@
window.$ = require('jquery')
+window.Popper = require('popper.js')
+require('bootstrap')
$(document).ready(function () {
function pwcheck (e) {
@@ -201,11 +203,10 @@ $(document).ready(function () {
var html = ''
for (var i in data) {
var article = data[i]
- html += '
'
- html += '
' + article.title + ''
- html += '
Published at ' + new Date(article.created_at) + ''
- html += '
' + article.description + '
'
- html += '
Read More'
+ html += '
'
+ html += '
'
+ html += '
Published at ' + new Date(article.created_at) + '
'
+ html += '
' + article.content + '
'
html += '
'
}
$('.newsfeed').html(html)
@@ -303,7 +304,7 @@ $(document).ready(function () {
})
}
- $('.loginDiag').click(function (e) {
+ $('.login-dialog-pop').click(function (e) {
e.preventDefault()
var url = $(this).attr('href')
var popup = PopupCenter(url, '_blank', 800, 620)
diff --git a/src/style/main.styl b/src/style/main.styl
index af880f2..4d0c033 100644
--- a/src/style/main.styl
+++ b/src/style/main.styl
@@ -1,22 +1,6 @@
body
margin: 0
color: black
- font-family: sans-serif
- /*background-color: #82fff4;
- background-image: linear-gradient(-45deg, #80d7ff 25%, transparent 25.5%, transparent 50%,
- #80d7ff 50.5%, #80d7ff 75%, transparent 75.5%, transparent)
- height: 100vh;
- background-size: 50px 50px;*/
- background: #6fefff
- background: -moz-linear-gradient(top, #6fefff 0%, #53cbf1 51%, #05abe0 100%)
- background: -webkit-linear-gradient(top, #6fefff 0%,#53cbf1 51%,#05abe0 100%)
- background: linear-gradient(to bottom, #6fefff 0%,#53cbf1 51%,#05abe0 100%)
-
-a
- color: green
- text-decoration: none
- &:hover
- text-decoration: underline
.logo
font-size: 8vw
@@ -109,30 +93,44 @@ a
&:checked ~ .list
max-height: 500px
-section
- font-family: "Open Sans"
- position: relative
- min-height: 100vh
- .content
- position: absolute
- left: 0
- right: 0
- top: 0
- bottom: 40%
- overflow: auto
- background-color: #ffffff
- padding: 20px
- home
- h1
- font-size: 300%
- text-align: center
- color: green
- margin-bottom: 0
- p
- text-align: center;
- font-size: 200%
- color: #0074d0;
- font-weight: bold;
+.carousel
+ margin-bottom: 4rem
+
+ .carousel-item
+ height: 40rem
+ background-color: #777
+
+ & > img
+ position: absolute
+ top: 0
+ left: 0
+ min-width: 100%
+ height: 40rem
+
+.marketing .col-lg-4
+ margin-bottom: 1.5rem
+ text-align: center
+
+ .circular-header
+ width: 140px
+ height: 140px
+ vertical-align: middle
+ display: inline-block
+ border-radius: 50% !important
+ line-height: 9rem
+ font-size: 5rem
+ color: #fff
+
+.news-article
+ margin-bottom: 4rem
+
+ .news-title
+ margin-bottom: .25rem
+ font-size: 2.5rem
+
+ .news-meta
+ margin-bottom: 1.25rem
+ color: #999
.divboxes
text-align: center
@@ -178,35 +176,6 @@ section
code
white-space: pre
-label
- display: block
- margin-top: 20px
-
-input:not([type="submit"])
- padding: 5px
- font-size: 120%
- border-radius: 5px
- border: 1px solid #c1c1c1
- background-color: #f5f5f5
- color: #000
- box-shadow: inset 2px 2px 5px #ddd
- transition: border 0.1s linear
-
-button, .button, input[type="submit"]
- display: block
- padding: 5px 10px
- background-color: #fbfbfb
- color: #000
- border: 1px solid #c1c1c1
- border-radius: 5px
- font-size: 120%
- margin: 10px 0
- cursor: pointer
- &.active
- background-color: #ddd
-
-input[disabled]
- color: #959595
.button
display: inline-block
@@ -260,8 +229,8 @@ input[disabled]
color: #a9a9a9
font-style: italic
-.dlbtn
- display: block
+.app-button
+ display: inline-block
img
width: 200px
&.apple
@@ -269,63 +238,56 @@ input[disabled]
width: 175px
padding: 0 12px
-.twitterLogin
+.login-btn
display: block
- padding: 10px
- width: 215px
- margin-top: 5px
- background-color: #fff
- border: 1px solid #ddd
- border-radius: 5px
text-decoration: none
- i
- color: #03A9F4
- font-size: 22px
- span
- color: #000
- display: inline-block
- vertical-align: top
- margin-top: 3px
- margin-left: 12px
-
-.discordLogin
- display: block
- background-color: #99AAB5
- width: 225px
- height: 40px
+ border-radius: 5px
margin-top: 5px
padding: 5px 5px
- border-radius: 5px
- text-decoration: none
- span
- color: white
- vertical-align: top
- margin-top: 11px
- margin-left: 3px
- display: inline-block
- img
- width: 45px
- display: inline-block
-
-.googleLogin
- padding: 10px
width: 215px
- margin-top: 5px
- background-color: #4285f4
- border: 1px solid #ddd
- border-radius: 5px
- text-decoration: none
- display: block
+ height: 50px
cursor: pointer
- i
- color: #fff
- font-size: 22px
- span
- color: #fff
- display: inline-block
- vertical-align: top
- margin-top: 3px
- margin-left: 12px
+
+ &.twitter-login
+ background-color: #fff
+ border: 1px solid #ddd
+ line-height: 2.2rem
+
+ i
+ color: #03A9F4
+ font-size: 22px
+ span
+ color: #000
+ display: inline-block
+ vertical-align: top
+ margin-left: 12px
+
+ &.discord-login
+ background-color: #99aab5
+ line-height: 2.4rem
+
+ span
+ color: white
+ vertical-align: top
+ margin-left: 3px
+ display: inline-block
+ img
+ width: 45px
+ display: inline-block
+
+ &.google-login
+ background-color: #4285f4
+ border: 1px solid #ddd
+ line-height: 2.2rem
+
+ i
+ color: #fff
+ font-size: 22px
+ span
+ color: #fff
+ display: inline-block
+ vertical-align: top
+ margin-left: 12px
.accdisconnect
margin-top: 5px
@@ -462,9 +424,6 @@ span.load
.prvcontent
margin: 10px 0
-.return
- margin-top: 40px
-
.content
hr
border-color: #ffffff
diff --git a/views/document.pug b/views/document.pug
index 4a3fbeb..7e9c419 100644
--- a/views/document.pug
+++ b/views/document.pug
@@ -4,5 +4,5 @@ block title
|Icy Network
block body
- .document
+ .container.mt-4
.content !{doc}
diff --git a/views/donate.pug b/views/donate.pug
index 6d22ca4..5f18331 100644
--- a/views/donate.pug
+++ b/views/donate.pug
@@ -3,43 +3,43 @@ block title
|Icy Network - Donate
block body
- .wrapper
- .boxcont
- .box#donate
- h1 Donate
- p Donations help us pay for the services required to keep Icy Network running. Donating any amount would be highly appreciated!
-
- - var formurl = "https://www.paypal.com/cgi-bin/webscr"
- if sandbox
- - formurl = "https://www.sandbox.paypal.com/cgi-bin/webscr"
-
- form(action=formurl, method="post")
- input(type="hidden" name="cmd" value="_xclick")
- input(type="hidden" name="business" value=business)
- input(type="hidden" name="item_name" value=name)
- input(type="hidden" name="item_number" value="1")
- input(type="hidden" name="no_shipping" value="1")
- input(type="hidden" name="quantity" value="1")
- input(type="hidden" name="tax" value="0")
- input(type="hidden" name="notify_url" value=ipn_url)
- label(for="amount") Amount
- input(type="number", name="amount" value="1.00")
- select(name="currency_code")
+ .container.mb-4.mt-4
+ h1 Donate
+ p Donations help us pay for the servers required to keep Icy Network running. Donating any amount would be highly appreciated!
+
+ - var formurl = "https://www.paypal.com/cgi-bin/webscr"
+ if sandbox
+ - formurl = "https://www.sandbox.paypal.com/cgi-bin/webscr"
+
+ form(action=formurl, method="post")
+ input(type="hidden" name="cmd" value="_xclick")
+ input(type="hidden" name="business" value=business)
+ input(type="hidden" name="item_name" value=name)
+ input(type="hidden" name="item_number" value="1")
+ input(type="hidden" name="no_shipping" value="1")
+ input(type="hidden" name="quantity" value="1")
+ input(type="hidden" name="tax" value="0")
+ input(type="hidden" name="notify_url" value=ipn_url)
+ label(for="amount") Amount
+ .row.form-group
+ .col-10
+ input.form-control(type="number", name="amount" value="1.00")
+ .col
+ select.form-control(name="currency_code")
option(value="EUR") EUR
option(value="USD") USD
- if user
- input#custominfo(type="hidden", name="custom", value="userid:" + user.id)
- else
- input#custominfo(type="hidden", name="custom", value="")
- if minecraft
- .check
- label(for="mcinclude") Include Minecraft Username
- input(id="mcinclude" type="checkbox")
- .mcuname(style="display: none;")
- input(id="mcusername", autocomplete="off")
- .buttoncont
- a.button.donate(name="submit", onclick="$(this).closest('form').submit()")
- i.fa.fa-fw.fa-paypal
- |Donate
- br
- b Currently you can only donate using PayPal.
+ if user
+ input#custominfo(type="hidden", name="custom", value="userid:" + user.id)
+ else
+ input#custominfo(type="hidden", name="custom", value="")
+ if minecraft
+ .form-check.form-check-inline
+ input.form-check-input(id="mcinclude" type="checkbox" checked="false")
+ label.form-check-label(for="mcinclude") Include Minecraft Username
+ .mcuname.form-group(style="display: none;")
+ label(for="mcusername") Minecraft Username
+ input.form-control(id="mcusername", autocomplete="off")
+ .buttoncont
+ a.btn.btn-primary.text-light(name="submit", onclick="$(this).closest('form').submit()")
+ i.fa.fa-fw.fa-paypal
+ | Donate
diff --git a/views/includes/external.pug b/views/includes/external.pug
index 3bfee73..18154f3 100644
--- a/views/includes/external.pug
+++ b/views/includes/external.pug
@@ -22,7 +22,7 @@
fb:login-button(scope="public_profile,email", onlogin="checkLoginState();" data-max-rows="1", data-size="large", data-button-type="login_with", data-show-faces="false", data-auto-logout-link="false", data-use-continue-as="false")
if google_auth
script(src="https://apis.google.com/js/api:client.js")
- a.googleLogin
+ a.login-btn.google-login
i.fa.fa-fw.fa-google
span Log in With Google
script.
@@ -35,7 +35,7 @@
cookiepolicy: 'single_host_origin',
fetch_basic_profile: true
});
- attachSignin(document.querySelector('.googleLogin'));
+ attachSignin(document.querySelector('.google-login'));
});
};
@@ -60,10 +60,10 @@
startApp()
if twitter_auth
- a.twitterLogin.loginDiag(href="/api/external/twitter/login")
+ a.login-btn.twitter-login.login-dialog-pop(href="/api/external/twitter/login")
i.fa.fa-fw.fa-twitter
span Log in With Twitter
if discord_auth
- a.discordLogin.loginDiag(href="/api/external/discord/login")
+ a.login-btn.discord-login.login-dialog-pop(href="/api/external/discord/login")
img(src="/static/image/Discord-Logo-White.svg")
span Log in With Discord
diff --git a/views/index.pug b/views/index.pug
index 3d1138a..80f549e 100644
--- a/views/index.pug
+++ b/views/index.pug
@@ -3,25 +3,46 @@ block title
|Icy Network
block body
- section#home
- .content
- h1 Welcome to Icy Network!
- p Icy Network is a Global Network of Communities and Websites, United by a Single Login
- .divboxes
- .divbox#secure
- span.head
- i.fa.fa-lock.fa-fw
- span.text Secure Login
- span.text A secure login system with Two-Factor Authentication possibility
- .divbox#secure
- span.head
- i.fa.fa-github.fa-fw
- span.text Open Source
- span.text All of our platforms are Open Source Software hosted on our
- a(href="https://github.com/IcyNet", target="_blank") GitHub Organization
- section#news
- .content
- h1 Icy Network News
- .newsfeed
- p Please enable JavaScript to view this content.
- a.older(href="/news") View all articles
+ .carousel.slide#myCarousel(data-ride="carousel")
+ ol.carousel-indicators
+ li.active(data-target="#myCarousel" data-slide-to="0")
+ li(data-target="#myCarousel" data-slide-to="1")
+ .carousel-inner
+ .carousel-item.active
+ img.first-slide(src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==", alt="First Slide")
+ .container
+ .carousel-caption.text-left
+ h1 Welcome to Icy Network
+ p Icy Network is a Global Network of Communities and Websites, United by a Single Login
+ a.btn.btn-lg.btn-primary(href="#" role="button") Learn More
+ .carousel-item
+ img.second-slide(src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==", alt="Second Slide")
+ .container
+ .carousel-caption.text-left
+ h1 Join our Minecraft Server
+ p We have a Minecraft Server up at mc.icynet.eu, join now!
+ a.carousel-control-prev(href="#myCarousel" role="button" data-slide="prev")
+ span.carousel-control-prev-icon(aria-hidden="true")
+ span.sr-only Previous
+ a.carousel-control-next(href="#myCarousel" role="button" data-slide="next")
+ span.carousel-control-next-icon(aria-hidden="true")
+ span.sr-only Next
+ .container.marketing
+ .row
+ .col-lg-4
+ span.circular-header.bg-warning
+ i.fa.fa-fw.fa-lock
+ h2 Secure Login
+ p We have a secure login system with the possibility to even further secure your account with Two-Factor Authentication.
+ .col-lg-4
+ span.circular-header.bg-success
+ i.fa.fa-fw.fa-github
+ h2 Open Source
+ p All of our services are Free and Open Source Software (FOSS) hosted on GitHub.
+ p
+ a.btn.btn-secondary(href="https://github.com/IcyNet", target="_blank") Browse Repositories
+ .col-lg-4
+ span.circular-header.bg-info
+ i.fa.fa-fw.fa-users
+ h2 Community-oriented
+ p Our services are made to serve communities. We unite them all with a single login system with support for multiple authentication protocols.
diff --git a/views/layout.pug b/views/layout.pug
index 2edeb80..faa481d 100644
--- a/views/layout.pug
+++ b/views/layout.pug
@@ -2,7 +2,7 @@ doctype html
html
head
meta(charset="utf8")
- meta(name="viewport", content="width=device-width, initial-scale=1")
+ meta(name="viewport", content="width=device-width, initial-scale=1, shrink-to-fit=no")
block meta
meta(name="og:title", content="Icy Network")
meta(name="og:description", content="Icy Network is a Global Network of Communities and Websites, United by a Single Login")
@@ -27,8 +27,8 @@ html
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
block links
+ link(rel="stylesheet", type="text/css", href="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css")
link(rel="stylesheet", type="text/css", href="/style/main.css")
- link(rel="stylesheet", type="text/css", href="/style/footer.css")
link(rel="stylesheet", type="text/css", href="//fonts.googleapis.com/css?family=Open+Sans")
link(rel="stylesheet", type="text/css", href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css")
script(src="/script/main.js")
@@ -59,69 +59,51 @@ html
p Please consider enabling JavaScript for the full experience.
if matomo
p
- img(src="#{matomo.track_url}piwik.php?idsite=1&rec=1" style="border:0;" alt="")
- block banner
- .banner
- .logo
- .part1 Icy
- .part2 Network
- block dialog
- .dialog-drop#dialog
- .dialog
- .head
- #title
- #close
- i.fa.fa-fw.fa-times
- .content#content
+ img.d-inline-block.align-top(src="#{matomo.track_url}piwik.php?idsite=1&rec=1" style="border:0;" alt="")
+
block nav
- .anchor
- nav.navigator
- li.hidden#navlogo
- a(href="/")
- .logo.small
- .part1 Icy
- .part2 Network
- .menu
- label.showButton(for="show-menu")
- i.fa.fa-fw.fa-bars
- input(type="checkbox" id="show-menu")
- .list
- ul
- li
- a.scroll(href="/#home") Home
- li
- a.scroll(href="/#news") News
- li
- a(href="https://forum.icynet.eu/") Forum
- ul.floating
- if user
- li#user
- a(href="/user/manage") #{user.display_name}
- li
- a(href="/logout") Log out
- else
- li
- a(href="/login") Log in
- block body
- block footer
- footer
- img.squeebot(src="/static/image/squeebot.svg")
- span.copyright
- .logo.small
- .part1 Icy
- .part2 Network
- .social
+ nav.navbar.navbar-expand-lg.navbar-light.bg-light.sticky-top
+ a.navbar-brand(href="/")
+ img(src="/static/image/icynet-icon.svg" width="30" heigth="30")
+ |Icy Network
+
+ button.navbar-toggler(type="button" data-toggle="collapse" data-target="#navCollapse" aria-controls="navCollapse" aria-expanded="false" aria-label="Toggle navigation")
+ span.navbar-toggler-icon
+
+ .navbar-collapse.collapse#navCollapse
+ ul.mr-auto.navbar-nav
+ li.nav-item
+ a.nav-link(href="/") Home
+ li.nav-item
+ a.nav-link(href="/news") News
+ li.nav-item
+ a.nav-link(href="https://forum.icynet.eu/") Forum
+ ul.navbar-nav.my-2.my-lg-0
+ if user
+ li.nav-item
+ a.nav-link(href="/user/manage") #{user.display_name}
+ li.nav-item
+ a.nav-link(href="/logout") Log out
+ else
+ li.nav-item
+ a.nav-link(href="/login") Log in
+ main(role="main")
+ block body
+ block footer
+ //FOOTER
+ footer.container
+ p.float-right
a.socialbtn#github(href="https://github.com/IcyNet/" target="_blank")
i.fa.fa-fw.fa-github
a.socialbtn#twitter(href="https://twitter.com/IcyNet" target="_blank")
i.fa.fa-fw.fa-twitter
a.socialbtn#discord(href="https://discord.gg/Xe7MKSx" target="_blank")
span.discordlogo
- span © 2018 - Icy Network - Some Rights Reserved
- br
- span
- a(href="/docs/terms-of-service") Terms of Service
- span.divider |
- a(href="/docs/privacy-policy") Privacy Policy
- span.divider |
+ p
+ |© 2017-2018 Icy Network
+ | ·
+ a(href="/docs/terms-of-service") Terms
+ | ·
+ a(href="/docs/privacy-policy") Privacy
+ | ·
a(href="/donate") Donate
diff --git a/views/news/article.pug b/views/news/article.pug
index 4e3c647..8b77a82 100644
--- a/views/news/article.pug
+++ b/views/news/article.pug
@@ -24,45 +24,47 @@ block title
|Icy Network - News - 404
block body
- .document
- .content
- if !article
- span.error No such article
- else
- .article
- if user && user.privilege && user.privilege > 0 && !editing
- a.button(style="float: right;" href="?edit=1") Edit
- .title= article.title
- .author Published by
- span #{article.author.display_name}
- |at
- .timestamp #{new Date(article.created_at)}
- if editing
- .content(contenteditable="true" id="editor1")!= article.content
- else
- .content!= article.content
- if editing
- .button(id="done") Done editing
- br
- script.
- CKEDITOR.disableAutoInline = true;
- CKEDITOR.inline('editor1');
- $('#done').click(function (e) {
- let data = CKEDITOR.instances.editor1.getData();
- $.post({
- url: '/api/news/edit/#{article.id}',
- data: {content: data},
- success: function () {
- window.location.href = '/news/#{article.id}-#{article.slug}'
- },
- error: function (e) {
- if (e.responseJSON && e.responseJSON.error) {
- alert(e.responseJSON.error);
- }
+ .container.mt-4
+ if !article
+ span.error No such article
+ else
+ nav(aria-label="breadcrumb")
+ ol.breadcrumb
+ li.breadcrumb-item
+ a(href="/") Home
+ li.breadcrumb-item
+ a(href="/news") News
+ li.breadcrumb-item.active(aria-current="page")= article.title
+
+ .news-article
+ if user && user.privilege && user.privilege > 0 && !editing
+ a.btn.btn-primary.float-right(href="?edit=1") Edit
+ h1.news-title= article.title
+ p.news-meta Published by
+ span #{article.author.display_name}
+ |at #{new Date(article.created_at)}
+ if editing
+ .content(contenteditable="true" id="editor1")!= article.content
+ else
+ .content!= article.content
+ if editing
+ .btn.btn-success(id="done") Done editing
+ br
+ script.
+ CKEDITOR.disableAutoInline = true;
+ CKEDITOR.inline('editor1');
+ $('#done').click(function (e) {
+ let data = CKEDITOR.instances.editor1.getData();
+ $.post({
+ url: '/api/news/edit/#{article.id}',
+ data: {content: data},
+ success: function () {
+ window.location.href = '/news/#{article.id}-#{article.slug}'
+ },
+ error: function (e) {
+ if (e.responseJSON && e.responseJSON.error) {
+ alert(e.responseJSON.error);
}
- });
+ }
});
-
- .return
- a(href="/news") Back to the news archive
-
+ });
diff --git a/views/news/composer.pug b/views/news/composer.pug
index cbd0059..d25a02b 100644
--- a/views/news/composer.pug
+++ b/views/news/composer.pug
@@ -7,25 +7,34 @@ block title
|Icy Network - News - Compose
block body
- .document
- .content
- if message.text
- if message.error
- .message.error
- span #{message.text}
- else
- .message
- span #{message.text}
- form(action="", method="post")
- input(type="hidden", name="csrf", value=csrf)
+ .container.mt-4.mb-4
+ nav(aria-label="breadcrumb")
+ ol.breadcrumb
+ li.breadcrumb-item
+ a(href="/") Home
+ li.breadcrumb-item
+ a(href="/news") News
+ li.breadcrumb-item.active(aria-current="page") Compose
+ if message.text
+ if message.error
+ .alert.alert-danger
+ span #{message.text}
+ else
+ .alert.alert-warning
+ span #{message.text}
+ form(action="", method="post")
+ input(type="hidden", name="csrf", value=csrf)
+ .form-group
label(for="title") Title
- input(type="text", name="title", id="title", value=formkeep.title)
+ input.form-control(type="text", name="title", id="title", value=formkeep.title, aria-describedby="titleHelp")
+ small.form-text.text-muted#titleHelp Describe your article in a short sentence
+ .form-group
label(for="composer1") Content
- textarea(name="content" id="composer1") #{formkeep.content}
+ textarea.form-control(name="content" id="composer1") #{formkeep.content}
+ .form-group
label(for="tags") Tags
- input(type="text", name="tags", id="tags", value=formkeep.tags)
- input(type="submit", value="Submit")
- script.
- CKEDITOR.replace('composer1')
- a(href="/news") Back to news directory
+ input.form-control(type="text", name="tags", id="tags", value=formkeep.tags)
+ button.btn.btn-primary(type="submit") Submit
+ script.
+ CKEDITOR.replace('composer1')
diff --git a/views/news/news.pug b/views/news/news.pug
index 2caf28a..a931c2a 100644
--- a/views/news/news.pug
+++ b/views/news/news.pug
@@ -7,33 +7,49 @@ block title
|Icy Network - News
block body
- .document
- .content
- if user && user.privilege && user.privilege > 0
- a.button(style="float: right;" href="/news/compose") New Article
- h1 Icy Network News Archive
- if news.error
- span.error There are no articles to show.
- else
- if news.page
- span.pagenum
- |Page #{news.page.page} of #{news.page.pages}
- .pgn
+ .container.mt-4
+ nav(aria-label="breadcrumb")
+ ol.breadcrumb
+ li.breadcrumb-item
+ a(href="/") Home
+ li.breadcrumb-item.active(aria-current="page") News
+
+ if user && user.privilege && user.privilege > 0
+ a.btn.btn-light.float-right(href="/news/compose") New Article
+ h1.pb-3.mb-4.border-bottom Icy Network News
+ if news.error
+ span.error There are no articles to show.
+ else
+ if news.page
+ nav(aria-label="pagination")
+ ul.pagination
if news.page.page > 1
- a.button(href="/news/?page=" + (news.page.page - 1)) Previous
+ li.page-item
+ a.page-link(href="/news/?page=" + (news.page.page - 1)) Previous
+ else
+ li.page-item.disabled
+ a.page-link(href="#" tabindex="-1") Previous
- var n = 0
while n < news.page.pages
- a.button(href="/news/?page=" + (n + 1))= n + 1
+ - var current = n + 1 == news.page.page
+ li.page-item(class=(current ? 'active' : ''))
+ a.page-link(href="/news/?page=" + (n + 1))= n + 1
+ if current
+ span.sr-only (current)
- n++
if news.page.pages > news.page.page
- a.button(href="/news/?page=" + (news.page.page + 1)) Next
- each val in news.articles
- .article
- a.title(href="/news/" + val.id + "-" + val.slug)= val.title
- .author Published by
- span #{val.author.display_name}
- |at
- .timestamp #{new Date(val.created_at)}
- .content!= val.content
- hr
+ li.page-item
+ a.page-link(href="/news/?page=" + (news.page.page + 1)) Next
+ else
+ li.page-item.disabled
+ a.page-link(href="#" tabindex="-1") Next
+ each val in news.articles
+ .news-article
+ h2.news-title
+ a(href="/news/" + val.id + "-" + val.slug)= val.title
+ p.news-meta Published by
+ span #{val.author.display_name}
+ |at #{new Date(val.created_at)}
+ .content!= val.content
+ hr
diff --git a/views/user/banned.pug b/views/user/banned.pug
index 8ec2529..606f57e 100644
--- a/views/user/banned.pug
+++ b/views/user/banned.pug
@@ -3,26 +3,27 @@ block title
|Icy Network - Banned Account
block body
- .wrapper
- .boxcont
- .box#login
- if ipban
- h1 This IP Address is BANNED!
- else
- h1 This User is BANNED!
- p This user currently has #{bans.length} ban(s) active
- each ban in bans
- .message.error.ban
- label Banned
- .date #{new Date(ban.banned)}
- label Reason
- .reason #{ban.reason}
- label Expires at
- .expiry
- if !ban.expiry
- b This ban is permanent.
- else
- |#{new Date(ban.expiry)}
+ .container.mt-4.mb-4
+ if ipban
+ h1 This IP Address is banned from accessing Icy Network
+ else
+ h1 This user is banned from accessing Icy Network.
+ p This user currently has #{bans.length} ban(s) active.
+ each ban in bans
+ .ban.alert.alert-danger
+ p
+ b Banned at
+ .date #{new Date(ban.banned)}
+ p
+ b Reason
+ .reason #{ban.reason}
+ p
+ b Expires at
+ .expiry
if !ban.expiry
- b This ban cannot be appealed.
+ b This ban is permanent.
+ else
+ |#{new Date(ban.expiry)}
+ if !ban.expiry
+ b This ban cannot be appealed.
diff --git a/views/user/email_change.pug b/views/user/email_change.pug
index 79385ee..d629f52 100644
--- a/views/user/email_change.pug
+++ b/views/user/email_change.pug
@@ -3,27 +3,34 @@ block title
|Icy Network - Change User Email
block body
- .wrapper
- .boxcont
- .box#totpcheck
- h1 Change Your Email
- if message.text
- if message.error
- .message.error
- span #{message.text}
- else
- .message
- span #{message.text}
- form#loginForm(method="POST", action="")
- input(type="hidden", name="csrf", value=csrf)
- if email
- label(for="email") Current Email Address
- small Email Hint: #{email}
- br
- input(type="email", name="email", id="email")
- label(for="email_new") New Email Address
- input(type="email", name="email_new", id="email_new")
- if password
- label(for="password") Password
- input(type="password", name="password", id="password")
- input(type="submit", value="Change")
+ .container.mt-4.mb-4
+ nav(aria-label="breadcrumb")
+ ol.breadcrumb
+ li.breadcrumb-item
+ a(href="/") Home
+ li.breadcrumb-item
+ a(href="/user/manage") User Settings
+ li.breadcrumb-item.active(aria-current="page") Change Email Address
+ h1 Change Your Email Address
+ if message.text
+ if message.error
+ .alert.alert-danger
+ span #{message.text}
+ else
+ .alert.alert-success
+ span #{message.text}
+ form#loginForm(method="POST", action="")
+ input(type="hidden", name="csrf", value=csrf)
+ if email
+ .form-group
+ label(for="email") Current Email Address
+ input.form-control(type="email", name="email", id="email")
+ small Email Hint: #{email}
+ .form-group
+ label(for="email_new") New Email Address
+ input.form-control(type="email", name="email_new", id="email_new")
+ if password
+ .form-group
+ label(for="password") Password
+ input.form-control(type="password", name="password", id="password")
+ button.btn.btn-primary(type="submit") Done
diff --git a/views/user/login.pug b/views/user/login.pug
index 5c9a099..02e783d 100644
--- a/views/user/login.pug
+++ b/views/user/login.pug
@@ -3,27 +3,28 @@ block title
|Icy Network - Log In
block body
- .wrapper
- .boxcont
- .box#login
- h1 Log in
- .left
- if message.text
- if message.error
- .message.error
- span #{message.text}
- else
- .message
- span #{message.text}
- form#loginForm(method="POST", action="")
- input(type="hidden", name="csrf", value=csrf)
+ .container.mb-4.mt-4
+ h1 Log in
+ .row
+ .col
+ if message.text
+ if message.error
+ .alert.alert-danger
+ span #{message.text}
+ else
+ .alert.alert-success
+ span #{message.text}
+ form#loginForm(method="POST", action="")
+ input(type="hidden", name="csrf", value=csrf)
+ .form-group
label(for="username") Username or Email Address
- input(type="text", name="username", id="username")
+ input.form-control(type="text", name="username", id="username")
+ .form-group
label(for="password") Password
- input(type="password", name="password", id="password")
- input(type="submit", value="Log in")
- a#create(href="/register") Create an account
- span.divider ·
- a#create(href="/login/reset") Forgot password?
- .right
- include ../includes/external.pug
+ input.form-control(type="password", name="password", id="password")
+ button.btn.btn-primary(type="submit") Log in
+ a(href="/register") Create an account
+ | ·
+ a(href="/login/reset") Forgot password?
+ aside.col
+ include ../includes/external.pug
diff --git a/views/user/password.pug b/views/user/password.pug
index 48835d8..b6f6209 100644
--- a/views/user/password.pug
+++ b/views/user/password.pug
@@ -3,20 +3,19 @@ block title
|Icy Network - Password Required
block body
- .wrapper
- .boxcont
- .box#totpcheck
- h1 Enter your password
- small.descr This action requires your password to continue
- if message.text
- if message.error
- .message.error
- span #{message.text}
- else
- .message
- span #{message.text}
- form#loginForm(method="POST", action=post)
- input(type="hidden", name="csrf", value=csrf)
- label(for="password") Password
- input(type="password", name="password", id="password")
- input(type="submit", value="Continue")
+ .container.mt-4.mb-4
+ h1 Enter your password
+ p This action requires your password to continue
+ if message.text
+ if message.error
+ .alert.alert-danger
+ span #{message.text}
+ else
+ .alert.alert-warning
+ span #{message.text}
+ form#loginForm(method="POST", action=post)
+ input(type="hidden", name="csrf", value=csrf)
+ .form-group
+ label(for="password") Password
+ input.form-control#password(type="password", name="password")
+ button.btn.btn-primary(type="submit") Continue
diff --git a/views/user/password_new.pug b/views/user/password_new.pug
index 87d0c09..0333b4b 100644
--- a/views/user/password_new.pug
+++ b/views/user/password_new.pug
@@ -3,25 +3,34 @@ block title
|Icy Network - Change User Password
block body
- .wrapper
- .boxcont
- .box#totpcheck
- h1 Change Your Password
- if message.text
- if message.error
- .message.error
- span #{message.text}
- else
- .message
- span #{message.text}
- form#loginForm(method="POST", action="")
- input(type="hidden", name="csrf", value=csrf)
- if !token
- label(for="password_old") Current Password
- input(type="password", name="password_old", id="password_old")
- label(for="password") New Password
- input(type="password", name="password", id="password")
- label(for="password_repeat") Repeat New Password
- input(type="password", name="password_repeat", id="password_repeat", autocomplete="off")
- div#repeatcheck(style="display: none")
- input(type="submit", value="Change")
+ .container.mt-4.mb-4
+ if user
+ nav(aria-label="breadcrumb")
+ ol.breadcrumb
+ li.breadcrumb-item
+ a(href="/") Home
+ li.breadcrumb-item
+ a(href="/user/manage") User Settings
+ li.breadcrumb-item.active(aria-current="page") Change Password
+ h1 Change Your Password
+ if message.text
+ if message.error
+ .alert.alert-danger
+ span #{message.text}
+ else
+ .alert.alert-success
+ span #{message.text}
+ form#loginForm(method="POST", action="")
+ input(type="hidden", name="csrf", value=csrf)
+ if !token
+ .form-group
+ label(for="password_old") Current Password
+ input.form-control#password_old(type="password", name="password_old")
+ .form-group
+ label(for="password") New Password
+ input.form-control#password(type="password", name="password")
+ .form-group
+ label(for="password_repeat") Repeat New Password
+ input.form-control#password_repeat(type="password", name="password_repeat", autocomplete="off")
+ small#repeatcheck(style="display: none")
+ button.btn.btn-primary(type="submit") Change
diff --git a/views/user/register.pug b/views/user/register.pug
index de8779f..b0d5193 100644
--- a/views/user/register.pug
+++ b/views/user/register.pug
@@ -3,35 +3,45 @@ block title
|Icy Network - Register
block body
- .wrapper
- .boxcont
- .box#login
- h1 Create a new account
- .left
- if message.text
- if message.error
- .message.error
- span #{message.text}
- else
- .message
- span #{message.text}
- form#loginForm(method="POST", action="")
- input(type="hidden", name="csrf", value=csrf)
+ .container.mb-4.mt-4
+ h1 Create a new account
+ .row
+ .col
+ if message.text
+ if message.error
+ .alert.alert-danger
+ span #{message.text}
+ else
+ .alert.alert-success
+ span #{message.text}
+ form#loginForm(method="POST", action="")
+ input(type="hidden", name="csrf", value=csrf)
+ .form-group
label(for="username") Username
- input(type="text", name="username", id="username", value=formkeep.username)
+ input.form-control#username(type="text", name="username", value=formkeep.username, aria-labelledby="usernameText")
+ small#usernameText English characters, numbers and -_ only.
+ .form-group
label(for="display_name") Display Name
- input(type="text", name="display_name", id="display_name", value=formkeep.display_name)
+ input.form-control#display_name(type="text", name="display_name", value=formkeep.display_name, aria-labelledby="display_nameText")
+ small#display_nameText The name displayed on your public profiles.
+ .form-group
label(for="email") Email Address
- input(type="email", name="email", id="email", value=formkeep.email)
+ input.form-control#email(type="email", name="email", value=formkeep.email)
+ .form-group
label(for="password") Password
- input(type="password", name="password", id="password")
+ input.form-control#password(type="password", name="password", aria-labelledby="passwordText")
+ small#passwordText 8 characters minimum.
+ .form-group
label(for="password_repeat") Repeat Password
- input(type="password", name="password_repeat", id="password_repeat", autocomplete="off")
- div#repeatcheck(style="display: none")
- if recaptcha
+ input.form-control#password_repeat(type="password", name="password_repeat", autocomplete="off")
+ small#repeatcheck(style="display: none")
+ if recaptcha
+ .form-group
+ label Captcha
script(src='https://www.google.com/recaptcha/api.js')
.g-recaptcha(data-sitekey=recaptcha)
- input(type="submit", value="Register")
- a#create(href="/login") Log in with an existing account
- .right
- include ../includes/external.pug
+ button.btn.btn-primary(type="submit") Register
+ | or
+ a(href="/login") log in with an existing account
+ aside.col
+ include ../includes/external.pug
diff --git a/views/user/settings.pug b/views/user/settings.pug
index 8a63c7a..03125fe 100644
--- a/views/user/settings.pug
+++ b/views/user/settings.pug
@@ -3,70 +3,87 @@ block title
|Icy Network - User Settings
block body
- .wrapper
- .boxcont
- .box#settings
- h1 User Settings
- .left
- if message.text
- if message.error
- .message.error
- span #{message.text}
- else
- .message
- span #{message.text}
- form#loginForm(method="POST", action="")
- input(type="hidden", name="csrf", value=csrf)
- label(for="username") Username
- input(type="text", name="username", id="username", value=user.username, disabled)
- label(for="display_name") Display Name
- input(type="text", name="display_name", id="display_name", value=user.display_name)
- label Avatar
- .avatarCont
- include ../includes/avatar.pug
- .options
- a#newAvatar(href='#') Change Avatar
- if user.avatar_file
- a#removeAvatar(href='#') Remove Avatar
- input(type="submit", value="Save Settings")
- .right
- h3 Social Media Accounts
- .specify(title="You can add social media accounts to your account for ease of login. Once added, logging in from linked sources logs you into this account automatically.") ?
- include ../includes/external.pug
- if google_auth == false
- a.option.accdisconnect(href="/api/external/google/remove")
- i.fa.fa-fw.fa-times
- |Unlink Google
- if twitter_auth == false
- a.option.accdisconnect(href="/api/external/twitter/remove")
- i.fa.fa-fw.fa-times
- |Unlink Twitter
- if facebook_auth == false
- a.option.accdisconnect(href="/api/external/facebook/remove")
- i.fa.fa-fw.fa-times
- |Unlink Facebook
- if discord_auth == false
- a.option.accdisconnect(href="/api/external/discord/remove")
- i.fa.fa-fw.fa-times
- |Unlink Discord
- h3 Other Options
- if password
- a.option(href="/user/manage/password")
- i.fa.fa-fw.fa-lock
- |Change Password
- if totp
- a.option(href="/user/two-factor/disable")
+ .container.mt-4.mb-4
+ nav(aria-label="breadcrumb")
+ ol.breadcrumb
+ li.breadcrumb-item
+ a(href="/") Home
+ li.breadcrumb-item.active(aria-current="page") User Settings
+ h1 User Settings
+ .row
+ .col-3
+ .nav.flex-column.nav-pills#v-pills-tab(role="tablist", aria-orientation="vertical")
+ a.nav-link.active#v-pills-main-tab(data-toggle="tab", href="#v-pills-main", role="tab", aria-control="v-pills-main", aria-selected="true") General Settings
+ a.nav-link#v-pills-social-tab(data-toggle="tab", href="#v-pills-social", role="tab", aria-control="v-pills-social", aria-selected="false") Social Accounts
+ a.nav-link#v-pills-oauth2-tab(data-toggle="tab", href="#v-pills-oauth2", role="tab", aria-control="v-pills-oauth2", aria-selected="false") OAuth2 Authorizations
+ a.nav-link#v-pills-actions-tab(data-toggle="tab", href="#v-pills-actions", role="tab", aria-control="v-pills-actions", aria-selected="false") Account Actions
+ .col-9
+ .tab-content#v-pills-tabContent
+ .tab-pane.fade.show.active#v-pills-main(role="tabpanel", aria-labelledby="v-pills-main")
+ h2 General Settings
+ if message.text
+ if message.error
+ .alert.alert-danger
+ span #{message.text}
+ else
+ .alert.alert-success
+ span #{message.text}
+ form#loginForm(method="POST", action="")
+ input(type="hidden", name="csrf", value=csrf)
+ .form-group
+ label(for="username") Username
+ input.form-control(type="text", name="username", id="username", value=user.username, disabled)
+ .form-group
+ label(for="display_name") Display Name
+ input.form-control(type="text", name="display_name", id="display_name", value=user.display_name)
+ label Avatar
+ .avatarCont
+ include ../includes/avatar.pug
+ .options
+ a#newAvatar(href='#') Change Avatar
+ if user.avatar_file
+ a#removeAvatar(href='#') Remove Avatar
+ button.btn.btn-primary(type="submit") Save Settings
+ .tab-pane.fade#v-pills-social(role="tabpanel", aria-labelledby="v-pills-social")
+ h3 Social Media Accounts
+ p You can add social media accounts to your account for ease of login. Once added, logging in from linked sources logs you into this account automatically.
+ include ../includes/external.pug
+ if google_auth == false
+ a.option.accdisconnect(href="/api/external/google/remove")
+ i.fa.fa-fw.fa-times
+ |Unlink Google
+ if twitter_auth == false
+ a.option.accdisconnect(href="/api/external/twitter/remove")
+ i.fa.fa-fw.fa-times
+ |Unlink Twitter
+ if facebook_auth == false
+ a.option.accdisconnect(href="/api/external/facebook/remove")
+ i.fa.fa-fw.fa-times
+ |Unlink Facebook
+ if discord_auth == false
+ a.option.accdisconnect(href="/api/external/discord/remove")
+ i.fa.fa-fw.fa-times
+ |Unlink Discord
+ .tab-pane.fade#v-pills-oauth2(role="tabpanel", aria-labelledby="v-pills-oauth2")
+ .clients
+ h2 Authorized Applications
+ p Applications which have access to basic user information. You may restrict access at any time by pressing the red icon on the top right of the application card.
+ .cl#clientlist
+ p Please enable JavaScript to view this content.
+ .tab-pane.fade#v-pills-actions(role="tabpanel", aria-labelledby="v-pills-actions")
+ h3 Account Actions
+ if password
+ a.option(href="/user/manage/password")
i.fa.fa-fw.fa-lock
- |Disable Two-Factor Authentication
- else
- a.option(href="/user/two-factor")
- i.fa.fa-fw.fa-lock
- |Enable Two-Factor Authentication
- a.option(href="/user/manage/email")
- i.fa.fa-fw.fa-envelope
- |Change Email Address
- .clients
- h2 Authorized Applications
- .specify(title="Applications which have access to basic user information. You may restrict access at any time by pressing the red icon on the top right of the application card.") ?
- .cl#clientlist
- p Please enable JavaScript to view this content.
+ |Change Password
+ if totp
+ a.option(href="/user/two-factor/disable")
+ i.fa.fa-fw.fa-lock
+ |Disable Two-Factor Authentication
+ else
+ a.option(href="/user/two-factor")
+ i.fa.fa-fw.fa-lock
+ |Enable Two-Factor Authentication
+ a.option(href="/user/manage/email")
+ i.fa.fa-fw.fa-envelope
+ |Change Email Address
diff --git a/views/user/totp-check.pug b/views/user/totp-check.pug
index 5a3e685..da2477a 100644
--- a/views/user/totp-check.pug
+++ b/views/user/totp-check.pug
@@ -3,20 +3,19 @@ block title
|Icy Network - Log In - Verification Required
block body
- .wrapper
- .boxcont
- .box#totpcheck
- h1 Enter Code
- small.descr This user has Two Factor Authentication enabled. Enter the code to log in.
- if message.text
- if message.error
- .message.error
- span #{message.text}
- else
- .message
- span #{message.text}
- form#loginForm(method="POST", action="")
- input(type="hidden", name="csrf", value=csrf)
- label(for="code") Code
- input(type="text", name="code", id="code", autocomplete="off")
- input(type="submit", value="Log in")
+ .container
+ h1 Enter Code
+ p This user has Two Factor Authentication enabled. Enter the code to log in.
+ if message.text
+ if message.error
+ .alert.alert-danger
+ span #{message.text}
+ else
+ .alert.alert-success
+ span #{message.text}
+ form#loginForm(method="POST", action="")
+ input(type="hidden", name="csrf", value=csrf)
+ .form-group
+ label(for="code") Code
+ input.form-control#code(type="text", name="code", autocomplete="off")
+ button.btn.btn-primary(type="submit") Log in
diff --git a/views/user/totp.pug b/views/user/totp.pug
index d764769..03a332a 100644
--- a/views/user/totp.pug
+++ b/views/user/totp.pug
@@ -3,33 +3,40 @@ block title
|Icy Network - Activate Authenticator
block body
- .wrapper
- .boxcont
- .box#login
- h1 Two Factor Authentication
- .left
- if message.text
- if message.error
- .message.error
- span #{message.text}
- else
- .message
- span #{message.text}
- img.qr(src="//api.qrserver.com/v1/create-qr-code/?data=" + uri)
- form#totpForm(method="POST", action="")
- input(type="hidden", name="csrf", value=csrf)
+ .container.mt-5.mb-5
+ nav(aria-label="breadcrumb")
+ ol.breadcrumb
+ li.breadcrumb-item
+ a(href="/") Home
+ li.breadcrumb-item
+ a(href="/user/manage") User Settings
+ li.breadcrumb-item.active(aria-current="page") Enable Two Factor Authentication
+ h1 Two Factor Authentication
+ .row
+ .col
+ if message.text
+ if message.error
+ .alert.alert-danger
+ span #{message.text}
+ else
+ .alert.alert-warning
+ span #{message.text}
+ img.qr(src="//api.qrserver.com/v1/create-qr-code/?data=" + uri)
+ form#totpForm(method="POST", action="")
+ input(type="hidden", name="csrf", value=csrf)
+ .form-group
label(for="code") Enter the Code
- input(type="text", name="code", id="code", autocomplete="off")
- input(type="submit", value="Enable Now")
- .right
- h3 How to use
- ol
- li Scan the QR Code with your authenticator app
- li Enter the one-time code given to you
- li You will now be asked for a code every time you log in
- h3 Authenticator app
- p We recommend using Google Authenticator
- a.dlbtn(href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1', target="_blank")
- img(alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png')
- a.dlbtn.apple(href='https://itunes.apple.com/us/app/google-authenticator/id388497605', target="_blank")
- img(alt='Download on the App Store' src='https://devimages-cdn.apple.com/app-store/marketing/guidelines/images/badge-download-on-the-app-store.svg')
+ input.form-control#code(type="text", name="code", autocomplete="off")
+ button.btn.btn-primary(type="submit") Enable Now
+ aside.col
+ h3 How to use
+ ol
+ li Scan the QR Code with your authenticator app
+ li Enter the one-time code given to you
+ li You will now be asked for a code every time you log in
+ h3 Authenticator app
+ p We recommend using Google Authenticator. You can download it below for your smartphone:
+ a.app-button(href='https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1', target="_blank")
+ img(alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png')
+ a.app-button.apple(href='https://itunes.apple.com/us/app/google-authenticator/id388497605', target="_blank")
+ img(alt='Download on the App Store' src='https://devimages-cdn.apple.com/app-store/marketing/guidelines/images/badge-download-on-the-app-store.svg')