From 555c26c35efabcca6c0906934ba5322d977baddc Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Sun, 28 Jun 2020 23:34:29 +0200 Subject: Full new website in production now --- .gitignore | 2 + schemeato | 135 +++++++++ static/css/extra-style.css | 31 ++ static/css/fonts.css | 23 ++ static/css/normalize.css | 427 ++++++++++++++++++++++++++++ static/css/style.css | 364 ++++++++++++++++++++++++ static/files/publickey.hello@elenq.tech.txt | 34 +++ static/fonts/LatoLatin-Light.eot | Bin 0 -> 67508 bytes static/fonts/LatoLatin-Light.ttf | Bin 0 -> 151856 bytes static/fonts/LatoLatin-Light.woff | Bin 0 -> 72604 bytes static/fonts/LatoLatin-Light.woff2 | Bin 0 -> 43468 bytes static/fonts/LatoLatin-Regular.eot | Bin 0 -> 68135 bytes static/fonts/LatoLatin-Regular.ttf | Bin 0 -> 148540 bytes static/fonts/LatoLatin-Regular.woff | Bin 0 -> 72456 bytes static/fonts/LatoLatin-Regular.woff2 | Bin 0 -> 43760 bytes static/fonts/OFL.txt | 94 ++++++ static/img/faces/ekaitz.jpg | Bin 0 -> 11507 bytes templates/_defs.scm | 79 +++++ templates/_logo.svg | 8 + templates/_structure.scm | 0 templates/en/_ethics.md | 13 + templates/en/_products.md | 29 ++ templates/en/_summary.md | 12 + templates/en/index.html | 86 ++++++ templates/es/_ethics.md | 16 ++ templates/es/_products.md | 31 ++ templates/es/_summary.md | 13 + templates/es/index.html | 88 ++++++ 28 files changed, 1485 insertions(+) create mode 100644 .gitignore create mode 100755 schemeato create mode 100644 static/css/extra-style.css create mode 100644 static/css/fonts.css create mode 100644 static/css/normalize.css create mode 100644 static/css/style.css create mode 100644 static/files/publickey.hello@elenq.tech.txt create mode 100644 static/fonts/LatoLatin-Light.eot create mode 100644 static/fonts/LatoLatin-Light.ttf create mode 100644 static/fonts/LatoLatin-Light.woff create mode 100644 static/fonts/LatoLatin-Light.woff2 create mode 100644 static/fonts/LatoLatin-Regular.eot create mode 100644 static/fonts/LatoLatin-Regular.ttf create mode 100644 static/fonts/LatoLatin-Regular.woff create mode 100644 static/fonts/LatoLatin-Regular.woff2 create mode 100644 static/fonts/OFL.txt create mode 100644 static/img/faces/ekaitz.jpg create mode 100644 templates/_defs.scm create mode 100644 templates/_logo.svg create mode 100644 templates/_structure.scm create mode 100644 templates/en/_ethics.md create mode 100644 templates/en/_products.md create mode 100644 templates/en/_summary.md create mode 100644 templates/en/index.html create mode 100644 templates/es/_ethics.md create mode 100644 templates/es/_products.md create mode 100644 templates/es/_summary.md create mode 100644 templates/es/index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1c0f43e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +www +discarded diff --git a/schemeato b/schemeato new file mode 100755 index 0000000..cd940d6 --- /dev/null +++ b/schemeato @@ -0,0 +1,135 @@ +#| +#!/usr/bin/env sh +exec chibi-scheme -A `dirname $0` $0 $@ +|# +(import + (scheme base) + (srfi 1) + (srfi 69) + (srfi 115) + (chibi) + (chibi app) + (chibi config) + (chibi filesystem) + (chibi process) + (chibi io) + (chibi pathname) + (chibi string) + (chibi sxml)) + +; - [X] Read all the locales +; - [ ] Prepare needed variables per file: +; - [X] List of languages available +; - [X] Current language +; - [ ] Current file +; - [X] Markdown parser +; - [X] pandoc +; - [ ] Check how to do it in scheme +; - [ ] Some more: check schiumato for reference +; - [X] `load` or `eval` files in the created environment and extract their +; exports to dump them to target folder +; - [ ] deal with input arguments or config, that can be cool for language +; selection and directory config. +; - [ ] Move globs to default config stuff. +; - [ ] Make a `new` command that creates the file structure and the default +; configuration file + +(define (string-startswith? str char) + (string-cursor=? + (string-cursor-start str) + (string-find str (lambda (y) (char=? y char))))) + +; Move this to input/config parameters +(define staticdir "static") +(define templatedir "templates") +(define outdir "www") + +(define (md-to-html md-text) + "Markdown to HTML converter using external Pandoc command" + (call-with-process-io "pandoc" + (lambda (pid in out err) + (display md-text in) + (close-output-port in) + (let ((res (port->string out))) + (waitpid pid 0) + res)))) + +(define (load-templates) + "Read templates `templatedir`. + Returns them as a alist where keys are the filename of the template relative + to the `templatedir` and the values are the contents of the file." + (directory-fold-tree + templatedir + #f + #f + (lambda (file acc) + (if (or (string-startswith? (path-strip-directory file) #\.) + (string-startswith? (path-strip-directory file) #\_)) + acc + (cons (list (path-relative-to file templatedir) + (call-with-input-file + file + (lambda (p) + (let loop ((x (read p))) + (if (eof-object? x) + '() + (cons x (loop (read p)))))))) + acc))) + '())) + +(define (render-template tpl env) + "Render one template" + (let* ((code (let ((codelist (cdr tpl))) + (reduce (lambda (x acc) + (append x acc)) + '() + codelist))) + (fullcode (append env code))) + (eval fullcode))) + +(define (copy-static) + "Copy static directory in output directory" + (directory-fold-tree + staticdir + #f + #f + (lambda (file acc) + (let ((output (make-path outdir file))) + (create-directory* (path-directory output)) + (call-with-output-file output + (lambda (x) + (send-file file x))))) + #\null)) + +(define (include-template name) + ; TODO make template loader + #f) + +(define (create-output cfg spec . args) + "Dumps the templates in the output directory" + (let ((templates (load-templates))) + (or (create-directory* outdir) (error "Unable to create output directory")) + (display "Copying static files...") + (newline) + (copy-static) + (let* ((env `(let ((include-template ,include-template))))) + (for-each + (lambda (x) + (let ((outfile (make-path outdir (car x)))) + (or (create-directory* (path-directory outfile)) + (error "Unable to create directory")) + (call-with-output-file + outfile + (lambda (f) + (display (render-template x env) f))))) + templates)))) + + +(run-application + `(schemeato + "Schemeato: an easy to translate static site generator" + (or + (create "Create output from current folder" ,create-output) + (help "Show this help" (,app-help-command)))) + (command-line) + #;(conf-load "conf.scm")) diff --git a/static/css/extra-style.css b/static/css/extra-style.css new file mode 100644 index 0000000..c7a7f06 --- /dev/null +++ b/static/css/extra-style.css @@ -0,0 +1,31 @@ +.summary{ + font-size: 115%; + padding-top: 2rem; +} + +#hamburger, #hamburger-label{ + display: none; +} + +#hamburger-label{ + font-size: 180%; + cursor: pointer; +} + +.active{ + text-decoration: underline; +} + +.mainheader{position: relative;} + +@media (max-width: 800px){ + #hamburger-label { + display: inline-block; + } + .navbar-contents { + display: none; + } + input#hamburger:checked ~ .navbar-contents { + display: block; + } +} diff --git a/static/css/fonts.css b/static/css/fonts.css new file mode 100644 index 0000000..ea9b2c9 --- /dev/null +++ b/static/css/fonts.css @@ -0,0 +1,23 @@ +/* Webfont: LatoLatin-Regular */@font-face { + font-family: 'LatoLatinWeb'; + src: url('/static/fonts/LatoLatin-Regular.eot'); /* IE9 Compat Modes */ + src: url('/static/fonts/LatoLatin-Regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('/static/fonts/LatoLatin-Regular.woff2') format('woff2'), /* Modern Browsers */ + url('/static/fonts/LatoLatin-Regular.woff') format('woff'), /* Modern Browsers */ + url('/static/fonts/LatoLatin-Regular.ttf') format('truetype'); + font-style: normal; + font-weight: normal; + text-rendering: optimizeLegibility; +} + +/* Webfont: LatoLatin-Light */@font-face { + font-family: 'LatoLatinLightWeb'; + src: url('/static/fonts/LatoLatin-Light.eot'); /* IE9 Compat Modes */ + src: url('/static/fonts/LatoLatin-Light.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('/static/fonts/LatoLatin-Light.woff2') format('woff2'), /* Modern Browsers */ + url('/static/fonts/LatoLatin-Light.woff') format('woff'), /* Modern Browsers */ + url('/static/fonts/LatoLatin-Light.ttf') format('truetype'); + font-style: normal; + font-weight: normal; + text-rendering: optimizeLegibility; +} diff --git a/static/css/normalize.css b/static/css/normalize.css new file mode 100644 index 0000000..81c6f31 --- /dev/null +++ b/static/css/normalize.css @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} \ No newline at end of file diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..29cede2 --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,364 @@ +html{ + font-size: 80%; +} + +/* Typography*/ +body{ + font-family: "LatoLatinWeb", Helvetica, Arial, sans-serif; + line-height: 1.4; + color: #222; + background-color: #fff; + font-size: 1.5em; +} +p { + text-align: justify; +} +q, blockquote{ + font-style: italic; +} +h1, h2, h3, h4, h5, h6 { + text-decoration: none; + margin-top: 2ex; + margin-bottom: 0; + font-weight: 300; } +h1 { + font-size: 5.5rem; + line-height: 1.2; + text-align: center; + margin-bottom: 4rem; + margin-top: 0; + font-family: "LatoLatinLightWeb", Helvetica, Arial, sans-serif; +} +h1,h2,h3 { letter-spacing: -.1rem; } +h4 { letter-spacing: -.08rem;} +h5 { letter-spacing: -.05rem;} +h6 { letter-spacing: 0} + +h2 { font-size: 2.8rem; } +h3 { font-size: 2.3rem; } +h4 { font-size: 2.1rem; } +h5 { font-size: 1.8rem; } +h6 { font-size: 1.5rem; } + +@media (min-width: 550px) { + h1 { font-size: 8.0rem; } + h2 { font-size: 3.2rem; } + h3 { font-size: 2.7rem; } + h4 { font-size: 2.2rem; } + h5 { font-size: 2.0rem; } + h6 { font-size: 1.7rem; } +} +a{ + color: #1EAEDB; +} +hr{ + border: 0 +} +pre > code { + overflow: auto; + border: none; + border-radius: 0; +} + + + +/* Utils */ +.text-center{ + text-align: center; +} +.text-right{ + text-align: right; +} +.text-justify{ + text-align: justify; +} +.text-nodeco{ + text-decoration: none; +} +.text-nodeco-black{ + text-decoration: none; + color: #222; +} +.only-reader{ + font-size: 0; +} + + +/* Sections*/ +section{ + padding-bottom: 2rem; + margin-bottom: 0; +} + + +/* Images */ +img { + display: block; + margin-left: auto; + margin-right: auto; + margin-top: 3ex; + margin-bottom: 3ex; +} +img.round{ + border-radius: 50%; +} + + +/* Footer */ +.bar-bottom { + border-top: 1px solid #eee; + position: relative; + width: 100%; + margin: 0 auto; + margin-top: 10ex; + padding: 1rem 0; + box-sizing: border-box; + + font-size: 70%; +} + + +/* Container */ +.container { + max-width: 900px; + margin: auto; + width: 80%; +} +@media(max-width: 550px){ + .container{ + padding-left: 20px; + padding-right: 20px; + } +} + + +/* Navbar */ +.mainheader{ + top: 0; + display: block; + width: 100%; + background: #fff; + z-index: 99; + border-bottom: 1px solid #eee; + margin-bottom: 6.5rem; +} +@media(max-width: 550px){ + .mainheader{ + margin-bottom: 4rem; + } +} +.navbar { + width: 100%; + } +.navbar-link, +.navbar-control{ + text-transform: uppercase; + font-size: 0.9rem; + font-weight: 600; + letter-spacing: .1rem; + text-decoration: none; + line-height: 6rem; + display: inline-block; + color: #222; + } +.navbar-right, +.navbar-left{ + display: inline; +} +.navbar-separator{ + margin: 0 auto; +} +/* Large devices everything inline and the header floating */ +@media (min-width: 801px) { + .mainheader{position: sticky;} + .link-right { + margin-left: 15px; + margin-right: 0px; + } + .link-left{ + margin-right: 25px; + } + .nav-right{ + text-align: right; + } + .navbar-right{ + float: right; + } + .navbar-separator{ + display: none; + } + +} +/* Smaller devices leave the header at the top of the page and make it more + * vertical */ +@media (max-width: 800px){ + /* Main navbar toggle */ + /* TODO: BURGER? */ + .navbar-right, + .navbar-left{ + width: 100%; + min-width: 100%; + display: inline-flex; + flex: 1; + justify-content: space-around; + flex-flow: row; + } + .navbar-left{ + flex-flow: row wrap; + } + + .navbar-left .navbar-link{ + margin-left: 3ex; + margin-right: 3ex; + } + + .navbar-right .navbar-link{ + margin: auto; + line-height: 5rem; + } +} + + +/* Title page */ +.title-image { + width: 90%; +} +.title-image path{ + fill: #222; +} +@media (min-width: 550px){ + .title-image { width: 60%; } +} + + +/* Cards: Image | text */ +.card-picture *{ + height: auto; + width: 100%; +} +.card-picture{ + margin-left: auto; + margin-right: auto; + margin-top: 2ex; + margin-bottom: 2ex; + height: auto; + width: 150px; + min-width: 150px; +} +.card-picture-right{ + order 2; +} +.card-data{ + order: 1; +} +@media (min-width: 800px) { /*more than a tablet*/ + .card{ + margin-top: 1ex; + margin-bottom: 1ex; + + width: 100%; + min-width: 100%; + display: inline-flex; + flex: 1; + -webkit-flex: 1; /* Safari 6.1+ */ + -ms-flex: 1; /* IE 10 */ + justify-content: space-around; + align-items: center; + } + + .card-picture{ + margin: 2ex; + margin-right: 4ex; + order: 0; + } + .card-picture-right{ + margin: 2ex; + margin-left: 4ex; + order: 2; + } + + .card-data{ + flex-grow: 2; + flex-shrink: 2; + order: 1; + } +} + +/* Anchors */ +a.anchor{ + visibility: hidden; + text-decoration: none; + font-size: 0.8em; +} +h1:hover > a.anchor, +h2:hover > a.anchor, +h3:hover > a.anchor, +h4:hover > a.anchor, +h5:hover > a.anchor, +h6:hover > a.anchor{ + visibility: visible; +} + +:root{ + --bg-color: #FFF; + --tx-color: #222; + --link-color: #1EAEDB; + --border-color:#EEE; +} +@media (prefers-color-scheme: dark) { + :root { + --bg-color: #2F2F2F; + --tx-color: #FFF; + --link-color: #1EAEDB; + --border-color:#4A4A4A; + } +} + +/* Overwrite colors to vars if supported */ +body{ + color: var(--tx-color); + background-color: var(--bg-color); +} +.text-nodeco-black, .navbar-link{ + color: var(--tx-color); +} +.title-image path{ + fill: var(--tx-color); +} +.mainheader { + background-color: var(--bg-color); + border-color: var(--border-color); +} +a { + color: var(--link-color); +} +.bar-bottom { + border-color: var(--border-color); +} + + + +.flex-cols{ + width: 90%; +} +.col{ + max-width: 100%; +} +@media (min-width: 550px) { /*more than a phone*/ + .flex-cols{ + display: inline-flex; + flex: 1; + align-items: center; + justify-content: space-around; + width: 100%; + min-width: 100%; + } + .col{ + flex-grow: 1; + flex-shrink: 1; + flex-basis: 100px; + margin-left: 5%; + margin-right: 5%; + } + +} diff --git a/static/files/publickey.hello@elenq.tech.txt b/static/files/publickey.hello@elenq.tech.txt new file mode 100644 index 0000000..ddb4ca3 --- /dev/null +++ b/static/files/publickey.hello@elenq.tech.txt @@ -0,0 +1,34 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: OpenPGP.js v2.3.8 +Comment: http://openpgpjs.org + +xsBNBFlKNu4BCADnO0dweMwiVAAWmI51s7SXtCAgxEUdPMlzPADmAsz31lLc +SIcsXW1lPfA0GDwvn4XvDjxW4RB/HKKpg04IbKFxFrfJ/1Vu0tpGe9H252JM +nWBexc6oSCSKpuhG7/nLRO140v0xmdU+CZj3XPSLO73rIgYzSPV//j00kXGz +z1rVLKv+3FlTSMJV411qQpP9P/Rwdad/txekXOURnvFLhDC0xJBIq4KMPolh +/u0TkkYtPmRmn9U7YFeraiublSEQEGmX5rxuzJ+A6P+kVjWeOQxJuigiKKWR +4E/gd2rvn8wSxafnbzS0uA1iQRgF0/It5pG1XeRUrJLJTQ2P0kfdQrEjABEB +AAHNI2hlbGxvQGVsZW5xLnRlY2ggPGhlbGxvQGVsZW5xLnRlY2g+wsB1BBAB +CAApBQJZSjbuBgsJBwgDAgkQQ7fiWdQmzT4EFQgKAgMWAgECGQECGwMCHgEA +AGuWCACYylinKBY/sHtqqbqbw57A4QcP/E5LCDjIJyLB5LV5HFEaCqjPqpGP +2F05S8to9BarFPMPKtvZbWy8u3wR9VHhVLkuLYGO15eNPgboylU/n1DEDAbt +iTPv1wd4OStulIAU79LZj6RNkYAGYaLGetYMcWTXzJUN2WbER6IhR8uKKlb4 +480qUyjEN4uznO72WVZRnFRXCekk+q0yuURNQy4Z2IMKriALM0Ijj/VAsnyK +i4KQCukFylcnG33rD7Dq9qPDAmHC0imWRXFDMIy/g7pZP6XtjwMp4MlpZ2oS +w+JJlYwTgHd0nVVQ8TE6FWPN/mDZa6U4VWhlrOCTcecPP6sEzsBNBFlKNu4B +CADdCy6ugZzxwQctqGzy0YMl0Uk4WQLrqQ4ZkvW0H5yhxnBzSC1YaZ+WQOLL +bdParzS/0LRMa0WQikqLsC8uRQxXgWCBzjtPSmphFmOfAW9n8Fc5Ap8PAxjv +M5Y+znOnx8ecZHcYx2l0BNV+9uWWRDx0t+gtNTeLlvYuCUF40WKG3USGZ1U8 ++O3jhjbEII0sBdz45el516nEp0Uzc/usFQ3dJNPZ6ZK6M+YA7o/EfGfwVKVH +A5L0lP26utDpBmmWoTfLVUFZ1lxrZCNJ9M4JGBJ0/xDmZw1GOCHeacF3ZuWP +7JLcsSyukGKUzn6Sm9wwy73rAV8lhddd6EdGwgWWIsTbABEBAAHCwF8EGAEI +ABMFAllKNu4JEEO34lnUJs0+AhsMAAA1lAgAlb0C/6Qev//zdnv1CUi+zotZ +vNQQOSK7XDAfQlpMhwwuwrA5wR8Y43e1tEVutUaEE3wahW8smj8cb/C7SVBR +5JvAQyqTESqCbGcrGOgUa8L2505pnEb6wrBmPfZ1STbQwK+Xw/meM3eVAzuq +m2IgwaRbuLg3bJh8L45XVkDyzYJJDnugqfmnnUTy7jTHXLRNLatAdQdcKwbY +9fSyzuU6BQn1vSdwZGDvkMC2UZ0ygBvyFDir9WmQbhTKNqDGfsz/XndGhujW +IdBWSdVYr1/pYJ2/3M/6VS2rCzujpoip6dd96bSjhCQ3R6se/Z8hWxMqZyZD +LCAjdtBXsrAnapFj7Q== +=Yvv0 +-----END PGP PUBLIC KEY BLOCK----- + diff --git a/static/fonts/LatoLatin-Light.eot b/static/fonts/LatoLatin-Light.eot new file mode 100644 index 0000000..865537d Binary files /dev/null and b/static/fonts/LatoLatin-Light.eot differ diff --git a/static/fonts/LatoLatin-Light.ttf b/static/fonts/LatoLatin-Light.ttf new file mode 100644 index 0000000..6af1b85 Binary files /dev/null and b/static/fonts/LatoLatin-Light.ttf differ diff --git a/static/fonts/LatoLatin-Light.woff b/static/fonts/LatoLatin-Light.woff new file mode 100644 index 0000000..e7d4278 Binary files /dev/null and b/static/fonts/LatoLatin-Light.woff differ diff --git a/static/fonts/LatoLatin-Light.woff2 b/static/fonts/LatoLatin-Light.woff2 new file mode 100644 index 0000000..b6d0288 Binary files /dev/null and b/static/fonts/LatoLatin-Light.woff2 differ diff --git a/static/fonts/LatoLatin-Regular.eot b/static/fonts/LatoLatin-Regular.eot new file mode 100644 index 0000000..96a9035 Binary files /dev/null and b/static/fonts/LatoLatin-Regular.eot differ diff --git a/static/fonts/LatoLatin-Regular.ttf b/static/fonts/LatoLatin-Regular.ttf new file mode 100644 index 0000000..bcc5778 Binary files /dev/null and b/static/fonts/LatoLatin-Regular.ttf differ diff --git a/static/fonts/LatoLatin-Regular.woff b/static/fonts/LatoLatin-Regular.woff new file mode 100644 index 0000000..bf73a6d Binary files /dev/null and b/static/fonts/LatoLatin-Regular.woff differ diff --git a/static/fonts/LatoLatin-Regular.woff2 b/static/fonts/LatoLatin-Regular.woff2 new file mode 100644 index 0000000..a4d084b Binary files /dev/null and b/static/fonts/LatoLatin-Regular.woff2 differ diff --git a/static/fonts/OFL.txt b/static/fonts/OFL.txt new file mode 100644 index 0000000..6d2c416 --- /dev/null +++ b/static/fonts/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2010-2015, Łukasz Dziedzic (dziedzic@typoland.com), +with Reserved Font Name Lato. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/static/img/faces/ekaitz.jpg b/static/img/faces/ekaitz.jpg new file mode 100644 index 0000000..b73778f Binary files /dev/null and b/static/img/faces/ekaitz.jpg differ diff --git a/templates/_defs.scm b/templates/_defs.scm new file mode 100644 index 0000000..765dc73 --- /dev/null +++ b/templates/_defs.scm @@ -0,0 +1,79 @@ +; Global to the file, use (set! lang "lang") to configure in languages +(define lang "en") + +; UTILS ----------------------------------------------------------------------- +(define (anchored-h level title id) + `(,(string->symbol (string-append "h" (number->string level))) + (@ (id ,id)) + ,title + (a (@ (href ,(string-append "#" id)) (class "anchor")) " ¶" ))) + + +(define (absurl-to-lang url) + (string-append "/" lang url)) + +(define (header-link lr text title link active) + `(a (@ (class ,(string-append (if active "active " " ") + "navbar-link link-" lr)) + (href ,link) + (title ,title)) + ,text)) + +(define (style href) + "Make tags to add CSS" + `(link (@ (rel "stylesheet") + (href ,href)))) + +(define (md markdown-text) + `(@raw ,(md-to-html markdown-text))) + +(define (logo-title) `(h1 (@raw ,(file->string "templates/_logo.svg")))) + +; BASE ------------------------------------------------------------------------ +(define (base title body) + `(html + (@ (lang ,lang)) + (head + (meta (@ (charset "utf-8"))) + (meta (@ (name "viewport") + (content "width=device-width, initial-scale=1"))) + ,(style "/static/css/normalize.css") + ,(style "/static/css/style.css") + ,(style "/static/css/fonts.css") + ,(style "/static/css/extra-style.css") + (title ,title)) + (body ,body))) + + +; HEADER----------------------------------------------------------------------- +(define (nav-link l) + (header-link "left" + (cdr (assq 'name l)) + (cdr (assq 'title l)) + (cdr (assq 'absurl l)) + (or (assq 'active l) #f))) + +(define (lang-link l) + (header-link "right" + (cdr (assq 'name l)) + (cdr (assq 'title l)) + (cdr (assq 'absurl l)) + (or (assq 'active l) #f))) + +(define (header links langs) + `(header + (@ (class mainheader)) + (div (@ (class container)) + (nav (@ (class navbar)) + (label (@ (id hamburger-label) + (for "hamburger") + (class "navbar-link link-left")) (@raw "☰")) + (input (@ (id "hamburger") (type checkbox))) + + (div (@ (class navbar-contents)) + (div (@ (class navbar-left)) + ,(map nav-link links)) + + (div (@ (class "navbar-right")) + ,(map lang-link langs))))))) + diff --git a/templates/_logo.svg b/templates/_logo.svg new file mode 100644 index 0000000..c574b25 --- /dev/null +++ b/templates/_logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/_structure.scm b/templates/_structure.scm new file mode 100644 index 0000000..e69de29 diff --git a/templates/en/_ethics.md b/templates/en/_ethics.md new file mode 100644 index 0000000..1334b82 --- /dev/null +++ b/templates/en/_ethics.md @@ -0,0 +1,13 @@ +We support free knowledge and we consider our clients must have access to +everything we develop for them so that they can audit and edit it without +restrictions. That’s why only deliver **free software and free +documentation**. + +On the other hand, we believe we all have impact in the society so **we +carefully select the projects we work on**, avoiding projects that we consider +that don't have a good impact in the society: that are incompatible with human +rights, abuse vulnerable collectives, etc. + +Also, we have a really strong compromise with the free software movement +because it helps us make our everyday job. For that reason, we spend some of +our effort supporting free software in terms of funds or development time. diff --git a/templates/en/_products.md b/templates/en/_products.md new file mode 100644 index 0000000..0937455 --- /dev/null +++ b/templates/en/_products.md @@ -0,0 +1,29 @@ +### R&D: Research and Development + +We primarily focus on Research and Development. Our main goal is to push our +clients forward technologically speaking. + +The service is flexible and can focus on research, making reports about +the state of the art in a certain area or about possible alternatives to solve +an issue, or can be focused on development, delivering a proof-of-concept, a +mockup or a fully-featured solution. + +Our commitment is to transfer all the knowledge we adquire during the process, +so our clients are able audit, edit or continue the research in their own. For +that reason, and following our ethics framework, we deliver everything under +a free software license. + +### Training + +We also offer advanced training in computer science, mostly programming, as a +supplementary service as part of our technological grow model. + +The training is aimed to provide our clients a way to improve the technicall +skills of their teams, make them learn a new technology or make newcomers learn +the tools and philosophy of the company, among others. In any case, they ease +to set up a highly-skilled team that deeply understand their job and the tools +they need. + +We focus on the transmission of the technical basis in order to encourage +critical and independent thinking that serves as a robust basis to keep +learning and researching. diff --git a/templates/en/_summary.md b/templates/en/_summary.md new file mode 100644 index 0000000..1df4753 --- /dev/null +++ b/templates/en/_summary.md @@ -0,0 +1,12 @@ +*ElenQ Technology* is a **Research and Development** company. This means we +learn for you and give you the knowledge back in a way you can use it freely, +following our [ethics](#ethics). + +We also offer **training and engineering** as secondary services, which means +we can help you with that project that never gets finished because you must +focus on more important things like clients and maintenance. + +Our experience is based on **Software and Electronics** but we also have a +background on arts, design and other fields. The fact is that we are engineers +and our main talent is learning anything so don't hesitate to [contact +us](#contact) if you think we can help you. diff --git a/templates/en/index.html b/templates/en/index.html new file mode 100644 index 0000000..cb09ca4 --- /dev/null +++ b/templates/en/index.html @@ -0,0 +1,86 @@ +(define footer +" +The content of this website is published under the terms of [Creative Commons +Attribution Share-Alike 4.0 +International](http://creativecommons.org/licenses/by-sa/4.0/) license unless +otherwise stated. +") + +(define summary (file->string "templates/en/_summary.md")) +(define ethics (file->string "templates/en/_ethics.md")) +(define products (file->string "templates/en/_products.md")) + +(load "templates/_defs.scm") +(set! lang "en") + +(sxml->xml + (base + "ElenQ Technology" + `(,(header + `(((name . "Technology") + (title . "Engineering - ElenQ Technology") + (absurl . ,(absurl-to-lang "/index.html")) + (active . #t)) + ((name . "Publishing") + (title . "Publishing House - ElenQ Publishing") + (absurl . "https://en.goteo.org/project/elenq-publishing"))) + + `(((name . "en") + (title . "English") + (absurl . "/en/") + (active . #t)) + ((name . "es") + (title . "Español") + (absurl . "/es/")))) + + (div (@ (class "content container")) + ,(logo-title) + + (section (@ (class summary)) + ,(md summary)) + + (section + ,(anchored-h 2 "Ethics" "ethics") + ,(md ethics)) + + (section + ,(anchored-h 2 "Products" "products") + ,(md products)) + + (section + ,(anchored-h 2 "Who we are" "who") + (p "ElenQ Technology wouldn't be possible without all the people + around it, who support and help us unconditionally. Despite + not being part of ElenQ Technology officially, they deserve + to be mentioned at least in these lines, even if they are not + listed below.") + (div (@ (class card)) + (div (@ (class card-picture)) + (img (@ (src "/static/img/faces/ekaitz.jpg") + (class round)))) + (div (@ (class card-data)) + (h3 "Ekaitz Zarraga") + (p "Telecommunication engineer (EEE equivalent) by + training, 10 years of experience as a programmer and + a lifetime of R&D, Ekaitz is the one man army of + ElenQ Technology.") + (p "He says his only talent is learning. He founded + ElenQ Technology with the idea of inspiring + others to make a better world helping them with + the difficult task of going out of their comfort + zone.") + (p "He writes about his work at ElenQ Technology " + (a (@ (href "https://ekaitz.elenq.tech")) + "in his blog") ".")))) + + (section + ,(anchored-h 2 "Contact" "contact") + (p "Send us an email to: " + (a (@ (href "mailto:hello@elenq.tech")) (em "hello@elenq.tech")) + " " + (a (@ (href "/static/files/publickey.hello@elenq.tech.txt")) "[PGP]")))) + + (footer (@ (class bar-bottom)) + (div (@ (class "container text-center")) + (h6 "© ElenQ Technology") + ,(md footer)))))) diff --git a/templates/es/_ethics.md b/templates/es/_ethics.md new file mode 100644 index 0000000..5a24489 --- /dev/null +++ b/templates/es/_ethics.md @@ -0,0 +1,16 @@ +Como defensores del conocimiento libre, consideramos que nuestros clientes +tienen que tener acceso a todo lo que realizamos para ellos con el fin de poder +auditarlo y editarlo sin ninguna restricción. Por esa razón, únicamente +**entregamos software y documentación libre**. + +Por otro lado, como consideramos que todos tenemos un impacto en la sociedad, +**seleccionamos de manera estricta en qué proyectos trabajamos** evitando +apoyar proyectos que consideramos que van a tener un impacto negativo en la +sociedad: que no cumplen los derechos humanos, que buscan explotar a un grupo +de personas vulnerable, etc. + +Además, estamos comprometidos con el movimiento del software libre, ya que nos +permite llevar a cabo nuestro trabajo diario. Por ello, dedicamos parte de +nuestros esfuerzos a colaborar con los proyectos que utilizamos, ya sea de +forma económica o dedicando nuestro tiempo de desarrollo con el fin de mantener +el ecosistema vivo y en buen estado. diff --git a/templates/es/_products.md b/templates/es/_products.md new file mode 100644 index 0000000..8e1ad29 --- /dev/null +++ b/templates/es/_products.md @@ -0,0 +1,31 @@ +### I+D: Investigación y Desarrollo + +Como equipo de Investigación y Desarrollo que somos, nos dedicamos +principalmente a esa tarea. Ofrecemos nuestros servicios como equipo de I+D +independiente para impulsar tecnológicamente a nuestros clientes. + +El servicio es flexible y puede estar más centrado en la investigación, +redactando informes de análisis de situación, estado del arte o posibles +alternativas, o en el desarrollo, creando pruebas de concepto, maquetas o +soluciones que resuelvan los problemas de nuestros clientes. + +Hacemos hincapié en una transferencia de real de conocimiento y, siguiendo +nuestro compromiso ético, realizamos la entrega de todo lo desarrollado con +licencias libres, para que el cliente sea libre de auditarlo y editarlo a su +antojo. + + +### Formación + +Ofrecemos formaciones avanzadas en el área de la informática, principalmente +sobre programación como parte de nuestro modelo de impulso tecnológico. + +Estas formaciones tienen como objetivo introducir a un equipo de profesionales +a una tecnología que aún no conocen, actualizar a profesionales o formar a +recién llegados a conocer la filosofía de la empresa, entre otros. En cualquier +caso, facilitan la puesta en marcha de equipos eficientes que controlan al +detalle su trabajo. + +Estas formaciones se centran en los fundamentos técnicos con el fin de fomentar +el pensamiento crítico e independiente creando así una base de conocimientos +robusta sobre la que seguir avanzando de forma independiente. diff --git a/templates/es/_summary.md b/templates/es/_summary.md new file mode 100644 index 0000000..23222ea --- /dev/null +++ b/templates/es/_summary.md @@ -0,0 +1,13 @@ +*ElenQ Technology* es una empresa de **Investigación y Desarrollo**. Lo que +significa que aprendemos para ti y te damos el conocimiento de vuelta de modo +que puedas usarlo de forma libre, siguiendo nuestro [compromiso +ético](#ethics). + +También ofrecemos **formación e ingeniería** como servicios secundarios, para poder +ayudarte con ese proyecto que nunca acaba porque tienes que concentrarte en +cosas más importantes como el mantenimiento o tratar con los clientes. + +Nuestras especialidades son el **Software y la Electrónica** pero también tenemos +experiencia en el arte, el diseño y otros campos. La verdad es que somos +ingenieros cuyo mayor talento es aprender, así que no dudes en +[contactarnos](#contact) si crees que podemos ayudarte. diff --git a/templates/es/index.html b/templates/es/index.html new file mode 100644 index 0000000..463f00d --- /dev/null +++ b/templates/es/index.html @@ -0,0 +1,88 @@ +(define footer +" +El contenido de este sitio está publicado bajo los términos de la licencia +[Cretive Commons Atribución Compartir-Igual 4.0 +Internacional](http://creativecommons.org/licenses/by-sa/4.0/) a no +ser que se especifique lo contrario. +") + +(define summary (file->string "templates/es/_summary.md")) +(define ethics (file->string "templates/es/_ethics.md")) +(define products (file->string "templates/es/_products.md")) + +(load "templates/_defs.scm") +(set! lang "es") + +(sxml->xml + (base + "ElenQ Technology" + `(,(header + `(((name . "Technology") + (title . "Ingeniería - ElenQ Technology") + (absurl . ,(absurl-to-lang "/index.html")) + (active . #t)) + ((name . "Publishing") + (title . "Editorial - ElenQ Publishing") + (absurl . "https://www.goteo.org/project/elenq-publishing"))) + + `(((name . "en") + (title . "English") + (absurl . "/en/")) + ((name . "es") + (title . "Español") + (absurl . "/es/") + (active . #t)))) + + + (div (@ (class "content container")) + + ,(logo-title) + + (section (@ (class summary)) + ,(md summary)) + + (section + ,(anchored-h 2 "Compromiso ético" "ethics") + ,(md ethics)) + + (section + ,(anchored-h 2 "Qué ofrecemos" "products") + ,(md products)) + + (section + ,(anchored-h 2 "Quiénes somos" "who") + (p "ElenQ Technology no sería posible sin nuestros colaboradores, + personas de diferentes áreas que nos apoyan y nos ayudan en + nuestro trabajo. A pesar de no formar parte oficial de ElenQ + Technology, merecen ser mencionados, aunque no se listen a + continuación.") + (div (@ (class card)) + (div (@ (class card-picture)) + (img (@ (src "/static/img/faces/ekaitz.jpg") + (class round)))) + (div (@ (class card-data)) + (h3 "Ekaitz Zarraga") + (p "Ingeniero de Telecomunicaciones de formación, con + alrededor de 10 años de experiencia como programador + y toda una vida dedicada al I+D, Ekaitz es el hombre + orquesta de ElenQ Technology.") + (p "Suele decir que su único talento es aprender. Fundó + ElenQ Technology con la idea de inspirar a otros a + hacer del mundo un lugar mejor, ayudándoles con la + difícil tarea de salir a visitar territorio + desconocido.") + (p "Escribe sobre su trabajo en ElenQ Technology " + (a (@ (href "https://ekaitz.elenq.tech")) + "en su blog") ".")))) + + (section + ,(anchored-h 2 "Contacto" "contact") + (p "Escríbenos a: " + (a (@ (href "mailto:hello@elenq.tech")) (em "hello@elenq.tech")) + " " + (a (@ (href "/static/files/publickey.hello@elenq.tech.txt")) "[PGP]")))) + + (footer (@ (class bar-bottom)) + (div (@ (class "container text-center")) + (h6 "© ElenQ Technology") + ,(md footer)))))) -- cgit v1.2.3