Page MenuHomeDevCentral

D674.diff
No OneTemporary

D674.diff

diff --git a/.babelrc b/.babelrc
new file mode 100644
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,4 @@
+{
+ "presets": ["es2015"],
+ "compact": false
+}
diff --git a/.bowerrc b/.bowerrc
new file mode 100644
--- /dev/null
+++ b/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory": "bower_components"
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+# Mac OS X
+.DS_Store
+
+# Node artifacts
+node_modules
+npm-debug.log
+bower_components
+
+# Released version
+dist
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,7 @@
+# Changelog
+All notable changes to this project will be documented in this file.
+This project adheres to [semantic versioning](http://semver.org/).
+
+## Unreleased
+### Added
+- Initial version.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,11 @@
+# Eglide web site
+
+## Introduction
+
+A web site for https://www.eglide.org/, a free, community-oriented,
+professional shell hosting service.
+
+## Installation
+
+> Document here any step to install the site.
+> You're first to commit, you've the choice to decide how that installs.
diff --git a/bower.json b/bower.json
new file mode 100644
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,23 @@
+{
+ "name": "eglide-www",
+ "version": "0.0.1",
+ "authors": [
+ "Sébastien Santoro aka Dereckson <dereckson@espace-win.org>"
+ ],
+ "description": "Website design for Eglide.",
+ "main": "gulpfile.js",
+ "license": "CC-BY-4.0",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "dependencies": {
+ "foundation-sites": "~6.2.3",
+ "motion-ui": "~1.2.2",
+ "foundation-icon-fonts": "*"
+ },
+ "private": true
+}
diff --git a/config.yml b/config.yml
new file mode 100644
--- /dev/null
+++ b/config.yml
@@ -0,0 +1,64 @@
+# Your project's server will run on localhost:xxxx at this port
+PORT: 8000
+
+# Autoprefixer will make sure your CSS works with these browsers
+COMPATIBILITY:
+ - "last 2 versions"
+ - "ie >= 9"
+
+# UnCSS will use these settings
+UNCSS_OPTIONS:
+ html:
+ - "src/**/*.html"
+ ignore:
+ - !!js/regexp .foundation-mq
+ - !!js/regexp ^\.is-.*
+
+# Gulp will reference these paths when it copies files
+PATHS:
+ # Path to dist folder
+ dist: "dist"
+ # Paths to static assets that aren't images, CSS, or JavaScript
+ assets:
+ - "src/assets/**/*"
+ - "!src/assets/{scss,root}"
+ - "!src/assets/{img,js,scss,root}/**/*"
+ rootAssets:
+ - "src/assets/root/**/*"
+ # Paths to Sass libraries, which can then be loaded with @import
+ sass:
+ - "bower_components/foundation-sites/scss"
+ - "bower_components/motion-ui/src"
+ - "bower_components/foundation-icon-fonts"
+ # Paths to JavaScript libraries, which are compined into one file
+ javascript:
+ # Libraries requried by Foundation
+ - "bower_components/jquery/dist/jquery.js"
+ - "bower_components/what-input/what-input.js"
+ # Core Foundation files
+ - "bower_components/foundation-sites/js/foundation.core.js"
+ - "bower_components/foundation-sites/js/foundation.util.*.js"
+ # Individual Foundation components
+ # If you aren't using a component, just remove it from the list
+ - "bower_components/foundation-sites/js/foundation.abide.js"
+ - "bower_components/foundation-sites/js/foundation.accordion.js"
+ - "bower_components/foundation-sites/js/foundation.accordionMenu.js"
+ - "bower_components/foundation-sites/js/foundation.drilldown.js"
+ - "bower_components/foundation-sites/js/foundation.dropdown.js"
+ - "bower_components/foundation-sites/js/foundation.dropdownMenu.js"
+ - "bower_components/foundation-sites/js/foundation.equalizer.js"
+ - "bower_components/foundation-sites/js/foundation.interchange.js"
+ - "bower_components/foundation-sites/js/foundation.magellan.js"
+ - "bower_components/foundation-sites/js/foundation.offcanvas.js"
+ - "bower_components/foundation-sites/js/foundation.orbit.js"
+ - "bower_components/foundation-sites/js/foundation.responsiveMenu.js"
+ - "bower_components/foundation-sites/js/foundation.responsiveToggle.js"
+ - "bower_components/foundation-sites/js/foundation.reveal.js"
+ - "bower_components/foundation-sites/js/foundation.slider.js"
+ - "bower_components/foundation-sites/js/foundation.sticky.js"
+ - "bower_components/foundation-sites/js/foundation.tabs.js"
+ - "bower_components/foundation-sites/js/foundation.toggler.js"
+ - "bower_components/foundation-sites/js/foundation.tooltip.js"
+ # Paths to your own project code are here
+ - "src/assets/js/!(app).js"
+ - "src/assets/js/app.js"
diff --git a/gulpfile.babel.js b/gulpfile.babel.js
new file mode 100644
--- /dev/null
+++ b/gulpfile.babel.js
@@ -0,0 +1,156 @@
+'use strict';
+
+import plugins from 'gulp-load-plugins';
+import yargs from 'yargs';
+import browser from 'browser-sync';
+import gulp from 'gulp';
+import panini from 'panini';
+import rimraf from 'rimraf';
+import sherpa from 'style-sherpa';
+import yaml from 'js-yaml';
+import fs from 'fs';
+
+// Load all Gulp plugins into one variable
+const $ = plugins();
+
+// Check for --production flag
+const PRODUCTION = !!(yargs.argv.production);
+
+// Load settings from settings.yml
+const { COMPATIBILITY, PORT, UNCSS_OPTIONS, PATHS } = loadConfig();
+
+function loadConfig() {
+ let ymlFile = fs.readFileSync('config.yml', 'utf8');
+ return yaml.load(ymlFile);
+}
+
+// Build the "dist" folder by running all of the below tasks
+gulp.task('build', gulp.series(
+ clean,
+ gulp.parallel(pages, sass, javascript, images, cssfonts, copy),
+ doc
+));
+
+// Build the site, run the server, and watch for file changes
+gulp.task('default',
+ gulp.series('build', server, watch));
+
+// Delete the "dist" folder
+// This happens every time a build starts
+function clean(done) {
+ rimraf(PATHS.dist, done);
+}
+
+// Copy files out of the assets and rootAssets folder
+// This task skips over the "img", "js", and "scss" folders, which are parsed separately
+function copy() {
+ gulp.src(PATHS.assets)
+ .pipe(gulp.dest(PATHS.dist + '/assets'));
+
+ return gulp.src(PATHS.rootAssets)
+ .pipe(gulp.dest(PATHS.dist));
+}
+
+// Copy page templates into finished HTML files
+function pages() {
+ return gulp.src('src/pages/**/*.{html,hbs,handlebars}')
+ .pipe(panini({
+ root: 'src/pages/',
+ layouts: 'src/layouts/',
+ partials: 'src/partials/',
+ data: 'src/data/',
+ helpers: 'src/helpers/'
+ }))
+ .pipe(gulp.dest(PATHS.dist));
+}
+
+// Load updated HTML templates and partials into Panini
+function resetPages(done) {
+ panini.refresh();
+ done();
+}
+
+// Compile Sass into CSS
+// In production, the CSS is compressed
+function sass() {
+ return gulp.src('src/assets/scss/app.scss')
+ .pipe($.sourcemaps.init())
+ .pipe($.sass({
+ includePaths: PATHS.sass
+ })
+ .on('error', $.sass.logError))
+ .pipe($.autoprefixer({
+ browsers: COMPATIBILITY
+ }))
+ // Comment in the pipe below to run UnCSS in production
+ //.pipe($.if(PRODUCTION, $.uncss(UNCSS_OPTIONS)))
+ .pipe($.if(PRODUCTION, $.cssnano()))
+ .pipe($.if(!PRODUCTION, $.sourcemaps.write()))
+ .pipe(gulp.dest(PATHS.dist + '/assets/css'))
+ .pipe(browser.reload({ stream: true }));
+}
+
+// Combine JavaScript into one file
+// In production, the file is minified
+function javascript() {
+ return gulp.src(PATHS.javascript)
+ .pipe($.sourcemaps.init())
+ .pipe($.babel())
+ .pipe($.concat('app.js'))
+ .pipe($.if(PRODUCTION, $.uglify()
+ .on('error', e => { console.log(e); })
+ ))
+ .pipe($.if(!PRODUCTION, $.sourcemaps.write()))
+ .pipe(gulp.dest(PATHS.dist + '/assets/js'));
+}
+
+// Copy images to the "dist" folder
+// In production, the images are compressed
+function images() {
+ return gulp.src('src/assets/img/**/*')
+ .pipe($.if(PRODUCTION, $.imagemin({
+ progressive: true
+ })))
+ .pipe(gulp.dest(PATHS.dist + '/assets/img'));
+}
+
+// Copy fonts used in CSS to the "dist" folder
+function cssfonts() {
+ return gulp.src('./bower_components/foundation-icon-fonts/*.{ttf,woff,eot,svg}')
+ .pipe(gulp.dest(PATHS.dist + '/assets/fonts'));
+}
+
+// Generate the documentation the Markdown content and HTML template in doc/
+function doc(done) {
+ sherpa('src/doc/index.md', {
+ output: PATHS.dist + '/doc.html',
+ template: 'src/doc/template.html'
+ }, done);
+}
+
+// Start a server with BrowserSync to preview the site in
+function server(done) {
+ browser.init({
+ server: PATHS.dist,
+ port: PORT,
+ tunnel: "eglide"
+ });
+ done();
+}
+
+// Reload the browser with BrowserSync
+function reload(done) {
+ browser.reload();
+ done();
+}
+
+// Watch for changes to static assets, pages, Sass, and JavaScript
+function watch() {
+ gulp.watch(PATHS.assets, copy);
+ gulp.watch('src/pages/**/*.html').on('change', gulp.series(pages, browser.reload));
+ gulp.watch('src/{layouts,partials}/**/*.html').on('change', gulp.series(resetPages, pages, browser.reload));
+ gulp.watch('src/assets/scss/**/*.scss', sass);
+ gulp.watch('src/assets/js/**/*.js').on('change', gulp.series(javascript, browser.reload));
+ gulp.watch('src/assets/img/**/*').on('change', gulp.series(images, browser.reload));
+ gulp.watch('src/doc/**').on('change', gulp.series(doc, browser.reload));
+}
diff --git a/package.json b/package.json
new file mode 100644
--- /dev/null
+++ b/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "eglide-www",
+ "version": "0.0.1",
+ "description": "Website for Eglide.",
+ "main": "gulpfile.js",
+ "scripts": {
+ "start": "gulp",
+ "build": "gulp build --production"
+ },
+ "author": "Sébastien Santoro aka Dereckson <dereckson@espace-win.org>",
+ "homepage": "https://www.eglide.org/",
+ "license": "CC-BY-4.0",
+ "keywords": [
+ "www"
+ ],
+ "devDependencies": {
+ "babel-preset-es2015": "^6.3.13",
+ "babel-register": "^6.7.2",
+ "browser-sync": "^2.10.0",
+ "gulp": "gulpjs/gulp#4.0",
+ "gulp-autoprefixer": "^3.1.0",
+ "gulp-babel": "^6.1.2",
+ "gulp-cli": "^1.2.1",
+ "gulp-concat": "^2.5.2",
+ "gulp-cssnano": "^2.1.0",
+ "gulp-extname": "^0.2.0",
+ "gulp-if": "^2.0.0",
+ "gulp-imagemin": "^2.2.1",
+ "gulp-load-plugins": "^1.1.0",
+ "gulp-sass": "^2.1.0",
+ "gulp-sourcemaps": "^1.6.0",
+ "gulp-uglify": "^1.2.0",
+ "gulp-uncss": "^1.0.1",
+ "handlebars-helpers": "^0.7.3",
+ "js-yaml": "^3.4.6",
+ "panini": "^1.3.0",
+ "rimraf": "^2.4.3",
+ "style-sherpa": "^1.0.0",
+ "yargs": "^3.8.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/nasqueron/eglide-www.git"
+ },
+ "bugs": {
+ "url": "https://devcentral.nasqueron.org/project/view/82/"
+ },
+ "babel": {
+ "presets": [
+ "es2015"
+ ]
+ },
+ "private": true
+}
diff --git a/readme.md b/readme.md
new file mode 100644
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,66 @@
+# Dæghrefn web site
+
+This website hosted at https://daeghrefn.nasqueron.org/
+provides an web presence to Dæghrefn, an utility bot on
+Freenode.
+
+## Purpose
+- An answer to the question 'Who are you?'
+- Provide a documentation
+
+## What this repository is not
+
+If you search the source source code of the bot:
+ - At the core, it's an [eggdrop](http://www.eggheads.org/devel/)
+ - It uses these [TCL scripts](https://devcentral.nasqueron.org/diffusion/VIPER/)
+ - It also uses these [Python scripts](https://devcentral.nasqueron.org/diffusion/DWD/) to interact with Wikidata.
+
+## Features
+
+This site use the ZURB Template for use with [Foundation for Sites](http://foundation.zurb.com/sites).
+
+It has a Gulp-powered build system with these features:
+
+- Handlebars HTML templates with Panini
+- Sass compilation and prefixing
+- JavaScript concatenation
+- Built-in BrowserSync server
+- For production builds:
+ - CSS compression
+ - JavaScript compression
+ - Image compression
+
+## Installation
+
+These steps come from the Foundation ZURB template repository documentation.
+
+### Manual Setup
+
+To use this repository, your computer needs:
+
+- [NodeJS](https://nodejs.org/en/) (0.12 or greater)
+- [Git](https://git-scm.com/)
+
+To manually set up the repository, first download it with Git:
+
+```bash
+git clone https://github.com/nasqueron/daeghrefn-www daeghrefn-www
+```
+
+Then open the folder in your command line, and install the needed dependencies:
+
+```bash
+cd daeghrefn-www
+npm install
+bower install
+```
+
+Finally, run `npm start` to run Gulp. The finished site will be created in a folder called `dist`, viewable at this URL:
+
+```
+http://localhost:8000
+```
+
+### Create locally a production-ready version
+
+To create compressed, production-ready assets, run `npm run build`.
diff --git a/src/assets/img/logo-eglide-24px.png b/src/assets/img/logo-eglide-24px.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/img/logo-eglide-32px.png b/src/assets/img/logo-eglide-32px.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/img/logo-nasqueron.png b/src/assets/img/logo-nasqueron.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/js/app.js b/src/assets/js/app.js
new file mode 100644
--- /dev/null
+++ b/src/assets/js/app.js
@@ -0,0 +1,166 @@
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Author: Sébastien Santoro aka Dereckson
+ Dependencies: jquery
+ Filename: app.js
+ Licence: CC-BY 4.0, MIT, BSD-2-Clause (multi-licensing)
+ ------------------------------------------------------------- */
+
+/* -------------------------------------------------------------
+ Table of contents
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ :: Easter egg
+ :: Code to run when document is ready
+ */
+
+/* -------------------------------------------------------------
+ Easter egg
+
+ Based on https://github.com/snaptortoise/konami-js
+ Author: George Mandis
+ License: MIT
+ Version: 1.4.5 (3/2/2016)
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+var EasterEgg = function (callback) {
+ var easterEgg = {
+
+ addEvent: function (obj, type, fn, ref_obj) {
+ if (obj.addEventListener)
+ obj.addEventListener(type, fn, false);
+ else if (obj.attachEvent) {
+ // IE
+ obj['e' + type + fn] = fn;
+ obj[type + fn] = function () {
+ obj['e' + type + fn](window.event, ref_obj);
+ };
+ obj.attachEvent('on' + type, obj[type + fn]);
+ }
+ },
+
+ input: '',
+
+ pattern: '38384040373937396665',
+
+ load: function (link) {
+ this.addEvent(document, 'keydown', function (e, ref_obj) {
+ if (ref_obj) {
+ easterEgg = ref_obj; // IE
+ }
+ easterEgg.input += e ? e.keyCode : event.keyCode;
+ if (easterEgg.input.length > easterEgg.pattern.length) {
+ easterEgg.input = easterEgg.input.substr(
+ easterEgg.input.length - easterEgg.pattern.length
+ );
+ }
+ if (easterEgg.input == easterEgg.pattern) {
+ easterEgg.code(link);
+ easterEgg.input = '';
+ e.preventDefault();
+ return false;
+ }
+ }, this);
+ this.touchscreen.load(link);
+ },
+
+ code: function (link) {
+ window.location = link
+ },
+
+ touchscreen: {
+
+ start_x: 0,
+ start_y: 0,
+ stop_x: 0,
+ stop_y: 0,
+ tap: false,
+ capture: false,
+ orig_keys: '',
+ keys: [
+ 'UP', 'UP',
+ 'DOWN', 'DOWN',
+ 'LEFT', 'RIGHT',
+ 'LEFT', 'RIGHT',
+ 'TAP', 'TAP'
+ ],
+
+ code: function (link) {
+ easterEgg.code(link);
+ },
+
+ load: function (link) {
+ this.orig_keys = this.keys;
+
+ easterEgg.addEvent(document, 'touchmove', function (e) {
+ if (e.touches.length == 1 && easterEgg.touchscreen.capture == true) {
+ var touch = e.touches[0];
+ easterEgg.touchscreen.stop_x = touch.pageX;
+ easterEgg.touchscreen.stop_y = touch.pageY;
+ easterEgg.touchscreen.tap = false;
+ easterEgg.touchscreen.capture = false;
+ easterEgg.touchscreen.check_direction();
+ }
+ });
+
+ easterEgg.addEvent(document, 'touchend', function (evt) {
+ if (easterEgg.touchscreen.tap == true) {
+ easterEgg.touchscreen.check_direction(link);
+ }
+ }, false);
+
+ easterEgg.addEvent(document, 'touchstart', function (evt) {
+ easterEgg.touchscreen.start_x = evt.changedTouches[0].pageX;
+ easterEgg.touchscreen.start_y = evt.changedTouches[0].pageY;
+ easterEgg.touchscreen.tap = true;
+ easterEgg.touchscreen.capture = true;
+ });
+ },
+
+ check_direction: function (link) {
+ var x_magnitude = Math.abs(this.start_x - this.stop_x);
+ var y_magnitude = Math.abs(this.start_y - this.stop_y);
+ var x = ((this.start_x - this.stop_x) < 0) ? 'RIGHT' : 'LEFT';
+ var y = ((this.start_y - this.stop_y) < 0) ? 'DOWN' : 'UP';
+ var result = (x_magnitude > y_magnitude) ? x : y;
+ result = (this.tap == true) ? 'TAP' : result;
+
+ if (result == this.keys[0]) {
+ this.keys = this.keys.slice(1, this.keys.length);
+ }
+
+ if (this.keys.length == 0) {
+ this.keys = this.orig_keys;
+ this.code(link);
+ }
+ }
+
+ }
+
+ };
+
+ typeof callback === 'string' && easterEgg.load(callback);
+
+ if (typeof callback === 'function') {
+ easterEgg.code = callback;
+ easterEgg.load();
+ }
+
+ return easterEgg;
+};
+
+var quote = "“A protracted conference, with Cheuhoras, Saraisme the younger, Akeurle Both-twins, traav Kanchangesja and a couple of minors from the Eglide adolescent pod.”";
+
+/* -------------------------------------------------------------
+ Code to run when document is ready
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+$( document ).ready(function() {
+ $(document).foundation();
+
+ new EasterEgg(function() {
+ console.log(quote);
+ });
+});
diff --git a/src/assets/root/android-chrome-192x192.png b/src/assets/root/android-chrome-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/android-chrome-512x512.png b/src/assets/root/android-chrome-512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/apple-touch-icon.png b/src/assets/root/apple-touch-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/browserconfig.xml b/src/assets/root/browserconfig.xml
new file mode 100644
--- /dev/null
+++ b/src/assets/root/browserconfig.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+ <msapplication>
+ <tile>
+ <square150x150logo src="/mstile-150x150.png"/>
+ <TileColor>#00aba9</TileColor>
+ </tile>
+ </msapplication>
+</browserconfig>
diff --git a/src/assets/root/favicon-16x16.png b/src/assets/root/favicon-16x16.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/favicon-32x32.png b/src/assets/root/favicon-32x32.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/favicon.ico b/src/assets/root/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/manifest.json b/src/assets/root/manifest.json
new file mode 100644
--- /dev/null
+++ b/src/assets/root/manifest.json
@@ -0,0 +1,16 @@
+{
+ "name": "Eglide",
+ "icons": [
+ {
+ "src": "\/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image\/png"
+ },
+ {
+ "src": "\/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image\/png"
+ }
+ ],
+ "theme_color": "#cdebf7"
+}
diff --git a/src/assets/root/mstile-144x144.png b/src/assets/root/mstile-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/mstile-150x150.png b/src/assets/root/mstile-150x150.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/mstile-310x150.png b/src/assets/root/mstile-310x150.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/mstile-310x310.png b/src/assets/root/mstile-310x310.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/mstile-70x70.png b/src/assets/root/mstile-70x70.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/src/assets/root/safari-pinned-tab.svg b/src/assets/root/safari-pinned-tab.svg
new file mode 100644
--- /dev/null
+++ b/src/assets/root/safari-pinned-tab.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
+ preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+</metadata>
+<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
+fill="#000000" stroke="none">
+<path d="M1361 6009 c-84 -16 -159 -75 -203 -159 l-23 -45 0 -1445 0 -1445 21
+-46 c27 -58 85 -116 143 -143 46 -21 52 -21 974 -24 l927 -2 0 -119 0 -118
+-117 -7 c-262 -15 -579 -62 -806 -120 -318 -82 -529 -189 -615 -315 l-37 -53
+0 -277 c0 -316 -2 -307 91 -396 58 -56 220 -145 342 -189 600 -214 1662 -259
+2437 -105 356 71 608 170 741 292 92 84 94 89 94 395 0 259 0 263 -25 311
+-109 216 -672 401 -1377 453 l-158 12 0 118 0 118 1010 0 c967 0 1012 1 1060
+19 73 28 125 74 157 139 l28 57 0 320 0 320 -33 68 c-35 70 -76 109 -152 145
+-32 16 -182 17 -1843 22 -1592 4 -1809 7 -1817 20 -5 8 -10 63 -10 121 0 90 3
+108 18 122 17 15 132 17 1353 19 l1334 3 47 28 c29 17 57 44 73 71 22 38 25
+54 25 146 0 91 -3 108 -24 144 -27 46 -65 77 -115 94 -25 9 -371 12 -1356 12
+-1268 0 -1323 1 -1338 18 -26 28 -25 222 1 245 17 15 167 17 1818 19 l1799 3
+52 24 c61 27 116 84 147 150 20 44 21 59 21 411 0 410 1 401 -74 483 -23 25
+-65 55 -94 68 l-52 24 -2200 1 c-1210 1 -2220 -2 -2244 -7z m949 -549 c0 -73
+-4 -120 -10 -120 -6 0 -10 47 -10 120 0 73 4 120 10 120 6 0 10 -47 10 -120z
+m90 105 c0 -8 -4 -15 -10 -15 -5 0 -10 7 -10 15 0 8 5 15 10 15 6 0 10 -7 10
+-15z m210 -105 c0 -100 -2 -120 -15 -120 -8 0 -15 4 -15 10 0 5 -13 1 -29 -8
+-29 -16 -31 -16 -57 4 -37 27 -49 67 -35 114 15 50 58 71 96 46 l25 -16 0 45
+c0 33 4 45 15 45 13 0 15 -20 15 -120z m-580 100 c0 -6 -27 -10 -60 -10 l-60
+0 0 -35 0 -35 55 0 c42 0 55 -3 55 -15 0 -12 -13 -15 -55 -15 l-55 0 0 -45 0
+-45 60 0 c33 0 60 -4 60 -10 0 -6 -32 -10 -75 -10 l-75 0 0 115 0 115 75 0
+c43 0 75 -4 75 -10z m-400 -80 c41 -15 76 -34 78 -41 2 -9 -31 -26 -98 -50
+-79 -29 -100 -33 -98 -21 2 8 33 25 75 40 40 14 70 29 67 33 -2 4 -36 18 -74
+30 -42 14 -70 28 -70 37 0 15 5 14 120 -28z m548 24 c12 -8 22 -10 22 -5 0 6
+7 11 15 11 12 0 15 -15 14 -77 0 -104 -15 -145 -56 -156 -39 -12 -83 -2 -83
+18 0 11 5 12 25 5 42 -16 85 10 85 51 0 6 -8 6 -19 -1 -34 -18 -68 -12 -90 16
+-36 46 -24 125 22 144 32 13 40 12 65 -6z m619 -7 c7 -7 15 -27 19 -45 l7 -32
+-67 0 c-71 0 -83 -11 -49 -45 12 -13 28 -16 60 -12 54 6 61 -18 7 -26 -40 -7
+-81 6 -100 31 -17 22 -18 93 -1 114 30 38 93 46 124 15z m-397 -72 c0 -50 -4
+-85 -10 -85 -6 0 -10 35 -10 85 0 50 4 85 10 85 6 0 10 -35 10 -85z m998
+-2780 c93 -78 128 -352 66 -527 -52 -147 -140 -200 -213 -127 l-31 31 0 285 0
+285 39 39 c48 48 93 53 139 14z m-708 -480 c131 -25 274 -69 397 -121 l113
+-48 2 -180 3 -181 195 -5 c217 -6 209 -3 196 -76 -13 -68 -89 -126 -206 -155
+-93 -23 -311 -17 -460 14 -353 74 -676 238 -815 415 -132 167 -76 296 150 348
+77 18 309 12 425 -11z m1190 -835 c0 -14 -5 -107 -12 -207 l-12 -182 -40 -5
+c-98 -12 -377 -14 -575 -5 -118 5 -217 12 -219 14 -3 2 1 96 8 207 l13 203
+418 0 419 0 0 -25z"/>
+<path d="M2490 5464 c-14 -36 -12 -56 6 -82 32 -45 84 -19 84 43 0 43 -17 65
+-51 65 -22 0 -32 -6 -39 -26z"/>
+<path d="M2110 5471 c-16 -30 -12 -76 8 -94 35 -32 64 -18 77 36 15 57 -58
+107 -85 58z"/>
+<path d="M2702 5478 c-26 -26 -13 -38 38 -38 34 0 50 4 50 13 0 21 -22 37 -50
+37 -14 0 -31 -5 -38 -12z"/>
+</g>
+</svg>
diff --git a/src/assets/scss/_settings.scss b/src/assets/scss/_settings.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/_settings.scss
@@ -0,0 +1,600 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Author: Dereckson
+ Dependencies: foundation motion-ui
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+@import 'util/util';
+
+/* -------------------------------------------------------------
+ Table of contents
+
+ Foundation for Sites Settings
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ :: 1. Global
+ :: 2. Breakpoints
+ :: 3. The Grid
+ :: 4. Base Typography
+ :: 5. Typography Helpers
+ :: 6. Abide
+ :: 7. Accordion
+ :: 8. Accordion Menu
+ :: 9. Badge
+ :: 10. Breadcrumbs
+ :: 11. Button
+ :: 12. Button Group
+ :: 13. Callout
+ :: 14. Close Button
+ :: 15. Drilldown
+ :: 16. Dropdown
+ :: 17. Dropdown Menu
+ :: 18. Flex Video
+ :: 19. Forms
+ :: 20. Label
+ :: 21. Media Object
+ :: 22. Menu
+ :: 23. Meter
+ :: 24. Off-canvas
+ :: 25. Orbit
+ :: 26. Pagination
+ :: 27. Progress Bar
+ :: 28. Reveal
+ :: 29. Slider
+ :: 30. Switch
+ :: 31. Table
+ :: 32. Tabs
+ :: 33. Thumbnail
+ :: 34. Title Bar
+ :: 35. Tooltip
+ :: 36. Top Bar
+
+ :: 37. Path for fonts
+ :: 38. Header
+
+*/
+
+// 1. Global
+// ---------
+
+$global-font-size: 100%;
+$global-width: rem-calc(1200);
+$global-lineheight: 1.5;
+$foundation-palette: (
+ primary: #2199e8,
+ secondary: #777,
+ success: #3adb76,
+ warning: #ffae00,
+ alert: #ec5840,
+);
+$light-gray: #e6e6e6;
+$medium-gray: $light-gray;
+$dark-gray: #8a8a8a;
+$black: #0a0a0a;
+$white: #fefefe;
+$body-background: $white;
+$body-font-color: $black;
+$body-font-family: 'Raleway', serif;
+$body-antialiased: true;
+$global-margin: 1rem;
+$global-padding: 1rem;
+$global-weight-normal: normal;
+$global-weight-bold: bold;
+$global-radius: 0;
+$global-text-direction: ltr;
+$global-flexbox: false;
+$print-transparent-backgrounds: true;
+
+@include add-foundation-colors;
+
+// 2. Breakpoints
+// --------------
+
+$breakpoints: (
+ small: 0,
+ medium: 640px,
+ large: 1024px,
+ xlarge: 1200px,
+ xxlarge: 1440px,
+);
+$breakpoint-classes: (small medium large);
+
+// 3. The Grid
+// -----------
+
+$grid-row-width: $global-width;
+$grid-column-count: 12;
+$grid-column-gutter: (
+ small: 20px,
+ medium: 30px,
+);
+$grid-column-align-edge: true;
+$block-grid-max: 8;
+
+// 4. Base Typography
+// ------------------
+
+$header-font-family: 'Uncial Antiqua', cursive;
+$header-font-weight: $global-weight-normal;
+$header-font-style: normal;
+$font-family-monospace: Consolas, 'Liberation Mono', Courier, monospace;
+$header-sizes: (
+ small: (
+ 'h1': 24,
+ 'h2': 20,
+ 'h3': 19,
+ 'h4': 18,
+ 'h5': 17,
+ 'h6': 16,
+ ),
+ medium: (
+ 'h1': 48,
+ 'h2': 40,
+ 'h3': 31,
+ 'h4': 25,
+ 'h5': 20,
+ 'h6': 16,
+ ),
+);
+$header-color: inherit;
+$header-lineheight: 1.4;
+$header-margin-bottom: 0.5rem;
+$header-text-rendering: optimizeLegibility;
+$small-font-size: 80%;
+$header-small-font-color: $medium-gray;
+$paragraph-lineheight: 1.6;
+$paragraph-margin-bottom: 1rem;
+$paragraph-text-rendering: optimizeLegibility;
+$code-color: $black;
+$code-font-family: $font-family-monospace;
+$code-font-weight: $global-weight-normal;
+$code-background: $light-gray;
+$code-border: 1px solid $medium-gray;
+$code-padding: rem-calc(2 5 1);
+$anchor-color: $primary-color;
+$anchor-color-hover: scale-color($anchor-color, $lightness: -14%);
+$anchor-text-decoration: none;
+$anchor-text-decoration-hover: none;
+$hr-width: $global-width;
+$hr-border: 1px solid $medium-gray;
+$hr-margin: rem-calc(20) auto;
+$list-lineheight: $paragraph-lineheight;
+$list-margin-bottom: $paragraph-margin-bottom;
+$list-style-type: disc;
+$list-style-position: outside;
+$list-side-margin: 1.25rem;
+$list-nested-side-margin: 1.25rem;
+$defnlist-margin-bottom: 1rem;
+$defnlist-term-weight: $global-weight-bold;
+$defnlist-term-margin-bottom: 0.3rem;
+$blockquote-color: $dark-gray;
+$blockquote-padding: rem-calc(9 20 0 19);
+$blockquote-border: 1px solid $medium-gray;
+$cite-font-size: rem-calc(13);
+$cite-color: $dark-gray;
+$keystroke-font: $font-family-monospace;
+$keystroke-color: $black;
+$keystroke-background: $light-gray;
+$keystroke-padding: rem-calc(2 4 0);
+$keystroke-radius: $global-radius;
+$abbr-underline: 1px dotted $black;
+
+// 5. Typography Helpers
+// ---------------------
+
+$lead-font-size: $global-font-size * 1.25;
+$lead-lineheight: 1.6;
+$subheader-lineheight: 1.4;
+$subheader-color: $dark-gray;
+$subheader-font-weight: $global-weight-normal;
+$subheader-margin-top: 0.2rem;
+$subheader-margin-bottom: 0.5rem;
+$stat-font-size: 2.5rem;
+
+// 6. Abide
+// --------
+
+$abide-inputs: true;
+$abide-labels: true;
+$input-background-invalid: map-get($foundation-palette, alert);
+$form-label-color-invalid: map-get($foundation-palette, alert);
+$input-error-color: map-get($foundation-palette, alert);
+$input-error-font-size: rem-calc(12);
+$input-error-font-weight: $global-weight-bold;
+
+// 7. Accordion
+// ------------
+
+$accordion-background: $white;
+$accordion-plusminus: true;
+$accordion-item-color: foreground($accordion-background, $primary-color);
+$accordion-item-background-hover: $light-gray;
+$accordion-item-padding: 1.25rem 1rem;
+$accordion-content-background: $white;
+$accordion-content-border: 1px solid $light-gray;
+$accordion-content-color: foreground($accordion-background, $primary-color);
+$accordion-content-padding: 1rem;
+
+// 8. Accordion Menu
+// -----------------
+
+$accordionmenu-arrows: true;
+$accordionmenu-arrow-color: $primary-color;
+
+// 9. Badge
+// --------
+
+$badge-background: $primary-color;
+$badge-color: foreground($badge-background);
+$badge-padding: 0.3em;
+$badge-minwidth: 2.1em;
+$badge-font-size: 0.6rem;
+
+// 10. Breadcrumbs
+// ---------------
+
+$breadcrumbs-margin: 0 0 $global-margin 0;
+$breadcrumbs-item-font-size: rem-calc(11);
+$breadcrumbs-item-color: $primary-color;
+$breadcrumbs-item-color-current: $black;
+$breadcrumbs-item-color-disabled: $medium-gray;
+$breadcrumbs-item-margin: 0.75rem;
+$breadcrumbs-item-uppercase: true;
+$breadcrumbs-item-slash: true;
+
+// 11. Button
+// ----------
+
+$button-padding: 0.85em 1em;
+$button-margin: 0 0 $global-margin 0;
+$button-fill: solid;
+$button-background: $primary-color;
+$button-background-hover: scale-color($button-background, $lightness: -15%);
+$button-color: $white;
+$button-color-alt: $black;
+$button-radius: $global-radius;
+$button-sizes: (
+ tiny: 0.6rem,
+ small: 0.75rem,
+ default: 0.9rem,
+ large: 1.25rem,
+);
+$button-opacity-disabled: 0.25;
+
+// 12. Button Group
+// ----------------
+
+$buttongroup-margin: 1rem;
+$buttongroup-spacing: 1px;
+$buttongroup-child-selector: '.button';
+$buttongroup-expand-max: 6;
+
+// 13. Callout
+// -----------
+
+$callout-background: $white;
+$callout-background-fade: 85%;
+$callout-border: 1px solid rgba($black, 0.25);
+$callout-margin: 0 0 1rem 0;
+$callout-padding: 1rem;
+$callout-font-color: $body-font-color;
+$callout-font-color-alt: $body-background;
+$callout-radius: $global-radius;
+$callout-link-tint: 30%;
+
+// 14. Close Button
+// ----------------
+
+$closebutton-position: right top;
+$closebutton-offset-horizontal: 1rem;
+$closebutton-offset-vertical: 0.5rem;
+$closebutton-size: 2em;
+$closebutton-lineheight: 1;
+$closebutton-color: $dark-gray;
+$closebutton-color-hover: $black;
+
+// 15. Drilldown
+// -------------
+
+$drilldown-transition: transform 0.15s linear;
+$drilldown-arrows: true;
+$drilldown-arrow-color: $primary-color;
+$drilldown-background: $white;
+
+// 16. Dropdown
+// ------------
+
+$dropdown-padding: 1rem;
+$dropdown-border: 1px solid $medium-gray;
+$dropdown-font-size: 1rem;
+$dropdown-width: 300px;
+$dropdown-radius: $global-radius;
+$dropdown-sizes: (
+ tiny: 100px,
+ small: 200px,
+ large: 400px,
+);
+
+// 17. Dropdown Menu
+// -----------------
+
+$dropdownmenu-arrows: true;
+$dropdownmenu-arrow-color: $anchor-color;
+$dropdownmenu-min-width: 200px;
+$dropdownmenu-background: $white;
+$dropdownmenu-border: 1px solid $medium-gray;
+
+// 18. Flex Video
+// --------------
+
+$flexvideo-margin-bottom: rem-calc(16);
+$flexvideo-ratio: 4 by 3;
+$flexvideo-ratio-widescreen: 16 by 9;
+
+// 19. Forms
+// ---------
+
+$fieldset-border: 1px solid $medium-gray;
+$fieldset-padding: rem-calc(20);
+$fieldset-margin: rem-calc(18 0);
+$legend-padding: rem-calc(0 3);
+$form-spacing: rem-calc(16);
+$helptext-color: $black;
+$helptext-font-size: rem-calc(13);
+$helptext-font-style: italic;
+$input-prefix-color: $black;
+$input-prefix-background: $light-gray;
+$input-prefix-border: 1px solid $medium-gray;
+$input-prefix-padding: 1rem;
+$form-label-color: $black;
+$form-label-font-size: rem-calc(14);
+$form-label-font-weight: $global-weight-normal;
+$form-label-line-height: 1.8;
+$select-background: $white;
+$select-triangle-color: $dark-gray;
+$select-radius: $global-radius;
+$input-color: $black;
+$input-placeholder-color: $medium-gray;
+$input-font-family: inherit;
+$input-font-size: rem-calc(16);
+$input-background: $white;
+$input-background-focus: $white;
+$input-background-disabled: $light-gray;
+$input-border: 1px solid $medium-gray;
+$input-border-focus: 1px solid $dark-gray;
+$input-shadow: inset 0 1px 2px rgba($black, 0.1);
+$input-shadow-focus: 0 0 5px $medium-gray;
+$input-cursor-disabled: default;
+$input-transition: box-shadow 0.5s, border-color 0.25s ease-in-out;
+$input-number-spinners: true;
+$input-radius: $global-radius;
+
+// 20. Label
+// ---------
+
+$label-background: $primary-color;
+$label-color: foreground($label-background);
+$label-font-size: 0.8rem;
+$label-padding: 0.33333rem 0.5rem;
+$label-radius: $global-radius;
+
+// 21. Media Object
+// ----------------
+
+$mediaobject-margin-bottom: $global-margin;
+$mediaobject-section-padding: $global-padding;
+$mediaobject-image-width-stacked: 100%;
+
+// 22. Menu
+// --------
+
+$menu-margin: 0;
+$menu-margin-nested: 1rem;
+$menu-item-padding: 0.7rem 1rem;
+$menu-item-color-active: $white;
+$menu-item-background-active: map-get($foundation-palette, primary);
+$menu-icon-spacing: 0.25rem;
+
+// 23. Meter
+// ---------
+
+$meter-height: 1rem;
+$meter-radius: $global-radius;
+$meter-background: $medium-gray;
+$meter-fill-good: $success-color;
+$meter-fill-medium: $warning-color;
+$meter-fill-bad: $alert-color;
+
+// 24. Off-canvas
+// --------------
+
+$offcanvas-size: 250px;
+$offcanvas-background: $light-gray;
+$offcanvas-zindex: -1;
+$offcanvas-transition-length: 0.5s;
+$offcanvas-transition-timing: ease;
+$offcanvas-fixed-reveal: true;
+$offcanvas-exit-background: rgba($white, 0.25);
+$maincontent-class: 'off-canvas-content';
+$maincontent-shadow: 0 0 10px rgba($black, 0.5);
+
+// 25. Orbit
+// ---------
+
+$orbit-bullet-background: $medium-gray;
+$orbit-bullet-background-active: $dark-gray;
+$orbit-bullet-diameter: 1.2rem;
+$orbit-bullet-margin: 0.1rem;
+$orbit-bullet-margin-top: 0.8rem;
+$orbit-bullet-margin-bottom: 0.8rem;
+$orbit-caption-background: rgba($black, 0.5);
+$orbit-caption-padding: 1rem;
+$orbit-control-background-hover: rgba($black, 0.5);
+$orbit-control-padding: 1rem;
+$orbit-control-zindex: 10;
+
+// 26. Pagination
+// --------------
+
+$pagination-font-size: rem-calc(14);
+$pagination-margin-bottom: $global-margin;
+$pagination-item-color: $black;
+$pagination-item-padding: rem-calc(3 10);
+$pagination-item-spacing: rem-calc(1);
+$pagination-radius: $global-radius;
+$pagination-item-background-hover: $light-gray;
+$pagination-item-background-current: $primary-color;
+$pagination-item-color-current: foreground($pagination-item-background-current);
+$pagination-item-color-disabled: $medium-gray;
+$pagination-ellipsis-color: $black;
+$pagination-mobile-items: false;
+$pagination-arrows: true;
+
+// 27. Progress Bar
+// ----------------
+
+$progress-height: 1rem;
+$progress-background: $medium-gray;
+$progress-margin-bottom: $global-margin;
+$progress-meter-background: $primary-color;
+$progress-radius: $global-radius;
+
+// 28. Reveal
+// ----------
+
+$reveal-background: $white;
+$reveal-width: 600px;
+$reveal-max-width: $global-width;
+$reveal-padding: $global-padding;
+$reveal-border: 1px solid $medium-gray;
+$reveal-radius: $global-radius;
+$reveal-zindex: 1005;
+$reveal-overlay-background: rgba($black, 0.45);
+
+// 29. Slider
+// ----------
+
+$slider-width-vertical: 0.5rem;
+$slider-transition: all 0.2s ease-in-out;
+$slider-height: 0.5rem;
+$slider-background: $light-gray;
+$slider-fill-background: $medium-gray;
+$slider-handle-height: 1.4rem;
+$slider-handle-width: 1.4rem;
+$slider-handle-background: $primary-color;
+$slider-opacity-disabled: 0.25;
+$slider-radius: $global-radius;
+
+// 30. Switch
+// ----------
+
+$switch-background: $medium-gray;
+$switch-background-active: $primary-color;
+$switch-height: 2rem;
+$switch-height-tiny: 1.5rem;
+$switch-height-small: 1.75rem;
+$switch-height-large: 2.5rem;
+$switch-radius: $global-radius;
+$switch-margin: $global-margin;
+$switch-paddle-background: $white;
+$switch-paddle-offset: 0.25rem;
+$switch-paddle-radius: $global-radius;
+$switch-paddle-transition: all 0.25s ease-out;
+
+// 31. Table
+// ---------
+
+$table-background: $white;
+$table-color-scale: 5%;
+$table-border: 1px solid smart-scale($table-background, $table-color-scale);
+$table-padding: rem-calc(8 10 10);
+$table-hover-scale: 2%;
+$table-row-hover: darken($table-background, $table-hover-scale);
+$table-row-stripe-hover: darken($table-background, $table-color-scale + $table-hover-scale);
+$table-striped-background: smart-scale($table-background, $table-color-scale);
+$table-stripe: even;
+$table-head-background: smart-scale($table-background, $table-color-scale / 2);
+$table-foot-background: smart-scale($table-background, $table-color-scale);
+$table-head-font-color: $body-font-color;
+$show-header-for-stacked: false;
+
+// 32. Tabs
+// --------
+
+$tab-margin: 0;
+$tab-background: $white;
+$tab-background-active: $light-gray;
+$tab-item-font-size: rem-calc(12);
+$tab-item-background-hover: $white;
+$tab-item-padding: 1.25rem 1.5rem;
+$tab-expand-max: 6;
+$tab-content-background: $white;
+$tab-content-border: $light-gray;
+$tab-content-color: foreground($tab-background, $primary-color);
+$tab-content-padding: 1rem;
+
+// 33. Thumbnail
+// -------------
+
+$thumbnail-border: solid 4px $white;
+$thumbnail-margin-bottom: $global-margin;
+$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2);
+$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5);
+$thumbnail-transition: box-shadow 200ms ease-out;
+$thumbnail-radius: $global-radius;
+
+// 34. Title Bar
+// -------------
+
+$titlebar-background: $black;
+$titlebar-color: $white;
+$titlebar-padding: 0.5rem;
+$titlebar-text-font-weight: bold;
+$titlebar-icon-color: $white;
+$titlebar-icon-color-hover: $medium-gray;
+$titlebar-icon-spacing: 0.25rem;
+
+// 35. Tooltip
+// -----------
+
+$has-tip-font-weight: $global-weight-bold;
+$has-tip-border-bottom: dotted 1px $dark-gray;
+$tooltip-background-color: $black;
+$tooltip-color: $white;
+$tooltip-padding: 0.75rem;
+$tooltip-font-size: $small-font-size;
+$tooltip-pip-width: 0.75rem;
+$tooltip-pip-height: $tooltip-pip-width * 0.866;
+$tooltip-radius: $global-radius;
+
+// 36. Top Bar
+// -----------
+
+$topbar-padding: 0.5rem;
+$topbar-background: $light-gray;
+$topbar-submenu-background: $topbar-background;
+$topbar-title-spacing: 1rem;
+$topbar-input-width: 200px;
+$topbar-unstack-breakpoint: medium;
+$topbar-height: 6rem;
+
+// 37. Path for fonts
+// ------------------
+
+$fi-path: "../fonts";
+
+// 38. Header
+// ----------
+
+$header-bg: #272F32;
+$subnav-link-padding: 0.9rem;
+$subnav-font-size: 0.75rem;
+$subnav-link-opacity: 0.15;
+$header-height: 3.5rem;
+$transition: all .35s ease-in-out;
diff --git a/src/assets/scss/app.scss b/src/assets/scss/app.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/app.scss
@@ -0,0 +1,89 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Author: Dereckson
+ Dependencies: foundation motion-ui
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+@import 'settings';
+
+/* -------------------------------------------------------------
+ Table of contents
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ :: Dependencies
+ :: Our design
+
+*/
+
+/* -------------------------------------------------------------
+ Dependencies
+
+ Foundation
+ Motion UI
+ Foundation Icon Fonts 3
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+@import 'foundation';
+@import 'motion-ui';
+@import '_foundation-icons';
+
+@include foundation-global-styles;
+@include foundation-grid;
+@include foundation-typography;
+@include foundation-button;
+@include foundation-forms;
+/*
+@include foundation-accordion;
+@include foundation-accordion-menu;
+@include foundation-badge;
+@include foundation-breadcrumbs;
+@include foundation-button-group;
+@include foundation-callout;
+@include foundation-close-button;
+@include foundation-menu;
+@include foundation-menu-icon;
+@include foundation-drilldown-menu;
+@include foundation-dropdown;
+@include foundation-dropdown-menu;
+@include foundation-flex-video;
+@include foundation-label;
+@include foundation-media-object;
+@include foundation-off-canvas;
+@include foundation-orbit;
+@include foundation-pagination;
+@include foundation-progress-bar;
+@include foundation-slider;
+@include foundation-sticky;
+@include foundation-reveal;
+@include foundation-switch;
+@include foundation-table;
+@include foundation-tabs;
+@include foundation-thumbnail;
+@include foundation-title-bar;
+@include foundation-tooltip;
+@include foundation-top-bar;
+@include foundation-visibility-classes;
+@include foundation-float-classes;
+
+@include motion-ui-transitions;
+@include motion-ui-animations;
+*/
+
+/* -------------------------------------------------------------
+ Our design
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+@import 'components/layout';
+@import 'components/footer';
+@import 'components/header';
+@import 'components/blockgrid';
+@import 'components/panel';
+@import 'components/cards';
+@import 'components/status';
+@import 'components/news';
diff --git a/src/assets/scss/components/_blockgrid.scss b/src/assets/scss/components/_blockgrid.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/components/_blockgrid.scss
@@ -0,0 +1,33 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Author: Dereckson
+ Dependencies: foundation motion-ui
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+/* -------------------------------------------------------------
+ Block grid
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+.blockgrid {
+ padding: 1em 0;
+}
+
+.blockgrid img {
+ margin: 1rem 0;
+}
+
+.black-margin {
+ border: 8px solid black;
+}
+
+.white {
+ background-color: white;
+ color: black;
+ font-weight: 700;
+}
diff --git a/src/assets/scss/components/_cards.scss b/src/assets/scss/components/_cards.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/components/_cards.scss
@@ -0,0 +1,108 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Author: Dereckson
+ Dependencies: foundation motion-ui
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+/* -------------------------------------------------------------
+ Callout cards
+
+ http://zurb.com/building-blocks/info-card-with-corner-lables
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+$info: #89c4f4;
+
+.callout-card {
+ border: 1px solid #333;
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
+ margin: 1rem 0;
+ overflow: hidden;
+
+ .card-label {
+ border-color: transparent #333 transparent transparent;
+ border-color: rgba(255,255,255,0) #333 rgba(255,255,255,0) rgba(255,255,255,0);
+ }
+
+ &.primary {
+ border-color: $primary-color ;
+
+ .card-label {
+ border-color: transparent $primary-color transparent transparent;
+ border-color: rgba(255,255,255,0) $primary-color rgba(255,255,255,0) rgba(255,255,255,0);
+ }
+ }
+ &.secondary {
+ border-color: $secondary-color;
+
+ .card-label {
+ border-color: transparent $secondary-color transparent transparent;
+ border-color: rgba(255,255,255,0) $secondary-color rgba(255,255,255,0) rgba(255,255,255,0);
+ }
+ }
+ &.info {
+ border-color: $info;
+
+ .card-label {
+ border-color: transparent $info transparent transparent;
+ border-color: rgba(255,255,255,0) $info rgba(255,255,255,0) rgba(255,255,255,0);
+ }
+ }
+ &.alert {
+ border-color: $alert-color;
+
+ .card-label {
+ border-color: transparent $alert-color transparent transparent;
+ border-color: rgba(255,255,255,0) $alert-color rgba(255,255,255,0) rgba(255,255,255,0);
+ }
+ }
+ &.success {
+ border-color: $success-color;
+
+ .card-label {
+ border-color: transparent $success-color transparent transparent;
+ border-color: rgba(255,255,255,0) $success-color rgba(255,255,255,0) rgba(255,255,255,0);
+ }
+ }
+ &.warning {
+ border-color: $warning-color;
+
+ .card-label {
+ border-color: transparent $warning-color transparent transparent;
+ border-color: rgba(255,255,255,0) $warning-color rgba(255,255,255,0) rgba(255,255,255,0);
+ }
+ }
+
+ .card-label {
+ border-style: solid;
+ border-width: 0 70px 40px 0;
+ float:right;
+ height: 0px;
+ width: 0px;
+ transform:rotate(360deg);
+ }
+
+ .callout-card-content{
+ padding: 0.5rem 1.5rem 0.875rem;
+ }
+
+ &.radius {
+ border-radius: 0.6rem;
+ }
+
+ .label-text {
+ color: #fff;
+ font-size: 0.75rem;
+ font-weight: bold;
+ position: relative;
+ right: -40px;
+ top: 2px;
+ white-space: nowrap;
+ transform: rotate(30deg);
+ }
+}
diff --git a/src/assets/scss/components/_footer.scss b/src/assets/scss/components/_footer.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/components/_footer.scss
@@ -0,0 +1,119 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Dependencies: foundation motion-ui
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+.footer {
+ background-color: #292c2f;
+ text-align: center;
+ font-size: 1.2rem;
+ padding: 4rem;
+
+ margin-top: 10vh;
+
+ .inline-list a {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ background-color: #33383b;
+ border-radius: 2px;
+ font-size: 1.5rem;
+ color: #fff;
+ text-align: center;
+ line-height: 35px;
+ margin: 0 3px 0 0;
+ }
+
+ .contact {
+ list-style-type: none;
+ margin: 0;
+ text-align: left;
+ color: #fff;
+
+ li {
+ margin-bottom: 2rem;
+
+ p {
+ padding-left: 5rem;
+ }
+ }
+
+ i {
+ position: absolute;
+ background-color: #33383b;
+ color: #fff;
+ font-size: 2rem;
+ border-radius: 50%;
+ line-height: 1;
+ margin: 0 0 0 -4rem;
+ vertical-align: middle;
+ padding: .25em .45em;
+ }
+ }
+
+ .copywrite {
+ color: #8f9296;
+ font-size: 0.875rem;
+ margin: 0 0 1rem 0;
+ }
+
+ .about {
+ color: #92999f;
+ font-size: 0.875rem;
+ margin: 0 0 1rem 0;
+ }
+
+ .footer-links a {
+ list-style: none;
+ font-weight: normal;
+ color: #fff;
+ padding: 3rem 0 2rem;
+ margin: 0;
+ font-size: 0.875rem;
+
+ &::after {
+ content: "•";
+ padding: 0 0.2rem 0 0.4rem;
+ }
+
+ &:last-child::after {
+ content: "";
+ padding: 0 0.4rem 0 0.8rem;
+ }
+ }
+
+ @media only screen and (min-width: 40.063em) {
+
+ p {
+ text-align: left;
+ }
+
+ .social {
+ text-align: left;
+ margin: 0;
+ }
+
+ .contact {
+ text-align: left;
+ > i {
+ margin-right: 1rem;
+ }
+ }
+
+ }
+}
+
+.logo {
+ color: #fff;
+ font-size: 1.5rem;
+
+ i {
+ margin-right: 0.5rem;
+ }
+}
diff --git a/src/assets/scss/components/_header.scss b/src/assets/scss/components/_header.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/components/_header.scss
@@ -0,0 +1,69 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Dependencies: foundation motion-ui
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+// http://zurb.com/building-blocks/header-and-subnav
+
+.header {
+ text-align: center;
+ background: $header-bg;
+ background-size: cover;
+ position: relative;
+ overflow: visible;
+ padding-top: $header-height;
+ padding-bottom: $header-height + ($subnav-link-padding * 2 + $subnav-font-size - 0.15rem);
+
+ .headline {
+ color: #ffe;
+ }
+}
+
+.header-subnav {
+ float: none;
+ position: absolute;
+ text-align: center;
+ margin: 0 auto;
+ bottom: 0;
+ width: 100%;
+
+ li {
+ float: none;
+ display: inline-block;
+
+ a {
+ padding: $subnav-link-padding 1rem;
+ font-size: $subnav-font-size;
+ color: #ffe;
+ text-transform: uppercase;
+ display: block;
+ font-weight: bold;
+ letter-spacing: 1px;
+ transition: $transition;
+
+ &.is-active {
+ background: rgba(250,250,250,$subnav-link-opacity);
+ }
+
+ &:hover {
+ background: rgba(250,250,250,$subnav-link-opacity);
+ transition: $transition;
+ }
+ }
+ }
+
+ i {
+ margin-right: 0.5em;
+ }
+}
+
+// Rules applying to page header and content header.
+header {
+ margin-bottom: $header-height;
+}
diff --git a/src/assets/scss/components/_layout.scss b/src/assets/scss/components/_layout.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/components/_layout.scss
@@ -0,0 +1,37 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Author: Dereckson
+ Dependencies: foundation motion-ui
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+/* -------------------------------------------------------------
+ Table of contents
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ :: Header
+ :: Content
+ :: Headings
+
+*/
+
+/* -------------------------------------------------------------
+ Header
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+header {
+}
+
+
+/* -------------------------------------------------------------
+ Content
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+/* -------------------------------------------------------------
+ Headings
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
diff --git a/src/assets/scss/components/_news.scss b/src/assets/scss/components/_news.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/components/_news.scss
@@ -0,0 +1,27 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Author: Dereckson
+ Dependencies: foundation
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+.news {
+ margin-top: 1rem;
+ margin-bottom: 2rem;
+
+ h3 {
+ font-family: $body-font-family;
+ font-size: 1.5rem;
+ font-weight: 300;
+ margin-bottom: 0.5em;
+
+ i {
+ margin-right: 0.5rem;
+ }
+ }
+}
diff --git a/src/assets/scss/components/_panel.scss b/src/assets/scss/components/_panel.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/components/_panel.scss
@@ -0,0 +1,53 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Author: Dereckson
+ Dependencies: foundation
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+// http://zurb.com/building-blocks/header-card-panel
+
+.panel {
+ margin: 3rem auto;
+ border: 2px solid #444;
+ background: yellow;
+
+ p {
+ font-size: 1rem;
+ padding: 1rem 2rem 2rem 2rem;
+ margin-top: -1.25rem;
+
+ span {
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ font-size: 75%;
+ font-weight: bold;
+ }
+ }
+
+ .sign {
+ background: #FF3D2E;
+ width: 150px;
+ height: 2.4rem;
+ border: 2px solid #444;
+ position: relative;
+ top: -2.5rem;
+ margin: auto;
+
+ h1 {
+ text-transform: uppercase;
+ font: bolder 0.875rem;
+ letter-spacing: 3px;
+ color: $black;
+ font-size: 70%;
+ text-align: center;
+ line-height: 2rem;
+ }
+ }
+}
+
diff --git a/src/assets/scss/components/_status.scss b/src/assets/scss/components/_status.scss
new file mode 100644
--- /dev/null
+++ b/src/assets/scss/components/_status.scss
@@ -0,0 +1,15 @@
+@charset "utf-8";
+
+/* -------------------------------------------------------------
+ Eglide web site
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Project: Eglide
+ Author: Dereckson
+ Dependencies: foundation
+ Filename: app.css
+ Licence: CC-BY 4.0, MIT
+ ------------------------------------------------------------- */
+
+.status {
+ border: 2px dashed $black;
+}
diff --git a/src/doc/index.md b/src/doc/index.md
new file mode 100644
--- /dev/null
+++ b/src/doc/index.md
@@ -0,0 +1,146 @@
+# Acknowledgements
+
+> Dedicated to all former ViperServ, Slippy and SurfBoard users,
+> alive and *dans l'au-delà*.
+
+
+
+# Overview
+
+Dæghrefn is an utility bot on the Freenode network.
+
+It offers services to users and accomplish various tasks like add an user or
+web site on a server, fetch a video title, publish Wikipedia articles ideas
+on Twitter or create Wikidata items.
+
+These tasks are customized for channels, according the needs of the communities.
+
+
+
+# Wikidata item creation
+
+| Channel | Kind of item created | Aliases | Example |
+|------------------------------------|----------------------|-------------------|-----------------|
+| `.+givenname <given name> [genre]` | Given name | .+prénom .+prenom | `.+prénom Aude F` |
+| `.+surname <name>` | Surname | .+nom | `.+nom Gueryand ` |
+
+That requires to be recognized by the bot, with a flag D.
+
+
+
+# Server management
+
+Some server administration tasks are automatable from IRC, like add a new vhost
+to the nginx server or create a new unprivileged user account.
+
+
+
+# Twitter bridge
+
+## On #wikipedia-fr and #wolfplex
+
+`!pub <message>` allows to publish to the main account linked to the channel.
+
+| Channel | Twitter account | Purpose |
+|---------------|---------------------------------------------------|---------------------------------------------------------|
+| #wolfplex | [@wolfplex](https://twitter.com/wolfplex) | Official account of Wolfplex Hackerspace |
+| #wikipedia-fr | [@wikipedia-fr](https://twitter.com/wikipedia-fr) | Notify Twitter of current conversations on the channel. |
+
+## On #wikipedia-fr — articles suggestions
+
+`!idée <idea>` allows to add on [@ideedarticles](https://twitter.com/ideedarticles)
+new ideas.
+
+This account is managed by Zil.
+
+## In partyline
+
+You can use the same method to publish to a personal account.
+
+`.pub <message>`
+
+
+
+# Video titles
+
+When a link to YouTube or other popular site is given, Dæghrefn will give the
+URL, excepted if you already did that on the same line.
+
+
+
+# Operator tasks
+
+We strongly think moderation should be done by humans and limit the cases
+handled by a bot to the strict minimum, when there is a strong consensus.
+
+## On #wikipedia-fr
+
+There is a strange botnet attack with random connections, using always the same
+nick and usernames, quitting with excess flood, generally from big providers
+like Wanadoo, Free or Skynet.
+
+Dæghrefn watches the quit message and heuristically bans probable botnet users.
+
+## On #vikidia
+
+There is an attack using open proxies. Dæghrefn queries DNSBL lists for users
+joining the channel, and bans if the IP is listed. It extracts the IP from the
+web gateway cloaks.
+
+
+
+# Development principles
+
+## Repositories
+
+**TCL scripts:**
+
+ The scripts collection repository is called ViperServ,
+ from a former name of a bot.
+
+ [GitHub](https://github.com/nasqueron/ViperServ),
+ [DevCentral](https://devcentral.nasqueron.org/diffusion/VIPERWWW/)
+
+**Web site:**
+
+ The website uses a static generator to process Handlebar templates,
+ and SCSS stylesheets.
+
+ [GitHub](https://github.com/nasqueron/daeghrefn-www),
+ [DevCentral](https://devcentral.nasqueron.org/diffusion/VIPER/)
+
+## Submit code
+
+Open a patch on DevCentral, our Phabricator instance,
+against the relevant repository.
+
+We accept external scripts in Python, interpreted in bot TCL code or C modules.
+We prefer useful C modules to directly extend TCL (e.g. RabbitMQ connection)
+than only for eggdrops.
+
+A guide on how to use Arcanist to interact with repositories is available
+on the Nasqueron wiki at the page
+[How to contribute code](http://agora.nasqueron.org/How_to_contribute_code).
+
+## Code review
+
+Code will be reviewed at two level: by the core maintainer (currently Dereckson)
+and by a developer of the channel primarily using the eggdrop to share
+responsibilities and knowledge, and ensure communities know what is
+going on.
+
+* Nasqueron-broker specific code: Sandlayth
+* Wikidata specific code: Ash-Crow, Dachary
+* Wolfplex specific code: Philectro
+
+## Smooth deployment
+
+The bots don't quit/join channels all the time. Our bots tend to be rather
+quiet when not actively triggered.
+
+When ready, file with code updated is explicitly loaded, with good error
+catching TCL feature. Code is written, reviewed, tested live, reviewed again,
+then committed to master (which so offers a stable version of the codebase).
+
+At the section writing time, Dæghrefn has a 109 days uptime, TC2 150 days
+and Wearg 162 days (= the server uptime).
diff --git a/src/doc/template.html b/src/doc/template.html
new file mode 100644
--- /dev/null
+++ b/src/doc/template.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8"/>
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Dæghrefn</title>
+ <link rel="stylesheet" href="{{ root }}assets/css/app.css">
+ <link href='https://fonts.googleapis.com/css?family=Kreon' rel='stylesheet' type='text/css'>
+ <link href='https://fonts.googleapis.com/css?family=Arimo:400,700' rel='stylesheet' type='text/css'>
+ </head>
+ <body>
+
+ <header class="column row">
+ <h1>Dæghrefn documentation</h1>
+ <p class="lead">This style guide was built with Foundation for Sites. For more information on how to use this responsive front-end framework, check out the documentation, get help from the Foundation community, or request immediate technical support.</p>
+ <a href="http://foundation.zurb.com/docs/" class="button">Visit the Docs</a>
+ <a href="http://foundation.zurb.com/forum/" class="secondary button">Foundation Forum</a>
+ <a href="http://foundation.zurb.com/business/business-support.html" class="secondary button">Technical Support</a>
+ </header>
+
+ <div class="column row darken"><div class="row collapse">
+
+ <div class="large-3 medium-4 columns" data-sticky-container>
+ <ul class="vertical menu">
+ {{#each pages}}
+ <li><a href="#{{ anchor }}">{{ title }}</a></li>
+ {{/each}}
+ </ul>
+ </div>
+
+ <div class="large-9 medium-8 columns">
+ {{#each pages}}
+ <section class="ss-section" id="{{ anchor }}">
+ {{ body }}
+ </section>
+ {{/each}}
+ </div>
+
+ </div></div>
+
+ <script src="assets/js/app.js"></script>
+ </body>
+</html>
diff --git a/src/helpers/is.js b/src/helpers/is.js
new file mode 100644
--- /dev/null
+++ b/src/helpers/is.js
@@ -0,0 +1,25 @@
+/**
+ * Block helper that renders a block if `a` is **equal to** `b`.
+ * If an inverse block is specified it will be rendered when falsy.
+ *
+ * From http://assemble.io/helpers/, under MIT license.
+ *
+ * @name .is
+ * @param {any} `a`
+ * @param {any} `b`
+ * @param {Object} `options` Handlebars provided options object
+ * @return {String}
+ * @block
+ * @api public
+ */
+
+module.exports = function (a, b, options) {
+ if (arguments.length === 2) {
+ options = b;
+ b = options.hash.compare;
+ }
+ if (a === b) {
+ return options.fn(this);
+ }
+ return options.inverse(this);
+};
diff --git a/src/helpers/ucfirst.js b/src/helpers/ucfirst.js
new file mode 100644
--- /dev/null
+++ b/src/helpers/ucfirst.js
@@ -0,0 +1,16 @@
+/**
+ * Handlebars helper to capitalize.
+ *
+ * @param {string} str - The string to capitalize the first character
+ * @example
+ * {{ucfirst foo}}
+ * @returns string The string capitalized
+ */
+module.exports = function (str) {
+ if (str && typeof str === "string") {
+ return str.charAt(0).toUpperCase() + str.slice(1);
+ }
+
+ console.warn("helpers: ucfirst called with a non string parameter.");
+ return '';
+}
diff --git a/src/layouts/default.html b/src/layouts/default.html
new file mode 100644
--- /dev/null
+++ b/src/layouts/default.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<html class="no-js" lang="en">
+<head>
+ <meta charset="utf-8"/>
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Eglide</title>
+ <link rel="stylesheet" href="{{ root }}assets/css/app.css">
+ <link href="https://fonts.googleapis.com/css?family=Raleway:300,400|Uncial+Antiqua" rel="stylesheet">
+
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
+ <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
+ <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
+ <link rel="manifest" href="/manifest.json">
+ <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
+ <meta name="apple-mobile-web-app-title" content="Eglide">
+ <meta name="application-name" content="Eglide">
+ <meta name="theme-color" content="#cdebf7">
+</head>
+<body>
+ {{> header}}
+ {{> body}}
+ {{> footer}}
+
+ <script src="{{ root }}assets/js/app.js"></script>
+</body>
+</html>
diff --git a/src/pages/index.html b/src/pages/index.html
new file mode 100644
--- /dev/null
+++ b/src/pages/index.html
@@ -0,0 +1,21 @@
+---
+title: Home
+---
+<header id="welcome">
+ <div class="row hero">
+ <div class="large-10 large-offset-1 columns">
+ <h1>Welcome to Eglide.</h1>
+ <h2>Durant les travaux, l'exposition continue.</h2>
+ </div>
+ </div>
+</header>
+
+<section class="row">
+ <div class="large-8 columns">
+ <h2>News</h2>
+ {{> news}}
+ </div>
+ <div class="large-4 columns">
+ {{> status}}
+ </div>
+</section>
diff --git a/src/pages/presentation.html b/src/pages/presentation.html
new file mode 100644
--- /dev/null
+++ b/src/pages/presentation.html
@@ -0,0 +1,46 @@
+---
+title: Presentation
+---
+<header id="welcome">
+ <div class="row hero">
+ <div class="large-10 large-offset-1 columns">
+ <h1>Welcome to Eglide.</h1>
+ <h2>A great server for great people.</h2>
+ </div>
+ </div>
+</header>
+
+<section class="row">
+ <div class="small-8 medium-6 large-5 small-centered columns">
+ <div class="panel">
+ <div class="sign">
+ <h1>We're baking.</h1>
+ </div>
+ <p><span>We're baking a great shell hosting service.</span> Claim a little space for your files, an IRC connection for you or your bot, a website. Something where to code, experiment, connect with like-minded people..</p>
+ </div>
+ </div>
+</section>
+
+<section class="row">
+ <div class="small-8 medium-6 large-5 small-centered columns">
+ <div class="panel">
+ <div class="sign">
+ <h1>How we roll.</h1>
+ </div>
+ <p><span>We know what we're doing.</span> Our team is experimented, with first shell provided in 2001.</p>
+ <p><span>Something different.</span> The project is fully managed as configuration-as-code with a Salt repository. That means you can contribute to the servers configuration, like you contribute to any other open source project.</p>
+ </div>
+ </div>
+</section>
+
+<section class="row">
+ <div class="small-8 medium-6 large-5 small-centered columns">
+ <div class="panel">
+ <div class="sign">
+ <h1>Freikultur.</h1>
+ </div>
+ <p><span>Für die Freikultur.</span> Eglide is a free culture project. Everyone is welcome to participate or use it.</p>
+ <p><span>An open and welcoming environment.</span> We as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.</p>
+ </div>
+ </div>
+</section>
diff --git a/src/partials/.gitkeep b/src/partials/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/partials/.gitkeep
@@ -0,0 +1 @@
+# You can delete this file. It's just here to make Git happy.
diff --git a/src/partials/footer.html b/src/partials/footer.html
new file mode 100644
--- /dev/null
+++ b/src/partials/footer.html
@@ -0,0 +1,26 @@
+<footer id="footer" class="footer">
+ <div class="row">
+ <div class="small-12 medium-6 large-5 columns">
+ <p class="logo"><img src="/assets/img/logo-eglide-32px.png" alt="Eglide logo"> EGLIDE</p>
+ <p class="footer-links">
+ <a href="https://www.nasqueron.org/">ICT management by Nasqueron</a>
+ <a href="https://www.wolfplex.be/">Support by Wolfplex</a>
+ </p>
+ <p class="copywrite">Texts available under <a href="https://creativecommons.org/licenses/by/4.0/" rel="license">CC-BY 4.0 license</a>.</p>
+ </div>
+ <div class="small-12 medium-6 large-4 columns">
+ <ul class="contact">
+ <li><p><i class="fi-comment"></i><a href="http://irc.lc/wolfplex">Freenode #wolfplex</a></p></li>
+ <li><p><i class="fi-mail"></i>contact@eglide.org</p></li>
+ </ul>
+ </div>
+ <div class="small-12 medium-12 large-3 columns">
+ <p class="about">About Eglide</p>
+ <p class="about subheader">“A protracted conference, with Cheuhoras, Saraisme the younger, Akeurle Both-twins, traav Kanchangesja and a couple of minors from the Eglide adolescent pod.”</p>
+ <ul class="inline-list social">
+ <a href="https://www.twitter.com/eglide_project"><i class="fi-social-twitter"></i></a>
+ <a href="https://www.github.com/eglide"><i class="fi-social-github"></i></a>
+ </ul>
+ </div>
+ </div>
+</footer>
diff --git a/src/partials/header.html b/src/partials/header.html
new file mode 100644
--- /dev/null
+++ b/src/partials/header.html
@@ -0,0 +1,9 @@
+<header class="header">
+ <h1 class="headline">Eglide<br /><small>Shell Hosting</small></h1>
+ <ul class="header-subnav">
+ <li><a href="{{root}}/presentation.html"{{#is title "Presentation"}} class="is-active"{{/is}}><i class="fi-book"></i> Presentation</a></li>
+ <li><a href="{{root}}/"{{#is title "Home"}} class="is-active"{{/is}}><i class="fi-home"></i> Home</a></li>
+ <li><a href="#"{{#is title "Request account"}} class="is-active"{{/is}}><i class="fi-plus"></i> Request account</a></li>
+ <li><a href="#"{{#is title "Contribute"}} class="is-active"{{/is}}><i class="fi-paw"></i> Contribute</a></li>
+ </ul>
+</header>
diff --git a/src/partials/news.html b/src/partials/news.html
new file mode 100644
--- /dev/null
+++ b/src/partials/news.html
@@ -0,0 +1,12 @@
+<section class="news">
+ <h3><i class="fi-megaphone"></i> Alpha technical preview</h3>
+ <p>We currently opened the server to former Grip users.</p>
+ <p>You can request an account on IRC Freenode #wolfplex.</p>
+ <p>You need a SSH key.</p>
+</section>
+
+<section class="news">
+ <h3><i class="fi-megaphone"></i> Soon in beta</h3>
+ <p>There are still some things to do before enable the beta.</p>
+ <p>If you want to help, check our <a href="https://devcentral.nasqueron.org/T938">tracking task</a>.</p>
+</section>
diff --git a/src/partials/status.html b/src/partials/status.html
new file mode 100644
--- /dev/null
+++ b/src/partials/status.html
@@ -0,0 +1,40 @@
+<div class="callout-card info">
+ <div class="card-label">
+ <div class="label-text">
+ IPs
+ </div>
+ </div>
+ <div class="callout-card-content">
+ <h3 class="lead">eglide.org</h3>
+ <p><pre>2001:470:1f13:896:0:c0de:15:11fe</pre></p>
+ <p><pre>212.47.244.42</pre></p>
+ </div>
+</div>
+
+<div class="callout-card success">
+ <div class="card-label">
+ <div class="label-text">
+ Web
+ </div>
+ </div>
+ <div class="callout-card-content">
+ <h3 class="lead">Web server</h3>
+ <p>Nginx is operational.</p>
+ </div>
+</div>
+
+<div class="callout-card primary">
+ <div class="card-label">
+ <div class="label-text">
+ Git
+ </div>
+ </div>
+ <div class="callout-card-content">
+ <h3 class="lead">Repositories</h3>
+ <ul>
+ <li><a href="https://github.com/nasqueron/operations" title="Nasqueron Operations">rOPS</a></li>
+ <li><a href="https://github.com/eglide/www" title="Eglide web site">rEGLIDEWWW</a></li>
+ </ul>
+
+ </div>
+</div>

File Metadata

Mime Type
text/plain
Expires
Fri, May 2, 00:58 (18 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2623028
Default Alt Text
D674.diff (73 KB)

Event Timeline