From e1ddb297f2f4dbf4eeeaa9733b236b24228a4ab6 Mon Sep 17 00:00:00 2001 From: Pierre Jarriges <pierre.jarriges@tutanota.com> Date: Sun, 18 Jul 2021 16:47:03 +0200 Subject: [PATCH] update software articles --- public/articles/software/index.json | 9 +- .../software/mentalo/images/mental-eau.png | Bin 0 -> 17155 bytes public/articles/software/mentalo/mentalo.json | 19 + public/articles/software/mentalo/mentalo.txt | 2 + .../images/obj-to-html-logo.png | Bin 0 -> 952 bytes .../object-to-html-renderer.json | 18 + .../object-to-html-renderer.txt | 1 + .../images/kuadrado-template-screen.png | Bin 39284 -> 0 bytes .../website-template/website-template.json | 13 - .../website-template/website-template.txt | 3 - public/education/education.js | 665 ++++++++- public/games/games.js | 772 +++++++++- public/main.js | 965 ++++++++++++- .../software-development.js | 813 ++++++++++- public/style/style.css | 1278 ++++++++++++++++- src/lib/article-utils.js | 2 +- .../components/software-articles.js | 11 +- .../software-development.scss | 59 +- 18 files changed, 4559 insertions(+), 71 deletions(-) create mode 100644 public/articles/software/mentalo/images/mental-eau.png create mode 100755 public/articles/software/mentalo/mentalo.json create mode 100755 public/articles/software/mentalo/mentalo.txt create mode 100644 public/articles/software/object-to-html-renderer/images/obj-to-html-logo.png create mode 100755 public/articles/software/object-to-html-renderer/object-to-html-renderer.json create mode 100755 public/articles/software/object-to-html-renderer/object-to-html-renderer.txt delete mode 100644 public/articles/software/website-template/images/kuadrado-template-screen.png delete mode 100644 public/articles/software/website-template/website-template.json delete mode 100644 public/articles/software/website-template/website-template.txt diff --git a/public/articles/software/index.json b/public/articles/software/index.json index 82e6d2b..62342be 100755 --- a/public/articles/software/index.json +++ b/public/articles/software/index.json @@ -1,3 +1,8 @@ { - "articles": ["watergun", "website-template", "make_frames"] -} + "articles": [ + "mentalo", + "object-to-html-renderer", + "make_frames", + "watergun" + ] +} \ No newline at end of file diff --git a/public/articles/software/mentalo/images/mental-eau.png b/public/articles/software/mentalo/images/mental-eau.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6c2eeced7fbb226d7c30e1a526b7c0b09c6d93 GIT binary patch literal 17155 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 UGUikYLk4S^%c{i*3%8yAe{Z2>W&i*H literal 0 HcmV?d00001 diff --git a/public/articles/software/mentalo/mentalo.json b/public/articles/software/mentalo/mentalo.json new file mode 100755 index 0000000..0ba7316 --- /dev/null +++ b/public/articles/software/mentalo/mentalo.json @@ -0,0 +1,19 @@ +{ + "title": "Mentalo", + "date": "2021/07/18", + "subtitle": "Une application pour créer des jeux simples", + "body": "<file>mentalo.txt", + "technical": { + "stack": [ + "Javascript", + "Nodejs", + "Sass" + ], + "license": "GNU GPL v3", + "repository": "https://gitlab.com/kuadrado-software/mentalo", + "version": "0.1.2" + }, + "images": [ + "mental-eau.png" + ] +} \ No newline at end of file diff --git a/public/articles/software/mentalo/mentalo.txt b/public/articles/software/mentalo/mentalo.txt new file mode 100755 index 0000000..1e33e08 --- /dev/null +++ b/public/articles/software/mentalo/mentalo.txt @@ -0,0 +1,2 @@ +Mentalo est une application éducative qui permet de construire un raisonnement logique à travers la création de jeux simples basés sur des écrans statiques et des choix texte. +Sortie d'une version beta prévue pour Septembre 2021. \ No newline at end of file diff --git a/public/articles/software/object-to-html-renderer/images/obj-to-html-logo.png b/public/articles/software/object-to-html-renderer/images/obj-to-html-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8efda75f697267280b833f5aeb6b1a36b96cee67 GIT binary patch literal 952 zcmV;p14sOcP)<h;3K|Lk000e1NJLTq0077U0077V0{{R3mzF%;0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$iQ>7v;f_4xQ$xxjv6cusQDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_7;J6>}?mh0_0YbgZG^;BHXu55t z5^*t;T@?eb2%sM!#4sW=%b1g-Bsz|-d-(Wz7v))<&;2<<YR+PSPb8jYhG`RT5KnK~ z2Iqa^Fe}O`@j3ChNf#u3<htVV8|Q+{0?!Pa>C`-Nm{=^dvC_t@Xlle$#1U1~DPPEV zta9Gstd*;*c~AbrU`}6I<~q$`B(R7jND!f*iW17O5v5fp#X^eq;~o4%u3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTWx-7k*wF$x5Bfkw@7zK<QJaRT_Cfh)b`uhfB=Ptt2G zEpi0(Z37qAElt@2E_Z;zCqp)6SMt*o@_FF>jJ_!g4BP^}YhG{7eVjf3Y3eF@0~{Oz zV+G1y@9^%P_TK(I)9mjDj)HQs_{KmA00006P)t-s00030|No`gpWOfe00Cl4M??UK z1szBL000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jvG64KxSu`<9Xb000?uMObu0 zZ*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004lNkl<ZSi|j=F>=Hp3`NCII2|ds z3O5PYN|A|uG>*a%C@DN9NEYlG*x4rO^c!n<Sg?O389*cwi9{mN|H|y$f{Qg6$iYEw zgaen)r)or{O12k7Pl)e`jy-{nKqbdO*5@S9V_|ZGCETVY6=G*Z6Y&#b3-LBh$eO@- zdyGV9BIhr;5W^%6WG!oEGx_L=%Ee#1(c?-C+G@9AW_%z!*&B(_4sdsJW^pYDt#lST z+0jixD;|p{P<qF=2bWsuSh~_DT{6|;Sui|Z`C*sJ#y|vb6&o=LQ=Y_=(UoARnFM?t z7r*J)#A|#GdAzgd?Hmdd6MHAH?zl5kC6r|NHa7#c4=$)wx3CAMCQ&Ud6Y?63LqfJS zuPJFsry?i25|>jcUVHY%r4AM*VIYdhHddlbOQ8R1Acjbs5JhC0b;(yDAJhJMGalZj zq?9#WyHUR;eEdUi=Yh0I;X9)H>C#A@E^Sshct-9sk*63;NWJ6JIcf)z<bxy<i9{mN apXe8)qb))s^l9_}0000<MNUMnLSTaQbC!(& literal 0 HcmV?d00001 diff --git a/public/articles/software/object-to-html-renderer/object-to-html-renderer.json b/public/articles/software/object-to-html-renderer/object-to-html-renderer.json new file mode 100755 index 0000000..6ba1fd6 --- /dev/null +++ b/public/articles/software/object-to-html-renderer/object-to-html-renderer.json @@ -0,0 +1,18 @@ +{ + "title": "Object to HTML Renderer", + "date": "2021/07/18", + "subtitle": "Un moteur de rendu web dynamique", + "body": "<file>object-to-html-renderer.txt", + "technical": { + "stack": [ + "Javascript", + "Nodejs" + ], + "license": "LGPL-3.0", + "repository": "https://gitlab.com/kuadrado-software/object-to-html-renderer", + "version": "1.0.3" + }, + "images": [ + "obj-to-html-logo.png" + ] +} \ No newline at end of file diff --git a/public/articles/software/object-to-html-renderer/object-to-html-renderer.txt b/public/articles/software/object-to-html-renderer/object-to-html-renderer.txt new file mode 100755 index 0000000..34837d1 --- /dev/null +++ b/public/articles/software/object-to-html-renderer/object-to-html-renderer.txt @@ -0,0 +1 @@ +Une librairie minimaliste et sans aucune dépendances pour faire du rendu web html dynamique avec du Javascript. \ No newline at end of file diff --git a/public/articles/software/website-template/images/kuadrado-template-screen.png b/public/articles/software/website-template/images/kuadrado-template-screen.png deleted file mode 100644 index 5bfef5aa520bcd8d9b130622d1bcbbf9915b962d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39284 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 diff --git a/public/articles/software/website-template/website-template.json b/public/articles/software/website-template/website-template.json deleted file mode 100644 index e6e65de..0000000 --- a/public/articles/software/website-template/website-template.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "title": "Template web", - "date": "2021/01/28", - "subtitle": "Modèle de site statique simple et dynamique", - "body": "<file>website-template.txt", - "technical": { - "stack": ["Javascript", "Browserify", "Nginx", "Docker"], - "license": "MIT", - "repository": "https://gitlab.com/kuadrado-software/kuadrado-website-template", - "version": "0.1.0" - }, - "images": ["kuadrado-template-screen.png"] -} diff --git a/public/articles/software/website-template/website-template.txt b/public/articles/software/website-template/website-template.txt deleted file mode 100644 index c1610ad..0000000 --- a/public/articles/software/website-template/website-template.txt +++ /dev/null @@ -1,3 +0,0 @@ -Basé sur les mêmes mécanismes de rendu dynamique que pour Watergun, ce modèle de site web propose une base réutilisable pour n'importe quel site statique simple et moderne. - -Ce modèle est celui qui a servi pour le présent site. \ No newline at end of file diff --git a/public/education/education.js b/public/education/education.js index bc6aad7..9a7ac52 100644 --- a/public/education/education.js +++ b/public/education/education.js @@ -1,11 +1,660 @@ -!function s(a,o,r){function i(t,e){if(!o[t]){if(!a[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);throw(n=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",n}n=o[t]={exports:{}},a[t][0].call(n.exports,function(e){return i(a[t][1][e]||e)},n,n.exports,s,a,o,r)}return o[t].exports}for(var c="function"==typeof require&&require,e=0;e<r.length;e++)i(r[e]);return i}({1:[function(e,t,n){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,n){const{getServerUrl:s}=e("./config");t.exports={images_url:`${s()}assets/images/`,articles_url:`${s()}articles/`}},{"./config":1}],3:[function(e,t,n){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(n){var{tag:e}=n;const s=document.createElement(e),a=["tag","contents","style_rules","state"];return Object.keys(n).filter(e=>!a.includes(e)).forEach(e=>{"class"===e?s.classList.add(...n[e].split(" ").filter(e=>""!==e)):s[e]=n[e]}),n.contents&&"string"==typeof n.contents?s.innerHTML=n.contents:n.contents&&0<n.contents.length&&n.contents.forEach(e=>{switch(typeof e){case"string":s.innerHTML=e;break;case"object":s.appendChild(t(e))}}),n.style_rules&&Object.keys(n.style_rules).forEach(e=>{s.style[e]=n.style_rules[e]}),s},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,n={mode:"append"}){var s=this.objectToHtml(e);switch(n.mode){case"append":t.appendChild(s);break;case"override":t.innerHTML="",t.appendChild(s);break;case"insert-before":t.insertBefore(s,t.childNodes[n.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(n.insertLocation,s);break;case"replace":t.parentNode.replaceChild(s,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,n){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],5:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants");e=e("../../lib/web-page");const a=[{title:"Programmation",description:`<b>Franchissez le mur du code !</b><br /> - Apprenez à programmer avec différents langages (Python, Javascript, C ...), pour du web, du logiciel, du jeu vidéo ou autre.`,image:"learning_theme_coding.png"},{title:"Dessin numérique et animation 2D",description:`Apprenez à utiliser des logiciels libres de création graphique 2D et d'animation.<br /> - Créez des personnages et des décors, menez votre projet de dessin animé, d'illustration ou de jeu vidéo.`,image:"learning_theme_2d.png"},{title:"Maths et physique",description:"Abordez les notions fondamentales de façon décontractée pour le plaisir de comprendre.",image:"learning_theme_math.png"},{title:"Aide informatique générale",description:"Perdu avec votre ordinateur ou votre smartphone, les logiciels, internet ? Je vous aide pas à pas à comprendre les fondamentaux et à utiliser sereinement la technologie.",image:"learning_theme_pc.png"},{title:"Stage GNU/Linux",description:`<b>Passez le cap du libre ! </b><br/> +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ +function getServerUrl() { + return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : "" + }`; +} + +module.exports = { + getServerUrl, + build: { + protected_dirs: ["assets", "style", "articles"], + default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"], + }, +}; + +},{}],2:[function(require,module,exports){ +const { getServerUrl } = require("./config"); + +module.exports = { + images_url: `${getServerUrl()}assets/images/`, + articles_url: `${getServerUrl()}articles/`, +}; + +},{"./config":1}],3:[function(require,module,exports){ +"use strict"; + +module.exports = { + setRenderCycleRoot(renderCycleRoot) { + this.renderCycleRoot = renderCycleRoot; + }, + objectToHtml: function objectToHtml(obj) { + const { tag } = obj; + + const node = document.createElement(tag); + const excludeKeys = ["tag", "contents", "style_rules", "state"]; + + Object.keys(obj) + .filter(attr => !excludeKeys.includes(attr)) + .forEach(attr => { + if (attr === "class") { + node.classList.add(...obj[attr].split(" ").filter(s => s !== "")); + } else { + node[attr] = obj[attr]; + } + }); + if (obj.contents && typeof obj.contents === "string") { + node.innerHTML = obj.contents; + } else { + obj.contents && + obj.contents.length > 0 && + obj.contents.forEach(el => { + switch (typeof el) { + case "string": + node.innerHTML = el; + break; + case "object": + node.appendChild(objectToHtml(el)); + break; + } + }); + } + + if (obj.style_rules) { + Object.keys(obj.style_rules).forEach(rule => { + node.style[rule] = obj.style_rules[rule]; + }); + } + + return node; + }, + renderCycle: function () { + this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], { + mode: "replace", + }); + }, + subRender(object, htmlNode, options = { mode: "append" }) { + const insert = this.objectToHtml(object); + switch (options.mode) { + case "append": + htmlNode.appendChild(insert); + break; + case "override": + htmlNode.innerHTML = ""; + htmlNode.appendChild(insert); + break; + case "insert-before": + htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]); + break; + case "adjacent": + /** + * options.insertLocation must be one of: + * + * afterbegin + * afterend + * beforebegin + * beforeend + */ + htmlNode.insertAdjacentHTML(options.insertLocation, insert); + break; + case "replace": + htmlNode.parentNode.replaceChild(insert, htmlNode); + break; + case "remove": + htmlNode.remove(); + break; + } + }, +}; + +},{}],4:[function(require,module,exports){ +"use strict"; + +class WebPage { + constructor(args) { + Object.assign(this, args); + } +} + +module.exports = WebPage; +},{}],5:[function(require,module,exports){ +"use strict"; + +const { images_url } = require("../../../constants"); +const WebPage = require("../../lib/web-page"); + +const EDU_THEMES = [ + // { + // title: "Création de jeux vidéo", + // description: "Conception, graphisme et animation, programmation, je vous accompagne dans la découverte des techniques pour créer un jeu vidéo de A à Z", + // image: "learning_theme_conception.png", + // pageUrl: "gamedev", + // }, + { + title: "Programmation", + description: `<b>Franchissez le mur du code !</b><br /> + Apprenez à programmer avec différents langages (Python, Javascript, C ...), pour du web, du logiciel, du jeu vidéo ou autre.`, + image: "learning_theme_coding.png", + // pageUrl: "coding", + }, + { + title: "Dessin numérique et animation 2D", + description: `Apprenez à utiliser des logiciels libres de création graphique 2D et d'animation.<br /> + Créez des personnages et des décors, menez votre projet de dessin animé, d'illustration ou de jeu vidéo.`, + image: "learning_theme_2d.png", + // pageUrl: "2d", + }, + { + title: "Maths et physique", + description: "Abordez les notions fondamentales de façon décontractée pour le plaisir de comprendre.", + image: "learning_theme_math.png", + // pageUrl: "math", + }, + // { + // title: "Musique et sons électroniques", + // description: "Découvrez des logiciels libres de composition musicales, de synthèse sonore et de prise de son.", + // image: "learning_theme_sound.png", + // pageUrl: "sound", + // }, + { + title: "Aide informatique générale", + description: "Perdu avec votre ordinateur ou votre smartphone, les logiciels, internet ? Je vous aide pas à pas à comprendre les fondamentaux et à utiliser sereinement la technologie.", + image: "learning_theme_pc.png", + // pageUrl: "popularization" + }, + { + title: "Stage GNU/Linux", + description: `<b>Passez le cap du libre ! </b><br/> Stage de 4 séances pour installer Linux, faire ses premiers pas avec les logiciels libres et acquérir une autonomie suffisante pour une utilisation basique. - `,image:"learning_theme_linux.png"}];class o extends e{render(){return{tag:"div",id:"education-page",typeof:"EducationalOrganization",contents:[{tag:"div",class:"page-header logo-left",contents:[{tag:"div",class:"page-contents-center grid-wrapper",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"image brain",src:`${s}brain.svg`}]},{tag:"h1",contents:"Pédagogie"},{tag:"p",contents:`Animation d'ateliers informatiques accessibles à tous. - Programmation, graphisme 2D, jeux vidéo, vulgarisation, accompagnement de projet, etc.`}]}]},{tag:"div",class:"title-banner"},{tag:"section",class:"bg-dark",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"ul",class:"edu-themes",contents:a.map(e=>({tag:"li",class:"edu-theme",contents:[{tag:"img",width:250,height:140,class:"pixelated",src:`${s}${e.image}`},{tag:"h3",contents:e.title},{tag:"p",contents:e.description}]}))}]}]},{tag:"section",class:"practical-info",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Pour qui ?"},{tag:"p",class:"info-body",contents:`Les ateliers sont accessibles aux adultes comme aux enfants, plutôt à partir de 12 ans.<br/> + `, + image: "learning_theme_linux.png" + } +]; + +class EducationPage extends WebPage { + render() { + return { + tag: "div", + id: "education-page", + typeof: "EducationalOrganization", + contents: [ + { + tag: "div", + class: "page-header logo-left", + contents: [ + { + tag: "div", + class: "page-contents-center grid-wrapper", + contents: [ + { + tag: "div", + class: "logo", + contents: [ + { + tag: "img", + alt: "image brain", + src: `${images_url}brain.svg`, + }, + ], + }, + { tag: "h1", contents: "Pédagogie" }, + { + tag: "p", + contents: `Animation d'ateliers informatiques accessibles à tous. + Programmation, graphisme 2D, jeux vidéo, vulgarisation, accompagnement de projet, etc.`, + }, + ], + }, + ], + }, + { + tag: "div", + class: "title-banner", + }, + { + tag: "section", + class: "bg-dark", + contents: [ + { + tag: "div", + class: "page-contents-center", + contents: [ + { + tag: "ul", + class: "edu-themes", + contents: EDU_THEMES.map(theme => { + return { + tag: "li", + class: "edu-theme", + contents: [ + { tag: "img", width: 250, height: 140, class: "pixelated", src: `${images_url}${theme.image}` }, + { tag: "h3", contents: theme.title }, + { tag: "p", contents: theme.description }, + ] + } + }) + }, + ] + }, + ] + }, + { + tag: "section", + class: "practical-info", + contents: [ + { + tag: "div", + class: "page-contents-center", + contents: [ + { + tag: "div", + class: "info-block", + contents: [ + { tag: "h3", class: "info-title", contents: "Pour qui ?" }, + { + tag: "p", + class: "info-body", + contents: `Les ateliers sont accessibles aux adultes comme aux enfants, plutôt à partir de 12 ans.<br/> Les séances ont lieu en groupes mixtes. Capacité limitée à 5 personnes. - `}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Où ça ?"},{tag:"p",class:"info-body",contents:"Dans mon local professionnel : <br /><blue>32 rue Simon Vialet, passage du Cheminou, 07240 Vernoux en Vivarais.</blue>"}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Quel matériel ?"},{tag:"p",class:"info-body",contents:`Le matériel informatique est fourni sur place (ordinateurs et tablettes graphique) + ` + } + ] + }, + { + tag: "div", + class: "info-block", + contents: [ + { tag: "h3", class: "info-title", contents: "Où ça ?" }, + { + tag: "p", + class: "info-body", + contents: "Dans mon local professionnel : <br /><blue>32 rue Simon Vialet, passage du Cheminou, 07240 Vernoux en Vivarais.</blue>" + } + ] + }, + { + tag: "div", + class: "info-block", + contents: [ + { tag: "h3", class: "info-title", contents: "Quel matériel ?" }, + { + tag: "p", + class: "info-body", + contents: `Le matériel informatique est fourni sur place (ordinateurs et tablettes graphique) mais il est possible d'amener le sien. - <br />Il est recommandé d'apporter au moins une clé USB pour faire ses sauvegardes.`}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Quand ?"},{tag:"ul",class:"info-body tabled",contents:[{tag:"li",contents:[{tag:"span",contents:"Mardi"},{tag:"span",contents:"16h - 18h"}]},{tag:"li",contents:[{tag:"span",contents:"Mercredi"},{tag:"span",contents:"14h - 16h"}]},{tag:"li",contents:[{tag:"span",contents:"Jeudi"},{tag:"span",contents:"16h - 18h"}]},{tag:"li",class:"fullwidth",contents:"<em><blue>Ouvert de Septembre à Juin, sauf vacances scolaires ou fermetures exceptionnelles</blue></em>"}]}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Combien ça coûte ?"},{tag:"ul",class:"info-body tabled",contents:[{tag:"li",contents:[{tag:"span",contents:"Inscription au mois"},{tag:"span",contents:"50€, accès à toutes les plages horaires."}]},{tag:"li",contents:[{tag:"span",contents:"Inscription à la séance"},{tag:"span",contents:"15€"}]},{tag:"li",contents:[{tag:"span",contents:"Cours particuliers"},{tag:"span",contents:"30€/h, sur place ou en visio. Horaires à définir."}]},{tag:"li",contents:[{tag:"span",contents:"Stage 4 séances de 2h"},{tag:"span",contents:"40€ par personne, horaires et dates à définir selon la demande."}]}]}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Pour s'inscrire ou en savoir plus"},{tag:"ul",class:"info-body",contents:[{tag:"li",contents:[{tag:"span",contents:"Me contacter"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"li",contents:[{tag:"span",contents:""},{tag:"a",href:"tel:+33475780872",contents:"04 75 78 08 72",property:"telephone"}]},{tag:"li",contents:[{tag:"span",contents:"ou passer directement me voir au local !"}]}]}]}]}]}]}}}t.exports=o},{"../../../constants":2,"../../lib/web-page":4}],6:[function(e,t,n){"use strict";const s=e("../../run-page");e=e("./education");s(e)},{"../../run-page":7,"./education":5}],7:[function(e,t,n){"use strict";const s=e("object-to-html-renderer"),a=e("./template/template");t.exports=function(e){e=new a({page:new e});s.setRenderCycleRoot(e),s.renderCycle()}},{"./template/template":9,"object-to-html-renderer":3}],8:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants"),a=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${s}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${s}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,o=!1,r=""){return{tag:"ul",id:"nav-menu-list",class:o?"submenu":"",contents:e.map(e=>{const{url:t,text:n,submenu:s}=e,a=`${r}${t}`;return{tag:"li",class:o||window.location.pathname!==a?"":"active",contents:[{tag:"a",href:a,contents:n}].concat(s?[this.renderMenu(s,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(a)]}}}},{"../../../constants":2}],9:[function(e,t,n){"use strict";const{in_construction:s}=e("../../config"),{images_url:a}=e("../../constants"),o=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new o).render()]},s&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${a}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${a}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | - Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":8}]},{},[6]); \ No newline at end of file + <br />Il est recommandé d'apporter au moins une clé USB pour faire ses sauvegardes.` + } + ] + }, + { + tag: "div", + class: "info-block", + contents: [ + { tag: "h3", class: "info-title", contents: "Quand ?" }, + { + tag: "ul", + class: "info-body tabled", + contents: [ + { + tag: "li", + contents: [ + { tag: "span", contents: "Mardi" }, + { tag: "span", contents: "16h - 18h" }, + ] + }, + { + tag: "li", + contents: [ + { tag: "span", contents: "Mercredi" }, + { tag: "span", contents: "14h - 16h" }, + ] + }, + { + tag: "li", + contents: [ + { tag: "span", contents: "Jeudi" }, + { tag: "span", contents: "16h - 18h" }, + ] + }, + { + tag: "li", + class: "fullwidth", + contents: "<em><blue>Ouvert de Septembre à Juin, sauf vacances scolaires ou fermetures exceptionnelles</blue></em>" + } + ] + }, + ] + }, + { + tag: "div", + class: "info-block", + contents: [ + { tag: "h3", class: "info-title", contents: "Combien ça coûte ?" }, + { + tag: "ul", + class: "info-body tabled", + contents: [ + { + tag: "li", + contents: [ + { tag: "span", contents: "Inscription au mois" }, + { tag: "span", contents: "50€, accès à toutes les plages horaires." }, + ] + }, + { + tag: "li", + contents: [ + { tag: "span", contents: "Inscription à la séance" }, + { tag: "span", contents: "15€" }, + ] + }, + { + tag: "li", + contents: [ + { tag: "span", contents: "Cours particuliers" }, + { tag: "span", contents: "30€/h, sur place ou en visio. Horaires à définir." }, + ] + }, + { + tag: "li", + contents: [ + { tag: "span", contents: "Stage 4 séances de 2h" }, + { tag: "span", contents: "40€ par personne, horaires et dates à définir selon la demande." }, + ] + } + ] + } + ] + }, + { + tag: "div", + class: "info-block", + contents: [ + { tag: "h3", class: "info-title", contents: "Pour s'inscrire ou en savoir plus" }, + { + tag: "ul", + class: "info-body", + contents: [ + { + tag: "li", + contents: [ + { tag: "span", contents: "Me contacter" }, + { + tag: "a", + href: "mailto:contact@kuadrado-software.fr", + contents: "contact@kuadrado-software.fr", + } + ] + }, + { + tag: "li", + contents: [ + { tag: "span", contents: "" }, + { + tag: "a", + href: "tel:+33475780872", + contents: "04 75 78 08 72", + property: "telephone", + }, + ] + }, + { + tag: "li", + contents: [ + { tag: "span", contents: "ou passer directement me voir au local !" } + ] + } + ] + } + ] + } + ] + } + ] + + }, + ], + }; + } +} + +module.exports = EducationPage; + +},{"../../../constants":2,"../../lib/web-page":4}],6:[function(require,module,exports){ +"use strict"; +const runPage = require("../../run-page"); +const EducationPage = require("./education"); +runPage(EducationPage); + +},{"../../run-page":7,"./education":5}],7:[function(require,module,exports){ +"use strict"; + +const objectHtmlRenderer = require("object-to-html-renderer") +const Template = require("./template/template"); + +module.exports = function runPage(PageComponent) { + const template = new Template({ page: new PageComponent() }); + objectHtmlRenderer.setRenderCycleRoot(template); + objectHtmlRenderer.renderCycle(); +}; + +},{"./template/template":9,"object-to-html-renderer":3}],8:[function(require,module,exports){ +"use strict"; + +const { images_url } = require("../../../constants"); + +const NAV_MENU_ITEMS = [ + { url: "/games/", text: "Jeux" }, + { + url: "/education/", + text: "Pédagogie", + // submenu: [ + // { url: "/gamedev", text: "Création de jeux vidéo" }, + // ] + }, + { url: "/software-development/", text: "Software" } +]; + +class NavBar { + constructor() { + this.initEventHandlers(); + } + + handleBurgerClick() { + document.getElementById("nav-menu-list").classList.toggle("responsive-show"); + } + + initEventHandlers() { + window.addEventListener("click", event => { + if ( + event.target.id !== "nav-menu-list" && + !event.target.classList.contains("burger") && + !event.target.parentNode.classList.contains("burger") + ) { + document.getElementById("nav-menu-list").classList.remove("responsive-show"); + } + }); + } + + renderHome() { + return { + tag: "div", + class: "home", + contents: [ + { + tag: "a", + href: "/", + contents: [ + { + tag: "img", + alt: "Logo Kuadrado", + src: `${images_url}logo_kuadrado.svg`, + }, + { + tag: "img", + alt: "Kuadrado Software", + class: "logo-text", + src: `${images_url}logo_kuadrado_txt.svg`, + }, + ], + }, + ], + }; + } + + renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") { + return { + tag: "ul", + id: "nav-menu-list", + class: isSubmenu ? "submenu" : "", + contents: menuItemsArray.map(item => { + const { url, text, submenu } = item; + const href = `${parentUrl}${url}`; + return { + tag: "li", + class: !isSubmenu && window.location.pathname === href ? "active" : "", + contents: [ + { + tag: "a", + href, + contents: text, + }, + ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []), + }; + }), + }; + } + + renderResponsiveBurger() { + return { + tag: "div", + class: "burger", + onclick: this.handleBurgerClick.bind(this), + contents: [{ tag: "span", contents: "···" }], + }; + } + + render() { + return { + tag: "nav", + contents: [ + this.renderHome(), + this.renderResponsiveBurger(), + this.renderMenu(NAV_MENU_ITEMS), + ], + }; + } +} + +module.exports = NavBar; + +},{"../../../constants":2}],9:[function(require,module,exports){ +"use strict"; + +const { in_construction } = require("../../config"); +const { images_url } = require("../../constants"); +const NavBar = require("./components/navbar"); + +class Template { + constructor(props) { + this.props = props; + } + render() { + return { + tag: "main", + contents: [ + { + tag: "header", + contents: [new NavBar().render()], + }, + in_construction && { + tag: "section", + class: "warning-banner", + contents: [ + { + tag: "strong", + class: "page-contents-center", + contents: "Site en construction ...", + }, + ], + }, + { + tag: "section", + id: "page-container", + contents: [this.props.page.render()], + }, + { + tag: "footer", + contents: [ + { + tag: "div", + class: "logo", + contents: [ + { + tag: "img", + alt: `logo Kuadrado`, + src: `${images_url}logo_kuadrado.svg`, + }, + { + tag: "img", + class: "text-logo", + alt: "Kuadrado Software", + src: `${images_url}logo_kuadrado_txt.svg`, + }, + ], + }, + { + tag: "span", + contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France", + }, + { + tag: "div", + contents: [ + { tag: "strong", contents: "<blue>Contact : </blue>" }, + { + tag: "a", + href: "mailto:contact@kuadrado-software.fr", + contents: "contact@kuadrado-software.fr", + }, + ], + }, + { + tag: "div", + class: "social", + contents: [ + { + tag: "strong", + contents: "<blue>Sur les réseaux : </blue>", + }, + { + tag: "a", + href: "https://www.linkedin.com/company/kuadrado-software", + target: "_blank", + contents: "in", + title: "Linkedin", + }, + { + tag: "a", + href: "https://twitter.com/KuadradoSoft", + target: "_blank", + contents: "t", + title: "Twitter", + style_rules: { fontFamily: "serif" }, + }, + ], + }, + { + tag: "span", + contents: `Copyright © ${new Date() + .getFullYear()} Kuadrado Software | + Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`, + }, + ], + }, + ], + }; + } +} + +module.exports = Template; + +},{"../../config":1,"../../constants":2,"./components/navbar":8}]},{},[6]); diff --git a/public/games/games.js b/public/games/games.js index 0d18235..db8aa16 100644 --- a/public/games/games.js +++ b/public/games/games.js @@ -1,3 +1,769 @@ -!function n(r,a,o){function c(t,e){if(!a[t]){if(!r[t]){var s="function"==typeof require&&require;if(!e&&s)return s(t,!0);if(i)return i(t,!0);throw(s=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",s}s=a[t]={exports:{}},r[t][0].call(s.exports,function(e){return c(r[t][1][e]||e)},s,s.exports,n,r,a,o)}return a[t].exports}for(var i="function"==typeof require&&require,e=0;e<o.length;e++)c(o[e]);return c}({1:[function(e,t,s){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,s){const{getServerUrl:n}=e("./config");t.exports={images_url:`${n()}assets/images/`,articles_url:`${n()}articles/`}},{"./config":1}],3:[function(e,t,s){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(s){var{tag:e}=s;const n=document.createElement(e),r=["tag","contents","style_rules","state"];return Object.keys(s).filter(e=>!r.includes(e)).forEach(e=>{"class"===e?n.classList.add(...s[e].split(" ").filter(e=>""!==e)):n[e]=s[e]}),s.contents&&"string"==typeof s.contents?n.innerHTML=s.contents:s.contents&&0<s.contents.length&&s.contents.forEach(e=>{switch(typeof e){case"string":n.innerHTML=e;break;case"object":n.appendChild(t(e))}}),s.style_rules&&Object.keys(s.style_rules).forEach(e=>{n.style[e]=s.style_rules[e]}),n},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,s={mode:"append"}){var n=this.objectToHtml(e);switch(s.mode){case"append":t.appendChild(n);break;case"override":t.innerHTML="",t.appendChild(n);break;case"insert-before":t.insertBefore(n,t.childNodes[s.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(s.insertLocation,n);break;case"replace":t.parentNode.replaceChild(n,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,s){"use strict";const n=e("object-to-html-renderer");t.exports=class{constructor(e){this.props=e,this.id=performance.now(),this.state={showImageIndex:0},this.RUN_INTERVAL=5e3,1<this.props.images.length&&this.run()}run(){this.runningInterval=setInterval(()=>{var{showImageIndex:e}=this.state,{images:t}=this.props;this.state.showImageIndex=e<t.length-1?++e:0,this.refreshImage()},this.RUN_INTERVAL)}setImageIndex(e){clearInterval(this.runningInterval),this.state.showImageIndex=e,this.refreshImage()}refreshImage(){n.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{showImageIndex:s}=this.state,{images:e}=this.props;return{tag:"div",id:this.id,class:"image-carousel",contents:[{tag:"img",property:"image",alt:`image carousel ${e[s].replace(/\.[A-Za-z]+/,"")}`,src:e[s]},1<e.length&&{tag:"div",class:"carousel-bullets",contents:e.map((e,t)=>{return{tag:"span",class:`bullet ${s===t?"active":""}`,onclick:this.setImageIndex.bind(this,t)}})}]}}}},{"object-to-html-renderer":3}],5:[function(e,t,s){"use strict";const{fetchjson:a,fetchtext:n}=e("./fetch");function o(e){return new Promise((t,s)=>{Promise.all(e.map(async e=>{var t;return-1!==e.body.indexOf("<file>")&&(t=e.body.replace("<file>",""),t=await n(`${e.path}/${t}`),e.body=t,e.date=e.date?new Date(e.date):void 0),e})).then(e=>t(e.sort((e,t)=>e.date-t.date))).catch(e=>s(e))})}t.exports={loadArticles:function(r){return new Promise((t,s)=>{a(`${r}/index.json`).then(e=>{Promise.all(e.articles.map(async e=>{const t=`${e}/${e}.json`;var s=await a(`${r}/${t}`);const n=t.split("/");n.pop();e=`${r}/${n.join("/")}`;return Object.assign(s,{path:e})})).then(e=>{o(e).then(e=>t(e)).catch(e=>s(e))}).catch(e=>s(e))}).catch(e=>console.log(e))})},getArticleBody:function(e){return e.replaceAll("\n","<br/>")},getArticleDate:function(e){return`${e.getDate()}-${e.getMonth()+1}-${e.getFullYear()}`},populateArticles:o}},{"./fetch":6}],6:[function(e,t,s){"use strict";t.exports={fetchjson:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.json()).then(e=>t(e)).catch(e=>s(e))})},fetchtext:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.text()).then(e=>t(e)).catch(e=>s(e))})}}},{}],7:[function(e,t,s){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],8:[function(e,t,s){"use strict";const i=e("../../../generic-components/image-carousel"),{getArticleBody:l}=e("../../../lib/article-utils");class g{constructor(e){this.props=e}render(){const{title:e,subtitle:t,body:s,images:n,path:r}=this.props;return{tag:"div",class:"team-member",typeof:"Person",property:"author",contents:[{tag:"div",class:"team-member-img",contents:[{tag:"img",alt:`ìmage team member ${e}`,src:n.map(e=>`${r}/images/${e}`)[0],property:"image"}]},{tag:"h3",class:"team-member-title",contents:e,property:"name"},{tag:"strong",class:"team-member-subtitle",contents:t,property:"jobTitle"},{tag:"p",class:"team-member-body",contents:l(s),property:"description"}]}}}t.exports=class{constructor(e){this.props=e}render(){const{title:e,tags:t,body:s,subtitle:n,images:r,path:a,team_subarticles:o,image_banner:c}=this.props;return{tag:"article",typeof:"VideoGame",additionalType:"Article",class:"game-article",contents:[{tag:"h2",property:"name",class:"game-title",contents:e},{tag:"div",class:"game-banner",contents:[{tag:"img",class:"pixelated",src:`${a}/images/${c}`}]},{tag:"div",class:"game-tags",contents:t.map(e=>({tag:"span",contents:e,property:"about"}))},{tag:"h3",class:"game-subtitle",contents:n,property:"alternativeHeadline"},{tag:"div",class:"game-description",property:"description",contents:l(s)},new i({images:r.map(e=>`${a}/images/${e}`)}).render(),{tag:"div",class:"game-team",contents:[{tag:"h2",contents:"L'équipe"},{tag:"div",class:"team-members",contents:o.map(e=>new g({...e}).render())}]}]}}}},{"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5}],9:[function(e,t,s){"use strict";const{articles_url:n}=e("../../../../constants"),{loadArticles:r,populateArticles:a}=e("../../../lib/article-utils"),o=e("object-to-html-renderer"),c=e("./game-article");t.exports=class{constructor(e){this.props=e,this.state={articles:[]},this.id=performance.now(),this.loadArticles()}loadArticles(){r(`${n}games`).then(e=>{Promise.all(e.map(async t=>(t.team_subarticles&&(t.team_subarticles=await a(t.team_subarticles.map(e=>Object.assign(e,{path:t.path})))),t))).then(e=>{this.state.articles=e,this.refresh()})}).catch(e=>console.log(e))}renderPlaceholder(){return{tag:"article",class:"placeholder",contents:[{tag:"div"},{tag:"div"}]}}refresh(){o.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{articles:e}=this.state;return{tag:"section",class:"game-articles page-contents-center",id:this.id,contents:0<e.length?e.map(e=>new c({...e}).render()):[this.renderPlaceholder()]}}}},{"../../../../constants":2,"../../../lib/article-utils":5,"./game-article":8,"object-to-html-renderer":3}],10:[function(e,t,s){"use strict";const{images_url:n}=e("../../../constants");var r=e("../../lib/web-page");const a=e("./components/game-articles");class o extends r{render(){return{tag:"div",id:"games-page",contents:[{tag:"div",class:"page-header logo-left",contents:[{tag:"div",class:"page-contents-center grid-wrapper",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"image game controller",src:`${n}game_controller.svg`}]},{tag:"h1",contents:"Jeux"},{tag:"p",contents:`Création de jeux vidéos indépendants. - <br/>Jeux web, PC et projets en cours de développement`}]}]},(new a).render()]}}}t.exports=o},{"../../../constants":2,"../../lib/web-page":7,"./components/game-articles":9}],11:[function(e,t,s){"use strict";const n=e("../../run-page");e=e("./games");n(e)},{"../../run-page":12,"./games":10}],12:[function(e,t,s){"use strict";const n=e("object-to-html-renderer"),r=e("./template/template");t.exports=function(e){e=new r({page:new e});n.setRenderCycleRoot(e),n.renderCycle()}},{"./template/template":14,"object-to-html-renderer":3}],13:[function(e,t,s){"use strict";const{images_url:n}=e("../../../constants"),r=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${n}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${n}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,a=!1,o=""){return{tag:"ul",id:"nav-menu-list",class:a?"submenu":"",contents:e.map(e=>{const{url:t,text:s,submenu:n}=e,r=`${o}${t}`;return{tag:"li",class:a||window.location.pathname!==r?"":"active",contents:[{tag:"a",href:r,contents:s}].concat(n?[this.renderMenu(n,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(r)]}}}},{"../../../constants":2}],14:[function(e,t,s){"use strict";const{in_construction:n}=e("../../config"),{images_url:r}=e("../../constants"),a=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new a).render()]},n&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${r}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${r}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | - Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":13}]},{},[11]); \ No newline at end of file +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ +function getServerUrl() { + return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : "" + }`; +} + +module.exports = { + getServerUrl, + build: { + protected_dirs: ["assets", "style", "articles"], + default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"], + }, +}; + +},{}],2:[function(require,module,exports){ +const { getServerUrl } = require("./config"); + +module.exports = { + images_url: `${getServerUrl()}assets/images/`, + articles_url: `${getServerUrl()}articles/`, +}; + +},{"./config":1}],3:[function(require,module,exports){ +"use strict"; + +module.exports = { + setRenderCycleRoot(renderCycleRoot) { + this.renderCycleRoot = renderCycleRoot; + }, + objectToHtml: function objectToHtml(obj) { + const { tag } = obj; + + const node = document.createElement(tag); + const excludeKeys = ["tag", "contents", "style_rules", "state"]; + + Object.keys(obj) + .filter(attr => !excludeKeys.includes(attr)) + .forEach(attr => { + if (attr === "class") { + node.classList.add(...obj[attr].split(" ").filter(s => s !== "")); + } else { + node[attr] = obj[attr]; + } + }); + if (obj.contents && typeof obj.contents === "string") { + node.innerHTML = obj.contents; + } else { + obj.contents && + obj.contents.length > 0 && + obj.contents.forEach(el => { + switch (typeof el) { + case "string": + node.innerHTML = el; + break; + case "object": + node.appendChild(objectToHtml(el)); + break; + } + }); + } + + if (obj.style_rules) { + Object.keys(obj.style_rules).forEach(rule => { + node.style[rule] = obj.style_rules[rule]; + }); + } + + return node; + }, + renderCycle: function () { + this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], { + mode: "replace", + }); + }, + subRender(object, htmlNode, options = { mode: "append" }) { + const insert = this.objectToHtml(object); + switch (options.mode) { + case "append": + htmlNode.appendChild(insert); + break; + case "override": + htmlNode.innerHTML = ""; + htmlNode.appendChild(insert); + break; + case "insert-before": + htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]); + break; + case "adjacent": + /** + * options.insertLocation must be one of: + * + * afterbegin + * afterend + * beforebegin + * beforeend + */ + htmlNode.insertAdjacentHTML(options.insertLocation, insert); + break; + case "replace": + htmlNode.parentNode.replaceChild(insert, htmlNode); + break; + case "remove": + htmlNode.remove(); + break; + } + }, +}; + +},{}],4:[function(require,module,exports){ +"use strict"; + +const objectHtmlRenderer = require("object-to-html-renderer") + +class ImageCarousel { + constructor(props) { + this.props = props; + this.id = performance.now(); + this.state = { + showImageIndex: 0, + }; + this.RUN_INTERVAL = 5000; + this.props.images.length > 1 && this.run(); + } + + run() { + this.runningInterval = setInterval(() => { + let { showImageIndex } = this.state; + const { images } = this.props; + this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0; + this.refreshImage(); + }, this.RUN_INTERVAL); + } + + setImageIndex(i) { + clearInterval(this.runningInterval); + this.state.showImageIndex = i; + this.refreshImage(); + } + + refreshImage() { + objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), { + mode: "replace", + }); + } + + render() { + const { showImageIndex } = this.state; + const { images } = this.props; + return { + tag: "div", + id: this.id, + class: "image-carousel", + contents: [ + { + tag: "img", + property: "image", + alt: `image carousel ${images[showImageIndex].replace(/\.[A-Za-z]+/, "")}`, + src: images[showImageIndex], + }, + images.length > 1 && { + tag: "div", + class: "carousel-bullets", + contents: images.map((_, i) => { + const active = showImageIndex === i; + return { + tag: "span", + class: `bullet ${active ? "active" : ""}`, + onclick: this.setImageIndex.bind(this, i), + }; + }), + }, + ], + }; + } +} + +module.exports = ImageCarousel; + +},{"object-to-html-renderer":3}],5:[function(require,module,exports){ +"use strict"; + +const { fetchjson, fetchtext } = require("./fetch"); + +function getArticleBody(text) { + return text.replaceAll("\n", "<br/>"); +} + +function getArticleDate(date) { + return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`; +} + +function loadArticles(dir_url) { + return new Promise((resolve, reject) => { + fetchjson(`${dir_url}/index.json`) + .then(json => { + Promise.all( + json.articles.map(async artDir => { + const artPath = `${artDir}/${artDir}.json`; + const art = await fetchjson(`${dir_url}/${artPath}`); + const tmpSplit = artPath.split("/"); + tmpSplit.pop(); + const absArtPath = `${dir_url}/${tmpSplit.join("/")}`; + return Object.assign(art, { path: absArtPath }); + }) + ) + .then(articles => { + populateArticles(articles) + .then(completeArticles => resolve(completeArticles)) + .catch(e => reject(e)); + }) + .catch(e => reject(e)); + }) + .catch(e => console.log(e)); + }); +} + +function populateArticles(articles) { + return new Promise((resolve, reject) => { + Promise.all( + articles.map(async article => { + if (article.body.indexOf("<file>") !== -1) { + const txtPath = article.body.replace("<file>", ""); + const textValue = await fetchtext(`${article.path}/${txtPath}`); + article.body = textValue; + article.date = article.date ? new Date(article.date) : undefined; + } + return article; + }) + ) + .then(completeArticles => resolve(completeArticles.sort((a, b) => b.date - a.date))) + .catch(e => reject(e)); + }); +} + +module.exports = { + loadArticles, + getArticleBody, + getArticleDate, + populateArticles, +}; + +},{"./fetch":6}],6:[function(require,module,exports){ +"use strict"; + +function fetchjson(url) { + return new Promise((resolve, reject) => { + fetch(url) + .then(r => r.json()) + .then(r => resolve(r)) + .catch(e => reject(e)); + }); +} + +function fetchtext(url) { + return new Promise((resolve, reject) => { + fetch(url) + .then(r => r.text()) + .then(r => resolve(r)) + .catch(e => reject(e)); + }); +} + +module.exports = { + fetchjson, + fetchtext, +}; + +},{}],7:[function(require,module,exports){ +"use strict"; + +class WebPage { + constructor(args) { + Object.assign(this, args); + } +} + +module.exports = WebPage; +},{}],8:[function(require,module,exports){ +"use strict"; + +const ImageCarousel = require("../../../generic-components/image-carousel"); +const { getArticleBody } = require("../../../lib/article-utils"); + +class TeamMember { + constructor(props) { + this.props = props; + } + + render() { + const { title, subtitle, body, images, path } = this.props; + return { + tag: "div", + class: "team-member", + typeof: "Person", + property: "author", + contents: [ + { + tag: "div", + class: "team-member-img", + contents: [ + { + tag: "img", + alt: `ìmage team member ${title}`, + src: images.map(im => `${path}/images/${im}`)[0], + property: "image", + }, + ], + }, + { + tag: "h3", + class: "team-member-title", + contents: title, + property: "name", + }, + { + tag: "strong", + class: "team-member-subtitle", + contents: subtitle, + property: "jobTitle", + }, + { + tag: "p", + class: "team-member-body", + contents: getArticleBody(body), + property: "description", + }, + ], + }; + } +} + +class GameArticle { + constructor(props) { + this.props = props; + } + + render() { + const { + title, + tags, + body, + subtitle, + images, + path, + team_subarticles, + image_banner, + } = this.props; + return { + tag: "article", + typeof: "VideoGame", + additionalType: "Article", + class: "game-article", + contents: [ + { + tag: "h2", + property: "name", + class: "game-title", + contents: title, + }, + { + tag: "div", + class: "game-banner", + contents: [ + { tag: "img", class: "pixelated", src: `${path}/images/${image_banner}` }, + ], + }, + { + tag: "div", + class: "game-tags", + contents: tags.map(tag => { + return { tag: "span", contents: tag, property: "about" }; + }), + }, + { + tag: "h3", + class: "game-subtitle", + contents: subtitle, + property: "alternativeHeadline", + }, + { + tag: "div", + class: "game-description", + property: "description", + contents: getArticleBody(body), + }, + new ImageCarousel({ images: images.map(img => `${path}/images/${img}`) }).render(), + { + tag: "div", + class: "game-team", + contents: [ + { + tag: "h2", + contents: "L'équipe", + }, + { + tag: "div", + class: "team-members", + contents: team_subarticles.map(tsa => + new TeamMember({ ...tsa }).render() + ), + }, + ], + }, + ], + }; + } +} + +module.exports = GameArticle; + +},{"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5}],9:[function(require,module,exports){ +"use strict"; + +const { articles_url } = require("../../../../constants"); +const { loadArticles, populateArticles } = require("../../../lib/article-utils"); +const objectHtmlRenderer = require("object-to-html-renderer") +const GameArticle = require("./game-article"); + +class GameArticles { + constructor(props) { + this.props = props; + this.state = { + articles: [], + }; + this.id = performance.now(); + this.loadArticles(); + } + + loadArticles() { + loadArticles(`${articles_url}games`) + .then(articles => { + Promise.all( + articles.map(async a => { + if (a.team_subarticles) { + a.team_subarticles = await populateArticles( + a.team_subarticles.map(sa => Object.assign(sa, { path: a.path })) + ); + } + return a; + }) + ).then(completeArticles => { + this.state.articles = completeArticles; + this.refresh(); + }); + }) + .catch(e => console.log(e)); + } + + renderPlaceholder() { + return { + tag: "article", + class: "placeholder", + contents: [{ tag: "div" }, { tag: "div" }], + }; + } + + refresh() { + objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), { + mode: "replace", + }); + } + + render() { + const { articles } = this.state; + return { + tag: "section", + class: "game-articles page-contents-center", + id: this.id, + contents: + articles.length > 0 + ? articles.map(article => new GameArticle({ ...article }).render()) + : [this.renderPlaceholder()], + }; + } +} + +module.exports = GameArticles; + +},{"../../../../constants":2,"../../../lib/article-utils":5,"./game-article":8,"object-to-html-renderer":3}],10:[function(require,module,exports){ +"use strict"; + +const { images_url } = require("../../../constants"); +const WebPage = require("../../lib/web-page"); +const GameArticles = require("./components/game-articles"); + +class GamesPage extends WebPage { + render() { + return { + tag: "div", + id: "games-page", + contents: [ + { + tag: "div", + class: "page-header logo-left", + contents: [ + { + tag: "div", + class: "page-contents-center grid-wrapper", + contents: [ + { + tag: "div", + class: "logo", + contents: [ + { + tag: "img", + alt: "image game controller", + src: `${images_url}game_controller.svg`, + }, + ], + }, + { tag: "h1", contents: "Jeux" }, + { + tag: "p", + contents: `Création de jeux vidéos indépendants. + <br/>Jeux web, PC et projets en cours de développement`, + }, + ], + }, + ], + }, + new GameArticles().render(), + ], + }; + } +} + +module.exports = GamesPage; + +},{"../../../constants":2,"../../lib/web-page":7,"./components/game-articles":9}],11:[function(require,module,exports){ +"use strict"; + +"use strict"; +const runPage = require("../../run-page"); +const GamesPage = require("./games"); +runPage(GamesPage); + +},{"../../run-page":12,"./games":10}],12:[function(require,module,exports){ +"use strict"; + +const objectHtmlRenderer = require("object-to-html-renderer") +const Template = require("./template/template"); + +module.exports = function runPage(PageComponent) { + const template = new Template({ page: new PageComponent() }); + objectHtmlRenderer.setRenderCycleRoot(template); + objectHtmlRenderer.renderCycle(); +}; + +},{"./template/template":14,"object-to-html-renderer":3}],13:[function(require,module,exports){ +"use strict"; + +const { images_url } = require("../../../constants"); + +const NAV_MENU_ITEMS = [ + { url: "/games/", text: "Jeux" }, + { + url: "/education/", + text: "Pédagogie", + // submenu: [ + // { url: "/gamedev", text: "Création de jeux vidéo" }, + // ] + }, + { url: "/software-development/", text: "Software" } +]; + +class NavBar { + constructor() { + this.initEventHandlers(); + } + + handleBurgerClick() { + document.getElementById("nav-menu-list").classList.toggle("responsive-show"); + } + + initEventHandlers() { + window.addEventListener("click", event => { + if ( + event.target.id !== "nav-menu-list" && + !event.target.classList.contains("burger") && + !event.target.parentNode.classList.contains("burger") + ) { + document.getElementById("nav-menu-list").classList.remove("responsive-show"); + } + }); + } + + renderHome() { + return { + tag: "div", + class: "home", + contents: [ + { + tag: "a", + href: "/", + contents: [ + { + tag: "img", + alt: "Logo Kuadrado", + src: `${images_url}logo_kuadrado.svg`, + }, + { + tag: "img", + alt: "Kuadrado Software", + class: "logo-text", + src: `${images_url}logo_kuadrado_txt.svg`, + }, + ], + }, + ], + }; + } + + renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") { + return { + tag: "ul", + id: "nav-menu-list", + class: isSubmenu ? "submenu" : "", + contents: menuItemsArray.map(item => { + const { url, text, submenu } = item; + const href = `${parentUrl}${url}`; + return { + tag: "li", + class: !isSubmenu && window.location.pathname === href ? "active" : "", + contents: [ + { + tag: "a", + href, + contents: text, + }, + ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []), + }; + }), + }; + } + + renderResponsiveBurger() { + return { + tag: "div", + class: "burger", + onclick: this.handleBurgerClick.bind(this), + contents: [{ tag: "span", contents: "···" }], + }; + } + + render() { + return { + tag: "nav", + contents: [ + this.renderHome(), + this.renderResponsiveBurger(), + this.renderMenu(NAV_MENU_ITEMS), + ], + }; + } +} + +module.exports = NavBar; + +},{"../../../constants":2}],14:[function(require,module,exports){ +"use strict"; + +const { in_construction } = require("../../config"); +const { images_url } = require("../../constants"); +const NavBar = require("./components/navbar"); + +class Template { + constructor(props) { + this.props = props; + } + render() { + return { + tag: "main", + contents: [ + { + tag: "header", + contents: [new NavBar().render()], + }, + in_construction && { + tag: "section", + class: "warning-banner", + contents: [ + { + tag: "strong", + class: "page-contents-center", + contents: "Site en construction ...", + }, + ], + }, + { + tag: "section", + id: "page-container", + contents: [this.props.page.render()], + }, + { + tag: "footer", + contents: [ + { + tag: "div", + class: "logo", + contents: [ + { + tag: "img", + alt: `logo Kuadrado`, + src: `${images_url}logo_kuadrado.svg`, + }, + { + tag: "img", + class: "text-logo", + alt: "Kuadrado Software", + src: `${images_url}logo_kuadrado_txt.svg`, + }, + ], + }, + { + tag: "span", + contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France", + }, + { + tag: "div", + contents: [ + { tag: "strong", contents: "<blue>Contact : </blue>" }, + { + tag: "a", + href: "mailto:contact@kuadrado-software.fr", + contents: "contact@kuadrado-software.fr", + }, + ], + }, + { + tag: "div", + class: "social", + contents: [ + { + tag: "strong", + contents: "<blue>Sur les réseaux : </blue>", + }, + { + tag: "a", + href: "https://www.linkedin.com/company/kuadrado-software", + target: "_blank", + contents: "in", + title: "Linkedin", + }, + { + tag: "a", + href: "https://twitter.com/KuadradoSoft", + target: "_blank", + contents: "t", + title: "Twitter", + style_rules: { fontFamily: "serif" }, + }, + ], + }, + { + tag: "span", + contents: `Copyright © ${new Date() + .getFullYear()} Kuadrado Software | + Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`, + }, + ], + }, + ], + }; + } +} + +module.exports = Template; + +},{"../../config":1,"../../constants":2,"./components/navbar":13}]},{},[11]); diff --git a/public/main.js b/public/main.js index 82098e2..70aa45d 100644 --- a/public/main.js +++ b/public/main.js @@ -1,10 +1,501 @@ -!function n(r,a,o){function i(t,e){if(!a[t]){if(!r[t]){var s="function"==typeof require&&require;if(!e&&s)return s(t,!0);if(c)return c(t,!0);throw(s=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",s}s=a[t]={exports:{}},r[t][0].call(s.exports,function(e){return i(r[t][1][e]||e)},s,s.exports,n,r,a,o)}return a[t].exports}for(var c="function"==typeof require&&require,e=0;e<o.length;e++)i(o[e]);return i}({1:[function(e,t,s){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,s){const{getServerUrl:n}=e("./config");t.exports={images_url:`${n()}assets/images/`,articles_url:`${n()}articles/`}},{"./config":1}],3:[function(e,t,s){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(s){var{tag:e}=s;const n=document.createElement(e),r=["tag","contents","style_rules","state"];return Object.keys(s).filter(e=>!r.includes(e)).forEach(e=>{"class"===e?n.classList.add(...s[e].split(" ").filter(e=>""!==e)):n[e]=s[e]}),s.contents&&"string"==typeof s.contents?n.innerHTML=s.contents:s.contents&&0<s.contents.length&&s.contents.forEach(e=>{switch(typeof e){case"string":n.innerHTML=e;break;case"object":n.appendChild(t(e))}}),s.style_rules&&Object.keys(s.style_rules).forEach(e=>{n.style[e]=s.style_rules[e]}),n},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,s={mode:"append"}){var n=this.objectToHtml(e);switch(s.mode){case"append":t.appendChild(n);break;case"override":t.innerHTML="",t.appendChild(n);break;case"insert-before":t.insertBefore(n,t.childNodes[s.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(s.insertLocation,n);break;case"replace":t.parentNode.replaceChild(n,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,s){"use strict";const n=e("object-to-html-renderer");t.exports=class{constructor(e){this.props=e,this.id=performance.now(),this.state={showImageIndex:0},this.RUN_INTERVAL=5e3,1<this.props.images.length&&this.run()}run(){this.runningInterval=setInterval(()=>{var{showImageIndex:e}=this.state,{images:t}=this.props;this.state.showImageIndex=e<t.length-1?++e:0,this.refreshImage()},this.RUN_INTERVAL)}setImageIndex(e){clearInterval(this.runningInterval),this.state.showImageIndex=e,this.refreshImage()}refreshImage(){n.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{showImageIndex:s}=this.state,{images:e}=this.props;return{tag:"div",id:this.id,class:"image-carousel",contents:[{tag:"img",property:"image",alt:`image carousel ${e[s].replace(/\.[A-Za-z]+/,"")}`,src:e[s]},1<e.length&&{tag:"div",class:"carousel-bullets",contents:e.map((e,t)=>{return{tag:"span",class:`bullet ${s===t?"active":""}`,onclick:this.setImageIndex.bind(this,t)}})}]}}}},{"object-to-html-renderer":3}],5:[function(e,t,s){"use strict";t.exports=class{render(){return{tag:"section",class:"kuadrado-values",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"h2",contents:"<blue>Éthique</blue>"},{tag:"ul",class:"values-list",contents:[["<emoji>📖</emoji> <blue>Partage des connaissances</blue>",`Pour sortir de l'élitisme de l'ingénierie, pour sortir de la domination par l'obscurantisme et de la consommation aveugle, - pour aller plus loin ensemble, le partage du savoir est fondamental.`],["<emoji>💻</emoji> <blue>Logiciels libres et open source</blue>",`Toutes mes productions numériques, jeux vidéo, web, software, sont +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ +function getServerUrl() { + return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : "" + }`; +} + +module.exports = { + getServerUrl, + build: { + protected_dirs: ["assets", "style", "articles"], + default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"], + }, +}; + +},{}],2:[function(require,module,exports){ +const { getServerUrl } = require("./config"); + +module.exports = { + images_url: `${getServerUrl()}assets/images/`, + articles_url: `${getServerUrl()}articles/`, +}; + +},{"./config":1}],3:[function(require,module,exports){ +"use strict"; + +module.exports = { + setRenderCycleRoot(renderCycleRoot) { + this.renderCycleRoot = renderCycleRoot; + }, + objectToHtml: function objectToHtml(obj) { + const { tag } = obj; + + const node = document.createElement(tag); + const excludeKeys = ["tag", "contents", "style_rules", "state"]; + + Object.keys(obj) + .filter(attr => !excludeKeys.includes(attr)) + .forEach(attr => { + if (attr === "class") { + node.classList.add(...obj[attr].split(" ").filter(s => s !== "")); + } else { + node[attr] = obj[attr]; + } + }); + if (obj.contents && typeof obj.contents === "string") { + node.innerHTML = obj.contents; + } else { + obj.contents && + obj.contents.length > 0 && + obj.contents.forEach(el => { + switch (typeof el) { + case "string": + node.innerHTML = el; + break; + case "object": + node.appendChild(objectToHtml(el)); + break; + } + }); + } + + if (obj.style_rules) { + Object.keys(obj.style_rules).forEach(rule => { + node.style[rule] = obj.style_rules[rule]; + }); + } + + return node; + }, + renderCycle: function () { + this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], { + mode: "replace", + }); + }, + subRender(object, htmlNode, options = { mode: "append" }) { + const insert = this.objectToHtml(object); + switch (options.mode) { + case "append": + htmlNode.appendChild(insert); + break; + case "override": + htmlNode.innerHTML = ""; + htmlNode.appendChild(insert); + break; + case "insert-before": + htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]); + break; + case "adjacent": + /** + * options.insertLocation must be one of: + * + * afterbegin + * afterend + * beforebegin + * beforeend + */ + htmlNode.insertAdjacentHTML(options.insertLocation, insert); + break; + case "replace": + htmlNode.parentNode.replaceChild(insert, htmlNode); + break; + case "remove": + htmlNode.remove(); + break; + } + }, +}; + +},{}],4:[function(require,module,exports){ +"use strict"; + +const objectHtmlRenderer = require("object-to-html-renderer") + +class ImageCarousel { + constructor(props) { + this.props = props; + this.id = performance.now(); + this.state = { + showImageIndex: 0, + }; + this.RUN_INTERVAL = 5000; + this.props.images.length > 1 && this.run(); + } + + run() { + this.runningInterval = setInterval(() => { + let { showImageIndex } = this.state; + const { images } = this.props; + this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0; + this.refreshImage(); + }, this.RUN_INTERVAL); + } + + setImageIndex(i) { + clearInterval(this.runningInterval); + this.state.showImageIndex = i; + this.refreshImage(); + } + + refreshImage() { + objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), { + mode: "replace", + }); + } + + render() { + const { showImageIndex } = this.state; + const { images } = this.props; + return { + tag: "div", + id: this.id, + class: "image-carousel", + contents: [ + { + tag: "img", + property: "image", + alt: `image carousel ${images[showImageIndex].replace(/\.[A-Za-z]+/, "")}`, + src: images[showImageIndex], + }, + images.length > 1 && { + tag: "div", + class: "carousel-bullets", + contents: images.map((_, i) => { + const active = showImageIndex === i; + return { + tag: "span", + class: `bullet ${active ? "active" : ""}`, + onclick: this.setImageIndex.bind(this, i), + }; + }), + }, + ], + }; + } +} + +module.exports = ImageCarousel; + +},{"object-to-html-renderer":3}],5:[function(require,module,exports){ +"use strict"; + +class KuadradoValues { + render() { + return { + tag: "section", + class: "kuadrado-values", + contents: [ + { + tag: "div", + class: "page-contents-center", + contents: [ + { + tag: "h2", + contents: "<blue>Éthique</blue>", + }, + { + tag: "ul", + class: "values-list", + contents: [ + [ + "<emoji>📖</emoji> <blue>Partage des connaissances</blue>", + `Pour sortir de l'élitisme de l'ingénierie, pour sortir de la domination par l'obscurantisme et de la consommation aveugle, + pour aller plus loin ensemble, le partage du savoir est fondamental.`, + ], + [ + "<emoji>💻</emoji> <blue>Logiciels libres et open source</blue>", + `Toutes mes productions numériques, jeux vidéo, web, software, sont <b><a href="https://fr.wikipedia.org/wiki/Logiciel_libre" target="_blank">libres et open source</a></b>. - <br/> ainsi que les outils engagés dans leur fabrication.`],["<emoji>🌿</emoji> <blue>Écologie</blue>",`Nous vivons une époque ou l'utilisation de la technologie connaît une croissance exponentielle notament + <br/> ainsi que les outils engagés dans leur fabrication.`, + ], + [ + "<emoji>🌿</emoji> <blue>Écologie</blue>", + `Nous vivons une époque ou l'utilisation de la technologie connaît une croissance exponentielle notament à travers internet. <br/>Il est primordial de construire le numérique dans une direction de légèreté et d'économie de - ressources.`]].map(e=>{var[t,e]=e;return{tag:"li",contents:[{tag:"h3",contents:t},{tag:"p",contents:e}]}})}]}]}}}},{}],6:[function(e,t,s){"use strict";const{articles_url:n}=e("../../constants"),r=e("object-to-html-renderer"),a=e("../generic-components/image-carousel"),{loadArticles:o,getArticleDate:i,getArticleBody:c}=e("../lib/article-utils");t.exports=class{constructor(){this.id=performance.now().toString(),this.state={loading:!0,articles:[],showArticleIndex:-1},this.loadArticles()}loadArticles(){o(`${n}news`).then(e=>{this.state.articles=e,this.state.showArticleIndex=this.state.articles.length-1,this.refresh()})}refresh(){r.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}renderArticle(t){return{tag:"article",class:`${t.images?"grid-2":"grid-1"}`,typeof:"Article",contents:[{tag:"div",class:"date",contents:[{tag:"time",property:"datePublished",contents:i(t.date)}]},{tag:"div",class:"title",contents:[{tag:"h3",contents:t.title,property:"headline"}]},{tag:"div",class:"subtitle",contents:[{tag:"strong",contents:t.subtitle,property:"alternativeHeadline"}]},{tag:"div",class:"body",contents:[{tag:"p",contents:c(t.body),property:"articleBody"}]},t.images&&new a({images:t.images.map(e=>`${t.path}/images/${e}`)}).render()]}}renderArticlePlaceholder(){return{tag:"article",class:"article-placeholder",contents:[{tag:"div",class:"date"},{tag:"div",class:"title"},{tag:"div",class:"subtitle"},{tag:"div",class:"body"},{tag:"div",class:"image-carousel"}]}}handleChangeArticle(e){let{showArticleIndex:t,articles:s}=this.state;t="prev"===e?0<=t-1?t-1:0:t+1<=s.length-1?t+1:s.length-1,this.state.showArticleIndex=t,this.refresh()}render(){var{articles:e,showArticleIndex:t}=this.state,s=t<e.length-1,n=0<t;return{tag:"div",id:this.id,class:"articles-displayer page-contents-center",contents:0<e.length?[this.renderArticle(e[t]),{tag:"div",class:"prev-next-buttons",contents:[{tag:"button",class:`prev-btn ${n?"active":"disabled"}`,contents:"Précédent",onclick:this.handleChangeArticle.bind(this,"prev")},{tag:"button",class:`next-btn ${s?"active":"disabled"}`,contents:"Suivant",onclick:this.handleChangeArticle.bind(this,"next")}]}]:[this.renderArticlePlaceholder()]}}}},{"../../constants":2,"../generic-components/image-carousel":4,"../lib/article-utils":10,"object-to-html-renderer":3}],7:[function(e,t,s){"use strict";const{images_url:n}=e("../../constants");t.exports=class{constructor(e){this.props=e}render(){return{tag:"a",class:"theme-card",href:this.props.href,contents:[{tag:"div",class:"card-img",contents:[{tag:"img",alt:`thematic image ${this.props.img.replace(/\.[A-Za-z]+/,"")}`,src:`${n}${this.props.img}`}]},{tag:"div",class:"card-title",contents:[{tag:"h2",class:"section-title",contents:this.props.title}]},{tag:"div",class:"card-description",contents:[{tag:"p",contents:this.props.description}]}]}}}},{"../../constants":2}],8:[function(e,t,s){"use strict";t.exports=class{render(){return{tag:"section",id:"whoami",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"h2",contents:"Qui sommes-nous-je ?"},{tag:"div",class:"presentation-card",contents:[{tag:"div",class:"header",contents:[{tag:"div",class:"pic",contents:[{tag:"img",alt:"portrait Pierre Jarriges pixel art by Lucie Ventadour",src:"assets/images/pijar_profile_lt_square.png"}]},{tag:"div",class:"header-text",contents:[{tag:"h3",contents:"Pierre Jarriges"},{tag:"h4",contents:"Artiste, auteur BD, compositeur, développeur informatique"},{tag:"strong",contents:"Créateur de <blue>Kuadrado Software</blue> en Février 2021."}]}]},{tag:"div",class:"body",contents:[{tag:"p",contents:` + ressources.`, + ], + ].map(v => { + const [title, body] = v; + return { + tag: "li", + contents: [ + { tag: "h3", contents: title }, + { tag: "p", contents: body }, + ], + }; + }), + }, + ], + }, + ], + }; + } +} + +module.exports = KuadradoValues; + +},{}],6:[function(require,module,exports){ +"use strict"; + +const { articles_url } = require("../../constants"); +const objectHtmlRenderer = require("object-to-html-renderer"); +const ImageCarousel = require("../generic-components/image-carousel"); +const { loadArticles, getArticleDate, getArticleBody } = require("../lib/article-utils"); + +class NewsArticles { + constructor() { + this.id = performance.now().toString(); + this.state = { + loading: true, + articles: [], + showArticleIndex: -1, + }; + this.loadArticles(); + } + + loadArticles() { + loadArticles(`${articles_url}news`).then(articles => { + this.state.articles = articles; + this.state.showArticleIndex = this.state.articles.length - 1; + this.refresh(); + }); + } + + refresh() { + objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), { + mode: "replace", + }); + } + + renderArticle(articleData) { + return { + tag: "article", + class: `${articleData.images ? "grid-2" : "grid-1"}`, + typeof: "Article", + contents: [ + { + tag: "div", + class: "date", + contents: [ + { + tag: "time", + property: "datePublished", + contents: getArticleDate(articleData.date), + }, + ], + }, + { + tag: "div", + class: "title", + contents: [ + { + tag: "h3", + contents: articleData.title, + property: "headline", + }, + ], + }, + { + tag: "div", + class: "subtitle", + contents: [ + { + tag: "strong", + contents: articleData.subtitle, + property: "alternativeHeadline", + }, + ], + }, + { + tag: "div", + class: "body", + contents: [ + { + tag: "p", + contents: getArticleBody(articleData.body), + property: "articleBody", + }, + ], + }, + articleData.images && + new ImageCarousel({ + images: articleData.images.map(img => `${articleData.path}/images/${img}`), + }).render(), + ], + }; + } + + renderArticlePlaceholder() { + return { + tag: "article", + class: "article-placeholder", + contents: [ + { tag: "div", class: "date" }, + { tag: "div", class: "title" }, + { tag: "div", class: "subtitle" }, + { tag: "div", class: "body" }, + { tag: "div", class: "image-carousel" }, + ], + }; + } + + handleChangeArticle(dir) { + let { showArticleIndex, articles } = this.state; + showArticleIndex = + dir === "prev" + ? showArticleIndex - 1 >= 0 + ? showArticleIndex - 1 + : 0 + : showArticleIndex + 1 <= articles.length - 1 + ? showArticleIndex + 1 + : articles.length - 1; + this.state.showArticleIndex = showArticleIndex; + this.refresh(); + } + + render() { + const { articles, showArticleIndex } = this.state, + showNext = showArticleIndex < articles.length - 1, + showPrev = showArticleIndex > 0; + return { + tag: "div", + id: this.id, + class: "articles-displayer page-contents-center", + contents: + articles.length > 0 + ? [ + this.renderArticle(articles[showArticleIndex]), + { + tag: "div", + class: "prev-next-buttons", + contents: [ + { + tag: "button", + class: `prev-btn ${!showPrev ? "disabled" : "active"}`, + contents: "Précédent", + onclick: this.handleChangeArticle.bind(this, "prev"), + }, + { + tag: "button", + class: `next-btn ${!showNext ? "disabled" : "active"}`, + contents: "Suivant", + onclick: this.handleChangeArticle.bind(this, "next"), + }, + ], + }, + ] + : [this.renderArticlePlaceholder()], + }; + } +} + +module.exports = NewsArticles; + +},{"../../constants":2,"../generic-components/image-carousel":4,"../lib/article-utils":10,"object-to-html-renderer":3}],7:[function(require,module,exports){ +"use strict"; + +const { images_url } = require("../../constants"); + +class ThemeCard { + constructor(props) { + this.props = props; + } + + render() { + return { + tag: "a", + class: "theme-card", + href: this.props.href, + contents: [ + { + tag: "div", + class: "card-img", + contents: [{ tag: "img", alt:`thematic image ${this.props.img.replace(/\.[A-Za-z]+/, "")}`,src: `${images_url}${this.props.img}` }], + }, + { + tag: "div", + class: "card-title", + contents: [{ tag: "h2", class: "section-title", contents: this.props.title }], + }, + { + tag: "div", + class: "card-description", + contents: [{ tag: "p", contents: this.props.description }], + }, + ], + }; + } +} + +module.exports = ThemeCard; + +},{"../../constants":2}],8:[function(require,module,exports){ +"use strict"; + +class WhoAmI { + render() { + return { + tag: "section", + id: "whoami", + contents: [ + { + tag: "div", + class: "page-contents-center", + contents: [ + { + tag: "h2", + contents: "Qui sommes-nous-je ?", + }, + { + tag: "div", + class: "presentation-card", + contents: [ + { + tag: "div", + class: "header", + contents: [ + { + tag: "div", + class: "pic", + contents: [ + { + tag: "img", + alt: + "portrait Pierre Jarriges pixel art by Lucie Ventadour", + src: "assets/images/pijar_profile_lt_square.png", + }, + ], + }, + { + tag: "div", + class: "header-text", + contents: [ + { + tag: "h3", + contents: "Pierre Jarriges", + }, + { + tag: "h4", + contents: + "Artiste, auteur BD, compositeur, développeur informatique", + }, + { + tag: "strong", + contents: + "Créateur de <blue>Kuadrado Software</blue> en Février 2021.", + }, + ], + }, + ], + }, + { + tag: "div", + class: "body", + contents: [ + { + tag: "p", + contents: ` “ La création de <b><blue>Kuadrado Software</blue></b> vient de la volonté de développer différents axes ensembles : <br /><br /> <emoji>🎮</emoji> D'une part exprimer une passion en créant des <b>jeux vidéo indépendants</b> sur un modèle léger et artisanal dans @@ -24,5 +515,467 @@ dans le même état d'esprit, former des équipes de travail et de création, et s'inscrire dans un tissu local de savoir-faire, tout en gardant un modèle d'entreprise basé sur l'indépendance, afin de rester aussi léger, libéral, et modulaire que possible.†- `}]}]}]}]}}}},{}],9:[function(e,t,s){"use strict";const{images_url:n}=e("../constants"),r=e("./home-page-components/kuadrado-values"),a=e("./home-page-components/news-articles"),o=e("./home-page-components/theme-card"),i=e("./home-page-components/whoami");class c extends e("./lib/web-page"){render(){return{tag:"div",id:"home-page",contents:[{tag:"div",class:"page-header",contents:[{tag:"div",class:"big-logo page-contents-center",contents:[{tag:"img",alt:"logo Kuadrado",src:`${n}logo_kuadrado.svg`},{tag:"img",class:"logo-text",alt:"Kuadrado",src:`${n}logo_kuadrado_txt.svg`}]},{tag:"h1",contents:"Kuadrado Software",class:"page-contents-center"},{tag:"p",class:"page-contents-center",contents:"Créations numériques, jeux vidéo, pédagogie."},{tag:"ul",class:"philo-bubbles",contents:["Simplicité","Légèreté","Écologie"].map(e=>({tag:"li",contents:[{tag:"span",contents:e}]}))}]},{tag:"section",class:"page-contents-center poles",contents:[{title:"Jeux",img:"game_controller.svg",href:"/games/",description:"Créations vidéoludiques, jeux web et jeux PC, projets en cours."},{title:"Pédagogie",img:"brain.svg",href:"/education/",description:"S'approprier la technologie par le partage de connaissances."},{title:"Software",img:"meca_proc.svg",href:"/software-development/",description:"R&D, projets expérimentaux, web et outillage logiciel"}].map(e=>new o(e).render())},{tag:"section",class:"page-philo",contents:[{tag:"p",class:"page-contents-center",contents:"Travailler pour le plaisir de créer, de maîtriser et de comprendre."}]},{tag:"section",class:"page-contents-center",id:"news",contents:[{tag:"h2",contents:"Actu",class:"section-title"},(new a).render()]},(new r).render(),(new i).render()]}}}t.exports=c},{"../constants":2,"./home-page-components/kuadrado-values":5,"./home-page-components/news-articles":6,"./home-page-components/theme-card":7,"./home-page-components/whoami":8,"./lib/web-page":12}],10:[function(e,t,s){"use strict";const{fetchjson:a,fetchtext:n}=e("./fetch");function o(e){return new Promise((t,s)=>{Promise.all(e.map(async e=>{var t;return-1!==e.body.indexOf("<file>")&&(t=e.body.replace("<file>",""),t=await n(`${e.path}/${t}`),e.body=t,e.date=e.date?new Date(e.date):void 0),e})).then(e=>t(e.sort((e,t)=>e.date-t.date))).catch(e=>s(e))})}t.exports={loadArticles:function(r){return new Promise((t,s)=>{a(`${r}/index.json`).then(e=>{Promise.all(e.articles.map(async e=>{const t=`${e}/${e}.json`;var s=await a(`${r}/${t}`);const n=t.split("/");n.pop();e=`${r}/${n.join("/")}`;return Object.assign(s,{path:e})})).then(e=>{o(e).then(e=>t(e)).catch(e=>s(e))}).catch(e=>s(e))}).catch(e=>console.log(e))})},getArticleBody:function(e){return e.replaceAll("\n","<br/>")},getArticleDate:function(e){return`${e.getDate()}-${e.getMonth()+1}-${e.getFullYear()}`},populateArticles:o}},{"./fetch":11}],11:[function(e,t,s){"use strict";t.exports={fetchjson:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.json()).then(e=>t(e)).catch(e=>s(e))})},fetchtext:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.text()).then(e=>t(e)).catch(e=>s(e))})}}},{}],12:[function(e,t,s){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],13:[function(e,t,s){"use strict";var n=e("./homepage");const r=e("./run-page");r(n)},{"./homepage":9,"./run-page":14}],14:[function(e,t,s){"use strict";const n=e("object-to-html-renderer"),r=e("./template/template");t.exports=function(e){e=new r({page:new e});n.setRenderCycleRoot(e),n.renderCycle()}},{"./template/template":16,"object-to-html-renderer":3}],15:[function(e,t,s){"use strict";const{images_url:n}=e("../../../constants"),r=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${n}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${n}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,a=!1,o=""){return{tag:"ul",id:"nav-menu-list",class:a?"submenu":"",contents:e.map(e=>{const{url:t,text:s,submenu:n}=e,r=`${o}${t}`;return{tag:"li",class:a||window.location.pathname!==r?"":"active",contents:[{tag:"a",href:r,contents:s}].concat(n?[this.renderMenu(n,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(r)]}}}},{"../../../constants":2}],16:[function(e,t,s){"use strict";const{in_construction:n}=e("../../config"),{images_url:r}=e("../../constants"),a=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new a).render()]},n&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${r}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${r}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | - Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":15}]},{},[13]); \ No newline at end of file + `, + }, + ], + }, + ], + }, + ], + }, + ], + }; + } +} + +module.exports = WhoAmI; + +},{}],9:[function(require,module,exports){ +"use strict"; + +const { images_url } = require("../constants"); +const KuadradoValues = require("./home-page-components/kuadrado-values"); +const NewsArticles = require("./home-page-components/news-articles"); +const ThemeCard = require("./home-page-components/theme-card"); +const WhoAmI = require("./home-page-components/whoami"); +const WebPage = require("./lib/web-page"); + +class HomePage extends WebPage { + render() { + return { + tag: "div", + id: "home-page", + contents: [ + { + tag: "div", + class: "page-header", + contents: [ + { + tag: "div", + class: "big-logo page-contents-center", + contents: [ + { + tag: "img", + alt: "logo Kuadrado", + src: `${images_url}logo_kuadrado.svg`, + }, + { + tag: "img", + class: "logo-text", + alt: "Kuadrado", + src: `${images_url}logo_kuadrado_txt.svg`, + }, + ], + }, + { tag: "h1", contents: "Kuadrado Software", class: "page-contents-center" }, + { + tag: "p", + class: "page-contents-center", + contents: `Créations numériques, jeux vidéo, pédagogie.`, + }, + { + tag: "ul", + class: "philo-bubbles", + contents: ["Simplicité", "Légèreté", "Écologie"].map(word => { + return { + tag: "li", + contents: [{ tag: "span", contents: word }], + }; + }), + }, + ], + }, + { + tag: "section", + class: "page-contents-center poles", + contents: [ + { + title: "Jeux", + img: "game_controller.svg", + href: "/games/", + description: + "Créations vidéoludiques, jeux web et jeux PC, projets en cours.", + }, + { + title: "Pédagogie", + img: "brain.svg", + href: "/education/", + description: `S'approprier la technologie par le partage de connaissances.`, + }, + { + title: "Software", + img: "meca_proc.svg", + href: "/software-development/", + description: `R&D, projets expérimentaux, web et outillage logiciel`, + }, + ].map(cardProps => new ThemeCard(cardProps).render()), + }, + { + tag: "section", + class: "page-philo", + contents: [ + { + tag: "p", + class: "page-contents-center", + contents: `Travailler pour le plaisir de créer, de maîtriser et de comprendre.`, + }, + ], + }, + { + tag: "section", + class: "page-contents-center", + id:"news", + contents: [ + { tag: "h2", contents: "Actu", class: "section-title" }, + new NewsArticles().render(), + ], + }, + new KuadradoValues().render(), + new WhoAmI().render(), + ], + }; + } +} + +module.exports = HomePage; + +},{"../constants":2,"./home-page-components/kuadrado-values":5,"./home-page-components/news-articles":6,"./home-page-components/theme-card":7,"./home-page-components/whoami":8,"./lib/web-page":12}],10:[function(require,module,exports){ +"use strict"; + +const { fetchjson, fetchtext } = require("./fetch"); + +function getArticleBody(text) { + return text.replaceAll("\n", "<br/>"); +} + +function getArticleDate(date) { + return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`; +} + +function loadArticles(dir_url) { + return new Promise((resolve, reject) => { + fetchjson(`${dir_url}/index.json`) + .then(json => { + Promise.all( + json.articles.map(async artDir => { + const artPath = `${artDir}/${artDir}.json`; + const art = await fetchjson(`${dir_url}/${artPath}`); + const tmpSplit = artPath.split("/"); + tmpSplit.pop(); + const absArtPath = `${dir_url}/${tmpSplit.join("/")}`; + return Object.assign(art, { path: absArtPath }); + }) + ) + .then(articles => { + populateArticles(articles) + .then(completeArticles => resolve(completeArticles)) + .catch(e => reject(e)); + }) + .catch(e => reject(e)); + }) + .catch(e => console.log(e)); + }); +} + +function populateArticles(articles) { + return new Promise((resolve, reject) => { + Promise.all( + articles.map(async article => { + if (article.body.indexOf("<file>") !== -1) { + const txtPath = article.body.replace("<file>", ""); + const textValue = await fetchtext(`${article.path}/${txtPath}`); + article.body = textValue; + article.date = article.date ? new Date(article.date) : undefined; + } + return article; + }) + ) + .then(completeArticles => resolve(completeArticles.sort((a, b) => b.date - a.date))) + .catch(e => reject(e)); + }); +} + +module.exports = { + loadArticles, + getArticleBody, + getArticleDate, + populateArticles, +}; + +},{"./fetch":11}],11:[function(require,module,exports){ +"use strict"; + +function fetchjson(url) { + return new Promise((resolve, reject) => { + fetch(url) + .then(r => r.json()) + .then(r => resolve(r)) + .catch(e => reject(e)); + }); +} + +function fetchtext(url) { + return new Promise((resolve, reject) => { + fetch(url) + .then(r => r.text()) + .then(r => resolve(r)) + .catch(e => reject(e)); + }); +} + +module.exports = { + fetchjson, + fetchtext, +}; + +},{}],12:[function(require,module,exports){ +"use strict"; + +class WebPage { + constructor(args) { + Object.assign(this, args); + } +} + +module.exports = WebPage; +},{}],13:[function(require,module,exports){ +"use strict"; + +const HomePage = require("./homepage"); +const runPage = require("./run-page"); + +runPage(HomePage); + +},{"./homepage":9,"./run-page":14}],14:[function(require,module,exports){ +"use strict"; + +const objectHtmlRenderer = require("object-to-html-renderer") +const Template = require("./template/template"); + +module.exports = function runPage(PageComponent) { + const template = new Template({ page: new PageComponent() }); + objectHtmlRenderer.setRenderCycleRoot(template); + objectHtmlRenderer.renderCycle(); +}; + +},{"./template/template":16,"object-to-html-renderer":3}],15:[function(require,module,exports){ +"use strict"; + +const { images_url } = require("../../../constants"); + +const NAV_MENU_ITEMS = [ + { url: "/games/", text: "Jeux" }, + { + url: "/education/", + text: "Pédagogie", + // submenu: [ + // { url: "/gamedev", text: "Création de jeux vidéo" }, + // ] + }, + { url: "/software-development/", text: "Software" } +]; + +class NavBar { + constructor() { + this.initEventHandlers(); + } + + handleBurgerClick() { + document.getElementById("nav-menu-list").classList.toggle("responsive-show"); + } + + initEventHandlers() { + window.addEventListener("click", event => { + if ( + event.target.id !== "nav-menu-list" && + !event.target.classList.contains("burger") && + !event.target.parentNode.classList.contains("burger") + ) { + document.getElementById("nav-menu-list").classList.remove("responsive-show"); + } + }); + } + + renderHome() { + return { + tag: "div", + class: "home", + contents: [ + { + tag: "a", + href: "/", + contents: [ + { + tag: "img", + alt: "Logo Kuadrado", + src: `${images_url}logo_kuadrado.svg`, + }, + { + tag: "img", + alt: "Kuadrado Software", + class: "logo-text", + src: `${images_url}logo_kuadrado_txt.svg`, + }, + ], + }, + ], + }; + } + + renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") { + return { + tag: "ul", + id: "nav-menu-list", + class: isSubmenu ? "submenu" : "", + contents: menuItemsArray.map(item => { + const { url, text, submenu } = item; + const href = `${parentUrl}${url}`; + return { + tag: "li", + class: !isSubmenu && window.location.pathname === href ? "active" : "", + contents: [ + { + tag: "a", + href, + contents: text, + }, + ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []), + }; + }), + }; + } + + renderResponsiveBurger() { + return { + tag: "div", + class: "burger", + onclick: this.handleBurgerClick.bind(this), + contents: [{ tag: "span", contents: "···" }], + }; + } + + render() { + return { + tag: "nav", + contents: [ + this.renderHome(), + this.renderResponsiveBurger(), + this.renderMenu(NAV_MENU_ITEMS), + ], + }; + } +} + +module.exports = NavBar; + +},{"../../../constants":2}],16:[function(require,module,exports){ +"use strict"; + +const { in_construction } = require("../../config"); +const { images_url } = require("../../constants"); +const NavBar = require("./components/navbar"); + +class Template { + constructor(props) { + this.props = props; + } + render() { + return { + tag: "main", + contents: [ + { + tag: "header", + contents: [new NavBar().render()], + }, + in_construction && { + tag: "section", + class: "warning-banner", + contents: [ + { + tag: "strong", + class: "page-contents-center", + contents: "Site en construction ...", + }, + ], + }, + { + tag: "section", + id: "page-container", + contents: [this.props.page.render()], + }, + { + tag: "footer", + contents: [ + { + tag: "div", + class: "logo", + contents: [ + { + tag: "img", + alt: `logo Kuadrado`, + src: `${images_url}logo_kuadrado.svg`, + }, + { + tag: "img", + class: "text-logo", + alt: "Kuadrado Software", + src: `${images_url}logo_kuadrado_txt.svg`, + }, + ], + }, + { + tag: "span", + contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France", + }, + { + tag: "div", + contents: [ + { tag: "strong", contents: "<blue>Contact : </blue>" }, + { + tag: "a", + href: "mailto:contact@kuadrado-software.fr", + contents: "contact@kuadrado-software.fr", + }, + ], + }, + { + tag: "div", + class: "social", + contents: [ + { + tag: "strong", + contents: "<blue>Sur les réseaux : </blue>", + }, + { + tag: "a", + href: "https://www.linkedin.com/company/kuadrado-software", + target: "_blank", + contents: "in", + title: "Linkedin", + }, + { + tag: "a", + href: "https://twitter.com/KuadradoSoft", + target: "_blank", + contents: "t", + title: "Twitter", + style_rules: { fontFamily: "serif" }, + }, + ], + }, + { + tag: "span", + contents: `Copyright © ${new Date() + .getFullYear()} Kuadrado Software | + Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`, + }, + ], + }, + ], + }; + } +} + +module.exports = Template; + +},{"../../config":1,"../../constants":2,"./components/navbar":15}]},{},[13]); diff --git a/public/software-development/software-development.js b/public/software-development/software-development.js index f17ce36..43b6a97 100644 --- a/public/software-development/software-development.js +++ b/public/software-development/software-development.js @@ -1,2 +1,811 @@ -!function s(r,a,o){function c(t,e){if(!a[t]){if(!r[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(i)return i(t,!0);throw(n=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",n}n=a[t]={exports:{}},r[t][0].call(n.exports,function(e){return c(r[t][1][e]||e)},n,n.exports,s,r,a,o)}return a[t].exports}for(var i="function"==typeof require&&require,e=0;e<o.length;e++)c(o[e]);return c}({1:[function(e,t,n){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,n){const{getServerUrl:s}=e("./config");t.exports={images_url:`${s()}assets/images/`,articles_url:`${s()}articles/`}},{"./config":1}],3:[function(e,t,n){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(n){var{tag:e}=n;const s=document.createElement(e),r=["tag","contents","style_rules","state"];return Object.keys(n).filter(e=>!r.includes(e)).forEach(e=>{"class"===e?s.classList.add(...n[e].split(" ").filter(e=>""!==e)):s[e]=n[e]}),n.contents&&"string"==typeof n.contents?s.innerHTML=n.contents:n.contents&&0<n.contents.length&&n.contents.forEach(e=>{switch(typeof e){case"string":s.innerHTML=e;break;case"object":s.appendChild(t(e))}}),n.style_rules&&Object.keys(n.style_rules).forEach(e=>{s.style[e]=n.style_rules[e]}),s},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,n={mode:"append"}){var s=this.objectToHtml(e);switch(n.mode){case"append":t.appendChild(s);break;case"override":t.innerHTML="",t.appendChild(s);break;case"insert-before":t.insertBefore(s,t.childNodes[n.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(n.insertLocation,s);break;case"replace":t.parentNode.replaceChild(s,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,n){"use strict";const s=e("object-to-html-renderer");t.exports=class{constructor(e){this.props=e,this.id=performance.now(),this.state={showImageIndex:0},this.RUN_INTERVAL=5e3,1<this.props.images.length&&this.run()}run(){this.runningInterval=setInterval(()=>{var{showImageIndex:e}=this.state,{images:t}=this.props;this.state.showImageIndex=e<t.length-1?++e:0,this.refreshImage()},this.RUN_INTERVAL)}setImageIndex(e){clearInterval(this.runningInterval),this.state.showImageIndex=e,this.refreshImage()}refreshImage(){s.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{showImageIndex:n}=this.state,{images:e}=this.props;return{tag:"div",id:this.id,class:"image-carousel",contents:[{tag:"img",property:"image",alt:`image carousel ${e[n].replace(/\.[A-Za-z]+/,"")}`,src:e[n]},1<e.length&&{tag:"div",class:"carousel-bullets",contents:e.map((e,t)=>{return{tag:"span",class:`bullet ${n===t?"active":""}`,onclick:this.setImageIndex.bind(this,t)}})}]}}}},{"object-to-html-renderer":3}],5:[function(e,t,n){"use strict";const{fetchjson:a,fetchtext:s}=e("./fetch");function o(e){return new Promise((t,n)=>{Promise.all(e.map(async e=>{var t;return-1!==e.body.indexOf("<file>")&&(t=e.body.replace("<file>",""),t=await s(`${e.path}/${t}`),e.body=t,e.date=e.date?new Date(e.date):void 0),e})).then(e=>t(e.sort((e,t)=>e.date-t.date))).catch(e=>n(e))})}t.exports={loadArticles:function(r){return new Promise((t,n)=>{a(`${r}/index.json`).then(e=>{Promise.all(e.articles.map(async e=>{const t=`${e}/${e}.json`;var n=await a(`${r}/${t}`);const s=t.split("/");s.pop();e=`${r}/${s.join("/")}`;return Object.assign(n,{path:e})})).then(e=>{o(e).then(e=>t(e)).catch(e=>n(e))}).catch(e=>n(e))}).catch(e=>console.log(e))})},getArticleBody:function(e){return e.replaceAll("\n","<br/>")},getArticleDate:function(e){return`${e.getDate()}-${e.getMonth()+1}-${e.getFullYear()}`},populateArticles:o}},{"./fetch":6}],6:[function(e,t,n){"use strict";t.exports={fetchjson:function(e){return new Promise((t,n)=>{fetch(e).then(e=>e.json()).then(e=>t(e)).catch(e=>n(e))})},fetchtext:function(e){return new Promise((t,n)=>{fetch(e).then(e=>e.text()).then(e=>t(e)).catch(e=>n(e))})}}},{}],7:[function(e,t,n){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],8:[function(e,t,n){"use strict";const{articles_url:s}=e("../../../../constants"),i=e("../../../generic-components/image-carousel"),{loadArticles:r,getArticleBody:l,getArticleDate:d}=e("../../../lib/article-utils"),a=e("object-to-html-renderer");class o{constructor(e){this.props=e}render(){const{title:e,date:t,body:n,subtitle:s,images:r,path:a,technical:o,releases:c}=this.props;return{tag:"article",class:"software-article",typeof:"SoftwareApplication",additionalType:"Article",contents:[{tag:"h2",class:"software-title",contents:e,property:"name"},{tag:"time",class:"software-date",contents:d(t),property:"datePublished"},{tag:"h3",class:"software-subtitle",contents:s,property:"alternativeHeadline"},{tag:"div",class:"software-description",contents:l(n),property:"description"},new i({images:r.map(e=>`${a}/images/${e}`)}).render(),{tag:"div",class:"software-technical",contents:[{tag:"h2",contents:"Details"},{tag:"ul",class:"technical-details",contents:[{tag:"li",class:"detail",contents:[{tag:"label",contents:"Stack"},{tag:"div",contents:[{tag:"ul",contents:o.stack.map(e=>({tag:"li",contents:e,property:"about"}))}]}]},{tag:"li",class:"detail",contents:[{tag:"label",contents:"Version actuelle"},{tag:"div",contents:o.version,property:"version"}]},{tag:"li",class:"detail",contents:[{tag:"label",contents:"License"},{tag:"div",contents:o.license,property:"license"}]},{tag:"li",class:"detail",contents:[{tag:"label",contents:"Code source"},{tag:"a",href:o.repository,target:"_blank",contents:o.repository.replace(/https?:\/\/(www\.)?/g,""),property:"url"}]}]},c&&{tag:"h2",contents:"Releases"},c&&{tag:"ul",class:"releases",contents:[{tag:"li",class:"detail",contents:[{tag:"label",class:"label",contents:"Plateforme"},{tag:"label",class:"label",contents:"Téléchargement"}]}].concat(c.map(e=>({tag:"li",class:"release detail",contents:[{tag:"label",contents:e.platform},{tag:"a",download:e.download,href:`${a}/release/${e.download}`,contents:e.download,property:"url"}]})))}]}]}}}t.exports=class{constructor(e){this.props=e,this.state={articles:[]},this.id=performance.now(),this.loadArticles()}loadArticles(){r(`${s}software`).then(e=>{this.state.articles=e,this.refresh(),this.fixScroll()}).catch(e=>console.log(e))}renderPlaceholder(){return{tag:"article",class:"placeholder",contents:[{tag:"div",class:"title"},{tag:"div",class:"body"},{tag:"div",class:"details"}]}}refresh(){a.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}fixScroll(){window.location.href.includes("#")&&window.scrollTo(0,document.getElementById(window.location.href.match(/#.+/)[0].replace("#","")).offsetTop)}render(){const{articles:e}=this.state;return{tag:"section",class:"software-articles page-contents-center",id:this.id,contents:0<e.length?e.map(e=>new o({...e}).render()):[this.renderPlaceholder()]}}}},{"../../../../constants":2,"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5,"object-to-html-renderer":3}],9:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants");var r=e("../../lib/web-page");const a=e("./components/software-articles");class o extends r{render(){return{tag:"div",id:"software-page",contents:[{tag:"div",class:"page-header logo-left",contents:[{tag:"div",class:"page-contents-center grid-wrapper",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"image mechanic electronic",src:`${s}meca_proc.svg`}]},{tag:"h1",contents:"Software"},{tag:"p",contents:"R&D, projets expérimentaux, outillage logiciel pour le développement de jeu ou pour le web."}]}]},(new a).render()]}}}t.exports=o},{"../../../constants":2,"../../lib/web-page":7,"./components/software-articles":8}],10:[function(e,t,n){"use strict";const s=e("../../run-page");e=e("./software-development");s(e)},{"../../run-page":11,"./software-development":9}],11:[function(e,t,n){"use strict";const s=e("object-to-html-renderer"),r=e("./template/template");t.exports=function(e){e=new r({page:new e});s.setRenderCycleRoot(e),s.renderCycle()}},{"./template/template":13,"object-to-html-renderer":3}],12:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants"),r=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${s}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${s}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,a=!1,o=""){return{tag:"ul",id:"nav-menu-list",class:a?"submenu":"",contents:e.map(e=>{const{url:t,text:n,submenu:s}=e,r=`${o}${t}`;return{tag:"li",class:a||window.location.pathname!==r?"":"active",contents:[{tag:"a",href:r,contents:n}].concat(s?[this.renderMenu(s,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(r)]}}}},{"../../../constants":2}],13:[function(e,t,n){"use strict";const{in_construction:s}=e("../../config"),{images_url:r}=e("../../constants"),a=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new a).render()]},s&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${r}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${r}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | - Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":12}]},{},[10]); \ No newline at end of file +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ +function getServerUrl() { + return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : "" + }`; +} + +module.exports = { + getServerUrl, + build: { + protected_dirs: ["assets", "style", "articles"], + default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"], + }, +}; + +},{}],2:[function(require,module,exports){ +const { getServerUrl } = require("./config"); + +module.exports = { + images_url: `${getServerUrl()}assets/images/`, + articles_url: `${getServerUrl()}articles/`, +}; + +},{"./config":1}],3:[function(require,module,exports){ +"use strict"; + +module.exports = { + setRenderCycleRoot(renderCycleRoot) { + this.renderCycleRoot = renderCycleRoot; + }, + objectToHtml: function objectToHtml(obj) { + const { tag } = obj; + + const node = document.createElement(tag); + const excludeKeys = ["tag", "contents", "style_rules", "state"]; + + Object.keys(obj) + .filter(attr => !excludeKeys.includes(attr)) + .forEach(attr => { + if (attr === "class") { + node.classList.add(...obj[attr].split(" ").filter(s => s !== "")); + } else { + node[attr] = obj[attr]; + } + }); + if (obj.contents && typeof obj.contents === "string") { + node.innerHTML = obj.contents; + } else { + obj.contents && + obj.contents.length > 0 && + obj.contents.forEach(el => { + switch (typeof el) { + case "string": + node.innerHTML = el; + break; + case "object": + node.appendChild(objectToHtml(el)); + break; + } + }); + } + + if (obj.style_rules) { + Object.keys(obj.style_rules).forEach(rule => { + node.style[rule] = obj.style_rules[rule]; + }); + } + + return node; + }, + renderCycle: function () { + this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], { + mode: "replace", + }); + }, + subRender(object, htmlNode, options = { mode: "append" }) { + const insert = this.objectToHtml(object); + switch (options.mode) { + case "append": + htmlNode.appendChild(insert); + break; + case "override": + htmlNode.innerHTML = ""; + htmlNode.appendChild(insert); + break; + case "insert-before": + htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]); + break; + case "adjacent": + /** + * options.insertLocation must be one of: + * + * afterbegin + * afterend + * beforebegin + * beforeend + */ + htmlNode.insertAdjacentHTML(options.insertLocation, insert); + break; + case "replace": + htmlNode.parentNode.replaceChild(insert, htmlNode); + break; + case "remove": + htmlNode.remove(); + break; + } + }, +}; + +},{}],4:[function(require,module,exports){ +"use strict"; + +const objectHtmlRenderer = require("object-to-html-renderer") + +class ImageCarousel { + constructor(props) { + this.props = props; + this.id = performance.now(); + this.state = { + showImageIndex: 0, + }; + this.RUN_INTERVAL = 5000; + this.props.images.length > 1 && this.run(); + } + + run() { + this.runningInterval = setInterval(() => { + let { showImageIndex } = this.state; + const { images } = this.props; + this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0; + this.refreshImage(); + }, this.RUN_INTERVAL); + } + + setImageIndex(i) { + clearInterval(this.runningInterval); + this.state.showImageIndex = i; + this.refreshImage(); + } + + refreshImage() { + objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), { + mode: "replace", + }); + } + + render() { + const { showImageIndex } = this.state; + const { images } = this.props; + return { + tag: "div", + id: this.id, + class: "image-carousel", + contents: [ + { + tag: "img", + property: "image", + alt: `image carousel ${images[showImageIndex].replace(/\.[A-Za-z]+/, "")}`, + src: images[showImageIndex], + }, + images.length > 1 && { + tag: "div", + class: "carousel-bullets", + contents: images.map((_, i) => { + const active = showImageIndex === i; + return { + tag: "span", + class: `bullet ${active ? "active" : ""}`, + onclick: this.setImageIndex.bind(this, i), + }; + }), + }, + ], + }; + } +} + +module.exports = ImageCarousel; + +},{"object-to-html-renderer":3}],5:[function(require,module,exports){ +"use strict"; + +const { fetchjson, fetchtext } = require("./fetch"); + +function getArticleBody(text) { + return text.replaceAll("\n", "<br/>"); +} + +function getArticleDate(date) { + return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`; +} + +function loadArticles(dir_url) { + return new Promise((resolve, reject) => { + fetchjson(`${dir_url}/index.json`) + .then(json => { + Promise.all( + json.articles.map(async artDir => { + const artPath = `${artDir}/${artDir}.json`; + const art = await fetchjson(`${dir_url}/${artPath}`); + const tmpSplit = artPath.split("/"); + tmpSplit.pop(); + const absArtPath = `${dir_url}/${tmpSplit.join("/")}`; + return Object.assign(art, { path: absArtPath }); + }) + ) + .then(articles => { + populateArticles(articles) + .then(completeArticles => resolve(completeArticles)) + .catch(e => reject(e)); + }) + .catch(e => reject(e)); + }) + .catch(e => console.log(e)); + }); +} + +function populateArticles(articles) { + return new Promise((resolve, reject) => { + Promise.all( + articles.map(async article => { + if (article.body.indexOf("<file>") !== -1) { + const txtPath = article.body.replace("<file>", ""); + const textValue = await fetchtext(`${article.path}/${txtPath}`); + article.body = textValue; + article.date = article.date ? new Date(article.date) : undefined; + } + return article; + }) + ) + .then(completeArticles => resolve(completeArticles.sort((a, b) => b.date - a.date))) + .catch(e => reject(e)); + }); +} + +module.exports = { + loadArticles, + getArticleBody, + getArticleDate, + populateArticles, +}; + +},{"./fetch":6}],6:[function(require,module,exports){ +"use strict"; + +function fetchjson(url) { + return new Promise((resolve, reject) => { + fetch(url) + .then(r => r.json()) + .then(r => resolve(r)) + .catch(e => reject(e)); + }); +} + +function fetchtext(url) { + return new Promise((resolve, reject) => { + fetch(url) + .then(r => r.text()) + .then(r => resolve(r)) + .catch(e => reject(e)); + }); +} + +module.exports = { + fetchjson, + fetchtext, +}; + +},{}],7:[function(require,module,exports){ +"use strict"; + +class WebPage { + constructor(args) { + Object.assign(this, args); + } +} + +module.exports = WebPage; +},{}],8:[function(require,module,exports){ +"use strict"; + +const { articles_url } = require("../../../../constants"); +const ImageCarousel = require("../../../generic-components/image-carousel"); +const { loadArticles, getArticleBody, getArticleDate } = require("../../../lib/article-utils"); +const objectHtmlRenderer = require("object-to-html-renderer") + +class SoftwareArticle { + constructor(props) { + this.props = props; + } + + render() { + const { title, date, body, subtitle, images, path, technical, releases } = this.props; + return { + tag: "article", + class: "software-article", + typeof: "SoftwareApplication", + additionalType: "Article", + contents: [ + { + tag: "h2", + class: "software-title", + contents: title, + property: "name", + }, + { + tag: "div", class: "software-image", + contents: [ + { + tag: "img", src: `${path}/images/${images[0]}` + } + ] + }, + { + tag: "h3", + class: "software-subtitle", + contents: subtitle, + property: "alternativeHeadline", + }, + { + tag: "div", + class: "software-description", + contents: getArticleBody(body), + property: "description", + }, + { + tag: "div", + class: "software-technical", + contents: [ + { + tag: "h2", + contents: "Details", + }, + { + tag: "ul", + class: "technical-details", + contents: [ + { + tag: "li", + class: "detail", + contents: [ + { tag: "label", contents: "Stack" }, + { + tag: "div", + contents: [ + { + tag: "ul", + contents: technical.stack.map(tech => { + return { + tag: "li", + contents: tech, + property: "about", + }; + }), + }, + ], + }, + ], + }, + { + tag: "li", + class: "detail", + contents: [ + { tag: "label", contents: "Version actuelle" }, + { + tag: "div", + contents: technical.version, + property: "version", + }, + ], + }, + { + tag: "li", + class: "detail", + contents: [ + { tag: "label", contents: "License" }, + { + tag: "div", + contents: technical.license, + property: "license", + }, + ], + }, + { + tag: "li", + class: "detail", + contents: [ + { + tag: "label", + contents: "Code source", + }, + { + tag: "a", + href: technical.repository, + target: "_blank", + contents: technical.repository.replace( + /https?:\/\/(www\.)?/g, + "" + ), + property: "url", + }, + ], + }, + ], + }, + releases && { + tag: "h2", + contents: "Releases", + }, + releases && { + tag: "ul", + class: "releases", + contents: [ + { + tag: "li", + class: "detail", + contents: [ + { + tag: "label", + class: "label", + contents: "Plateforme", + }, + { + tag: "label", + class: "label", + contents: "Téléchargement", + }, + ], + }, + ].concat( + releases.map(rel => { + return { + tag: "li", + class: "release detail", + contents: [ + { + tag: "label", + contents: rel.platform, + }, + { + tag: "a", + download: rel.download, + href: `${path}/release/${rel.download}`, + contents: rel.download, + property: "url", + }, + ], + }; + }) + ), + }, + ], + }, + ], + }; + } +} + +class SoftwareArticles { + constructor(props) { + this.props = props; + this.state = { + articles: [], + }; + this.id = performance.now(); + this.loadArticles(); + } + + loadArticles() { + loadArticles(`${articles_url}software`) + .then(articles => { + this.state.articles = articles; + this.refresh(); + this.fixScroll(); + }) + .catch(e => console.log(e)); + } + + renderPlaceholder() { + return { + tag: "article", + class: "placeholder", + contents: [ + { tag: "div", class: "title" }, + { tag: "div", class: "body" }, + { tag: "div", class: "details" }, + ], + }; + } + + refresh() { + objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), { + mode: "replace", + }); + } + + fixScroll() { + if (window.location.href.includes("#")) { + window.scrollTo( + 0, + document.getElementById(window.location.href.match(/#.+/)[0].replace("#", "")) + .offsetTop + ); + } + } + + render() { + const { articles } = this.state; + return { + tag: "section", + class: "software-articles page-contents-center", + id: this.id, + contents: + articles.length > 0 + ? articles.map(article => new SoftwareArticle({ ...article }).render()) + : [this.renderPlaceholder()], + }; + } +} + +module.exports = SoftwareArticles; + +},{"../../../../constants":2,"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5,"object-to-html-renderer":3}],9:[function(require,module,exports){ +"use strict"; + +const { images_url } = require("../../../constants"); +const WebPage = require("../../lib/web-page"); +const SoftwareArticles = require("./components/software-articles"); + +class SoftwareDevelopment extends WebPage { + render() { + return { + tag: "div", + id: "software-page", + contents: [ + { + tag: "div", + class: "page-header logo-left", + contents: [ + { + tag: "div", + class: "page-contents-center grid-wrapper", + contents: [ + { + tag: "div", + class: "logo", + contents: [ + { + tag: "img", + alt: `image mechanic electronic`, + src: `${images_url}meca_proc.svg`, + }, + ], + }, + { tag: "h1", contents: "Software" }, + { + tag: "p", + contents: `R&D, projets expérimentaux, outillage logiciel pour le développement de jeu ou pour le web.`, + }, + ], + }, + ], + }, + new SoftwareArticles().render(), + ], + }; + } +} + +module.exports = SoftwareDevelopment; + +},{"../../../constants":2,"../../lib/web-page":7,"./components/software-articles":8}],10:[function(require,module,exports){ +"use strict"; + +"use strict"; +const runPage = require("../../run-page"); +const SoftwareDevelopment = require("./software-development"); +runPage(SoftwareDevelopment); + +},{"../../run-page":11,"./software-development":9}],11:[function(require,module,exports){ +"use strict"; + +const objectHtmlRenderer = require("object-to-html-renderer") +const Template = require("./template/template"); + +module.exports = function runPage(PageComponent) { + const template = new Template({ page: new PageComponent() }); + objectHtmlRenderer.setRenderCycleRoot(template); + objectHtmlRenderer.renderCycle(); +}; + +},{"./template/template":13,"object-to-html-renderer":3}],12:[function(require,module,exports){ +"use strict"; + +const { images_url } = require("../../../constants"); + +const NAV_MENU_ITEMS = [ + { url: "/games/", text: "Jeux" }, + { + url: "/education/", + text: "Pédagogie", + // submenu: [ + // { url: "/gamedev", text: "Création de jeux vidéo" }, + // ] + }, + { url: "/software-development/", text: "Software" } +]; + +class NavBar { + constructor() { + this.initEventHandlers(); + } + + handleBurgerClick() { + document.getElementById("nav-menu-list").classList.toggle("responsive-show"); + } + + initEventHandlers() { + window.addEventListener("click", event => { + if ( + event.target.id !== "nav-menu-list" && + !event.target.classList.contains("burger") && + !event.target.parentNode.classList.contains("burger") + ) { + document.getElementById("nav-menu-list").classList.remove("responsive-show"); + } + }); + } + + renderHome() { + return { + tag: "div", + class: "home", + contents: [ + { + tag: "a", + href: "/", + contents: [ + { + tag: "img", + alt: "Logo Kuadrado", + src: `${images_url}logo_kuadrado.svg`, + }, + { + tag: "img", + alt: "Kuadrado Software", + class: "logo-text", + src: `${images_url}logo_kuadrado_txt.svg`, + }, + ], + }, + ], + }; + } + + renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") { + return { + tag: "ul", + id: "nav-menu-list", + class: isSubmenu ? "submenu" : "", + contents: menuItemsArray.map(item => { + const { url, text, submenu } = item; + const href = `${parentUrl}${url}`; + return { + tag: "li", + class: !isSubmenu && window.location.pathname === href ? "active" : "", + contents: [ + { + tag: "a", + href, + contents: text, + }, + ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []), + }; + }), + }; + } + + renderResponsiveBurger() { + return { + tag: "div", + class: "burger", + onclick: this.handleBurgerClick.bind(this), + contents: [{ tag: "span", contents: "···" }], + }; + } + + render() { + return { + tag: "nav", + contents: [ + this.renderHome(), + this.renderResponsiveBurger(), + this.renderMenu(NAV_MENU_ITEMS), + ], + }; + } +} + +module.exports = NavBar; + +},{"../../../constants":2}],13:[function(require,module,exports){ +"use strict"; + +const { in_construction } = require("../../config"); +const { images_url } = require("../../constants"); +const NavBar = require("./components/navbar"); + +class Template { + constructor(props) { + this.props = props; + } + render() { + return { + tag: "main", + contents: [ + { + tag: "header", + contents: [new NavBar().render()], + }, + in_construction && { + tag: "section", + class: "warning-banner", + contents: [ + { + tag: "strong", + class: "page-contents-center", + contents: "Site en construction ...", + }, + ], + }, + { + tag: "section", + id: "page-container", + contents: [this.props.page.render()], + }, + { + tag: "footer", + contents: [ + { + tag: "div", + class: "logo", + contents: [ + { + tag: "img", + alt: `logo Kuadrado`, + src: `${images_url}logo_kuadrado.svg`, + }, + { + tag: "img", + class: "text-logo", + alt: "Kuadrado Software", + src: `${images_url}logo_kuadrado_txt.svg`, + }, + ], + }, + { + tag: "span", + contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France", + }, + { + tag: "div", + contents: [ + { tag: "strong", contents: "<blue>Contact : </blue>" }, + { + tag: "a", + href: "mailto:contact@kuadrado-software.fr", + contents: "contact@kuadrado-software.fr", + }, + ], + }, + { + tag: "div", + class: "social", + contents: [ + { + tag: "strong", + contents: "<blue>Sur les réseaux : </blue>", + }, + { + tag: "a", + href: "https://www.linkedin.com/company/kuadrado-software", + target: "_blank", + contents: "in", + title: "Linkedin", + }, + { + tag: "a", + href: "https://twitter.com/KuadradoSoft", + target: "_blank", + contents: "t", + title: "Twitter", + style_rules: { fontFamily: "serif" }, + }, + ], + }, + { + tag: "span", + contents: `Copyright © ${new Date() + .getFullYear()} Kuadrado Software | + Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`, + }, + ], + }, + ], + }; + } +} + +module.exports = Template; + +},{"../../config":1,"../../constants":2,"./components/navbar":12}]},{},[10]); diff --git a/public/style/style.css b/public/style/style.css index 450e8b2..26da894 100644 --- a/public/style/style.css +++ b/public/style/style.css @@ -1 +1,1277 @@ -body{font-family:Arial,Helvetica,sans-serif;margin:0}body *{box-sizing:border-box;color:#35393c;line-height:1.3em}body ul{margin:0;padding:0;list-style-type:none}body a{color:#4baabb;text-decoration:none}body a:hover{color:#72e3f0}body blue{color:#4baabb}body red{color:#9c3030}body green{color:#368736}body emoji{font-style:initial;font-size:25px}body .bg-blue{background-color:#4baabb;color:#fff}body .bg-dark{background-color:#3c4144;color:#aabbc8}body #seo-title{visibility:hidden}body img.pixelated{image-rendering:pixelated;image-rendering:-moz-crisp-edges;image-rendering:crisp-edges}main{display:flex;flex-direction:column;align-items:center;min-height:100vh}main .warning-banner{background:url("/assets/images/wallpaper_warning.svg");width:100%;height:40px;padding:20px 10%;display:flex;justify-content:center;align-items:center;flex-direction:row}main .warning-banner strong{font-size:18px;color:#1c3db2}main .image-carousel{overflow:hidden;display:flex;justify-content:center;align-items:center;flex-direction:row;background-color:#000;position:relative}main .image-carousel img{position:absolute;max-width:100%;max-height:400px}main .image-carousel .carousel-bullets{position:absolute;bottom:0;padding:20px;display:flex;gap:10px}main .image-carousel .carousel-bullets .bullet{cursor:pointer;width:8px;height:8px;background-color:#6b7880;border-radius:100%;box-shadow:0 0 3px #000}main .image-carousel .carousel-bullets .bullet.active{background-color:#d4d9dd}@media screen and (max-width: 900px){main .image-carousel img{max-height:100%}main .image-carousel .carousel-bullets{gap:30px}main .image-carousel .carousel-bullets .bullet{width:12px;height:12px}}main header{width:100%;background-color:#fff;position:sticky;position:-webkit-sticky;top:0;z-index:10}main header nav{display:flex;align-items:center;height:60px}main header nav .home{margin:0 10px}main header nav .home a{display:flex;align-items:center;gap:10px}main header nav .home a img{height:40px;width:auto}main header nav .home a img.logo-text{width:120px;height:auto}main header nav ul{display:flex;padding:0;margin:0;list-style-type:none;height:100%}main header nav ul li{position:relative}main header nav ul li a{display:flex;align-items:center;height:100%;padding:10px 20px;color:#96a5ae;font-weight:800;text-decoration:none}main header nav ul li .submenu{visibility:hidden;overflow:hidden;position:absolute;height:auto;max-height:0;transition:max-height .6s;top:100%;left:50%;flex-direction:column;background-color:#fff;white-space:nowrap}main header nav ul li.active a{color:#3c4144;border-bottom:3px solid}main header nav ul li:hover a{color:#3c4144}main header nav ul li:hover .submenu{visibility:unset;max-height:1000px}main header nav ul li:hover .submenu a{color:#96a5ae;border:none}main header nav ul li:hover .submenu li:hover a{color:#3c4144}main header nav .burger{display:none}@media screen and (max-width: 560px){main header nav{justify-content:space-between}main header nav .burger{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;font-weight:bold;border:1px solid;margin:0 20px;cursor:pointer;border-radius:100%;width:35px;height:35px;color:#555d61;font-size:25px}main header nav ul{display:none}main header nav ul.responsive-show{display:flex;flex-direction:column;position:absolute;right:0;max-width:100vw;min-width:50vw;top:60px;background-color:#fff;box-shadow:0 4px 6px 2px #0000000a;height:unset}main header nav ul.responsive-show li.active a{border:none}main header nav ul.responsive-show li .submenu{display:flex;visibility:visible;position:relative;height:unset;max-height:unset;transition:max-height .6s;top:unset;left:unset;margin-left:20px}main header nav ul.responsive-show li .submenu li a{font-weight:400;font-size:14px;color:#96a5ae}}main #page-container{width:100%;flex:1}main #page-container .page-header{background-image:url("/assets/images/wallpaper_binary.png");padding:50px 0}main #page-container .page-header h1{padding:15px 40px 0;font-size:25px;color:#4baabb;margin:0 auto}main #page-container .page-header p{color:#72e3f0;font-style:italic;padding:15px 40px 15px 100px;margin:0 auto;font-size:18px}main #page-container .page-header p *{color:#72e3f0}main #page-container .page-header .big-logo{display:flex;justify-content:center;align-items:center;flex-direction:row;gap:20px;padding:20px}main #page-container .page-header .big-logo img{width:200px;max-width:100%}main #page-container .page-header .big-logo img.logo-text{width:300px;max-width:100%}main #page-container .page-header .logo{padding-left:30px;display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container .page-header .logo img{width:100%}@media screen and (max-width: 560px){main #page-container .page-header h1{padding:15px 20px 0}main #page-container .page-header p{padding:20px 20px 30px 40px;text-align:justify}main #page-container .page-header .big-logo{flex-direction:column}}main #page-container .page-header.logo-left .grid-wrapper{display:grid;grid-template-columns:120px 1fr;grid-template-rows:auto 1fr}main #page-container .page-header.logo-left .grid-wrapper h1{width:100%}main #page-container .page-header.logo-left .grid-wrapper .logo{grid-column:1;grid-row:1;width:100%}main #page-container .page-header.logo-left .grid-wrapper p{margin:0;grid-column:1/span 2}@media screen and (max-width: 780px){main #page-container .page-header.logo-left .grid-wrapper h1{padding:0 20px}main #page-container .page-header.logo-left .grid-wrapper .logo{padding:0 20px}}main #page-container .page-philo{background-image:url("/assets/images/wallpaper_binary.png");padding:120px 30px}main #page-container .page-philo p{width:100%;max-width:600px;font-size:18px;color:#aabbc8;text-align:center;font-style:italic;font-weight:bold}main #page-container .page-philo p *{color:#aabbc8}main #page-container .page-contents-center{width:1300px;max-width:100%;margin:0 auto}@media screen and (max-width: 1300px){main #page-container .page-contents-center{padding:20px 20px 0}}main #page-container h2.page-section-title{color:#4baabb;padding:20px 0 10px;width:1300px;max-width:100%;margin:0 auto}@media screen and (max-width: 1300px){main #page-container h2.page-section-title{padding:20px 20px 0}}main #page-container #home-page{display:flex;flex-direction:column}main #page-container #home-page .section-title{padding:10px;margin:0;color:#aabbc8}main #page-container #home-page .page-header .philo-bubbles{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-wrap:wrap;gap:40px;margin:30px 20px}@media screen and (max-width: 780px){main #page-container #home-page .page-header .philo-bubbles{gap:20px}}main #page-container #home-page .page-header .philo-bubbles li{border-radius:100%;display:flex;justify-content:center;align-items:center;flex-direction:row;background-color:#d4d9dd;width:100px;height:100px}main #page-container #home-page .page-header .philo-bubbles li *{color:#6b7880}@media screen and (max-width: 560px){main #page-container #home-page .page-header .philo-bubbles li{width:75px;height:75px}main #page-container #home-page .page-header .philo-bubbles li *{font-size:12px}}main #page-container #home-page .page-header .philo-bubbles li:first-child{background-color:#6b7880}main #page-container #home-page .page-header .philo-bubbles li:first-child *{color:#fff}main #page-container #home-page .page-header .philo-bubbles li:last-child{background-color:#35393c}main #page-container #home-page .page-header .philo-bubbles li:last-child *{color:#96a5ae}main #page-container #home-page #news{padding:60px 20px}main #page-container #home-page #news .articles-displayer{margin:0 auto 40px}main #page-container #home-page #news .articles-displayer .prev-next-buttons{display:flex;justify-content:space-between}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn{border:none;background:none;display:flex;align-items:center;gap:10px;padding:5px 0}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.disabled,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.disabled{visibility:hidden;pointer-events:none}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active{cursor:pointer;color:#6b7880}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active:hover,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active:hover{color:#3c4144}main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active::after{content:" ";border-style:solid;border-width:2px 2px 0 0;width:8px;height:8px;transform:rotate(45deg);display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active::before{content:" ";border-style:solid;border-width:2px 2px 0 0;width:8px;height:8px;transform:rotate(-135deg);display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container #home-page #news .articles-displayer article{display:grid;gap:5px 50px;grid-template-rows:auto auto auto 1fr;position:relative;padding-left:20px}main #page-container #home-page #news .articles-displayer article.grid-1{grid-template-columns:1fr}main #page-container #home-page #news .articles-displayer article.grid-2{grid-template-columns:1fr 1fr}main #page-container #home-page #news .articles-displayer article .date{grid-column:1;grid-row:1;text-align:right}main #page-container #home-page #news .articles-displayer article .date time{color:#6b7880;font-style:italic;font-size:12px}main #page-container #home-page #news .articles-displayer article .title{grid-column:1;grid-row:2}main #page-container #home-page #news .articles-displayer article .title h3{margin:0 0 10px}main #page-container #home-page #news .articles-displayer article .subtitle{grid-column:1;grid-row:3;font-style:italic;font-size:15px}main #page-container #home-page #news .articles-displayer article .body{grid-column:1;grid-row:4;min-height:200px;padding-bottom:40px;text-align:justify}main #page-container #home-page #news .articles-displayer article .image-carousel{grid-row:1/span 4;grid-column:2}main #page-container #home-page #news .articles-displayer article .image-carousel img{max-height:100%}main #page-container #home-page #news .articles-displayer article.article-placeholder{padding:0}main #page-container #home-page #news .articles-displayer article.article-placeholder *{background-color:#d4d9dd}main #page-container #home-page #news .articles-displayer article.article-placeholder .date{height:10px}main #page-container #home-page #news .articles-displayer article.article-placeholder .title{height:40px}main #page-container #home-page #news .articles-displayer article.article-placeholder .subtitle{height:30px}@media screen and (max-width: 900px){main #page-container #home-page #news .articles-displayer article{gap:5px;padding:0}main #page-container #home-page #news .articles-displayer article.grid-2{grid-template-columns:1fr;grid-template-rows:300px auto auto auto 1fr}main #page-container #home-page #news .articles-displayer article.grid-2 .date{grid-row:2}main #page-container #home-page #news .articles-displayer article.grid-2 .title{grid-row:3}main #page-container #home-page #news .articles-displayer article.grid-2 .subtitle{grid-row:4}main #page-container #home-page #news .articles-displayer article.grid-2 .body{grid-row:5}main #page-container #home-page #news .articles-displayer article.grid-2 .image-carousel{grid-row:1;grid-column:1}main #page-container #home-page #news .articles-displayer article.grid-1 .date{grid-row:1}main #page-container #home-page #news .articles-displayer article.grid-1 .title{grid-row:2}main #page-container #home-page #news .articles-displayer article.grid-1 .subtitle{grid-row:3}main #page-container #home-page #news .articles-displayer article.grid-1 .body{grid-row:4}main #page-container #home-page #news .articles-displayer article .date,main #page-container #home-page #news .articles-displayer article .title,main #page-container #home-page #news .articles-displayer article .subtitle{padding:0 10px}main #page-container #home-page #news .articles-displayer article .body{padding:0 10px 30px}}main #page-container #home-page .poles{display:grid;grid-template-columns:1fr 1fr 1fr;gap:30px;padding:100px 0}main #page-container #home-page .poles .theme-card{display:flex;flex-direction:column;width:100%;cursor:pointer;transition:transform .3s}main #page-container #home-page .poles .theme-card .card-img{width:100%;height:240px;overflow:hidden;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;position:relative}main #page-container #home-page .poles .theme-card .card-img img{position:absolute;max-width:100%;height:100%;padding:10px}main #page-container #home-page .poles .theme-card .card-title h2{margin:0;text-align:center;padding:10px 20px;color:#4baabb;display:block;background-color:#fff}main #page-container #home-page .poles .theme-card .card-description{flex:1;padding:30px 20px}main #page-container #home-page .poles .theme-card .card-description p{margin:0;color:#4baabb;text-align:center}main #page-container #home-page .poles .theme-card:hover{transform:scale(1.03)}main #page-container #home-page .kuadrado-values{background-image:url("/assets/images/wallpaper_binary_light.png");padding:100px 0 120px}main #page-container #home-page .kuadrado-values *:not(a,blue){color:#d4d9dd}main #page-container #home-page .kuadrado-values h2{display:flex;justify-content:center;align-items:center;flex-direction:row;margin:0 auto 60px;width:120px;height:120px;background-image:url("/assets/images/wallpaper_binary.png");border-radius:100%;color:#72e3f0}main #page-container #home-page .kuadrado-values ul.values-list{display:grid;grid-template-columns:repeat(3, 1fr);gap:30px}main #page-container #home-page .kuadrado-values ul.values-list li{background-image:url("/assets/images/wallpaper_binary.png");padding:30px 20px 40px}main #page-container #home-page .kuadrado-values ul.values-list li h3{text-align:center}main #page-container #home-page .kuadrado-values ul.values-list li p{text-align:justify}main #page-container #home-page #whoami{padding:20px 0 50px}main #page-container #home-page #whoami .page-contents-center{padding:40px;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column}main #page-container #home-page #whoami .page-contents-center h2{text-align:center;background-color:#6b7880;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;width:220px;height:220px;border-radius:100%;padding:30px;margin:40px 0;color:#72e3f0}main #page-container #home-page #whoami .page-contents-center .presentation-card .header{display:grid;grid-template-columns:auto 1fr;gap:30px;padding:50px 0}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic img{width:150px;height:auto;border-radius:100%}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h3{font-size:22px;color:#96a5ae;margin:0}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4{font-size:18px}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text strong,main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4{color:#96a5ae}main #page-container #home-page #whoami .page-contents-center .presentation-card .body p{font-size:18px;font-style:italic;font-family:serif;color:#555d61}main #page-container #home-page #whoami .page-contents-center .presentation-card .body p *:not(blue,a){color:#555d61}@media screen and (max-width: 560px){main #page-container #home-page #whoami .page-contents-center .presentation-card .header{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text{text-align:center}}@media screen and (max-width: 900px){main #page-container #home-page .poles{grid-template-columns:1fr;gap:40px}main #page-container #home-page .poles .theme-card{transition:transform .3s}main #page-container #home-page .poles .theme-card .card-img{height:300px}main #page-container #home-page .poles .theme-card .card-img img{min-width:unset;height:100%}main #page-container #home-page .poles .theme-card .card-title h2{padding:5px 20px}main #page-container #home-page .poles .theme-card .card-description{padding:20px 30px}main #page-container #home-page .poles .theme-card:hover{transform:none}main #page-container #home-page .kuadrado-values ul.values-list{grid-template-columns:1fr}}@media screen and (max-width: 1300px){main #page-container #home-page .poles{padding:20px}main #page-container #home-page .articles-displayer{padding:0}}main #page-container #education-page h3.big{font-size:30px}main #page-container #education-page .title-banner{display:flex;justify-content:flex-end;flex-direction:column;height:20vw;min-height:250px;background-image:url("/assets/images/popularization_banner.png");background-size:cover;background-repeat:no-repeat;background-position:center}main #page-container #education-page .title-banner h2{color:#fff;font-size:2.5em;margin:40px;text-shadow:0 0 6px #0003}main #page-container #education-page .special-announcement{background-color:#ffd000}main #page-container #education-page .special-announcement .page-contents-center{padding:0 20px;display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container #education-page .special-announcement .page-contents-center p{color:#555d61;font-size:20px;font-weight:600;margin:0;padding:40px 0}main #page-container #education-page .edu-themes{display:grid;grid-template-columns:1fr 1fr;gap:50px;font-family:monospace;padding:70px 0}main #page-container #education-page .edu-themes .edu-theme{display:grid;grid-template-columns:auto 1fr}main #page-container #education-page .edu-themes .edu-theme *{border-style:dashed;border-color:lime;border-width:0 0 0 0}main #page-container #education-page .edu-themes .edu-theme h3{color:lime;grid-row:1;margin:0;padding:10px;display:flex;align-items:center;border-width:0 0 0 1px}main #page-container #education-page .edu-themes .edu-theme img{width:100%;grid-row:1/span 2;border-width:1px 0 1px 1px}main #page-container #education-page .edu-themes .edu-theme p{text-align:justify;color:#72e3f0;grid-row:2;margin:0;padding:10px 30px 0 10px;border-width:1px 1px 1px 0}main #page-container #education-page .edu-themes .edu-theme p *{color:#72e3f0}main #page-container #education-page .practical-info{padding:50px 0}main #page-container #education-page .practical-info .page-contents-center{display:grid;grid-template-columns:1fr 1fr;gap:50px}main #page-container #education-page .practical-info .page-contents-center .info-block{display:grid;grid-template-rows:auto 1fr}main #page-container #education-page .practical-info .page-contents-center .info-block .info-title{color:#4baabb;margin:0;border-bottom:1px dashed #aabbc8;border-left:1px dashed #aabbc8;padding:10px}main #page-container #education-page .practical-info .page-contents-center .info-block .info-body{margin:0;padding:20px 10px;border-right:1px dashed #aabbc8;border-bottom:1px dashed #aabbc8}main #page-container #education-page .practical-info .page-contents-center .info-block ul{display:flex;flex-direction:column;gap:5px}main #page-container #education-page .practical-info .page-contents-center .info-block ul li:not(.fullwidth){display:grid;grid-template-columns:1fr 1fr;gap:10px}main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span{padding:3px 0}main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:first-child{font-weight:bold;color:#6b7880}main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:last-child{color:#4baabb}@media screen and (max-width: 1200px){main #page-container #education-page .edu-themes{grid-template-columns:1fr;gap:30px;padding:70px 0}}@media screen and (max-width: 780px){main #page-container #education-page .practical-info .page-contents-center{grid-template-columns:1fr;gap:30px}main #page-container #education-page .practical-info .page-contents-center .info-block .info-title{border-top:1px dashed #aabbc8}main #page-container #education-page .practical-info .page-contents-center .info-block .info-body{border-bottom:none}}@media screen and (max-width: 560px){main #page-container #education-page .edu-themes .edu-theme h3{border-width:0 0 1px 1px}main #page-container #education-page .edu-themes .edu-theme img{max-width:150px;height:auto;grid-row:1;border-width:1px 0 0 1px}main #page-container #education-page .edu-themes .edu-theme p{grid-row:2;grid-column:1/span 2;padding:20px 10px 30px 10px;border-width:0 1px 1px 1px}}main #page-container #games-page .game-articles article{display:grid;grid-template-columns:.7fr 1fr;gap:30px 50px;margin:20px 0}main #page-container #games-page .game-articles article.game-article{grid-template-rows:repeat(7, auto);width:100%}main #page-container #games-page .game-articles article.game-article .game-title{grid-column:1/span 2;margin:0;padding:30px 20px;color:#aabbc8;font-size:35px;font-style:italic}main #page-container #games-page .game-articles article.game-article .game-banner{grid-column:1/span 2;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;background-color:#000;overflow:hidden}main #page-container #games-page .game-articles article.game-article .game-banner img{height:500px}main #page-container #games-page .game-articles article.game-article .game-tags{display:flex;gap:10px;flex-wrap:wrap;margin:10px 20px}main #page-container #games-page .game-articles article.game-article .game-tags span{font-size:12px;padding:4px;background-color:#d4d9dd;color:#6b7880;border-radius:5px;font-weight:600}main #page-container #games-page .game-articles article.game-article .game-subtitle{grid-column:1;margin:10px 20px;color:#6b7880}main #page-container #games-page .game-articles article.game-article .game-description{grid-column:1;text-align:justify;margin:10px 20px 30px}main #page-container #games-page .game-articles article.game-article .image-carousel{grid-column:2;grid-row:3/span 4;height:100%}main #page-container #games-page .game-articles article.game-article .game-team{grid-column:1/span 2}main #page-container #games-page .game-articles article.game-article .game-team h2{color:#6b7880;padding:10px 20px;font-style:italic;font-size:20px;margin:0}main #page-container #games-page .game-articles article.game-article .game-team .team-members{display:flex;flex-direction:column}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member{display:grid;grid-template-columns:80px 1fr;grid-template-rows:auto auto 1fr;margin:10px}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img{grid-row:1/span 3;overflow:hidden}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img img{width:100%;padding:0 10px 0 0}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-title{margin:0 0 5px;color:#6b7880}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-subtitle{margin:0 10px;font-size:14px;color:#96a5ae;font-style:italic}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body{margin:10px 10px 20px 20px;text-align:justify}main #page-container #games-page .game-articles article.placeholder{height:400px}main #page-container #games-page .game-articles article.placeholder *{background-color:#d4d9dd}@media screen and (max-width: 900px){main #page-container #games-page .game-articles article{grid-template-columns:1fr}main #page-container #games-page .game-articles article.game-article{grid-template-rows:repeat(6, auto)}main #page-container #games-page .game-articles article.game-article .game-title{grid-column:1;padding:0;font-size:25px}main #page-container #games-page .game-articles article.game-article .game-banner{grid-column:1;margin:0 -20px}main #page-container #games-page .game-articles article.game-article .image-carousel{grid-column:1;grid-row:3;height:400px;margin:0 -20px}main #page-container #games-page .game-articles article.game-article .game-team{grid-column:1}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member{grid-template-columns:70px 1fr}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img{grid-row:1/span 2}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body{grid-column:1/span 2}}main #page-container #software-page .software-articles{margin:20px auto 50px}main #page-container #software-page .software-articles article.software-article{display:grid;grid-template-columns:1fr .7fr;margin:0 0 30px;gap:10px 30px}main #page-container #software-page .software-articles article.software-article .software-title{grid-column:1/span 2;color:#aabbc8;margin:0;padding:10px}main #page-container #software-page .software-articles article.software-article .software-date{margin:0;color:#96a5ae;font-style:italic;text-align:right;color:#6b7880;font-style:italic;font-size:12px}main #page-container #software-page .software-articles article.software-article .software-subtitle{grid-column:1;margin:10px;color:#6b7880}main #page-container #software-page .software-articles article.software-article .software-description{grid-column:1;text-align:justify;margin:10px}main #page-container #software-page .software-articles article.software-article .image-carousel{grid-column:2;grid-row:2/span 6;min-height:250px}main #page-container #software-page .software-articles article.software-article .software-technical{grid-column:1}main #page-container #software-page .software-articles article.software-article .software-technical h2{color:#6b7880;margin:0 10px;padding:10px 0 0;font-size:16px}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details{margin:10px}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail{display:grid;grid-template-columns:1fr auto;font-size:12px;border-bottom:1px solid #d4d9dd;padding:5px 0}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail label{font-weight:bold;color:#6b7880}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail ul{display:flex;flex-wrap:wrap;gap:10px}main #page-container #software-page .software-articles article.software-article .software-technical ul.releases{margin:10px}main #page-container #software-page .software-articles article.software-article .software-technical .detail{display:grid;grid-template-columns:1fr auto;font-size:12px;border-bottom:1px solid #d4d9dd;padding:5px 0}main #page-container #software-page .software-articles article.software-article .software-technical .detail label{font-weight:bold;color:#6b7880}main #page-container #software-page .software-articles article.software-article .software-technical .detail .label{color:#aabbc8}main #page-container #software-page .software-articles article.software-article .software-technical .detail ul{display:flex;flex-wrap:wrap;gap:10px}@media screen and (max-width: 900px){main #page-container #software-page .software-articles article.software-article{grid-template-columns:1fr}main #page-container #software-page .software-articles article.software-article .software-title{grid-column:1}main #page-container #software-page .software-articles article.software-article .image-carousel{grid-column:1;grid-row:2;height:200px}main #page-container #software-page .software-articles article.software-article .software-technical{grid-column:1}}main #page-container #software-page .software-articles article.placeholder{display:flex;flex-direction:column;gap:10px;margin:30px}main #page-container #software-page .software-articles article.placeholder *{background-color:#d4d9dd}main #page-container #software-page .software-articles article.placeholder .title{height:60px}main #page-container #software-page .software-articles article.placeholder .body{height:400px}main #page-container #software-page .software-articles article.placeholder .details{height:200px}main footer{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;width:100%;background-image:url("/assets/images/wallpaper_binary.png");padding:40px 20px;gap:20px;font-size:12px}main footer span{color:#96a5ae;text-align:center}main footer .logo{display:flex;justify-content:center;align-items:center;flex-direction:row;gap:10px}main footer .logo img{width:35px}main footer .logo img.text-logo{width:100px}main footer .social{display:flex;justify-content:center;align-items:center;flex-direction:row;gap:20px}main footer .social a{background-color:#555d61;display:flex;justify-content:center;align-items:center;flex-direction:row;width:25px;height:25px;font-weight:bold;font-size:16px;border-radius:100%}/*# sourceMappingURL=style.css.map */ +body { + font-family: Arial, Helvetica, sans-serif; + margin: 0; +} +body * { + box-sizing: border-box; + color: #35393c; + line-height: 1.3em; +} +body ul { + margin: 0; + padding: 0; + list-style-type: none; +} +body a { + color: #4baabb; + text-decoration: none; +} +body a:hover { + color: #72e3f0; +} +body blue { + color: #4baabb; +} +body red { + color: #9c3030; +} +body green { + color: #368736; +} +body emoji { + font-style: initial; + font-size: 25px; +} +body .bg-blue { + background-color: #4baabb; + color: white; +} +body .bg-dark { + background-color: #3c4144; + color: #aabbc8; +} +body #seo-title { + visibility: hidden; +} +body img.pixelated { + image-rendering: pixelated; + image-rendering: -moz-crisp-edges; + image-rendering: crisp-edges; +} + +main { + display: flex; + flex-direction: column; + align-items: center; + min-height: 100vh; +} +main .warning-banner { + background: url("/assets/images/wallpaper_warning.svg"); + width: 100%; + height: 40px; + padding: 20px 10%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; +} +main .warning-banner strong { + font-size: 18px; + color: #1c3db2; +} +main .image-carousel { + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + background-color: black; + position: relative; +} +main .image-carousel img { + position: absolute; + max-width: 100%; + max-height: 400px; +} +main .image-carousel .carousel-bullets { + position: absolute; + bottom: 0; + padding: 20px; + display: flex; + gap: 10px; +} +main .image-carousel .carousel-bullets .bullet { + cursor: pointer; + width: 8px; + height: 8px; + background-color: #6b7880; + border-radius: 100%; + box-shadow: 0 0 3px black; +} +main .image-carousel .carousel-bullets .bullet.active { + background-color: #d4d9dd; +} +@media screen and (max-width: 900px) { + main .image-carousel img { + max-height: 100%; + } + main .image-carousel .carousel-bullets { + gap: 30px; + } + main .image-carousel .carousel-bullets .bullet { + width: 12px; + height: 12px; + } +} +main header { + width: 100%; + background-color: white; + position: sticky; + position: -webkit-sticky; + top: 0; + z-index: 10; +} +main header nav { + display: flex; + align-items: center; + height: 60px; +} +main header nav .home { + margin: 0 10px; +} +main header nav .home a { + display: flex; + align-items: center; + gap: 10px; +} +main header nav .home a img { + height: 40px; + width: auto; +} +main header nav .home a img.logo-text { + width: 120px; + height: auto; +} +main header nav ul { + display: flex; + padding: 0; + margin: 0; + list-style-type: none; + height: 100%; +} +main header nav ul li { + position: relative; +} +main header nav ul li a { + display: flex; + align-items: center; + height: 100%; + padding: 10px 20px; + color: #96a5ae; + font-weight: 800; + text-decoration: none; +} +main header nav ul li .submenu { + visibility: hidden; + overflow: hidden; + position: absolute; + height: auto; + max-height: 0; + transition: max-height 0.6s; + top: 100%; + left: 50%; + flex-direction: column; + background-color: white; + white-space: nowrap; +} +main header nav ul li.active a { + color: #3c4144; + border-bottom: 3px solid; +} +main header nav ul li:hover a { + color: #3c4144; +} +main header nav ul li:hover .submenu { + visibility: unset; + max-height: 1000px; +} +main header nav ul li:hover .submenu a { + color: #96a5ae; + border: none; +} +main header nav ul li:hover .submenu li:hover a { + color: #3c4144; +} +main header nav .burger { + display: none; +} +@media screen and (max-width: 560px) { + main header nav { + justify-content: space-between; + } + main header nav .burger { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-direction: column; + font-weight: bold; + border: 1px solid; + margin: 0 20px; + cursor: pointer; + border-radius: 100%; + width: 35px; + height: 35px; + color: #555d61; + font-size: 25px; + } + main header nav ul { + display: none; + } + main header nav ul.responsive-show { + display: flex; + flex-direction: column; + position: absolute; + right: 0; + max-width: 100vw; + min-width: 50vw; + top: 60px; + background-color: white; + box-shadow: 0 4px 6px 2px #0000000a; + height: unset; + } + main header nav ul.responsive-show li.active a { + border: none; + } + main header nav ul.responsive-show li .submenu { + display: flex; + visibility: visible; + position: relative; + height: unset; + max-height: unset; + transition: max-height 0.6s; + top: unset; + left: unset; + margin-left: 20px; + } + main header nav ul.responsive-show li .submenu li a { + font-weight: 400; + font-size: 14px; + color: #96a5ae; + } +} +main #page-container { + width: 100%; + flex: 1; +} +main #page-container .page-header { + background-image: url("/assets/images/wallpaper_binary.png"); + padding: 50px 0; +} +main #page-container .page-header h1 { + padding: 15px 40px 0; + font-size: 25px; + color: #4baabb; + margin: 0 auto; +} +main #page-container .page-header p { + color: #72e3f0; + font-style: italic; + padding: 15px 40px 15px 100px; + margin: 0 auto; + font-size: 18px; +} +main #page-container .page-header p * { + color: #72e3f0; +} +main #page-container .page-header .big-logo { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + gap: 20px; + padding: 20px; +} +main #page-container .page-header .big-logo img { + width: 200px; + max-width: 100%; +} +main #page-container .page-header .big-logo img.logo-text { + width: 300px; + max-width: 100%; +} +main #page-container .page-header .logo { + padding-left: 30px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; +} +main #page-container .page-header .logo img { + width: 100%; +} +@media screen and (max-width: 560px) { + main #page-container .page-header h1 { + padding: 15px 20px 0; + } + main #page-container .page-header p { + padding: 20px 20px 30px 40px; + text-align: justify; + } + main #page-container .page-header .big-logo { + flex-direction: column; + } +} +main #page-container .page-header.logo-left .grid-wrapper { + display: grid; + grid-template-columns: 120px 1fr; + grid-template-rows: auto 1fr; +} +main #page-container .page-header.logo-left .grid-wrapper h1 { + width: 100%; +} +main #page-container .page-header.logo-left .grid-wrapper .logo { + grid-column: 1; + grid-row: 1; + width: 100%; +} +main #page-container .page-header.logo-left .grid-wrapper p { + margin: 0; + grid-column: 1/span 2; +} +@media screen and (max-width: 780px) { + main #page-container .page-header.logo-left .grid-wrapper h1 { + padding: 0 20px; + } + main #page-container .page-header.logo-left .grid-wrapper .logo { + padding: 0 20px; + } +} +main #page-container .page-philo { + background-image: url("/assets/images/wallpaper_binary.png"); + padding: 120px 30px; +} +main #page-container .page-philo p { + width: 100%; + max-width: 600px; + font-size: 18px; + color: #aabbc8; + text-align: center; + font-style: italic; + font-weight: bold; +} +main #page-container .page-philo p * { + color: #aabbc8; +} +main #page-container .page-contents-center { + width: 1300px; + max-width: 100%; + margin: 0 auto; +} +@media screen and (max-width: 1300px) { + main #page-container .page-contents-center { + padding: 20px 20px 0; + } +} +main #page-container h2.page-section-title { + color: #4baabb; + padding: 20px 0 10px; + width: 1300px; + max-width: 100%; + margin: 0 auto; +} +@media screen and (max-width: 1300px) { + main #page-container h2.page-section-title { + padding: 20px 20px 0; + } +} +main #page-container #home-page { + display: flex; + flex-direction: column; +} +main #page-container #home-page .section-title { + padding: 10px; + margin: 0; + color: #aabbc8; +} +main #page-container #home-page .page-header .philo-bubbles { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-wrap: wrap; + gap: 40px; + margin: 30px 20px; +} +@media screen and (max-width: 780px) { + main #page-container #home-page .page-header .philo-bubbles { + gap: 20px; + } +} +main #page-container #home-page .page-header .philo-bubbles li { + border-radius: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + background-color: #d4d9dd; + width: 100px; + height: 100px; +} +main #page-container #home-page .page-header .philo-bubbles li * { + color: #6b7880; +} +@media screen and (max-width: 560px) { + main #page-container #home-page .page-header .philo-bubbles li { + width: 75px; + height: 75px; + } + main #page-container #home-page .page-header .philo-bubbles li * { + font-size: 12px; + } +} +main #page-container #home-page .page-header .philo-bubbles li:first-child { + background-color: #6b7880; +} +main #page-container #home-page .page-header .philo-bubbles li:first-child * { + color: white; +} +main #page-container #home-page .page-header .philo-bubbles li:last-child { + background-color: #35393c; +} +main #page-container #home-page .page-header .philo-bubbles li:last-child * { + color: #96a5ae; +} +main #page-container #home-page #news { + padding: 60px 20px; +} +main #page-container #home-page #news .articles-displayer { + margin: 0 auto 40px; +} +main #page-container #home-page #news .articles-displayer .prev-next-buttons { + display: flex; + justify-content: space-between; +} +main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn, +main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn { + border: none; + background: none; + display: flex; + align-items: center; + gap: 10px; + padding: 5px 0; +} +main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.disabled, +main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.disabled { + visibility: hidden; + pointer-events: none; +} +main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active, +main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active { + cursor: pointer; + color: #6b7880; +} +main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active:hover, +main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active:hover { + color: #3c4144; +} +main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active::after { + content: " "; + border-style: solid; + border-width: 2px 2px 0 0; + width: 8px; + height: 8px; + transform: rotate(45deg); + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; +} +main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active::before { + content: " "; + border-style: solid; + border-width: 2px 2px 0 0; + width: 8px; + height: 8px; + transform: rotate(-135deg); + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; +} +main #page-container #home-page #news .articles-displayer article { + display: grid; + gap: 5px 50px; + grid-template-rows: auto auto auto 1fr; + position: relative; + padding-left: 20px; +} +main #page-container #home-page #news .articles-displayer article.grid-1 { + grid-template-columns: 1fr; +} +main #page-container #home-page #news .articles-displayer article.grid-2 { + grid-template-columns: 1fr 1fr; +} +main #page-container #home-page #news .articles-displayer article .date { + grid-column: 1; + grid-row: 1; + text-align: right; +} +main #page-container #home-page #news .articles-displayer article .date time { + color: #6b7880; + font-style: italic; + font-size: 12px; +} +main #page-container #home-page #news .articles-displayer article .title { + grid-column: 1; + grid-row: 2; +} +main #page-container #home-page #news .articles-displayer article .title h3 { + margin: 0 0 10px; +} +main #page-container #home-page #news .articles-displayer article .subtitle { + grid-column: 1; + grid-row: 3; + font-style: italic; + font-size: 15px; +} +main #page-container #home-page #news .articles-displayer article .body { + grid-column: 1; + grid-row: 4; + min-height: 200px; + padding-bottom: 40px; + text-align: justify; +} +main #page-container #home-page #news .articles-displayer article .image-carousel { + grid-row: 1/span 4; + grid-column: 2; +} +main #page-container #home-page #news .articles-displayer article .image-carousel img { + max-height: 100%; +} +main #page-container #home-page #news .articles-displayer article.article-placeholder { + padding: 0; +} +main #page-container #home-page #news .articles-displayer article.article-placeholder * { + background-color: #d4d9dd; +} +main #page-container #home-page #news .articles-displayer article.article-placeholder .date { + height: 10px; +} +main #page-container #home-page #news .articles-displayer article.article-placeholder .title { + height: 40px; +} +main #page-container #home-page #news .articles-displayer article.article-placeholder .subtitle { + height: 30px; +} +@media screen and (max-width: 900px) { + main #page-container #home-page #news .articles-displayer article { + gap: 5px; + padding: 0; + } + main #page-container #home-page #news .articles-displayer article.grid-2 { + grid-template-columns: 1fr; + grid-template-rows: 300px auto auto auto 1fr; + } + main #page-container #home-page #news .articles-displayer article.grid-2 .date { + grid-row: 2; + } + main #page-container #home-page #news .articles-displayer article.grid-2 .title { + grid-row: 3; + } + main #page-container #home-page #news .articles-displayer article.grid-2 .subtitle { + grid-row: 4; + } + main #page-container #home-page #news .articles-displayer article.grid-2 .body { + grid-row: 5; + } + main #page-container #home-page #news .articles-displayer article.grid-2 .image-carousel { + grid-row: 1; + grid-column: 1; + } + main #page-container #home-page #news .articles-displayer article.grid-1 .date { + grid-row: 1; + } + main #page-container #home-page #news .articles-displayer article.grid-1 .title { + grid-row: 2; + } + main #page-container #home-page #news .articles-displayer article.grid-1 .subtitle { + grid-row: 3; + } + main #page-container #home-page #news .articles-displayer article.grid-1 .body { + grid-row: 4; + } + main #page-container #home-page #news .articles-displayer article .date, +main #page-container #home-page #news .articles-displayer article .title, +main #page-container #home-page #news .articles-displayer article .subtitle { + padding: 0 10px; + } + main #page-container #home-page #news .articles-displayer article .body { + padding: 0 10px 30px; + } +} +main #page-container #home-page .poles { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 30px; + padding: 100px 0; +} +main #page-container #home-page .poles .theme-card { + display: flex; + flex-direction: column; + width: 100%; + cursor: pointer; + transition: transform 0.3s; +} +main #page-container #home-page .poles .theme-card .card-img { + width: 100%; + height: 240px; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-direction: column; + position: relative; +} +main #page-container #home-page .poles .theme-card .card-img img { + position: absolute; + max-width: 100%; + height: 100%; + padding: 10px; +} +main #page-container #home-page .poles .theme-card .card-title h2 { + margin: 0; + text-align: center; + padding: 10px 20px; + color: #4baabb; + display: block; + background-color: white; +} +main #page-container #home-page .poles .theme-card .card-description { + flex: 1; + padding: 30px 20px; +} +main #page-container #home-page .poles .theme-card .card-description p { + margin: 0; + color: #4baabb; + text-align: center; +} +main #page-container #home-page .poles .theme-card:hover { + transform: scale(1.03); +} +main #page-container #home-page .kuadrado-values { + background-image: url("/assets/images/wallpaper_binary_light.png"); + padding: 100px 0 120px; +} +main #page-container #home-page .kuadrado-values *:not(a, blue) { + color: #d4d9dd; +} +main #page-container #home-page .kuadrado-values h2 { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + margin: 0 auto 60px; + width: 120px; + height: 120px; + background-image: url("/assets/images/wallpaper_binary.png"); + border-radius: 100%; + color: #72e3f0; +} +main #page-container #home-page .kuadrado-values ul.values-list { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 30px; +} +main #page-container #home-page .kuadrado-values ul.values-list li { + background-image: url("/assets/images/wallpaper_binary.png"); + padding: 30px 20px 40px; +} +main #page-container #home-page .kuadrado-values ul.values-list li h3 { + text-align: center; +} +main #page-container #home-page .kuadrado-values ul.values-list li p { + text-align: justify; +} +main #page-container #home-page #whoami { + padding: 20px 0 50px; +} +main #page-container #home-page #whoami .page-contents-center { + padding: 40px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-direction: column; +} +main #page-container #home-page #whoami .page-contents-center h2 { + text-align: center; + background-color: #6b7880; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-direction: column; + width: 220px; + height: 220px; + border-radius: 100%; + padding: 30px; + margin: 40px 0; + color: #72e3f0; +} +main #page-container #home-page #whoami .page-contents-center .presentation-card .header { + display: grid; + grid-template-columns: auto 1fr; + gap: 30px; + padding: 50px 0; +} +main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-direction: column; +} +main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic img { + width: 150px; + height: auto; + border-radius: 100%; +} +main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h3 { + font-size: 22px; + color: #96a5ae; + margin: 0; +} +main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4 { + font-size: 18px; +} +main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text strong, +main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4 { + color: #96a5ae; +} +main #page-container #home-page #whoami .page-contents-center .presentation-card .body p { + font-size: 18px; + font-style: italic; + font-family: serif; + color: #555d61; +} +main #page-container #home-page #whoami .page-contents-center .presentation-card .body p *:not(blue, a) { + color: #555d61; +} +@media screen and (max-width: 560px) { + main #page-container #home-page #whoami .page-contents-center .presentation-card .header { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-direction: column; + } + main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text { + text-align: center; + } +} +@media screen and (max-width: 900px) { + main #page-container #home-page .poles { + grid-template-columns: 1fr; + gap: 40px; + } + main #page-container #home-page .poles .theme-card { + transition: transform 0.3s; + } + main #page-container #home-page .poles .theme-card .card-img { + height: 300px; + } + main #page-container #home-page .poles .theme-card .card-img img { + min-width: unset; + height: 100%; + } + main #page-container #home-page .poles .theme-card .card-title h2 { + padding: 5px 20px; + } + main #page-container #home-page .poles .theme-card .card-description { + padding: 20px 30px; + } + main #page-container #home-page .poles .theme-card:hover { + transform: none; + } + main #page-container #home-page .kuadrado-values ul.values-list { + grid-template-columns: 1fr; + } +} +@media screen and (max-width: 1300px) { + main #page-container #home-page .poles { + padding: 20px; + } + main #page-container #home-page .articles-displayer { + padding: 0; + } +} +main #page-container #education-page h3.big { + font-size: 30px; +} +main #page-container #education-page .title-banner { + display: flex; + justify-content: flex-end; + flex-direction: column; + height: 20vw; + min-height: 250px; + background-image: url("/assets/images/popularization_banner.png"); + background-size: cover; + background-repeat: no-repeat; + background-position: center; +} +main #page-container #education-page .title-banner h2 { + color: white; + font-size: 2.5em; + margin: 40px; + text-shadow: 0 0 6px #0003; +} +main #page-container #education-page .special-announcement { + background-color: #ffd000; +} +main #page-container #education-page .special-announcement .page-contents-center { + padding: 0 20px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; +} +main #page-container #education-page .special-announcement .page-contents-center p { + color: #555d61; + font-size: 20px; + font-weight: 600; + margin: 0; + padding: 40px 0; +} +main #page-container #education-page .edu-themes { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 50px; + font-family: monospace; + padding: 70px 0; +} +main #page-container #education-page .edu-themes .edu-theme { + display: grid; + grid-template-columns: auto 1fr; +} +main #page-container #education-page .edu-themes .edu-theme * { + border-style: dashed; + border-color: #00ff00; + border-width: 0 0 0 0; +} +main #page-container #education-page .edu-themes .edu-theme h3 { + color: #00ff00; + grid-row: 1; + margin: 0; + padding: 10px; + display: flex; + align-items: center; + border-width: 0 0 0 1px; +} +main #page-container #education-page .edu-themes .edu-theme img { + width: 100%; + grid-row: 1/span 2; + border-width: 1px 0 1px 1px; +} +main #page-container #education-page .edu-themes .edu-theme p { + text-align: justify; + color: #72e3f0; + grid-row: 2; + margin: 0; + padding: 10px 30px 0 10px; + border-width: 1px 1px 1px 0; +} +main #page-container #education-page .edu-themes .edu-theme p * { + color: #72e3f0; +} +main #page-container #education-page .practical-info { + padding: 50px 0; +} +main #page-container #education-page .practical-info .page-contents-center { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 50px; +} +main #page-container #education-page .practical-info .page-contents-center .info-block { + display: grid; + grid-template-rows: auto 1fr; +} +main #page-container #education-page .practical-info .page-contents-center .info-block .info-title { + color: #4baabb; + margin: 0; + border-bottom: 1px dashed #aabbc8; + border-left: 1px dashed #aabbc8; + padding: 10px; +} +main #page-container #education-page .practical-info .page-contents-center .info-block .info-body { + margin: 0; + padding: 20px 10px; + border-right: 1px dashed #aabbc8; + border-bottom: 1px dashed #aabbc8; +} +main #page-container #education-page .practical-info .page-contents-center .info-block ul { + display: flex; + flex-direction: column; + gap: 5px; +} +main #page-container #education-page .practical-info .page-contents-center .info-block ul li:not(.fullwidth) { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; +} +main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span { + padding: 3px 0; +} +main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:first-child { + font-weight: bold; + color: #6b7880; +} +main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:last-child { + color: #4baabb; +} +@media screen and (max-width: 1200px) { + main #page-container #education-page .edu-themes { + grid-template-columns: 1fr; + gap: 30px; + padding: 70px 0; + } +} +@media screen and (max-width: 780px) { + main #page-container #education-page .practical-info .page-contents-center { + grid-template-columns: 1fr; + gap: 30px; + } + main #page-container #education-page .practical-info .page-contents-center .info-block .info-title { + border-top: 1px dashed #aabbc8; + } + main #page-container #education-page .practical-info .page-contents-center .info-block .info-body { + border-bottom: none; + } +} +@media screen and (max-width: 560px) { + main #page-container #education-page .edu-themes .edu-theme h3 { + border-width: 0 0 1px 1px; + } + main #page-container #education-page .edu-themes .edu-theme img { + max-width: 150px; + height: auto; + grid-row: 1; + border-width: 1px 0 0 1px; + } + main #page-container #education-page .edu-themes .edu-theme p { + grid-row: 2; + grid-column: 1/span 2; + padding: 20px 10px 30px 10px; + border-width: 0 1px 1px 1px; + } +} +main #page-container #games-page .game-articles article { + display: grid; + grid-template-columns: 0.7fr 1fr; + gap: 30px 50px; + margin: 20px 0; +} +main #page-container #games-page .game-articles article.game-article { + grid-template-rows: repeat(7, auto); + width: 100%; +} +main #page-container #games-page .game-articles article.game-article .game-title { + grid-column: 1/span 2; + margin: 0; + padding: 30px 20px; + color: #aabbc8; + font-size: 35px; + font-style: italic; +} +main #page-container #games-page .game-articles article.game-article .game-banner { + grid-column: 1/span 2; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-direction: column; + background-color: black; + overflow: hidden; +} +main #page-container #games-page .game-articles article.game-article .game-banner img { + height: 500px; +} +main #page-container #games-page .game-articles article.game-article .game-tags { + display: flex; + gap: 10px; + flex-wrap: wrap; + margin: 10px 20px; +} +main #page-container #games-page .game-articles article.game-article .game-tags span { + font-size: 12px; + padding: 4px; + background-color: #d4d9dd; + color: #6b7880; + border-radius: 5px; + font-weight: 600; +} +main #page-container #games-page .game-articles article.game-article .game-subtitle { + grid-column: 1; + margin: 10px 20px; + color: #6b7880; +} +main #page-container #games-page .game-articles article.game-article .game-description { + grid-column: 1; + text-align: justify; + margin: 10px 20px 30px; +} +main #page-container #games-page .game-articles article.game-article .image-carousel { + grid-column: 2; + grid-row: 3/span 4; + height: 100%; +} +main #page-container #games-page .game-articles article.game-article .game-team { + grid-column: 1/span 2; +} +main #page-container #games-page .game-articles article.game-article .game-team h2 { + color: #6b7880; + padding: 10px 20px; + font-style: italic; + font-size: 20px; + margin: 0; +} +main #page-container #games-page .game-articles article.game-article .game-team .team-members { + display: flex; + flex-direction: column; +} +main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member { + display: grid; + grid-template-columns: 80px 1fr; + grid-template-rows: auto auto 1fr; + margin: 10px; +} +main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img { + grid-row: 1/span 3; + overflow: hidden; +} +main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img img { + width: 100%; + padding: 0 10px 0 0; +} +main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-title { + margin: 0 0 5px; + color: #6b7880; +} +main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-subtitle { + margin: 0 10px; + font-size: 14px; + color: #96a5ae; + font-style: italic; +} +main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body { + margin: 10px 10px 20px 20px; + text-align: justify; +} +main #page-container #games-page .game-articles article.placeholder { + height: 400px; +} +main #page-container #games-page .game-articles article.placeholder * { + background-color: #d4d9dd; +} +@media screen and (max-width: 900px) { + main #page-container #games-page .game-articles article { + grid-template-columns: 1fr; + } + main #page-container #games-page .game-articles article.game-article { + grid-template-rows: repeat(6, auto); + } + main #page-container #games-page .game-articles article.game-article .game-title { + grid-column: 1; + padding: 0; + font-size: 25px; + } + main #page-container #games-page .game-articles article.game-article .game-banner { + grid-column: 1; + margin: 0 -20px; + } + main #page-container #games-page .game-articles article.game-article .image-carousel { + grid-column: 1; + grid-row: 3; + height: 400px; + margin: 0 -20px; + } + main #page-container #games-page .game-articles article.game-article .game-team { + grid-column: 1; + } + main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member { + grid-template-columns: 70px 1fr; + } + main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img { + grid-row: 1/span 2; + } + main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body { + grid-column: 1/span 2; + } +} +main #page-container #software-page .software-articles { + margin: 20px auto 50px; +} +main #page-container #software-page .software-articles article.software-article { + display: grid; + grid-template-columns: auto 1fr; + margin: 0 0 50px; + gap: 10px 30px; +} +main #page-container #software-page .software-articles article.software-article .software-title { + grid-column: 2; + color: #aabbc8; + margin: 0; + padding: 10px; +} +main #page-container #software-page .software-articles article.software-article .software-subtitle { + grid-column: 2; + margin: 10px; + color: #6b7880; +} +main #page-container #software-page .software-articles article.software-article .software-description { + grid-column: 2; + text-align: justify; + margin: 10px; +} +main #page-container #software-page .software-articles article.software-article .software-image { + padding: 20px; + background-color: black; + grid-column: 1; + grid-row: 1/span 3; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + width: 200px; + height: 200px; + overflow: hidden; + border-radius: 100%; +} +main #page-container #software-page .software-articles article.software-article .software-image img { + max-width: 100%; + max-height: 400px; +} +main #page-container #software-page .software-articles article.software-article .software-technical { + grid-column: 1/span 2; +} +main #page-container #software-page .software-articles article.software-article .software-technical h2 { + color: #6b7880; + margin: 0 10px; + padding: 10px 0 0; + font-size: 16px; +} +main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details { + margin: 10px; +} +main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail { + display: grid; + grid-template-columns: 1fr auto; + font-size: 12px; + border-bottom: 1px solid #d4d9dd; + padding: 5px 0; +} +main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail label { + font-weight: bold; + color: #6b7880; +} +main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail ul { + display: flex; + flex-wrap: wrap; + gap: 10px; +} +main #page-container #software-page .software-articles article.software-article .software-technical ul.releases { + margin: 10px; +} +main #page-container #software-page .software-articles article.software-article .software-technical .detail { + display: grid; + grid-template-columns: 1fr auto; + font-size: 12px; + border-bottom: 1px solid #d4d9dd; + padding: 5px 0; +} +main #page-container #software-page .software-articles article.software-article .software-technical .detail label { + font-weight: bold; + color: #6b7880; +} +main #page-container #software-page .software-articles article.software-article .software-technical .detail .label { + color: #aabbc8; +} +main #page-container #software-page .software-articles article.software-article .software-technical .detail ul { + display: flex; + flex-wrap: wrap; + gap: 10px; +} +@media screen and (max-width: 900px) { + main #page-container #software-page .software-articles article.software-article .software-title { + display: flex; + align-items: center; + } + main #page-container #software-page .software-articles article.software-article .software-subtitle, +main #page-container #software-page .software-articles article.software-article .software-description { + grid-column: 1/span 2; + } + main #page-container #software-page .software-articles article.software-article .software-image { + width: 100px; + height: 100px; + grid-row: 1; + } +} +main #page-container #software-page .software-articles article.placeholder { + display: flex; + flex-direction: column; + gap: 10px; + margin: 30px; +} +main #page-container #software-page .software-articles article.placeholder * { + background-color: #d4d9dd; +} +main #page-container #software-page .software-articles article.placeholder .title { + height: 60px; +} +main #page-container #software-page .software-articles article.placeholder .body { + height: 400px; +} +main #page-container #software-page .software-articles article.placeholder .details { + height: 200px; +} +main footer { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-direction: column; + width: 100%; + background-image: url("/assets/images/wallpaper_binary.png"); + padding: 40px 20px; + gap: 20px; + font-size: 12px; +} +main footer span { + color: #96a5ae; + text-align: center; +} +main footer .logo { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + gap: 10px; +} +main footer .logo img { + width: 35px; +} +main footer .logo img.text-logo { + width: 100px; +} +main footer .social { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + gap: 20px; +} +main footer .social a { + background-color: #555d61; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + width: 25px; + height: 25px; + font-weight: bold; + font-size: 16px; + border-radius: 100%; +} + +/*# sourceMappingURL=style.css.map */ diff --git a/src/lib/article-utils.js b/src/lib/article-utils.js index 3a7d83f..2d182ca 100644 --- a/src/lib/article-utils.js +++ b/src/lib/article-utils.js @@ -48,7 +48,7 @@ function populateArticles(articles) { return article; }) ) - .then(completeArticles => resolve(completeArticles.sort((a, b) => a.date - b.date))) + .then(completeArticles => resolve(completeArticles.sort((a, b) => b.date - a.date))) .catch(e => reject(e)); }); } diff --git a/src/pages/software-development/components/software-articles.js b/src/pages/software-development/components/software-articles.js index d33ac02..5ef3c6f 100644 --- a/src/pages/software-development/components/software-articles.js +++ b/src/pages/software-development/components/software-articles.js @@ -25,10 +25,12 @@ class SoftwareArticle { property: "name", }, { - tag: "time", - class: "software-date", - contents: getArticleDate(date), - property: "datePublished", + tag: "div", class: "software-image", + contents: [ + { + tag: "img", src: `${path}/images/${images[0]}` + } + ] }, { tag: "h3", @@ -42,7 +44,6 @@ class SoftwareArticle { contents: getArticleBody(body), property: "description", }, - new ImageCarousel({ images: images.map(img => `${path}/images/${img}`) }).render(), { tag: "div", class: "software-technical", diff --git a/src/pages/software-development/software-development.scss b/src/pages/software-development/software-development.scss index 87fdc63..c6f6670 100644 --- a/src/pages/software-development/software-development.scss +++ b/src/pages/software-development/software-development.scss @@ -3,43 +3,47 @@ margin: 20px auto 50px; article.software-article { display: grid; - grid-template-columns: 1fr 0.7fr; - margin: 0 0 30px; + grid-template-columns: auto 1fr; + margin: 0 0 50px; gap: 10px 30px; + .software-title { - grid-column: 1 / span 2; + grid-column: 2; color: $light_2; margin: 0; padding: 10px; } - .software-date { - margin: 0; - color: $light_1; - font-style: italic; - text-align: right; - color: $medium_grey; - font-style: italic; - font-size: 12px; - } .software-subtitle { - grid-column: 1; + grid-column: 2; margin: 10px; color: $medium_grey; } .software-description { - grid-column: 1; + grid-column: 2; text-align: justify; margin: 10px; } - .image-carousel { - grid-column: 2; - grid-row: 2 / span 6; - min-height: 250px; + + .software-image { + padding: 20px; + background-color: black; + grid-column: 1; + grid-row: 1 / span 3; + @include flex-center; + width: 200px; + height: 200px; + overflow: hidden; + border-radius: 100%; + img { + max-width: 100%; + max-height: 400px; + } } + .software-technical { - grid-column: 1; + grid-column: 1 / span 2; h2 { color: $medium_grey; margin: 0 10px; @@ -91,17 +95,18 @@ } } @media screen and (max-width: $screen_l) { - grid-template-columns: 1fr; .software-title { - grid-column: 1; + display: flex; + align-items: center; } - .image-carousel { - grid-column: 1; - grid-row: 2; - height: 200px; + .software-subtitle, + .software-description { + grid-column: 1 / span 2; } - .software-technical { - grid-column: 1; + .software-image { + width: 100px; + height: 100px; + grid-row: 1; } } } -- GitLab