├── example.env ├── .gitignore ├── public ├── images │ ├── favicon.png │ ├── blog │ │ ├── blog-01.jpg │ │ ├── blog-02.jpg │ │ ├── blog-03.jpg │ │ ├── author-01.png │ │ ├── bannder-ad.png │ │ ├── article-author-01.png │ │ ├── article-author-02.png │ │ ├── article-author-03.png │ │ ├── article-author-04.png │ │ ├── blog-details-01.jpg │ │ ├── quote-bg.svg │ │ └── dotted-shape.svg │ ├── team │ │ ├── team-01.png │ │ ├── team-02.png │ │ ├── team-03.png │ │ ├── team-04.png │ │ ├── shape-2.svg │ │ └── dotted-shape.svg │ ├── hero │ │ ├── hero-image.jpg │ │ └── brand.svg │ ├── testimonials │ │ ├── author-01.png │ │ ├── author-02.png │ │ └── author-03.png │ ├── footer │ │ ├── shape-1.svg │ │ ├── shape-3.svg │ │ └── brands │ │ │ ├── ayroui.svg │ │ │ ├── tailgrids.svg │ │ │ ├── lineicons.svg │ │ │ ├── plainadmin.svg │ │ │ ├── uideck.svg │ │ │ ├── tailwindtemplates.svg │ │ │ ├── graygrids.svg │ │ │ └── ecommerce-html.svg │ ├── logo │ │ ├── favicon.svg │ │ ├── logo-white.svg │ │ └── logo.svg │ └── brands │ │ ├── ayroui.svg │ │ ├── tailgrids.svg │ │ ├── lineicons.svg │ │ ├── uideck.svg │ │ ├── tailwindtemplates.svg │ │ ├── graygrids.svg │ │ └── ecommerce-html.svg ├── assets │ ├── fonts │ │ ├── LineIcons.eot │ │ ├── LineIcons.ttf │ │ ├── LineIcons.woff │ │ └── LineIcons.woff2 │ ├── images │ │ ├── hero │ │ │ └── phone.png │ │ ├── favicon.svg │ │ └── logo │ │ │ ├── logo.svg │ │ │ └── white-logo.svg │ ├── js │ │ ├── count-up.min.js │ │ ├── main.js │ │ ├── wow.min.js │ │ └── tiny-slider.js │ └── css │ │ ├── tiny-slider.css │ │ └── glightbox.min.css └── animate.css ├── middleware ├── errorHandler.js └── auth.js ├── routes ├── index.js ├── adminRoute.js └── authRoute.js ├── views ├── partials │ └── head.ejs └── pages │ ├── 404.ejs │ ├── login.ejs │ └── signup.ejs ├── config ├── db.js └── passport.js ├── models └── userSchema.js ├── package.json └── app.js /example.env: -------------------------------------------------------------------------------- 1 | url= 2 | secret= 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | .vscode 4 | .idea -------------------------------------------------------------------------------- /public/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/favicon.png -------------------------------------------------------------------------------- /public/images/blog/blog-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/blog-01.jpg -------------------------------------------------------------------------------- /public/images/blog/blog-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/blog-02.jpg -------------------------------------------------------------------------------- /public/images/blog/blog-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/blog-03.jpg -------------------------------------------------------------------------------- /public/images/team/team-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/team/team-01.png -------------------------------------------------------------------------------- /public/images/team/team-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/team/team-02.png -------------------------------------------------------------------------------- /public/images/team/team-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/team/team-03.png -------------------------------------------------------------------------------- /public/images/team/team-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/team/team-04.png -------------------------------------------------------------------------------- /public/images/blog/author-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/author-01.png -------------------------------------------------------------------------------- /middleware/errorHandler.js: -------------------------------------------------------------------------------- 1 | const notFound = (req,res,next) => { 2 | return res.render('404') 3 | } 4 | module.exports = {notFound} 5 | -------------------------------------------------------------------------------- /public/assets/fonts/LineIcons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/assets/fonts/LineIcons.eot -------------------------------------------------------------------------------- /public/assets/fonts/LineIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/assets/fonts/LineIcons.ttf -------------------------------------------------------------------------------- /public/assets/fonts/LineIcons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/assets/fonts/LineIcons.woff -------------------------------------------------------------------------------- /public/assets/fonts/LineIcons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/assets/fonts/LineIcons.woff2 -------------------------------------------------------------------------------- /public/assets/images/hero/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/assets/images/hero/phone.png -------------------------------------------------------------------------------- /public/images/blog/bannder-ad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/bannder-ad.png -------------------------------------------------------------------------------- /public/images/hero/hero-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/hero/hero-image.jpg -------------------------------------------------------------------------------- /public/images/blog/article-author-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/article-author-01.png -------------------------------------------------------------------------------- /public/images/blog/article-author-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/article-author-02.png -------------------------------------------------------------------------------- /public/images/blog/article-author-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/article-author-03.png -------------------------------------------------------------------------------- /public/images/blog/article-author-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/article-author-04.png -------------------------------------------------------------------------------- /public/images/blog/blog-details-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/blog/blog-details-01.jpg -------------------------------------------------------------------------------- /public/images/testimonials/author-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/testimonials/author-01.png -------------------------------------------------------------------------------- /public/images/testimonials/author-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/testimonials/author-02.png -------------------------------------------------------------------------------- /public/images/testimonials/author-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Axitvadi/passport-authentication/HEAD/public/images/testimonials/author-03.png -------------------------------------------------------------------------------- /public/images/team/shape-2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const passport = require('passport') 4 | 5 | const authRoute = require('./authRoute') 6 | const adminRoute = require('./adminRoute') 7 | 8 | router.use('/', authRoute) 9 | 10 | router.use('/admin', adminRoute) 11 | 12 | module.exports = router -------------------------------------------------------------------------------- /views/partials/head.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /middleware/auth.js: -------------------------------------------------------------------------------- 1 | function checkNotAuthenticated(req, res, next) { 2 | if (req.isAuthenticated()) { 3 | return res.redirect('/admin/main') 4 | } 5 | return next() 6 | } 7 | 8 | function checkAuthenticated(req, res, next) { 9 | if (req.isAuthenticated()) { 10 | return next() 11 | } 12 | return res.redirect('/login') 13 | } 14 | 15 | module.exports = {checkNotAuthenticated,checkAuthenticated} -------------------------------------------------------------------------------- /config/db.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | 3 | let mongoose = require("mongoose") 4 | 5 | require("../models/userSchema") 6 | 7 | mongoose.Promise = global.Promise 8 | 9 | mongoose.connect(process.env.url,{ 10 | useUnifiedTopology:true, 11 | useNewUrlParser:true 12 | }) 13 | 14 | let db = mongoose.connection 15 | 16 | db.on('error',console.error.bind(console,"failed to connect server")) 17 | 18 | db.once('open',()=>{console.log("succesfuly connected to Database..!")}) -------------------------------------------------------------------------------- /public/images/footer/shape-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /models/userSchema.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | var mongoose = require("mongoose") 3 | 4 | var userSchema = new mongoose.Schema({ 5 | username:{ 6 | type:String, 7 | required:[true,"fill username"] 8 | }, 9 | email:{ 10 | type:String, 11 | required:[true,"fill email"] 12 | }, 13 | password:{ 14 | type:String, 15 | required:[true,"fill password"] 16 | } 17 | }) 18 | 19 | var user = mongoose.model('user',userSchema) 20 | module.exports = user -------------------------------------------------------------------------------- /public/images/footer/shape-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/images/logo/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "passport-authentication", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node app.js", 9 | "dev": "nodemon app.js" 10 | }, 11 | "author": "Axit", 12 | "license": "MIT", 13 | "dependencies": { 14 | "connect-flash": "^0.1.1", 15 | "cookie-parser": "^1.4.6", 16 | "dotenv": "^16.0.0", 17 | "ejs": "^3.1.6", 18 | "express": "^4.17.2", 19 | "express-session": "^1.17.2", 20 | "mongoose": "^6.2.0", 21 | "nodemon": "^2.0.15", 22 | "passport": "^0.5.2", 23 | "passport-local": "^1.0.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/images/blog/quote-bg.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config() 2 | require("./config/db") 3 | const express = require("express") 4 | const app = express() 5 | const passport = require("passport") 6 | const path = require("path") 7 | const expressSession = require('express-session') 8 | const router = require('./routes/index') 9 | const {notFound} = require('./middleware/errorHandler') 10 | const flash = require('connect-flash') 11 | const cookieParser = require('cookie-parser'); 12 | 13 | require('./config/passport')(passport) 14 | 15 | app.set('views', path.join(__dirname, 'views/pages')) 16 | app.set('view engine', 'ejs') 17 | 18 | app.use(express.static('public')) 19 | 20 | app.use(expressSession({ 21 | secret: process.env.secret, 22 | resave: false, 23 | saveUninitialized: false 24 | })) 25 | 26 | app.use(express.json({limit: "1024mb"})) 27 | app.use(express.urlencoded({limit: "1024mb",extended: true})) 28 | 29 | app.use(passport.initialize()) 30 | app.use(passport.session()) 31 | app.use(cookieParser()) 32 | app.use(flash()) 33 | 34 | app.use(router) 35 | 36 | app.use(notFound) 37 | 38 | const port = process.env.PORT || 4000 39 | app.listen(port, () => console.log(`server started successful on port ${port}`)) 40 | -------------------------------------------------------------------------------- /routes/adminRoute.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | 4 | const {checkAuthenticated} = require('../middleware/auth') 5 | 6 | router.get('/main',checkAuthenticated, (req, res) => { 7 | const cookie = req.cookies 8 | console.log(cookie) 9 | const view = cookie.views ? + cookie.views + 1 : 1 10 | 11 | res.cookie(`views`,view,{ 12 | maxAge: 500000, // in mili second 13 | // expires works the same as the maxAge 14 | // expires: new Date('12 1 2022'), 15 | secure: true, // if true browser only accept cookie from https connection, on localhost it false 16 | httpOnly: true, // only access by http not in browser 17 | // sameSite: 'none' // default lax, lax mean for browser matches the domain of cookie, strict means for This will restrict cross-site sharing even between different domains that the same publisher owns 18 | }); 19 | res.render('main', { username: req.user?.username }) 20 | }) 21 | 22 | router.get('/logout',checkAuthenticated, async (req, res) => { 23 | req.logout() 24 | res.redirect('/login') 25 | }) 26 | 27 | router.get('/set-cookies',checkAuthenticated, async (req,res) => { 28 | 29 | }) 30 | 31 | module.exports = router 32 | -------------------------------------------------------------------------------- /routes/authRoute.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const passport = require('passport') 4 | const User = require('../models/userSchema') 5 | 6 | const {checkNotAuthenticated} = require('../middleware/auth') 7 | 8 | router.get('/', checkNotAuthenticated, (req, res) => { 9 | res.render('index') 10 | }) 11 | 12 | router.get('/login', checkNotAuthenticated, (req, res) => { 13 | const error = req.flash('error') 14 | const success = req.flash('success') 15 | res.render('login',{error,success}) 16 | }) 17 | router.post('/login', checkNotAuthenticated, passport.authenticate('local', { 18 | // successRedirect: '/admin/main', 19 | failureRedirect: '/login', 20 | failureFlash: true 21 | }), (req, res) => { 22 | console.log(req.hostname); 23 | res.redirect('/admin/main') 24 | }) 25 | 26 | router.get('/signup', checkNotAuthenticated, (req, res) => { 27 | res.render('signup') 28 | }) 29 | router.post('/signup', checkNotAuthenticated, async (req, res) => { 30 | try { 31 | const created = await User.create(req.body) 32 | if (!created) { 33 | res.redirect('/signup') 34 | } 35 | res.redirect('/login') 36 | } catch (err) { 37 | res.json({Message: err}) 38 | } 39 | }) 40 | 41 | module.exports = router 42 | -------------------------------------------------------------------------------- /config/passport.js: -------------------------------------------------------------------------------- 1 | const LocalStrategy = require("passport-local").Strategy; 2 | const USER = require('../models/userSchema') 3 | 4 | module.exports = (passport) => { 5 | 6 | passport.serializeUser((user, done) => { 7 | if (user) { 8 | return done(null, user._id) 9 | } 10 | return done(null, false) 11 | }) 12 | passport.deserializeUser((_id, done) => { 13 | USER.findById(_id, (err, user) => { 14 | if (err) return done(null, false) 15 | delete user._doc.password 16 | return done(null, user) 17 | }) 18 | }) 19 | 20 | passport.use(new LocalStrategy({ 21 | usernameField: 'email' 22 | }, 23 | async function (username, password, done) { 24 | USER.findOne({email: username}, function (err, user) { 25 | if (err) { 26 | return done(err); 27 | } 28 | if (!user) { 29 | return done(null, false, {type:"error",message:"incorrect username"}) 30 | } 31 | if (user.password !== password) { 32 | return done(null, false, {type:"error",message:"incorrect password"}) 33 | } 34 | return done(null, user); 35 | }); 36 | } 37 | )); 38 | } 39 | -------------------------------------------------------------------------------- /public/images/logo/logo-white.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/logo/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/brands/ayroui.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/footer/brands/ayroui.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/js/count-up.min.js: -------------------------------------------------------------------------------- 1 | function counterUp(t){"use strict";this.defaults={duration:3e3,prepend:"",append:"%",selector:".countup",start:0,end:100,intvalues:!1,interval:100};var e=this;this.upating=!1,this.intervalID=null,this.props={};for(var r in this.defaults)"undefined"!=typeof r&&(e.props[r]=e.defaults[r],t.hasOwnProperty(r)&&e.props.hasOwnProperty(r)&&(e.props[r]=t[r]));this.domelems=document.querySelectorAll(this.props.selector),this.elems=[];var n={};this.domelems.forEach(function(t){n.obj=t;var r=parseInt(t.getAttribute("cup-start"));isNaN(r)?n.start=e.props.start:n.start=r;var p=parseInt(t.getAttribute("cup-end"));isNaN(p)?n.end=e.props.end:n.end=p;var a=parseInt(t.getAttribute("cup-duration"));isNaN(a)?n.duration=e.props.duration:n.duration=a;var s=t.getAttribute("cup-prepend");null==s?n.prepend=e.props.prepend:n.prepend=s;var i=t.getAttribute("cup-append");null==i?n.append=e.props.append:n.append=i;var o=t.getAttribute("cup-intval");null==o?n.intvalues=e.props.intvalues:n.intvalues=o,n.step=(n.end-n.start)/(n.duration/e.props.interval),n.val=n.start,e.elems.push(n),n={}})}counterUp.prototype.start=function(){"use strict";var t=this;this.intervalID=setInterval(function(){t.updating||t.update()},t.props.interval)},counterUp.prototype.update=function(){"use strict";this.updating=!0;var t=!0;this.elems.forEach(function(e){e.val+=e.step,e.val -------------------------------------------------------------------------------- /public/assets/css/tiny-slider.css: -------------------------------------------------------------------------------- 1 | .tns-outer{padding:0!important}.tns-outer [hidden]{display:none!important}.tns-outer [aria-controls],.tns-outer [data-action]{cursor:pointer}.tns-slider{-webkit-transition:all 0s;-moz-transition:all 0s;transition:all 0s}.tns-slider>.tns-item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.tns-horizontal.tns-subpixel{white-space:nowrap}.tns-horizontal.tns-subpixel>.tns-item{display:inline-block;vertical-align:top;white-space:normal}.tns-horizontal.tns-no-subpixel:after{content:'';display:table;clear:both}.tns-horizontal.tns-no-subpixel>.tns-item{float:left}.tns-horizontal.tns-carousel.tns-no-subpixel>.tns-item{margin-right:-100%}.tns-no-calc{position:relative;left:0}.tns-gallery{position:relative;left:0;min-height:1px}.tns-gallery>.tns-item{position:absolute;left:-100%;-webkit-transition:transform 0s,opacity 0s;-moz-transition:transform 0s,opacity 0s;transition:transform 0s,opacity 0s}.tns-gallery>.tns-slide-active{position:relative;left:auto!important}.tns-gallery>.tns-moving{-webkit-transition:all .25s;-moz-transition:all .25s;transition:all .25s}.tns-autowidth{display:inline-block}.tns-lazy-img{-webkit-transition:opacity .6s;-moz-transition:opacity .6s;transition:opacity .6s;opacity:.6}.tns-lazy-img.tns-complete{opacity:1}.tns-ah{-webkit-transition:height 0s;-moz-transition:height 0s;transition:height 0s}.tns-ovh{overflow:hidden}.tns-visually-hidden{position:absolute;left:-10000em}.tns-transparent{opacity:0;visibility:hidden}.tns-fadeIn{opacity:1;filter:alpha(opacity=100);z-index:0}.tns-normal,.tns-fadeOut{opacity:0;filter:alpha(opacity=0);z-index:-1}.tns-vpfix{white-space:nowrap}.tns-vpfix>div,.tns-vpfix>li{display:inline-block}.tns-t-subp2{margin:0 auto;width:310px;position:relative;height:10px;overflow:hidden}.tns-t-ct{width:2333.3333333%;width:-webkit-calc(100% * 70/3);width:-moz-calc(100% * 70/3);width:calc(100% * 70/3);position:absolute;right:0}.tns-t-ct:after{content:'';display:table;clear:both}.tns-t-ct>div{width:1.4285714%;width:-webkit-calc(100%/70);width:-moz-calc(100%/70);width:calc(100%/70);height:10px;float:left} -------------------------------------------------------------------------------- /public/assets/images/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 24 | 25 | -------------------------------------------------------------------------------- /views/pages/404.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 404 Error - Appvilla Creative Landing Page HTML Template. 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 30 | 31 | 32 |
33 |
34 |
35 | 36 | 37 |
38 |
39 |
40 | 41 | 42 | 43 |
44 |
45 |
46 |
47 |
48 |

404

49 |

Oops! Page Not Found!

50 |

The page you are looking for does not exist. It might have been moved or deleted.

51 |
52 | Back to Home 53 |
54 |
55 |
56 |
57 |
58 |
59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /views/pages/login.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Login 6 | <%- include('../partials/head.ejs'); %> 7 | 8 | 9 | 10 |
11 |
12 |
13 |
14 |

Login

15 |
16 |
17 |
18 |
19 |
20 |
22 |
23 | 69 |
70 |
71 |
72 |
73 |
74 | 75 | 76 | 77 | 78 | 81 | -------------------------------------------------------------------------------- /public/assets/js/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | Template Name: Appvilla - Creative Landing Page HTML Template. 3 | Author: GrayGrids 4 | */ 5 | 6 | (function () { 7 | //===== Prealoder 8 | 9 | window.onload = function () { 10 | window.setTimeout(fadeout, 500); 11 | } 12 | 13 | function fadeout() { 14 | document.querySelector('.preloader').style.opacity = '0'; 15 | document.querySelector('.preloader').style.display = 'none'; 16 | } 17 | 18 | 19 | /*===================================== 20 | Sticky 21 | ======================================= */ 22 | window.onscroll = function () { 23 | var header_navbar = document.querySelector(".navbar-area"); 24 | var sticky = header_navbar.offsetTop; 25 | 26 | var logo = document.querySelector('.navbar-brand img') 27 | if (window.pageYOffset > sticky) { 28 | header_navbar.classList.add("sticky"); 29 | logo.src = 'assets/images/logo/logo.svg'; 30 | } else { 31 | header_navbar.classList.remove("sticky"); 32 | logo.src = 'assets/images/logo/white-logo.svg'; 33 | } 34 | 35 | // show or hide the back-top-top button 36 | var backToTo = document.querySelector(".scroll-top"); 37 | if (document.body.scrollTop > 50 || document.documentElement.scrollTop > 50) { 38 | backToTo.style.display = "flex"; 39 | } else { 40 | backToTo.style.display = "none"; 41 | } 42 | }; 43 | 44 | 45 | 46 | // section menu active 47 | function onScroll(event) { 48 | var sections = document.querySelectorAll('.page-scroll'); 49 | var scrollPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; 50 | 51 | for (var i = 0; i < sections.length; i++) { 52 | var currLink = sections[i]; 53 | var val = currLink.getAttribute('href'); 54 | var refElement = document.querySelector(val); 55 | var scrollTopMinus = scrollPos + 73; 56 | if (refElement.offsetTop <= scrollTopMinus && (refElement.offsetTop + refElement.offsetHeight > scrollTopMinus)) { 57 | document.querySelector('.page-scroll').classList.remove('active'); 58 | currLink.classList.add('active'); 59 | } else { 60 | currLink.classList.remove('active'); 61 | } 62 | } 63 | }; 64 | 65 | window.document.addEventListener('scroll', onScroll); 66 | 67 | // for menu scroll 68 | var pageLink = document.querySelectorAll('.page-scroll'); 69 | 70 | pageLink.forEach(elem => { 71 | elem.addEventListener('click', e => { 72 | e.preventDefault(); 73 | document.querySelector(elem.getAttribute('href')).scrollIntoView({ 74 | behavior: 'smooth', 75 | offsetTop: 1 - 60, 76 | }); 77 | }); 78 | }); 79 | 80 | // WOW active 81 | new WOW().init(); 82 | 83 | let filterButtons = document.querySelectorAll('.portfolio-btn-wrapper button'); 84 | filterButtons.forEach(e => 85 | e.addEventListener('click', () => { 86 | 87 | let filterValue = event.target.getAttribute('data-filter'); 88 | iso.arrange({ 89 | filter: filterValue 90 | }); 91 | }) 92 | ); 93 | 94 | var elements = document.getElementsByClassName("portfolio-btn"); 95 | for (var i = 0; i < elements.length; i++) { 96 | elements[i].onclick = function () { 97 | var el = elements[0]; 98 | while (el) { 99 | if (el.tagName === "BUTTON") { 100 | el.classList.remove("active"); 101 | } 102 | el = el.nextSibling; 103 | } 104 | this.classList.add("active"); 105 | }; 106 | }; 107 | 108 | //===== mobile-menu-btn 109 | let navbarToggler = document.querySelector(".mobile-menu-btn"); 110 | navbarToggler.addEventListener('click', function () { 111 | navbarToggler.classList.toggle("active"); 112 | }); 113 | 114 | 115 | })(); -------------------------------------------------------------------------------- /public/assets/images/logo/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 24 | 25 | 26 | 31 | 36 | 37 | 39 | 40 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /views/pages/signup.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Sign Up 6 | <%- include('../partials/head.ejs'); %> 7 | 8 | 9 | 10 |
11 |
12 |
13 |
14 |

Register

15 |
16 |
17 |
18 |
19 |
20 |
22 |
23 | 68 |
69 |
70 |
71 |
72 |
73 | 76 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /public/assets/images/logo/white-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 24 | 25 | 26 | 31 | 36 | 37 | 39 | 40 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /public/images/team/dotted-shape.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/animate.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | /*! 4 | * animate.css -https://daneden.github.io/animate.css/ 5 | * Version - 3.7.2 6 | * Licensed under the MIT license - http://opensource.org/licenses/MIT 7 | * 8 | * Copyright (c) 2019 Daniel Eden 9 | */ 10 | 11 | @-webkit-keyframes fadeIn { 12 | from { 13 | opacity: 0; 14 | } 15 | 16 | to { 17 | opacity: 1; 18 | } 19 | } 20 | 21 | @keyframes fadeIn { 22 | from { 23 | opacity: 0; 24 | } 25 | 26 | to { 27 | opacity: 1; 28 | } 29 | } 30 | 31 | .fadeIn { 32 | -webkit-animation-name: fadeIn; 33 | animation-name: fadeIn; 34 | } 35 | 36 | @-webkit-keyframes fadeInDown { 37 | from { 38 | opacity: 0; 39 | -webkit-transform: translate3d(0, -20px, 0); 40 | transform: translate3d(0, -20px, 0); 41 | } 42 | 43 | to { 44 | opacity: 1; 45 | -webkit-transform: translate3d(0, 0, 0); 46 | transform: translate3d(0, 0, 0); 47 | } 48 | } 49 | 50 | @keyframes fadeInDown { 51 | from { 52 | opacity: 0; 53 | -webkit-transform: translate3d(0, -20px, 0); 54 | transform: translate3d(0, -20px, 0); 55 | } 56 | 57 | to { 58 | opacity: 1; 59 | -webkit-transform: translate3d(0, 0, 0); 60 | transform: translate3d(0, 0, 0); 61 | } 62 | } 63 | 64 | .fadeInDown { 65 | -webkit-animation-name: fadeInDown; 66 | animation-name: fadeInDown; 67 | } 68 | 69 | @-webkit-keyframes fadeInLeft { 70 | from { 71 | opacity: 0; 72 | -webkit-transform: translate3d(-20px, 0, 0); 73 | transform: translate3d(-20px, 0, 0); 74 | } 75 | 76 | to { 77 | opacity: 1; 78 | -webkit-transform: translate3d(0, 0, 0); 79 | transform: translate3d(0, 0, 0); 80 | } 81 | } 82 | 83 | @keyframes fadeInLeft { 84 | from { 85 | opacity: 0; 86 | -webkit-transform: translate3d(-20px, 0, 0); 87 | transform: translate3d(-20px, 0, 0); 88 | } 89 | 90 | to { 91 | opacity: 1; 92 | -webkit-transform: translate3d(0, 0, 0); 93 | transform: translate3d(0, 0, 0); 94 | } 95 | } 96 | 97 | .fadeInLeft { 98 | -webkit-animation-name: fadeInLeft; 99 | animation-name: fadeInLeft; 100 | } 101 | 102 | @-webkit-keyframes fadeInRight { 103 | from { 104 | opacity: 0; 105 | -webkit-transform: translate3d(20px, 0, 0); 106 | transform: translate3d(20px, 0, 0); 107 | } 108 | 109 | to { 110 | opacity: 1; 111 | -webkit-transform: translate3d(0, 0, 0); 112 | transform: translate3d(0, 0, 0); 113 | } 114 | } 115 | 116 | @keyframes fadeInRight { 117 | from { 118 | opacity: 0; 119 | -webkit-transform: translate3d(20px, 0, 0); 120 | transform: translate3d(20px, 0, 0); 121 | } 122 | 123 | to { 124 | opacity: 1; 125 | -webkit-transform: translate3d(0, 0, 0); 126 | transform: translate3d(0, 0, 0); 127 | } 128 | } 129 | 130 | .fadeInRight { 131 | -webkit-animation-name: fadeInRight; 132 | animation-name: fadeInRight; 133 | } 134 | 135 | @-webkit-keyframes fadeInUp { 136 | from { 137 | opacity: 0; 138 | -webkit-transform: translate3d(0, 20px, 0); 139 | transform: translate3d(0, 20px, 0); 140 | } 141 | 142 | to { 143 | opacity: 1; 144 | -webkit-transform: translate3d(0, 0, 0); 145 | transform: translate3d(0, 0, 0); 146 | } 147 | } 148 | 149 | @keyframes fadeInUp { 150 | from { 151 | opacity: 0; 152 | -webkit-transform: translate3d(0, 20px, 0); 153 | transform: translate3d(0, 20px, 0); 154 | } 155 | 156 | to { 157 | opacity: 1; 158 | -webkit-transform: translate3d(0, 0, 0); 159 | transform: translate3d(0, 0, 0); 160 | } 161 | } 162 | 163 | .fadeInUp { 164 | -webkit-animation-name: fadeInUp; 165 | animation-name: fadeInUp; 166 | } 167 | 168 | .animated { 169 | -webkit-animation-duration: 1s; 170 | animation-duration: 1s; 171 | -webkit-animation-fill-mode: both; 172 | animation-fill-mode: both; 173 | } 174 | 175 | .animated.infinite { 176 | -webkit-animation-iteration-count: infinite; 177 | animation-iteration-count: infinite; 178 | } 179 | 180 | .animated.delay-1s { 181 | -webkit-animation-delay: 1s; 182 | animation-delay: 1s; 183 | } 184 | 185 | .animated.delay-2s { 186 | -webkit-animation-delay: 2s; 187 | animation-delay: 2s; 188 | } 189 | 190 | .animated.delay-3s { 191 | -webkit-animation-delay: 3s; 192 | animation-delay: 3s; 193 | } 194 | 195 | .animated.delay-4s { 196 | -webkit-animation-delay: 4s; 197 | animation-delay: 4s; 198 | } 199 | 200 | .animated.delay-5s { 201 | -webkit-animation-delay: 5s; 202 | animation-delay: 5s; 203 | } 204 | 205 | .animated.fast { 206 | -webkit-animation-duration: 800ms; 207 | animation-duration: 800ms; 208 | } 209 | 210 | .animated.faster { 211 | -webkit-animation-duration: 500ms; 212 | animation-duration: 500ms; 213 | } 214 | 215 | .animated.slow { 216 | -webkit-animation-duration: 2s; 217 | animation-duration: 2s; 218 | } 219 | 220 | .animated.slower { 221 | -webkit-animation-duration: 3s; 222 | animation-duration: 3s; 223 | } 224 | 225 | @media (print), (prefers-reduced-motion: reduce) { 226 | .animated { 227 | -webkit-animation-duration: 1ms !important; 228 | animation-duration: 1ms !important; 229 | -webkit-transition-duration: 1ms !important; 230 | transition-duration: 1ms !important; 231 | -webkit-animation-iteration-count: 1 !important; 232 | animation-iteration-count: 1 !important; 233 | } 234 | } 235 | -------------------------------------------------------------------------------- /public/images/footer/brands/tailgrids.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/brands/tailgrids.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/brands/lineicons.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/footer/brands/lineicons.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/footer/brands/plainadmin.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/brands/uideck.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/footer/brands/uideck.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/hero/brand.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/js/wow.min.js: -------------------------------------------------------------------------------- 1 | /*! WOW wow.js - v1.3.0 - 2016-10-04 2 | * https://wowjs.uk 3 | * Copyright (c) 2016 Thomas Grainger; Licensed MIT */!function(a,b){if("function"==typeof define&&define.amd)define(["module","exports"],b);else if("undefined"!=typeof exports)b(module,exports);else{var c={exports:{}};b(c,c.exports),a.WOW=c.exports}}(this,function(a,b){"use strict";function c(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function d(a,b){return b.indexOf(a)>=0}function e(a,b){for(var c in b)if(null==a[c]){var d=b[c];a[c]=d}return a}function f(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)}function g(a){var b=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],c=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],d=arguments.length<=3||void 0===arguments[3]?null:arguments[3],e=void 0;return null!=document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(a,b,c,d)):null!=document.createEventObject?(e=document.createEventObject(),e.eventType=a):e.eventName=a,e}function h(a,b){null!=a.dispatchEvent?a.dispatchEvent(b):b in(null!=a)?a[b]():"on"+b in(null!=a)&&a["on"+b]()}function i(a,b,c){null!=a.addEventListener?a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c}function j(a,b,c){null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete a[b]}function k(){return"innerHeight"in window?window.innerHeight:document.documentElement.clientHeight}Object.defineProperty(b,"__esModule",{value:!0});var l,m,n=function(){function a(a,b){for(var c=0;c=0){var b=a.target||a.srcElement;b.className=b.className.replace(this.config.animateClass,"").trim()}}},{key:"customStyle",value:function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a}},{key:"vendorSet",value:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];a[""+c]=d;for(var e=0;e=e&&f>=c}},{key:"disabled",value:function(){return!this.config.mobile&&f(navigator.userAgent)}}]),a}();b["default"]=r,a.exports=b["default"]}); -------------------------------------------------------------------------------- /public/images/brands/tailwindtemplates.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/footer/brands/tailwindtemplates.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/brands/graygrids.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/footer/brands/graygrids.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/brands/ecommerce-html.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/footer/brands/ecommerce-html.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/css/glightbox.min.css: -------------------------------------------------------------------------------- 1 | .glightbox-container{width:100%;height:100%;position:fixed;top:0;left:0;z-index:999999!important;overflow:hidden;-ms-touch-action:none;touch-action:none;-webkit-text-size-adjust:100%;-webkit-backface-visibility:hidden;outline:0;overflow:hidden}.glightbox-container.inactive{display:none}.glightbox-container .gcontainer{position:relative;width:100%;height:100%;z-index:9999;overflow:hidden}.glightbox-container .gslider{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease;height:100%;left:0;top:0;width:100%;position:relative;overflow:hidden;display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.glightbox-container .gslide{width:100%;position:absolute;opacity:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;opacity:0}.glightbox-container .gslide.current{opacity:1;z-index:99999;position:relative}.glightbox-container .gslide.prev{opacity:1;z-index:9999}.glightbox-container .gslide-inner-content{width:100%}.glightbox-container .ginner-container{position:relative;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-width:100%;margin:auto;height:100vh}.glightbox-container .ginner-container.gvideo-container{width:100%}.glightbox-container .ginner-container.desc-bottom,.glightbox-container .ginner-container.desc-top{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.glightbox-container .ginner-container.desc-left,.glightbox-container .ginner-container.desc-right{max-width:100%!important}.gslide iframe,.gslide video{outline:0!important;border:none;min-height:165px;-webkit-overflow-scrolling:touch;overflow-scrolling:touch;-ms-touch-action:auto;touch-action:auto}.gslide-image{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.gslide-image img{max-height:100vh;display:block;max-width:100%;margin:0;padding:0;float:none;outline:0;border:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-width:100vw;width:auto;height:auto;-o-object-fit:cover;object-fit:cover;-ms-touch-action:none;touch-action:none;margin:auto;min-width:200px}.desc-bottom .gslide-image img,.desc-top .gslide-image img{width:auto}.desc-left .gslide-image img,.desc-right .gslide-image img{width:auto;max-width:100%}.gslide-image img.zoomable{position:relative}.gslide-image img.dragging{cursor:-webkit-grabbing!important;cursor:grabbing!important;-webkit-transition:none;transition:none}.gslide-video{width:100%;max-width:100%;position:relative;width:100vh;max-width:100vh;width:100%!important}.gslide-video .gvideo-wrapper{width:100%;margin:auto}.gslide-video::before{content:'';display:block;position:absolute;width:100%;height:100%;background:rgba(255,0,0,.34);display:none}.gslide-video.playing::before{display:none}.gslide-video.fullscreen{max-width:100%!important;min-width:100%;height:80vh}.gslide-video.fullscreen video{max-width:100%!important;width:100%!important}.gslide-inline{background:#fff;text-align:left;max-height:calc(100vh - 40px);overflow:auto;max-width:100%}.gslide-inline .ginlined-content{padding:20px;width:100%}.ginlined-content{overflow:auto;display:block!important;opacity:1}.gslide-external{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;min-width:100%;background:#fff;padding:0;overflow:auto;max-height:75vh;height:100%}.gslide-media{display:block;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;display:-webkit-box;display:-ms-flexbox;display:flex;width:auto}.zoomed .gslide-media{-webkit-box-shadow:none!important;box-shadow:none!important}.desc-bottom .gslide-media,.desc-top .gslide-media{margin:0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.gslide-description{position:relative}.gslide-description.description-left,.gslide-description.description-right{max-width:100%}.gslide-description.description-bottom,.gslide-description.description-top{margin:0 auto;width:100%}.gslide-description p{margin-bottom:12px}.gslide-description p::last-child{margin-bottom:0}.zoomed .gslide-description{display:none}.glightbox-mobile .glightbox-container .gslide-description{height:auto!important;width:100%;background:0 0;position:absolute;bottom:15px;padding:19px 11px;max-width:100vw!important;-webkit-box-ordinal-group:3!important;-ms-flex-order:2!important;order:2!important;max-height:78vh;overflow:auto!important;background:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,0)),to(rgba(0,0,0,.75)));background:linear-gradient(to bottom,rgba(0,0,0,0) 0,rgba(0,0,0,.75) 100%);-webkit-transition:opacity .3s linear;transition:opacity .3s linear;padding-bottom:50px}.glightbox-mobile .glightbox-container .gslide-title{color:#fff;font-size:1em}.glightbox-mobile .glightbox-container .gslide-desc{color:#a1a1a1}.glightbox-mobile .glightbox-container .gslide-desc a{color:#fff;font-weight:700}.glightbox-mobile .glightbox-container .gslide-desc *{color:inherit}.glightbox-mobile .glightbox-container .gslide-desc string{color:#fff}.glightbox-mobile .glightbox-container .gslide-desc .desc-more{color:#fff;opacity:.4}.gdesc-open .gslide-media{-webkit-transition:opacity .5s ease;transition:opacity .5s ease;opacity:.4}.gdesc-open .gdesc-inner{padding-bottom:30px}.gdesc-closed .gslide-media{-webkit-transition:opacity .5s ease;transition:opacity .5s ease;opacity:1}.greset{-webkit-transition:all .3s ease;transition:all .3s ease}.gabsolute{position:absolute}.grelative{position:relative}.glightbox-desc{display:none!important}.glightbox-open{overflow:hidden}.gloader{height:25px;width:25px;-webkit-animation:lightboxLoader .8s infinite linear;animation:lightboxLoader .8s infinite linear;border:2px solid #fff;border-right-color:transparent;border-radius:50%;position:absolute;display:block;z-index:9999;left:0;right:0;margin:0 auto;top:47%}.goverlay{width:100%;height:100%;position:fixed;top:0;left:0;background:#000;will-change:opacity}.glightbox-mobile .goverlay{background:#000}.gclose,.gnext,.gprev{background-repeat:no-repeat;z-index:99999;cursor:pointer;width:26px;height:44px;display:block;background-position:0 0;border:none}.gclose svg,.gnext svg,.gprev svg{display:block;width:100%;height:auto}.gclose.disabled,.gnext.disabled,.gprev.disabled{opacity:.1}.gclose .garrow,.gnext .garrow,.gprev .garrow{stroke:#fff}iframe.wait-autoplay{opacity:0}.glightbox-closing .gclose,.glightbox-closing .gnext,.glightbox-closing .gprev{opacity:0!important}.glightbox-clean .gslide-description,.glightbox-modern .gslide-description{background:#fff}.glightbox-clean .gdesc-inner,.glightbox-modern .gdesc-inner{padding:22px 20px}.glightbox-clean .gslide-title,.glightbox-modern .gslide-title{font-size:1em;font-weight:400;font-family:arial;color:#000;margin-bottom:19px;line-height:1.4em}.glightbox-clean .gslide-desc,.glightbox-modern .gslide-desc{font-size:.86em;margin-bottom:0;font-family:arial;line-height:1.4em}.glightbox-clean .gslide-video,.glightbox-modern .gslide-video{background:#000}.glightbox-clean .gclose,.glightbox-clean .gnext,.glightbox-clean .gprev,.glightbox-modern .gclose,.glightbox-modern .gnext,.glightbox-modern .gprev{background-color:rgba(0,0,0,.12)}.glightbox-clean .gclose:hover,.glightbox-clean .gnext:hover,.glightbox-clean .gprev:hover,.glightbox-modern .gclose:hover,.glightbox-modern .gnext:hover,.glightbox-modern .gprev:hover{background-color:rgba(0,0,0,.2)}.glightbox-clean .gclose path,.glightbox-clean .gnext path,.glightbox-clean .gprev path,.glightbox-modern .gclose path,.glightbox-modern .gnext path,.glightbox-modern .gprev path{fill:#fff}.glightbox-clean button:focus:not(.focused):not(.disabled),.glightbox-modern button:focus:not(.focused):not(.disabled){outline:0}.glightbox-clean .gprev,.glightbox-modern .gprev{position:absolute;top:-100%;left:30px;width:40px;height:56px}.glightbox-clean .gnext,.glightbox-modern .gnext{position:absolute;top:-100%;right:30px;width:40px;height:56px}.glightbox-clean .gclose,.glightbox-modern .gclose{width:35px;height:35px;top:15px;right:10px;position:absolute;opacity:.7;background-position:-59px 2px}.glightbox-clean .gclose svg,.glightbox-modern .gclose svg{width:20px}.glightbox-clean .gclose:hover,.glightbox-modern .gclose:hover{opacity:1}.gfadeIn{-webkit-animation:gfadeIn .5s ease;animation:gfadeIn .5s ease}.gfadeOut{-webkit-animation:gfadeOut .5s ease;animation:gfadeOut .5s ease}.gslideOutLeft{-webkit-animation:gslideOutLeft .3s ease;animation:gslideOutLeft .3s ease}.gslideInLeft{-webkit-animation:gslideInLeft .3s ease;animation:gslideInLeft .3s ease}.gslideOutRight{-webkit-animation:gslideOutRight .3s ease;animation:gslideOutRight .3s ease}.gslideInRight{-webkit-animation:gslideInRight .3s ease;animation:gslideInRight .3s ease}.gzoomIn{-webkit-animation:gzoomIn .5s ease;animation:gzoomIn .5s ease}.gzoomOut{-webkit-animation:gzoomOut .5s ease;animation:gzoomOut .5s ease}@-webkit-keyframes lightboxLoader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes lightboxLoader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes gfadeIn{from{opacity:0}to{opacity:1}}@keyframes gfadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes gfadeOut{from{opacity:1}to{opacity:0}}@keyframes gfadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes gslideInLeft{from{opacity:0;-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0)}to{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes gslideInLeft{from{opacity:0;-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0)}to{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes gslideOutLeft{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0);opacity:0;visibility:hidden}}@keyframes gslideOutLeft{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0);opacity:0;visibility:hidden}}@-webkit-keyframes gslideInRight{from{opacity:0;visibility:visible;-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes gslideInRight{from{opacity:0;visibility:visible;-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes gslideOutRight{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0);opacity:0}}@keyframes gslideOutRight{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0);opacity:0}}@-webkit-keyframes gzoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:1}}@keyframes gzoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:1}}@-webkit-keyframes gzoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes gzoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@media (min-width:769px){.glightbox-container .ginner-container{width:auto;height:auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.glightbox-container .ginner-container.desc-top .gslide-description{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.glightbox-container .ginner-container.desc-top .gslide-image,.glightbox-container .ginner-container.desc-top .gslide-image img{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.glightbox-container .ginner-container.desc-left .gslide-description{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.glightbox-container .ginner-container.desc-left .gslide-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.gslide-image img{max-height:97vh;max-width:calc(100% - 20px);max-width:100%}.gslide-image img.zoomable{cursor:-webkit-zoom-in;cursor:zoom-in}.zoomed .gslide-image img.zoomable{cursor:-webkit-grab;cursor:grab}.gslide-inline{max-height:95vh}.gslide-external{max-height:100vh}.gslide-description.description-left,.gslide-description.description-right{max-width:275px}.glightbox-open{height:auto}.goverlay{background:rgba(0,0,0,.92)}.glightbox-clean .gslide-media,.glightbox-modern .gslide-media{-webkit-box-shadow:1px 2px 9px 0 rgba(0,0,0,.65);box-shadow:1px 2px 9px 0 rgba(0,0,0,.65)}.glightbox-clean .gprev,.glightbox-modern .gprev{top:45%}.glightbox-clean .gnext,.glightbox-modern .gnext{top:45%}}@media (min-width:992px){.glightbox-clean .gclose,.glightbox-modern .gclose{right:20px}}@media screen and (max-height:420px){.goverlay{background:#000}} -------------------------------------------------------------------------------- /public/assets/js/tiny-slider.js: -------------------------------------------------------------------------------- 1 | var tns=function(){var t=window,Ai=t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.msRequestAnimationFrame||function(t){return setTimeout(t,16)},e=window,Ni=e.cancelAnimationFrame||e.mozCancelAnimationFrame||function(t){clearTimeout(t)};function Li(){for(var t,e,n,i=arguments[0]||{},a=1,r=arguments.length;a";return r.innerHTML=o,a.appendChild(r),n.appendChild(a),t=Math.abs(a.getBoundingClientRect().left-r.children[67].getBoundingClientRect().left)<2,n.fake?Di(n,i):a.remove(),t}(),n),D=e.tMQ?Bi(e.tMQ):Si(e,"tMQ",function(){if(window.matchMedia||window.msMatchMedia)return!0;var t,e=document,n=Hi(),i=Oi(n),a=e.createElement("div"),r=e.createElement("style"),o="@media all and (min-width:1px){.tns-mq-test{position:absolute}}";return r.type="text/css",a.className="tns-mq-test",n.appendChild(r),n.appendChild(a),r.styleSheet?r.styleSheet.cssText=o:r.appendChild(e.createTextNode(o)),t=window.getComputedStyle?window.getComputedStyle(a).position:a.currentStyle.position,n.fake?Di(n,i):a.remove(),"absolute"===t}(),n),r=e.tTf?Bi(e.tTf):Si(e,"tTf",Ki("transform"),n),o=e.t3D?Bi(e.t3D):Si(e,"t3D",function(t){if(!t)return!1;if(!window.getComputedStyle)return!1;var e,n=document,i=Hi(),a=Oi(i),r=n.createElement("p"),o=9=-St)return t}:function(){return at&&I&&!ft?Q-1:ft||I?Math.max(0,Lt-Math.ceil(rt)):Lt-1},It=en(sn("startIndex")),Pt=It,zt=(tn(),0),Wt=$?null:Rt(),qt=H.preventActionWhenRunning,Ft=H.swipeAngle,jt=!Ft||"?",Vt=!1,Gt=H.onInit,Qt=new Zi,Xt=" tns-slider tns-"+H.mode,Yt=V.id||(S=window.tnsId,window.tnsId=S?S+1:1,"tns"+window.tnsId),Kt=sn("disable"),Jt=!1,Ut=H.freezable,_t=!(!Ut||$)&&Tn(),Zt=!1,$t={click:oi,keydown:function(t){t=pi(t);var e=[a.LEFT,a.RIGHT].indexOf(t.keyCode);0<=e&&(0===e?we.disabled||oi(t,-1):Ce.disabled||oi(t,1))}},te={click:function(t){if(Vt){if(qt)return;ai()}var e=hi(t=pi(t));for(;e!==Ae&&!qi(e,"data-nav");)e=e.parentNode;if(qi(e,"data-nav")){var n=Se=Number(Fi(e,"data-nav")),i=tt||$?n*Q/Le:n*rt,a=le?n:Math.min(Math.ceil(i),Q-1);ri(a,t),He===n&&(Pe&&fi(),Se=-1)}},keydown:function(t){t=pi(t);var e=O.activeElement;if(!qi(e,"data-nav"))return;var n=[a.LEFT,a.RIGHT,a.ENTER,a.SPACE].indexOf(t.keyCode),i=Number(Fi(e,"data-nav"));0<=n&&(0===n?0"," animation"];if(ce||fe)var Qe,Xe,Ye={},Ke={},Je=!1,Ue=F?function(t,e){return t.x-e.x}:function(t,e){return t.y-e.y};$||$e(Kt||_t),r&&(Ot=r,Dt="translate",o?(Dt+=F?"3d(":"3d(0px, ",kt=F?", 0px, 0px)":", 0px)"):(Dt+=F?"X(":"Y(",kt=")")),I&&(V.className=V.className.replace("tns-vpfix","")),function(){ln("gutter");T.className="tns-outer",j.className="tns-inner",T.id=Yt+"-ow",j.id=Yt+"-iw",""===V.id&&(V.id=Yt);Xt+=g||$?" tns-subpixel":" tns-no-subpixel",Xt+=y?" tns-calc":" tns-no-calc",$&&(Xt+=" tns-autowidth");Xt+=" tns-"+H.axis,V.className+=Xt,I?((M=O.createElement("div")).id=Yt+"-mw",M.className="tns-ovh",T.appendChild(M),M.appendChild(j)):T.appendChild(j);if(dt){var t=M||j;t.className+=" tns-ah"}if(E.insertBefore(T,V),j.appendChild(V),Ii(G,function(t,e){zi(t,"tns-item"),t.id||(t.id=Yt+"-item"+e),!I&&W&&zi(t,W),ji(t,{"aria-hidden":"true",tabindex:"-1"})}),Nt){for(var e=O.createDocumentFragment(),n=O.createDocumentFragment(),i=Nt;i--;){var a=i%Q,r=G[a].cloneNode(!0);if(zi(r,ve),Vi(r,"id"),n.insertBefore(r,n.firstChild),I){var o=G[Q-1-a].cloneNode(!0);zi(o,ve),Vi(o,"id"),e.appendChild(o)}}V.insertBefore(e,V.firstChild),V.appendChild(n),G=V.children}}(),function(){if(!I)for(var t=It,e=It+Math.min(Q,rt);t .tns-item","font-size:"+m.getComputedStyle(G[0]).fontSize+";",Ri(Mt)),ki(Mt,"#"+Yt,"font-size:0;",Ri(Mt))):I&&Ii(G,function(t,e){var n;t.style.marginLeft=(n=e,y?y+"("+100*n+"% / "+Lt+")":100*n/Lt+"%")}));if(D){if(x){var i=M&&H.autoHeight?hn(H.speed):"";ki(Mt,"#"+Yt+"-mw",i,Ri(Mt))}i=cn(H.edgePadding,H.gutter,H.fixedWidth,H.speed,H.autoHeight),ki(Mt,"#"+Yt+"-iw",i,Ri(Mt)),I&&(i=F&&!$?"width:"+fn(H.fixedWidth,H.gutter,H.items)+";":"",x&&(i+=hn(st)),ki(Mt,"#"+Yt,i,Ri(Mt))),i=F&&!$?dn(H.fixedWidth,H.gutter,H.items):"",H.gutter&&(i+=vn(H.gutter)),I||(x&&(i+=hn(st)),b&&(i+=mn(st))),i&&ki(Mt,"#"+Yt+" > .tns-item",i,Ri(Mt))}else{I&&dt&&(M.style[x]=st/1e3+"s"),j.style.cssText=cn(et,nt,tt,dt),I&&F&&!$&&(V.style.width=fn(tt,nt,rt));var i=F&&!$?dn(tt,nt,rt):"";nt&&(i+=vn(nt)),i&&ki(Mt,"#"+Yt+" > .tns-item",i,Ri(Mt))}if(k&&D)for(var a in k){a=parseInt(a);var r=k[a],i="",o="",u="",l="",s="",c=$?null:sn("items",a),f=sn("fixedWidth",a),d=sn("speed",a),v=sn("edgePadding",a),p=sn("autoHeight",a),h=sn("gutter",a);x&&M&&sn("autoHeight",a)&&"speed"in r&&(o="#"+Yt+"-mw{"+hn(d)+"}"),("edgePadding"in r||"gutter"in r)&&(u="#"+Yt+"-iw{"+cn(v,h,f,d,p)+"}"),I&&F&&!$&&("fixedWidth"in r||"items"in r||tt&&"gutter"in r)&&(l="width:"+fn(f,h,c)+";"),x&&"speed"in r&&(l+=hn(d)),l&&(l="#"+Yt+"{"+l+"}"),("fixedWidth"in r||tt&&"gutter"in r||!I&&"items"in r)&&(s+=dn(f,h,c)),"gutter"in r&&(s+=vn(h)),!I&&"speed"in r&&(x&&(s+=hn(d)),b&&(s+=mn(d))),s&&(s="#"+Yt+" > .tns-item{"+s+"}"),(i=o+u+l+s)&&Mt.insertRule("@media (min-width: "+a/16+"em) {"+i+"}",Mt.cssRules.length)}}(),yn();var _e=ft?I?function(){var t=zt,e=Wt;t+=ot,e-=ot,et?(t+=1,e-=1):tt&&(it+nt)%(tt+nt)&&(e-=1),Nt&&(e=parseInt(i)&&t in k[i]&&(n=k[i][t]);return"slideBy"===t&&"page"===n&&(n=sn("items")),I||"slideBy"!==t&&"items"!==t||(n=Math.floor(n)),n}function cn(t,e,n,i,a){var r="";if(void 0!==t){var o=t;e&&(o-=e),r=F?"margin: 0 "+o+"px 0 "+t+"px;":"margin: "+t+"px 0 "+o+"px 0;"}else if(e&&!n){var u="-"+e+"px";r="margin: 0 "+(F?u+" 0 0":"0 "+u+" 0")+";"}return!I&&a&&x&&i&&(r+=hn(i)),r}function fn(t,e,n){return t?(t+e)*Lt+"px":y?y+"("+100*Lt+"% / "+n+")":100*Lt/n+"%"}function dn(t,e,n){var i;if(t)i=t+e+"px";else{I||(n=Math.floor(n));var a=I?Lt:n;i=y?y+"(100% / "+a+")":100/a+"%"}return i="width:"+i,"inner"!==R?i+";":i+" !important;"}function vn(t){var e="";!1!==t&&(e=(F?"padding-":"margin-")+(F?"right":"bottom")+": "+t+"px;");return e}function pn(t,e){var n=t.substring(0,t.length-e).toLowerCase();return n&&(n="-"+n+"-"),n}function hn(t){return pn(x,18)+"transition-duration:"+t/1e3+"s;"}function mn(t){return pn(b,17)+"animation-duration:"+t/1e3+"s;"}function yn(){if(ln("autoHeight")||$||!F){var t=V.querySelectorAll("img");Ii(t,function(t){var e=t.src;Tt||(e&&e.indexOf("data:image")<0?(t.src="",Ui(t,he),zi(t,"loading"),t.src=e):kn(t))}),Ai(function(){zn(Gi(t),function(){L=!0})}),ln("autoHeight")&&(t=In(It,Math.min(It+rt-1,Lt-1))),Tt?gn():Ai(function(){zn(Gi(t),gn)})}else I&&$n(),bn(),wn()}function gn(){if($&&1slide '+Hn()+" of "+Q+""),B=T.querySelector(".tns-liveregion .current"),se){var t=gt?"stop":"start";je?ji(je,{"data-action":t}):H.autoplayButtonOutput&&(T.insertAdjacentHTML(on(H.autoplayPosition),'"),je=T.querySelector("[data-action]")),je&&Ui(je,{click:di}),gt&&(ci(),wt&&Ui(V,ee),Ct&&Ui(V,ne))}if(ue){if(Ae)ji(Ae,{"aria-label":"Carousel Pagination"}),Ii(Ee=Ae.children,function(t,e){ji(t,{"data-nav":e,tabindex:"-1","aria-label":ke+(e+1),"aria-controls":Yt})});else{for(var e="",n=le?"":'style="display:none"',i=0;i';e='
'+e+"
",T.insertAdjacentHTML(on(H.navPosition),e),Ae=T.querySelector(".tns-nav"),Ee=Ae.children}if(Ti(),x){var a=x.substring(0,x.length-18).toLowerCase(),r="transition: all "+st/1e3+"s";a&&(r="-"+a+"-"+r),ki(Mt,"[aria-controls^="+Yt+"-item]",r,Ri(Mt))}ji(Ee[He],{"aria-label":ke+(He+1)+Re}),Vi(Ee[He],"tabindex"),zi(Ee[He],De),Ui(Ae,te)}oe&&(xe||we&&Ce||(T.insertAdjacentHTML(on(H.controlsPosition),'
"),xe=T.querySelector(".tns-controls")),we&&Ce||(we=xe.children[0],Ce=xe.children[1]),H.controlsContainer&&ji(xe,{"aria-label":"Carousel Navigation",tabindex:"0"}),(H.controlsContainer||H.prevButton&&H.nextButton)&&ji([we,Ce],{"aria-controls":Yt,tabindex:"-1"}),(H.controlsContainer||H.prevButton&&H.nextButton)&&(ji(we,{"data-controls":"prev"}),ji(Ce,{"data-controls":"next"})),ye=Qn(we),ge=Qn(Ce),Kn(),xe?Ui(xe,$t):(Ui(we,$t),Ui(Ce,$t))),An()}function wn(){if(I&&s){var t={};t[s]=ai,Ui(V,t)}mt&&Ui(V,ae,H.preventScrollOnTouch),yt&&Ui(V,re),lt&&Ui(O,ie),"inner"===R?Qt.on("outerResized",function(){Mn(),Qt.emit("innerLoaded",Ei())}):(k||tt||$||dt||!F)&&Ui(m,{resize:Cn}),dt&&("outer"===R?Qt.on("innerLoaded",Pn):Kt||Pn()),Dn(),Kt?Bn():_t&&Ln(),Qt.on("indexChanged",Wn),"inner"===R&&Qt.emit("innerLoaded",Ei()),"function"==typeof Gt&&Gt(Ei()),Y=!0}function Cn(t){Ai(function(){Mn(pi(t))})}function Mn(t){if(Y){"outer"===R&&Qt.emit("outerResized",Ei(t)),X=rn();var e,n=q,i=!1;k&&(En(),(e=n!==q)&&Qt.emit("newBreakpointStart",Ei(t)));var a,r,o,u,l=rt,s=Kt,c=_t,f=lt,d=vt,v=ht,p=mt,h=yt,m=gt,y=wt,g=Ct,x=It;if(e){var b=tt,w=dt,C=pt,M=at,T=bt;if(!D)var E=nt,A=et}if(lt=sn("arrowKeys"),vt=sn("controls"),ht=sn("nav"),mt=sn("touch"),at=sn("center"),yt=sn("mouseDrag"),gt=sn("autoplay"),wt=sn("autoplayHoverPause"),Ct=sn("autoplayResetOnVisibility"),e&&(Kt=sn("disable"),tt=sn("fixedWidth"),st=sn("speed"),dt=sn("autoHeight"),pt=sn("controlsText"),bt=sn("autoplayText"),xt=sn("autoplayTimeout"),D||(et=sn("edgePadding"),nt=sn("gutter"))),$e(Kt),it=un(),F&&!$||Kt||(jn(),F||(Ci(),i=!0)),(tt||$)&&(St=_n(),Wt=Rt()),(e||tt)&&(rt=sn("items"),ot=sn("slideBy"),(r=rt!==l)&&(tt||$||(Wt=Rt()),_e())),e&&Kt!==s&&(Kt?Bn():function(){if(!Jt)return;if(Mt.disabled=!1,V.className+=Xt,$n(),ft)for(var t=Nt;t--;)I&&Xi(G[t]),Xi(G[Lt-t-1]);if(!I)for(var e=It,n=It+Q;e .tns-item",S,Ri(Mt))}dt&&Pn(),i&&($n(),Pt=It)}e&&Qt.emit("newBreakpointEnd",Ei(t))}}function Tn(){if(!tt&&!$)return Q<=(at?rt-(rt-1)/2:rt);var t=tt?(tt+nt)*Q:N[Q],e=et?it+2*et:it+nt;return at&&(e-=tt?(it-tt)/2:(it-(N[It+1]-N[It]-nt))/2),t<=e}function En(){for(var t in q=0,k)(t=parseInt(t))<=X&&(q=t)}function An(){!gt&&je&&Qi(je),!ht&&Ae&&Qi(Ae),vt||(xe?Qi(xe):(we&&Qi(we),Ce&&Qi(Ce)))}function Nn(){gt&&je&&Xi(je),ht&&Ae&&Xi(Ae),vt&&(xe?Xi(xe):(we&&Xi(we),Ce&&Xi(Ce)))}function Ln(){if(!Zt){if(et&&(j.style.margin="0px"),Nt)for(var t="tns-transparent",e=Nt;e--;)I&&zi(G[e],t),zi(G[Lt-e-1],t);An(),Zt=!0}}function Bn(){if(!Jt){if(Mt.disabled=!0,V.className=V.className.replace(Xt.substring(1),""),Vi(V,["style"]),ft)for(var t=Nt;t--;)I&&Qi(G[t]),Qi(G[Lt-t-1]);if(F&&I||Vi(j,["style"]),!I)for(var e=It,n=It+Q;e=N[Lt-1])It=Wt;else for(var n=0;n=N[n];)e>N[It=n]&&a<0&&(It+=1),n++}ni(i,a),Qt.emit(mi(i)?"touchEnd":"dragEnd",Ei(i))}):jt&&oi(i,0