Haris Razis
4 years ago
20 changed files with 13640 additions and 0 deletions
@ -0,0 +1 @@ |
|||||
|
node_modules/ |
@ -0,0 +1,78 @@ |
|||||
|
var createError = require('http-errors'), |
||||
|
express = require('express'), |
||||
|
path = require('path'), |
||||
|
cookieParser = require('cookie-parser'), |
||||
|
logger = require('morgan'), |
||||
|
i18next = require("i18next"), |
||||
|
session = require('express-session'), |
||||
|
i18nextMiddleware = require("i18next-express-middleware"), |
||||
|
FilesystemBackend = require("i18next-node-fs-backend"); |
||||
|
|
||||
|
var indexRouter = require('./routes/index'); |
||||
|
var enTranslations = require("./locales/en.json"); |
||||
|
var elTranslations = require("./locales/el.json"); |
||||
|
|
||||
|
var app = express(); |
||||
|
|
||||
|
// view engine setup
|
||||
|
app.set('views', path.join(__dirname, 'views')); |
||||
|
app.set('view engine', 'ejs'); |
||||
|
|
||||
|
app.use(logger('dev')); |
||||
|
app.use(express.json()); |
||||
|
app.use(express.urlencoded({ |
||||
|
extended: false |
||||
|
})); |
||||
|
app.use(cookieParser()); |
||||
|
app.use(express.static(path.join(__dirname, 'public'))); |
||||
|
|
||||
|
i18next |
||||
|
.use(i18nextMiddleware.LanguageDetector) |
||||
|
.use(FilesystemBackend) |
||||
|
.init({ |
||||
|
detection: { |
||||
|
order: ["querystring", "cookie"], |
||||
|
caches: ["cookie"] |
||||
|
}, |
||||
|
preload: ["en", "el"], |
||||
|
fallbackLng: "en", |
||||
|
debug: false, |
||||
|
resources: { |
||||
|
en: enTranslations, |
||||
|
el: elTranslations |
||||
|
}, |
||||
|
saveMissing: true |
||||
|
}); |
||||
|
|
||||
|
app.use( |
||||
|
session({ |
||||
|
cookie: { |
||||
|
maxAge: 60000 |
||||
|
}, |
||||
|
secret: "secret", |
||||
|
resave: false, |
||||
|
saveUninitialized: false |
||||
|
}) |
||||
|
); |
||||
|
|
||||
|
app.use(i18nextMiddleware.handle(i18next)); |
||||
|
|
||||
|
app.use('/', indexRouter); |
||||
|
|
||||
|
// catch 404 and forward to error handler
|
||||
|
app.use(function (req, res, next) { |
||||
|
next(createError(404)); |
||||
|
}); |
||||
|
|
||||
|
// error handler
|
||||
|
app.use(function (err, req, res, next) { |
||||
|
// set locals, only providing error in development
|
||||
|
res.locals.message = err.message; |
||||
|
res.locals.error = req.app.get('env') === 'development' ? err : {}; |
||||
|
|
||||
|
// render the error page
|
||||
|
res.status(err.status || 500); |
||||
|
res.render('error'); |
||||
|
}); |
||||
|
|
||||
|
module.exports = app; |
@ -0,0 +1,90 @@ |
|||||
|
#!/usr/bin/env node |
||||
|
|
||||
|
/** |
||||
|
* Module dependencies. |
||||
|
*/ |
||||
|
|
||||
|
var app = require('../app'); |
||||
|
var debug = require('debug')('swarmlab.io:server'); |
||||
|
var http = require('http'); |
||||
|
|
||||
|
/** |
||||
|
* Get port from environment and store in Express. |
||||
|
*/ |
||||
|
|
||||
|
var port = normalizePort(process.env.PORT || '3000'); |
||||
|
app.set('port', port); |
||||
|
|
||||
|
/** |
||||
|
* Create HTTP server. |
||||
|
*/ |
||||
|
|
||||
|
var server = http.createServer(app); |
||||
|
|
||||
|
/** |
||||
|
* Listen on provided port, on all network interfaces. |
||||
|
*/ |
||||
|
|
||||
|
server.listen(port); |
||||
|
server.on('error', onError); |
||||
|
server.on('listening', onListening); |
||||
|
|
||||
|
/** |
||||
|
* Normalize a port into a number, string, or false. |
||||
|
*/ |
||||
|
|
||||
|
function normalizePort(val) { |
||||
|
var port = parseInt(val, 10); |
||||
|
|
||||
|
if (isNaN(port)) { |
||||
|
// named pipe |
||||
|
return val; |
||||
|
} |
||||
|
|
||||
|
if (port >= 0) { |
||||
|
// port number |
||||
|
return port; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Event listener for HTTP server "error" event. |
||||
|
*/ |
||||
|
|
||||
|
function onError(error) { |
||||
|
if (error.syscall !== 'listen') { |
||||
|
throw error; |
||||
|
} |
||||
|
|
||||
|
var bind = typeof port === 'string' |
||||
|
? 'Pipe ' + port |
||||
|
: 'Port ' + port; |
||||
|
|
||||
|
// handle specific listen errors with friendly messages |
||||
|
switch (error.code) { |
||||
|
case 'EACCES': |
||||
|
console.error(bind + ' requires elevated privileges'); |
||||
|
process.exit(1); |
||||
|
break; |
||||
|
case 'EADDRINUSE': |
||||
|
console.error(bind + ' is already in use'); |
||||
|
process.exit(1); |
||||
|
break; |
||||
|
default: |
||||
|
throw error; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Event listener for HTTP server "listening" event. |
||||
|
*/ |
||||
|
|
||||
|
function onListening() { |
||||
|
var addr = server.address(); |
||||
|
var bind = typeof addr === 'string' |
||||
|
? 'pipe ' + addr |
||||
|
: 'port ' + addr.port; |
||||
|
debug('Listening on ' + bind); |
||||
|
} |
@ -0,0 +1,5 @@ |
|||||
|
{ |
||||
|
"translation": { |
||||
|
"welcome": "Home" |
||||
|
} |
||||
|
} |
@ -0,0 +1,18 @@ |
|||||
|
{ |
||||
|
"translation": { |
||||
|
"welcome": "Welcome to Swarmlab", |
||||
|
"welcome_text": "Swarmlab is a powerful collaboration tool that connects tutors and students in a unique all-in-one environment that gets work done fast and easily.", |
||||
|
"features_01_header": "Fast Deployment", |
||||
|
"features_01_text": "Tutors bootstrap their lab-rooms using our tools", |
||||
|
"features_02_header": "Collaboration ready", |
||||
|
"features_02_text": "Both teacher and students can use the latest collaboration tools", |
||||
|
"features_03_header": "Easy to Use", |
||||
|
"features_03_text": "Ready-to-Use Virtual Labs one click away", |
||||
|
"on_demand": "On demand Lab-rooms", |
||||
|
"on_demand_text": "Create and share your ideas on our lab-room platform. Join tutors labs, learn more about your interests and broaden your horizon.", |
||||
|
"git": "Git", |
||||
|
"git_text": "The wolds leading, powerful collaboration tool at your disposal on our servers. Keep in touch with your workmates and make sharing simpler then ever.", |
||||
|
"available_swarmlab": "Available Swarmlab Labrooms", |
||||
|
"bug": "Found a bug? Help us fix it!" |
||||
|
} |
||||
|
} |
File diff suppressed because it is too large
@ -0,0 +1,21 @@ |
|||||
|
{ |
||||
|
"name": "swarmlab.io", |
||||
|
"version": "0.0.0", |
||||
|
"private": true, |
||||
|
"scripts": { |
||||
|
"start": "nodemon ./bin/www" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"cookie-parser": "~1.4.4", |
||||
|
"debug": "~2.6.9", |
||||
|
"ejs": "~2.6.1", |
||||
|
"express": "~4.16.1", |
||||
|
"express-session": "^1.17.1", |
||||
|
"http-errors": "~1.6.3", |
||||
|
"i18next": "^19.6.2", |
||||
|
"i18next-express-middleware": "^2.0.0", |
||||
|
"i18next-node-fs-backend": "^2.1.3", |
||||
|
"morgan": "~1.9.1", |
||||
|
"nodemon": "^2.0.4" |
||||
|
} |
||||
|
} |
After Width: | Height: | Size: 327 KiB |
After Width: | Height: | Size: 370 KiB |
After Width: | Height: | Size: 259 KiB |
After Width: | Height: | Size: 475 KiB |
@ -0,0 +1,5 @@ |
|||||
|
$(document).ready(function(){ |
||||
|
$('[data-bs-hover-animate]') |
||||
|
.mouseenter( function(){ var elem = $(this); elem.addClass('animated ' + elem.attr('data-bs-hover-animate')) }) |
||||
|
.mouseleave( function(){ var elem = $(this); elem.removeClass('animated ' + elem.attr('data-bs-hover-animate')) }); |
||||
|
}); |
@ -0,0 +1,90 @@ |
|||||
|
.footer-dark { |
||||
|
padding: 50px 0; |
||||
|
color: #f0f9ff; |
||||
|
background-color: #282d32; |
||||
|
} |
||||
|
|
||||
|
.footer-dark h3 { |
||||
|
margin-top: 0; |
||||
|
margin-bottom: 12px; |
||||
|
font-weight: bold; |
||||
|
font-size: 16px; |
||||
|
} |
||||
|
|
||||
|
.footer-dark ul { |
||||
|
padding: 0; |
||||
|
list-style: none; |
||||
|
line-height: 1.6; |
||||
|
font-size: 14px; |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
|
||||
|
.footer-dark ul a { |
||||
|
color: inherit; |
||||
|
text-decoration: none; |
||||
|
opacity: 0.6; |
||||
|
} |
||||
|
|
||||
|
.footer-dark ul a:hover { |
||||
|
opacity: 0.8; |
||||
|
} |
||||
|
|
||||
|
@media (max-width:767px) { |
||||
|
.footer-dark .item:not(.social) { |
||||
|
text-align: center; |
||||
|
padding-bottom: 20px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.footer-dark .item.text { |
||||
|
margin-bottom: 36px; |
||||
|
} |
||||
|
|
||||
|
@media (max-width:767px) { |
||||
|
.footer-dark .item.text { |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.footer-dark .item.text p { |
||||
|
opacity: 0.6; |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
|
||||
|
.footer-dark .item.social { |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
@media (max-width:991px) { |
||||
|
.footer-dark .item.social { |
||||
|
text-align: center; |
||||
|
margin-top: 20px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.footer-dark .item.social > a { |
||||
|
font-size: 20px; |
||||
|
width: 36px; |
||||
|
height: 36px; |
||||
|
line-height: 36px; |
||||
|
display: inline-block; |
||||
|
text-align: center; |
||||
|
border-radius: 50%; |
||||
|
box-shadow: 0 0 0 1px rgba(255,255,255,0.4); |
||||
|
margin: 0 8px; |
||||
|
color: #fff; |
||||
|
opacity: 0.75; |
||||
|
} |
||||
|
|
||||
|
.footer-dark .item.social > a:hover { |
||||
|
opacity: 0.9; |
||||
|
} |
||||
|
|
||||
|
.footer-dark .copyright { |
||||
|
text-align: center; |
||||
|
padding-top: 24px; |
||||
|
opacity: 0.3; |
||||
|
font-size: 13px; |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
|
@ -0,0 +1,203 @@ |
|||||
|
.navigation-clean-button { |
||||
|
background: #fff; |
||||
|
padding-top: .75rem; |
||||
|
padding-bottom: .75rem; |
||||
|
color: #333; |
||||
|
border-radius: 0; |
||||
|
box-shadow: none; |
||||
|
border: none; |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
|
||||
|
@media (min-width:768px) { |
||||
|
.navigation-clean-button { |
||||
|
padding-top: 1rem; |
||||
|
padding-bottom: 1rem; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-brand { |
||||
|
font-weight: bold; |
||||
|
color: inherit; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-brand:hover { |
||||
|
color: #222; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .navbar-brand:hover { |
||||
|
color: #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-brand img { |
||||
|
height: 100%; |
||||
|
display: inline-block; |
||||
|
margin-right: 10px; |
||||
|
width: auto; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-toggler { |
||||
|
border-color: #ddd; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-toggler:hover, .navigation-clean-button .navbar-toggler:focus { |
||||
|
background: none; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .navbar-toggler { |
||||
|
border-color: #555; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-toggler { |
||||
|
color: #888; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .navbar-toggler { |
||||
|
color: #eee; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-collapse, .navigation-clean-button .form-inline { |
||||
|
border-top-color: #ddd; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .navbar-collapse, .navigation-clean-button.navbar-dark .form-inline { |
||||
|
border-top-color: #333; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-nav a.active, .navigation-clean-button .navbar-nav > .show > a { |
||||
|
background: none; |
||||
|
box-shadow: none; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-light .navbar-nav a.active, .navigation-clean-button.navbar-light .navbar-nav a.active:focus, .navigation-clean-button.navbar-light .navbar-nav a.active:hover { |
||||
|
color: #8f8f8f; |
||||
|
box-shadow: none; |
||||
|
background: none; |
||||
|
pointer-events: none; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar .navbar-nav .nav-link { |
||||
|
padding-left: 18px; |
||||
|
padding-right: 18px; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-light .navbar-nav .nav-link { |
||||
|
color: #465765; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-light .navbar-nav .nav-link:focus, .navigation-clean-button.navbar-light .navbar-nav .nav-link:hover { |
||||
|
color: #37434d !important; |
||||
|
background-color: transparent; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-nav > li > .dropdown-menu { |
||||
|
margin-top: -5px; |
||||
|
box-shadow: 0 4px 8px rgba(0,0,0,.1); |
||||
|
background-color: #fff; |
||||
|
border-radius: 2px; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .dropdown-menu .dropdown-item:focus, .navigation-clean-button .dropdown-menu .dropdown-item { |
||||
|
line-height: 2; |
||||
|
font-size: 14px; |
||||
|
color: #37434d; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .dropdown-menu .dropdown-item:focus, .navigation-clean-button .dropdown-menu .dropdown-item:hover { |
||||
|
background: #eee; |
||||
|
color: inherit; |
||||
|
} |
||||
|
|
||||
|
@media (max-width:767px) { |
||||
|
.navigation-clean-button .navbar-nav .show .dropdown-menu { |
||||
|
box-shadow: none; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@media (max-width:767px) { |
||||
|
.navigation-clean-button .navbar-nav .show .dropdown-menu .dropdown-item { |
||||
|
color: #37434d; |
||||
|
padding-top: 12px; |
||||
|
padding-bottom: 12px; |
||||
|
line-height: 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark { |
||||
|
background-color: #1f2021; |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .navbar-nav a.active, .navigation-clean-button.navbar-dark .navbar-nav a.active:focus, .navigation-clean-button.navbar-dark .navbar-nav a.active:hover { |
||||
|
color: #8f8f8f; |
||||
|
box-shadow: none; |
||||
|
background: none; |
||||
|
pointer-events: none; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .navbar-nav .nav-link { |
||||
|
color: #dfe8ee; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .navbar-nav .nav-link:focus, .navigation-clean-button.navbar-dark .navbar-nav .nav-link:hover { |
||||
|
color: #fff !important; |
||||
|
background-color: transparent; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .navbar-nav > li > .dropdown-menu { |
||||
|
background-color: #1f2021; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .dropdown-menu .dropdown-item:focus, .navigation-clean-button.navbar-dark .dropdown-menu .dropdown-item { |
||||
|
color: #f2f5f8; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .dropdown-menu .dropdown-item:focus, .navigation-clean-button.navbar-dark .dropdown-menu .dropdown-item:hover { |
||||
|
background: #363739; |
||||
|
} |
||||
|
|
||||
|
@media (max-width:767px) { |
||||
|
.navigation-clean-button.navbar-dark .navbar-nav .show .dropdown-menu .dropdown-item { |
||||
|
color: #fff; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .actions .login { |
||||
|
margin-right: 1rem; |
||||
|
text-decoration: none; |
||||
|
color: #465765; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .actions .login { |
||||
|
color: #dfe8ee; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .actions .login:hover { |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-text .action-button, .navigation-clean-button .navbar-text .action-button:active, .navigation-clean-button .navbar-text .action-button:hover { |
||||
|
background: #56c6c6; |
||||
|
border-radius: 20px; |
||||
|
font-size: inherit; |
||||
|
color: #fff; |
||||
|
box-shadow: none; |
||||
|
border: none; |
||||
|
text-shadow: none; |
||||
|
padding: .5rem 1rem; |
||||
|
transition: background-color 0.25s; |
||||
|
font-size: inherit; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button .navbar-text .action-button:hover { |
||||
|
background: #66d7d7; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .action-button, .navigation-clean-button.navbar-dark .action-button:active { |
||||
|
background: #208f8f; |
||||
|
} |
||||
|
|
||||
|
.navigation-clean-button.navbar-dark .action-button:hover { |
||||
|
background: #269d9d; |
||||
|
} |
||||
|
|
File diff suppressed because it is too large
@ -0,0 +1,9 @@ |
|||||
|
var express = require('express'); |
||||
|
var router = express.Router(); |
||||
|
|
||||
|
/* GET home page. */ |
||||
|
router.get('/', (req, res, next) => { |
||||
|
res.render('index'); |
||||
|
}); |
||||
|
|
||||
|
module.exports = router; |
@ -0,0 +1,9 @@ |
|||||
|
var express = require('express'); |
||||
|
var router = express.Router(); |
||||
|
|
||||
|
/* GET users listing. */ |
||||
|
router.get('/', function(req, res, next) { |
||||
|
res.send('respond with a resource'); |
||||
|
}); |
||||
|
|
||||
|
module.exports = router; |
@ -0,0 +1,3 @@ |
|||||
|
<h1><%= message %></h1> |
||||
|
<h2><%= error.status %></h2> |
||||
|
<pre><%= error.stack %></pre> |
@ -0,0 +1,210 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> |
||||
|
<title>swarmlab.io</title> |
||||
|
<link rel="stylesheet" href="/stylesheets/bootstrap.min.css"> |
||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic"> |
||||
|
<link rel="stylesheet" |
||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/simple-line-icons/2.4.1/css/simple-line-icons.min.css"> |
||||
|
<link rel="stylesheet" href="/stylesheets/Footer-Dark.css"> |
||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css"> |
||||
|
<link rel="stylesheet" href="/stylesheets/Navigation-with-Button.css"> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
<nav class="navbar navbar-light navbar-expand-md navigation-clean-button"> |
||||
|
<div class="container"><a class="navbar-brand text-monospace" href="index.html">swarmlab.io</a><button |
||||
|
data-toggle="collapse" class="navbar-toggler" data-target="#navcol-1"><span class="sr-only">Toggle |
||||
|
navigation</span><span class="navbar-toggler-icon"></span></button> |
||||
|
<div class="collapse navbar-collapse" id="navcol-1"> |
||||
|
<ul class="nav navbar-nav mr-auto"> |
||||
|
<li class="nav-item" role="presentation"><a class="nav-link" href="#features">Features</a></li> |
||||
|
<li class="nav-item" role="presentation"><a class="nav-link" href="#services">Services</a></li> |
||||
|
<li class="nav-item" role="presentation"><a class="nav-link" href="#lab-rooms">Lab-rooms</a></li> |
||||
|
</ul><span class="navbar-text actions"> <a class="login" href="#">Log In</a><a |
||||
|
class="btn btn-light action-button" role="button" href="#">Sign Up</a></span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</nav> |
||||
|
<header class="masthead text-white text-center" |
||||
|
style="background: url(/images/markus-spiske-qjnAnF0jIGk-unsplash.jpg) top / cover;"> |
||||
|
<div class="overlay"></div> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-xl-9 mx-auto"> |
||||
|
|
||||
|
<h1 class="mb-5" style="height: 20px;"><%= t('welcome') %></h1> |
||||
|
<p style="font-size: 24px;"><%= t('welcome_text') %></p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</header> |
||||
|
<section class="features-icons bg-light text-center" id="features"> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-lg-4"> |
||||
|
<div class="mx-auto features-icons-item mb-5 mb-lg-0 mb-lg-3"> |
||||
|
<div class="d-flex features-icons-icon"><i class="icon-screen-desktop m-auto text-primary" |
||||
|
data-bs-hover-animate="pulse"></i></div> |
||||
|
<h3><%= t('features_01_header') %></h3> |
||||
|
<p class="lead mb-0"><%= t('features_01_text') %></p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-4"> |
||||
|
<div class="mx-auto features-icons-item mb-5 mb-lg-0 mb-lg-3"> |
||||
|
<div class="d-flex features-icons-icon"><i class="icon-layers m-auto text-primary" |
||||
|
data-bs-hover-animate="pulse"></i></div> |
||||
|
<h3><%= t('features_02_header') %></h3> |
||||
|
<p class="lead mb-0"><%= t('features_02_text') %></p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-lg-4"> |
||||
|
<div class="mx-auto features-icons-item mb-5 mb-lg-0 mb-lg-3"> |
||||
|
<div class="d-flex features-icons-icon"><i class="icon-check m-auto text-primary" |
||||
|
data-bs-hover-animate="pulse"></i></div> |
||||
|
<h3><%= t('features_03_header') %></h3> |
||||
|
<p class="lead mb-0"><%= t('features_03_text') %></p> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col"><a class="btn btn-primary btn-lg" role="button" data-bs-hover-animate="pulse" |
||||
|
style="color: rgb(255,255,255);margin-top: 80px;">Documentation</a></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="showcase" id="services"> |
||||
|
<div class="container-fluid p-0"> |
||||
|
<div class="row no-gutters"> |
||||
|
<div class="col-lg-6 order-lg-2 text-white showcase-img" |
||||
|
style="background: url(/images/thomas-jensen-ISG-rUel0Uw-unsplash.jpg) center / cover;"><span></span></div> |
||||
|
<div class="col-lg-6 my-auto order-lg-1 showcase-text"> |
||||
|
<h2><strong><%= t('on_demand') %> </strong></h2> |
||||
|
<p class="lead mb-0"><%= t('on_demand_text') %></p><a class="btn btn-light border-dark" role="button" |
||||
|
data-bs-hover-animate="pulse" style="margin: 0;margin-top: 20px;" |
||||
|
href="https://api-client.swarmlab.io:8088">api-client.swarmlab</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="row no-gutters"> |
||||
|
<div class="col-lg-6 text-white showcase-img" |
||||
|
style="background: url(/images/yancy-min-842ofHC6MaI-unsplash.jpg) center / cover;"><span></span></div> |
||||
|
<div class="col-lg-6 my-auto order-lg-1 showcase-text" style="margin: 0;"> |
||||
|
<h2><strong><%= t('git') %></strong></h2> |
||||
|
<p class="lead mb-0"><%= t('git_text') %></p><a class="btn btn-light border-dark" role="button" |
||||
|
data-bs-hover-animate="pulse" style="margin: 0;margin-top: 20px;" |
||||
|
href="https://git.swarmlab.io:3000">git.swarmlab</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="testimonials text-center bg-light" id="lab-rooms"> |
||||
|
<div class="container"> |
||||
|
<h2 class="mb-5"><%= t('available_swarmlab') %></h2> |
||||
|
<div class="row"> |
||||
|
<div class="col"> |
||||
|
<div class="card-group"> |
||||
|
<div class="card" style="margin: 10px;"> |
||||
|
<div class="card-body"> |
||||
|
<h4 class="card-title">Title</h4> |
||||
|
<p class="card-text">Nullam id dolor id nibh ultricies vehicula ut id elit. Cras justo odio, dapibus ac |
||||
|
facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus.</p><a |
||||
|
class="btn btn-light btn-sm border-dark" role="button">More Info</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="card" style="margin: 10px;"> |
||||
|
<div class="card-body"> |
||||
|
<h4 class="card-title">Title</h4> |
||||
|
<p class="card-text">Nullam id dolor id nibh ultricies vehicula ut id elit. Cras justo odio, dapibus ac |
||||
|
facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus.</p><a |
||||
|
class="btn btn-light border-dark" role="button">Button</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="card" style="margin: 10px;"> |
||||
|
<div class="card-body"> |
||||
|
<h4 class="card-title">Title</h4> |
||||
|
<p class="card-text">Nullam id dolor id nibh ultricies vehicula ut id elit. Cras justo odio, dapibus ac |
||||
|
facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus.</p><a |
||||
|
class="btn btn-light border-dark" role="button">Button</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="d-flex justify-content-center justify-content-xl-center"> |
||||
|
<nav class="d-flex justify-content-center" style="width: auto;margin-top: 25px;color: rgb(33,37,41);"> |
||||
|
<ul class="pagination"> |
||||
|
<li class="page-item"><a class="page-link" href="#" aria-label="Previous"><span |
||||
|
aria-hidden="true">«</span></a></li> |
||||
|
<li class="page-item"><a class="page-link" href="#">1</a></li> |
||||
|
<li class="page-item"><a class="page-link" href="#">2</a></li> |
||||
|
<li class="page-item"><a class="page-link" href="#">3</a></li> |
||||
|
<li class="page-item"><a class="page-link" href="#">4</a></li> |
||||
|
<li class="page-item"><a class="page-link" href="#">5</a></li> |
||||
|
<li class="page-item"><a class="page-link" href="#" aria-label="Next"><span aria-hidden="true">»</span></a> |
||||
|
</li> |
||||
|
</ul> |
||||
|
</nav> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="call-to-action text-white text-center" |
||||
|
style="background: url(/images/annie-spratt-QckxruozjRg-unsplash.jpg) center / cover;height: 400;" id="feedback"> |
||||
|
<div class="overlay"></div> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-xl-9 mx-auto"> |
||||
|
<h2 class="mb-4"> <%= t('bug') %></h2> |
||||
|
</div> |
||||
|
<div class="col-md-10 col-lg-8 col-xl-7 mx-auto"> |
||||
|
<div class="row d-flex justify-content-center justify-content-xl-center"><a |
||||
|
class="btn btn-secondary btn-lg border-secondary justify-content-center" role="button" |
||||
|
data-bs-hover-animate="pulse" style="margin: 0;margin-top: 20px;background-color: rgb(40,45,51);" |
||||
|
href=" https://git.swarmlab.io:3000/swarmlab/feedback">Feedback</a></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<div class="footer-dark"> |
||||
|
<footer> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-6 col-md-3 item"> |
||||
|
<h3>Menu</h3> |
||||
|
<ul> |
||||
|
<li><a href="#features">Features</a></li> |
||||
|
<li><a href="#">Documentation</a></li> |
||||
|
<li><a href="#services">Services</a></li> |
||||
|
<li><a href="#lab-rooms">Lab-rooms</a></li> |
||||
|
<li><a href="#feedback">Feedback</a></li> |
||||
|
<li><a href="#">FAQ</a></li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
<div class="col-sm-6 col-md-3 item"> |
||||
|
<h3>Translations</h3> |
||||
|
<ul> |
||||
|
<li><a href="?lng=en">English</a></li> |
||||
|
<li><a href="?lng=el">Greek</a></li> |
||||
|
<li></li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
<div class=" col-md-6 item text"> |
||||
|
<h3>swarmlab.io</h3> |
||||
|
<p><%= t('welcome_text') %></p> |
||||
|
</div> |
||||
|
<div class="col item social"><span class="actions"> <a class="btn btn-light btn-lg text-light action-button" |
||||
|
role="button" href="#" style="background-color: rgba(248,249,250,0);">Log In</a><a |
||||
|
class="btn btn-light btn-lg text-light action-button" role="button" href="#" |
||||
|
style="margin: 20px;background-color: rgba(248,249,250,0);color: rgb(255,255,255);">Sign Up</a></span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<p class="copyright">swarmlab.io © <%= new Date().getFullYear(); %></p> |
||||
|
</div> |
||||
|
</footer> |
||||
|
</div> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.bundle.min.js"></script> |
||||
|
<script src="/javascripts/bs-init.js"></script> |
||||
|
</body> |
||||
|
|
||||
|
</html> |
Loading…
Reference in new issue