Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
education.js 34.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • (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){
    module.exports = {
        build: {
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
            protected_dirs: ["assets", "style", "views", "standard"],
    
            default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
        },
    };
    
    },{}],2:[function(require,module,exports){
    module.exports = {
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
        images_url: `/assets/images/`,
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
    },{}],3:[function(require,module,exports){
    
    "use strict";
    
    module.exports = {
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
        register_key: "objectToHtmlRender",
    
        /**
         * Register "this" as a window scope accessible variable named by the given key, or default.
         * @param {String} key 
         */
        register(key) {
            const register_key = key || this.register_key;
            window[register_key] = this;
        },
    
        /**
         * This must be called before any other method in order to initialize the lib.
         * It provides the root of the rendering cycle as a Javascript object.
         * @param {Object} renderCycleRoot A JS component with a render method.
         */
    
        setRenderCycleRoot(renderCycleRoot) {
            this.renderCycleRoot = renderCycleRoot;
        },
    
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
        event_name: "objtohtml-render-cycle",
    
        /**
         * Set a custom event name for the event that is trigger on render cycle.
         * Default is "objtohtml-render-cycle".
         * @param {String} evt_name 
         */
        setEventName(evt_name) {
            this.event_name = evt_name;
        },
    
        /**
         * This is the core agorithm that read an javascript Object and convert it into an HTML element.
         * @param {Object} obj The object representing the html element must be formatted like:
         * {
         *      tag: String // The name of the html tag, Any valid html tag should work. div, section, br, ul, li...
         *      xmlns: String // This can replace the tag key if the element is an element with a namespace URI, for example an <svg> tag.
         *                      See https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS for more information
         *      style_rules: Object // a object providing css attributes. The attributes names must be in JS syntax,
         *                              like maxHeight: "500px", backgrouncColor: "#ff2d56",  margin: 0,  etc.
         *      contents: Array or String // This reprensents the contents that will be nested in the created html element.
         *                                   <div>{contents}</div>
         *                                   The contents can be an array of other objects reprenting elements (with tag, contents, etc)
         *                                   or it can be a simple string.
         *      // All other attributes will be parsed as html attributes. They can be anything like onclick, href, onchange, title...
         *      // or they can also define custom html5 attributes, like data, my_custom_attr or anything.
         * }
         * @returns {HTMLElement} The output html node.
         */
        objectToHtml(obj) {
            if (!obj) return document.createElement("span"); // in case of invalid input, don't block the whole process.
            const objectToHtml = this.objectToHtml.bind(this);
            const { tag, xmlns } = obj;
            const node = xmlns !== undefined ? document.createElementNS(xmlns, tag) : document.createElement(tag);
            const excludeKeys = ["tag", "contents", "style_rules", "state", "xmlns"];
    
    
            Object.keys(obj)
                .filter(attr => !excludeKeys.includes(attr))
                .forEach(attr => {
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                    switch (attr) {
                        case "class":
                            node.classList.add(...obj[attr].split(" ").filter(s => s !== ""));
                            break;
                        case "on_render":
                            if (!obj.id) {
                                node.id = `${btoa(JSON.stringify(obj).slice(0, 127)).replace(/\=/g, '')}${window.performance.now()}`;
                            }
                            if (typeof obj.on_render !== "function") {
                                console.error("The on_render attribute must be a function")
                            } else {
                                this.attach_on_render_callback(node, obj.on_render);
                            }
                            break;
                        default:
                            if (xmlns !== undefined) {
                                node.setAttributeNS(null, attr, obj[attr])
                            } 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":
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                                if (xmlns !== undefined) {
                                    el = Object.assign(el, { xmlns })
                                }
    
                                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;
        },
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
    
        on_render_callbacks: [],
    
        /**
         * This is called if the on_render attribute of a component is set.
         * @param {HTMLElement} node The created html element
         * @param {Function} callback The callback defined in the js component to render
         */
        attach_on_render_callback(node, callback) {
            const callback_handler = {
                callback: e => {
                    if (e.detail.outputNode === node || e.detail.outputNode.querySelector(`#${node.id}`)) {
                        callback(node);
                        const handler_index = this.on_render_callbacks.indexOf((this.on_render_callbacks.find(cb => cb.node === node)));
                        if (handler_index === -1) {
                            console.warn("A callback was registered for node with id " + node.id + " but callbacck handler is undefined.")
                        } else {
                            window.removeEventListener(this.event_name, this.on_render_callbacks[handler_index].callback)
                            this.on_render_callbacks.splice(handler_index, 1);
                        }
                    }
                },
                node,
            };
    
            const len = this.on_render_callbacks.push(callback_handler);
            window.addEventListener(this.event_name, this.on_render_callbacks[len - 1].callback);
        },
    
        /**
         * If a main element exists in the html document, it will be used as rendering root.
         * If not, it will be created and inserted.
         */
    
        renderCycle: function () {
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
            const main_elmt = document.getElementsByTagName("main")[0] || (function () {
                const created_main = document.createElement("main");
                document.body.appendChild(created_main);
                return created_main;
            })();
    
            this.subRender(this.renderCycleRoot.render(), main_elmt, { mode: "replace" });
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
    
        /**
         * This method behaves like the renderCycle() method, but rather that starting the rendering cycle from the root component,
        * it can start from any component of the tree. The root component must be given as the first argument, the second argument be
        * be a valid html element in the dom and will be used as the insertion target.
         * @param {Object} object An object providing a render method returning an object representation of the html to insert
         * @param {HTMLElement} htmlNode The htlm element to update
         * @param {Object} options can be used the define the insertion mode, default is set to "append" and can be set to "override",
             * "insert-before" (must be defined along with an insertIndex key (integer)),
             * "adjacent" (must be defined along with an insertLocation key (String)), "replace" or "remove".
             * In case of "remove", the first argument "object" is not used and can be set to null, undefined or {}...
         */
    
        subRender(object, htmlNode, options = { mode: "append" }) {
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
            let outputNode = null;
    
            const get_insert = () => {
                outputNode = this.objectToHtml(object);
                return outputNode;
            };
    
    
            switch (options.mode) {
                case "append":
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                    htmlNode.appendChild(get_insert());
    
                    break;
                case "override":
                    htmlNode.innerHTML = "";
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                    htmlNode.appendChild(get_insert());
    
                    break;
                case "insert-before":
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                    htmlNode.insertBefore(get_insert(), htmlNode.childNodes[options.insertIndex]);
    
                    break;
                case "adjacent":
                    /**
                     * options.insertLocation must be one of:
                     *
                     * afterbegin
                     * afterend
                     * beforebegin
                     * beforeend
                     */
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                    htmlNode.insertAdjacentHTML(options.insertLocation, get_insert());
    
                    break;
                case "replace":
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                    htmlNode.parentNode.replaceChild(get_insert(), htmlNode);
    
                    break;
                case "remove":
                    htmlNode.remove();
                    break;
            }
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
            const evt_name = this.event_name;
            const event = new CustomEvent(evt_name, {
                detail: {
                    inputObject: object,
                    outputNode,
                    insertOptions: options,
                    targetNode: htmlNode,
                }
            });
    
            window.dispatchEvent(event);
    
        },
    };
    },{}],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",
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
            description: "Abordez les notions fondamentales de façon décontractée pour le plaisir de comprendre en s'appuyant sur les domaines d'application du jeu vidéo.",
    
            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",
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
            description: "Perdu avec votre ordinateur ou votre smartphone, les logiciels, internet ? Prenez en main les fondamentaux apprenez pas à pas à utiliser sereinement la technologie.",
    
            image: "learning_theme_pc.png",
            // pageUrl: "popularization"
        },
        {
            title: "Stage GNU/Linux",
            description: `<b>Passez le cap du libre ! </b><br/>
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
            Apprenez à installer Linux, faites vos premiers pas avec les logiciels libres et acquérez une autonomie suffisante pour une utilisation basique.`,
    
            image: "learning_theme_linux.png"
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
        },
        {
            title: "Créer un jeu avec Mentalo",
            description: "Créez un jeu en quelques séances avec l'application Mentalo. Manipulez des concepts logiques, narratifs et artistiques avec le maximum de simplicité.",
            image: "learning_theme_mentalo.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",
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                                        contents: `Ateliers, stages, workshops et cours particuliers accessibles à tous. 
                                        Programmation, graphisme 2D, jeux vidéo, vulgarisation informatique, 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: [
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                                    // {
                                    //     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) 
                                    //             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: [
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                                            { tag: "h3", class: "info-title", contents: "Pour s'inscrire ou en savoir plus <em>(programme 2021 2022 à définir, plus d'infos bientôt)</em>" },
    
                                            {
                                                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",
                                                            },
                                                        ]
                                                    },
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                                                    // {
                                                    //     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";
    
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
    const renderer = require("object-to-html-renderer")
    
    const Template = require("./template/template");
    
    module.exports = function runPage(PageComponent) {
        const template = new Template({ page: new PageComponent() });
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
        renderer.register("obj2htm")
        obj2htm.setRenderCycleRoot(template);
        obj2htm.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",
                                    },
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                                    {
                                        tag: "a",
                                        href: "https://mastodon.gamedev.place/@kuadrado_software",
                                        target: "_blank",
                                        contents: "m",
                                        title: "Mastodon",
                                    }
    
                                ],
                            },
                            {
                                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]);