diff --git a/README.md b/README.md index 30f358f..cf2edba 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +## Credits + +https://tabler-icons.io/ ## Structure @@ -51,4 +54,4 @@ Mosaic of squared technologies logos - Caddy - Python -- Gunicorn \ No newline at end of file +- Gunicorn diff --git a/assets/locales/en.yaml b/assets/locales/en.yaml index e63dfe1..f6000a2 100644 --- a/assets/locales/en.yaml +++ b/assets/locales/en.yaml @@ -1,29 +1,56 @@ +localeId: en +french: French +english: English + +view-more: See more +go-back-to-main: Go back to the main page external-website: External website last-update: "Last update :" about-website: "About this website" page: - title: Matthieu Bessat - Web developer + title: Matthieu Bessat profile: - intro: - main: Hi! I'm Matthieu - secondary: I like to program stuff + main: Hi, I'm Matthieu! + secondary: I like to program stuff + +intro: + title: About me + description: | + Welcome to my little piece of the web! My name is Matthieu Bessat aka lefuturiste, My life is complex and full of things but for now this page is mostly about my experience as a freelance web developer. My skillset is various enough that I can manage the creation of an app/website from start to finish: from defining the customer needs to hosting the website or app. If you have any projects that is linked to programming and you think that I can help you, don't hesitate to [contact me](#contact). + age: I'm %d years old + speak: I speak: + location: I live in + transport: I mainly use my bike to get around. + interests: What I love: technologies: + name: Technologies title: Some of the technologies that I'm currently working with projects: + name: Projects + title: Projects + project: Project: pro: title: Highlighted professional projects + description: Some projects that I've developed or participated in as a freelancer or as an employee side: title: Highlighted side projects + description: Entrepreneurship projects, volunteering projects or just for fun projects. + background: Background + solution: Solutions + technologies: Technologies used + images: Gallery links: + name: Links title: Find me on... contact: + name: Contact no-script: If you want to use the contact form, you will need to enable javascript to run free-ish software title: Contact me use-email: "You can contact me via e-mail:" diff --git a/assets/locales/fr.yaml b/assets/locales/fr.yaml index 93d0835..8ecccb6 100644 --- a/assets/locales/fr.yaml +++ b/assets/locales/fr.yaml @@ -1,3 +1,8 @@ +localeId: fr +french: Français +english: Anglais + +view-more: Voir plus go-back-to-main: Revenir à la page principale external-website: Site web externe @@ -5,32 +10,47 @@ last-update: Dernière mise à jour le about-website: A propos de ce site page: - title: Matthieu Bessat - Développeur web + title: Matthieu Bessat profile: - intro: - main: Salut, je m'appelle Matthieu - secondary: J'aime bien programmer des trucs + main: Salut, je m'appelle Matthieu ! + secondary: J'aime bien programmer des trucs + +intro: + title: Un peu sur moi + description: | + Bienvenue sur mon petit coin du web ! Je m'appelle Matthieu Bessat également connu sous le pseudonyme de *lefuturiste* sur internet ! En autre chose dans la vie je suis développeur freelance et capable de créer un site web/application de A à Z : de la définition des besoins clients, du modèle des données à la mise en production et à la maintenance. Si vous avez un projet n'hésitez pas à [me contacter](#contact) ! + age: J'ai %d ans + speak: Je parle : + location: J'habite la + transport: J'aime utiliser mon vélo ! + interests: Mes centres d'intérêts : technologies: + name: Technologies title: Quelques des technologies avec lesquelles je travaille en ce moment projects: + name: Projets title: Projets - project: Projet + project: Projet : pro: title: Projets professionels + description: Voici quelques projets que j'ai développé ou participé soit dans le cadre de l'auto-entreprenariat (freelancing) soit en tant qu'employé. side: title: Autres projets + description: Des projets d'entreprenariat, associatif, open source ou juste pour le fun ! background: Contexte solution: Solutions technologies: Technologies utilisées - + images: Gallerie links: + name: Liens title: Retrouvez moi sur... contact: + name: Contact no-script: Si vous voulez utiliser le formulaire de contact, vous devez activer le javascript (le site propose un code libre) title: Me contacter use-email: "Vous pouvez me contacter par e-mail :" diff --git a/assets/scripts/contact.js b/assets/scripts/contact.js index 5501f26..baf5adf 100644 --- a/assets/scripts/contact.js +++ b/assets/scripts/contact.js @@ -8,6 +8,8 @@ function contactFormSetup() { const postURL = "https://contact-form.thingmill.fr" const form = document.getElementById('contact-form') + if (form == null) return; + const formName = document.getElementById('contact-form-name') const formEmail = document.getElementById('contact-form-email') const formSubject = document.getElementById('contact-form-subject') diff --git a/assets/scripts/main.js b/assets/scripts/main.js index 40f4dab..2d67048 100755 --- a/assets/scripts/main.js +++ b/assets/scripts/main.js @@ -1,6 +1,10 @@ import axios from 'axios' import { contactFormSetup } from './contact' +import { technologiesMosaicSetup } from './technologiesMosaic' +import { mediaModalSetup } from './mediaModal' contactFormSetup() +technologiesMosaicSetup() +mediaModalSetup() diff --git a/assets/scripts/mediaModal.js b/assets/scripts/mediaModal.js new file mode 100644 index 0000000..e85df7f --- /dev/null +++ b/assets/scripts/mediaModal.js @@ -0,0 +1,99 @@ +function mediaModalSetup() { +/** + * Gallery modal to view media in large + */ +const mediaDataRaw = document.getElementById('project-images-data') +if (mediaDataRaw == null) return; +const mediaData = JSON.parse(mediaDataRaw.textContent) +console.log('mediaData', mediaData) + + +let mediaModal = document.querySelector('#media-modal') +let mediaModalContent = document.querySelector('#media-modal-content') +// let mediaModalImage = document.querySelector('#media-modal img') +// let mediaModalVideo = document.querySelector('#media-modal video') +// let mediaModalSource = document.querySelector('#media-modal video source') + +// function disableScroll() { +// // Get the current page scroll position +// scrollTop = window.pageYOffset || document.documentElement.scrollTop; +// scrollLeft = window.pageXOffset || document.documentElement.scrollLeft, + +// // if any scroll is attempted, set this to the previous value +// window.onscroll = function() { +// window.scrollTo(scrollLeft, scrollTop); +// }; +// } + +// function enableScroll() { +// window.onscroll = function() {}; +// } +let modalCaption = document.getElementById('caption') +let media = {} + +let fillModal = (m) => { + mediaModalContent.innerHTML = "" + let attr = document.createAttribute('src') + attr.value = m.image + let el = null + el = document.createElement('img') + el.attributes.setNamedItem(attr) + mediaModalContent.appendChild(el) + modalCaption.innerText = m.description +} + +setTimeout(() => { + mediaModal.style = '' +}, 500) + +window.openModal = (id) => { + + mediaModal.style.visibility = 'visible' + mediaModal.style.opacity = 1 + + media = mediaData.filter(m => m.id === id)[0] + + fillModal(media) + + //document.body.style.height = '100vh' + document.body.style.overflow = 'hidden' + document.body.style.touchAction = 'none' + + setTimeout(() => { + + // const outsideClickListener = event => { + // if (!mediaModalContent.contains(event.target) && isVisible(mediaModalContent)) { + // closeModal() + // document.removeEventListener('click', outsideClickListener) + // } + // } + // document.addEventListener('click', outsideClickListener) + + }, 100) +} + +const isVisible = elem => !!elem && !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ) + +window.closeModal = () => { + mediaModal.style.visibility = 'hidden' + mediaModal.style.opacity = 0 + document.body.style.overflow = 'initial' + document.body.style.height = 'initial' + document.body.style.touchAction = 'initial' +} + +window.navLeft = () => { + if (mediaData.indexOf(media) === 0) { return; } + media = mediaData[mediaData.indexOf(media) - 1] + fillModal(media) +} + +window.navRight = () => { + if (mediaData.indexOf(media) + 1 === mediaData.length) { return; } + media = mediaData[mediaData.indexOf(media) + 1] + fillModal(media) +} + +} + +export { mediaModalSetup }; diff --git a/assets/scripts/technologiesMosaic.js b/assets/scripts/technologiesMosaic.js new file mode 100644 index 0000000..7c6f7fc --- /dev/null +++ b/assets/scripts/technologiesMosaic.js @@ -0,0 +1,19 @@ +let opened = false + +function technologiesMosaicSetup() { + const mosaic = document.getElementById('tech-mosaic') + const mosaicContainer = document.getElementById('tech-mosaic-container') + const btnContainer = document.getElementById('tech-mosaic-btn-container') + + window.openTechMosaic = () => { + if (!opened) { + mosaicContainer.className = mosaicContainer.className.replace(' closed', ' opened') + } else { + mosaicContainer.className = mosaicContainer.className.replace(' opened', ' closed') + } + opened = !opened + } +} + +export { technologiesMosaicSetup } + diff --git a/assets/styles/components/chips.scss b/assets/styles/components/chips.scss index 042d048..a1ee487 100644 --- a/assets/styles/components/chips.scss +++ b/assets/styles/components/chips.scss @@ -4,10 +4,26 @@ .chip { margin-right: .5em; + margin-bottom: .5em; padding: 0.5em 0.9em; background: $primary; color: white; font-size: .9em; border-radius: 10rem; } + .chip-outline { + border: 1px solid $primary; + background: transparent; + color: $primary; + } + .chip-with-icon { + display: flex; + align-items: center; + .chip-icon { + display: flex; + align-items: center; + margin-right: 0.6em; + } + } } + diff --git a/assets/styles/components/contact.scss b/assets/styles/components/contact.scss index c21afac..10d5dd5 100644 --- a/assets/styles/components/contact.scss +++ b/assets/styles/components/contact.scss @@ -108,7 +108,7 @@ } @media (max-width: $sm-breakpoint) { - .contact-form { + .contact-form-container { .contact-form-first-group { display: block; .contact-form-input { diff --git a/assets/styles/components/footer.scss b/assets/styles/components/footer.scss index 82ad427..6829067 100644 --- a/assets/styles/components/footer.scss +++ b/assets/styles/components/footer.scss @@ -3,9 +3,15 @@ } footer { + // color from the profile gradient + background-color: #3ea643; margin-top: auto; - border-top: 1px solid gray; - border-color: rgb(84, 91, 94) !important; + color: white; + // border-top: 1px solid gray; + // border-color: rgb(84, 91, 94) !important; + a { + color: #212121; + } } .footer-container { @@ -18,6 +24,11 @@ footer { margin-bottom: .5em; } +.footer-right { + display: flex; + align-content: center; +} + .locale-switch-large { display: flex; align-items: center; diff --git a/assets/styles/components/intro.scss b/assets/styles/components/intro.scss new file mode 100644 index 0000000..d445623 --- /dev/null +++ b/assets/styles/components/intro.scss @@ -0,0 +1,67 @@ +.intro { + display: grid; + grid-template-columns: 2fr 1fr; + gap: 2em; +} + +.intro-text { + +} + +.intro-items { + border: 1px dashed gray; + padding: 1em; + .intro-item { + display: flex; + // margin: .4em 0em; + margin-bottom: .4em; + &:last-of-type { + margin-bottom: 0; + } + } + .item-icon { + margin-right: 1em; + color: $primary; + } + + .item-content { + display: flex; + align-items: center; + ul { + margin-left: .5em; + display: flex; + li { + margin-right: 0.5em; + } + } + } +} + +.intro-interests { + .chip { + font-size: .8em !important; + padding: .3em 1em !important; + } + .chip-icon { + svg { + width: 1.5em; + } + } +} + +.intro-interests-header { + width: 100%; + p { + margin-bottom: 0.5em; + } +} + +@media (max-width: 1200px) { + .intro { + display: block; + } + .intro-items { + margin-top: 1em; + } +} + diff --git a/assets/styles/components/projects.scss b/assets/styles/components/projects.scss index 8ce0398..ff17120 100644 --- a/assets/styles/components/projects.scss +++ b/assets/styles/components/projects.scss @@ -67,3 +67,161 @@ } } +.project-page { + .project-header { + div { + display: flex; + align-items: center; + margin-bottom: 0.4em; + svg { + margin-right: 0.6em; + } + } + } +} + + +.project-images-container { + width: 100%; + + .project-images { + display:flex; + overflow-x: scroll; + } + .img { + display: block; + overflow-y: hidden; + height: 199px; + min-width: 295px; + margin-right: 1em; + margin-bottom: 1em; + img { width: 100%; } + } +} + +.project-images { + display: grid; + width: 100%; +} + + +/* Media modal */ +/** +* Media modal +*/ +.media-modal-container { + position: fixed; + width: 100%; + height: 100vh; + z-index: 99; + top: 0; + left: 0; + background-color: rgba(0, 0, 0, .80); + + display: flex; + justify-content: center; + align-items: center; + + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear,opacity 0.1s linear; +} + +.media-modal { + position: relative; + width: 50%; +} + +.media-modal .media-modal-content { + border-radius: 4px; + width: 100%; + + /** crop not very cool images in modal **/ + max-height: 80vh; + overflow-y: scroll; + display: flex; + align-items: flex-start; + justify-content: center; +} + +.media-modal img, .media-modal video { + width: 100%; +} + +.media-close { + filter: drop-shadow(2px 4px 6px black); + position: absolute; + width: 1.5em; + height: 1.5em; + right: -.75em; + top: -.75em; + color: white; + cursor: pointer; + opacity: 0.9; + transition: all 0.2s; +} + +.media-close:hover { + transform: scale(1.2); + opacity: 1; +} + +.media-nav { + position: absolute; + top: 50%; + color: white; + cursor: pointer; + font-size: 2em; +} + + +.media-left-nav { + left: 2em !important; +} + +.media-right-nav { + right: 2em !important; +} + +.media-caption { + position: absolute; + bottom: 1.5em; + color: wheat; + padding: 0.5em 1em; + line-height: 1.3em; +} + + +@media (max-width: $md-breakpoint) { + .project-page { + + .media-modal { + width: 90%; + margin-top: 2em; + } + + .media-nav { + bottom: 0; + top: initial; + margin-bottom: 0.5em; + } + + .media-modal-content { + max-height: 60vh; + } + .media-caption { + font-size: .9em; + margin-bottom: .5em !important; + bottom: 4em; + text-align: center; + } + + .media-modal-container { + align-items: flex-start; + } + } +} + + + + diff --git a/assets/styles/components/technologies.scss b/assets/styles/components/technologies.scss index 8a6c281..48a639e 100644 --- a/assets/styles/components/technologies.scss +++ b/assets/styles/components/technologies.scss @@ -3,6 +3,7 @@ .tech-mosaic { display: flex; flex-wrap: wrap; + overflow: hidden; .item { position: relative; @@ -71,6 +72,34 @@ } +.tech-mosaic-btn-container { + + position: absolute; + bottom: 0; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + margin-top: 1em; + .btn { + margin-bottom: 1em; + } +} + +.tech-mosaic-container { + position: relative; +&.opened .tech-mosaic-btn-container { + display: none; +} + &.closed .tech-mosaic-btn-container { + @include scrimGradient(white, 0deg); + height: 11em; + } + &.closed .tech-mosaic { + max-height: 20em; + } +} + @media (min-width: 400px) { .item-bg { padding: 1em !important; diff --git a/assets/styles/components/typography.scss b/assets/styles/components/typography.scss index 594b8c0..ac27ff6 100644 --- a/assets/styles/components/typography.scss +++ b/assets/styles/components/typography.scss @@ -1,8 +1,16 @@ +a:hover { + opacity: .8; +} + p { line-height: 1.45em; margin-bottom: 1em; } +p.indent, .indent p { + text-indent: 3em; +} + h1 { font-size: xx-large; margin-bottom: 1em; @@ -10,7 +18,8 @@ h1 { h2 { font-size: x-large; - margin-bottom: .5em; + margin-top: 1.5em; + margin-bottom: .8em; } h3 { diff --git a/assets/styles/main.scss b/assets/styles/main.scss index f524d18..a8ddabb 100755 --- a/assets/styles/main.scss +++ b/assets/styles/main.scss @@ -1,5 +1,8 @@ -@import url('https://fonts.googleapis.com/css2?family=Libre+Baskerville&display=swap'); - +@use 'sass:math'; +@font-face { + font-family: LibreBaskervilleRegular; + src: url('/LibreBaskerville-Regular.woff'); +} $lg-breakpoint: 1500px; $md-breakpoint: 1000px; $sm-breakpoint: 900px; @@ -8,7 +11,42 @@ $xs-breakpoint: 400px; $primary: #4ba05f; $secondary: #a04b8c; + +@mixin scrimGradient($startColor: $color-black, $direction: 180deg) { + + $scrimCoordinates: ( + 0: 1, + 19: 0.738, + 34: 0.541, + 47: 0.382, + 56.5: 0.278, + 65: 0.194, + 73: 0.126, + 80.2: 0.075, + 86.1: 0.042, + 91: 0.021, + 95.2: 0.008, + 98.2: 0.002, + 100: 0 + ); + + $hue: hue($startColor); + $saturation: saturation($startColor); + $lightness: lightness($startColor); + $stops: (); + + @each $colorStop, $alphaValue in $scrimCoordinates { + $stop: hsla($hue, $saturation, $lightness, $alphaValue) percentage(math.div($colorStop,100)); + $stops: append($stops, $stop, comma); + } + + background: linear-gradient($direction, $stops); + +} + + @import './reset.scss'; +@import './components/intro.scss'; @import './components/profile.scss'; @import './components/projects.scss'; @import './components/technologies.scss'; @@ -20,6 +58,7 @@ $secondary: #a04b8c; @import './components/chips.scss'; body { + font-family: LibreBaskervilleRegular, sans-serif; min-height: 100vh; display: flex; flex-direction: column; @@ -38,7 +77,7 @@ body { .typo, body { - font-family: 'Libre Baskerville', serif; + font-family: 'LibreBaskervilleRegular', serif; } @@ -51,11 +90,24 @@ section:last-of-type { border-bottom: 0; } +section h2 { + margin-top: 0; + margin-bottom: 0; +} + .about-header { margin: 2em 0; } +.profile-nav { + a { + color: white; + opacity: 0.8; + margin-right: .6em; + } +} + @media (min-width: $lg-breakpoint) { .container { width: 58%; diff --git a/composer.json b/composer.json index 7988cea..b9c7aee 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,8 @@ "php-di/slim-bridge": "^3.2", "symfony/var-dumper": "^6.0", "adbario/php-dot-notation": "^3.1", - "boronczyk/localization-middleware": "^2.0" + "boronczyk/localization-middleware": "^2.0", + "erusev/parsedown": "^1.7" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 7eecabc..23a4cef 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cec518bea90ee444e31994b065bc4f79", + "content-hash": "95b3297abd88a7b2c01e52f12d2bf950", "packages": [ { "name": "adbario/php-dot-notation", @@ -112,6 +112,56 @@ }, "time": "2021-04-15T02:46:25+00:00" }, + { + "name": "erusev/parsedown", + "version": "1.7.4", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "support": { + "issues": "https://github.com/erusev/parsedown/issues", + "source": "https://github.com/erusev/parsedown/tree/1.7.x" + }, + "time": "2019-12-30T22:54:17+00:00" + }, { "name": "fig/http-message-util", "version": "1.1.5", diff --git a/config/intro.yaml b/config/intro.yaml new file mode 100644 index 0000000..5bc766c --- /dev/null +++ b/config/intro.yaml @@ -0,0 +1,39 @@ +email: mail@matthieubessat.fr +firstName: Matthieu +secondName: Bessat +bornDate: '2002-10-17' +location: + region: + fr: Normandie, France + en: Normandy, France +timezone: UTC+2 +languages: + - french + - english +transport: bike +interests: + # opensource, free software, robots, données colaboratives (opendata) + - id: opensource + name: Open Source + icon: opensource.svg + - id: freesoftware + name: + fr: Logiciel libre + en: Free Sofware + icon: copyleft.svg + - id: robots + name: + fr: Robotique + en: Robots + icon: robot.svg + - id: opendata + name: + fr: Données ouvertes + en: Open Data + icon: database.svg + - id: geodata + name: + fr: Données géographiques + en: Geographical data + icon: map.svg + diff --git a/config/links.yaml b/config/links.yaml index 9f60762..6dbf240 100644 --- a/config/links.yaml +++ b/config/links.yaml @@ -41,7 +41,9 @@ links: - id: osm name: OpenStreetMap url: https://openstreetmap.org/user/lefuturiste - # - id: osm_wiki + thumbnail: + src: osm-150.png + # - id: osm_wiki # name: # en: OpenStreetMap wiki # fr: Le wiki d'OpenStreetMap @@ -50,7 +52,7 @@ links: name: Wikipedia url: https://fr.wikipedia.org/wiki/Utilisateur:Matthieu2743 thumbnail: - src: wikipedia.svg + src: wikipedia-150.png alt: Wikipedia logo - id: wikidata name: Wikidata diff --git a/config/misc.yaml b/config/misc.yaml index ea307f2..e5dfcf3 100644 --- a/config/misc.yaml +++ b/config/misc.yaml @@ -1,4 +1,3 @@ -email: bonjour@matthieubessat.fr updated_at: '2022-07-04' diff --git a/config/projects.yaml b/config/projects.yaml index cf6f858..3b4ab97 100644 --- a/config/projects.yaml +++ b/config/projects.yaml @@ -1,5 +1,6 @@ pro_projects: - id: forum_asso + main: true detailled_page: true date: 2020-07 link: https://associations.espacecondorcet.org @@ -58,19 +59,19 @@ pro_projects: en: Administered association directory description: fr: | - Application web de gestion de fiche associative avec interface administrative. + Application web de gestion de fiche associative collaborative avec interface administrative pour l'Espace Condorcet. en: | - Web application of association management with administration interface. + Web application of collaborative association management with administration interface for the Espace Condorcet background: fr: | - En Juin 2020, l'Espace condorcet cherchait un moyen numérique afin de substituer le forum associatif physique qui était compromis pour cause sanitaire, ils voulait un moyen simple pour que les associations puissent se décrire et en même temps que le personnel de l'espace condorcet puissent valider le contenu facilement sans d'étapes manuelle pour la publication. + En Juin 2020, [l'Espace Condorcet](https://www.espacecondorcet.org/) (association qui promeut la vie associative locale de Gaillon) cherchait un moyen numérique afin de substituer le forum associatif physique qui était compromis pour cause sanitaire, ils voulait un moyen simple pour que les associations puissent se décrire et en même temps que l'administrateur du site puissent valider le contenu facilement sans d'étapes manuelle pour la publication. en: | - In June of 2020, the Espace Condorcet wanted a way to have the public discover associations around them in around the town. + In June of 2020, [the Espace Condorcet](https://www.espacecondorcet.org/) (association to promote local associative life around Gaillon) wanted a way to substitute the traditional meeting (allowing the public to discover associations around the town) which was compromised because of the COVID crisis. They wanted a simple way for associations to input details about them in a structured manner. And then a way for the administrator of the website to approve the changes before publication. solution: fr: | - Afin de répondre aux besoins du client, j'ai développé pendant l'été le logiciel qui se compose en plusieurs parties : une partie accessible par tous qui permet de naviguer dans les associations basé sur un serveur Node.js et une interface d'administration et d'édition par les associations qui communique avec une API web en Node.js qui va ensuite mettre à jour la base de données MongoDB. + Afin de répondre aux besoins du client, j'ai développé pendant l'été 2020 le logiciel qui se compose en trois parties : une partie accessible par tous qui permet de naviguer dans les associations basé sur un serveur Node.js et une interface d'administration et d'édition par les associations qui communique avec une API web en Node.js qui constitue la troisième partie, c'est cette partie qui va mettre à jour la base de données MongoDB. en: | - Foo bar + In order to answer the customer needs, I've developped during the summer of 2020 the software that is composed of many parts : a public page where everyone can browse the directory based on a Node.js server, a web interface for the administration of the site and on which the associations can input their details which communicate with the third part: the web API that update the database accordingly. action: fr: Site web externe en: External website @@ -80,29 +81,82 @@ pro_projects: fr: Un dessin enfantin représentant le soleil éclairant un chemin en: A childish drawing representing the sun lighting up a footway. - id: tracklift - detailled_page: false + main: true + detailled_page: true date: 2022-01 link: https://tracklift.fr name: Tracklift - # En 2021 Socobat Environnement avait le besoin d'une application web afin de modéliser la gestion des déchets sur des chantiers d'ascenseurs (collecte, retraitement, revalorisation) et de partager le résultat à des clients. J'ai démarré le développement à partir d'une base et j'ai mit en production le site web. description: - fr: | - Gestion de la récupération, le traitement et la revalorisation des déchets issues des chantiers d'ascenseurs. + fr: "Application web pour entreprise, gestion de la récupération, le traitement et la revalorisation des déchets issues des chantiers d'ascenseurs." # De façon plus général, logiciel de gestion de l'activité d'une entreprise. + en: "Business management application: management of the recovering, the processing and the revaluation of wastes from elevator's worksite." + background: + fr: | + En 2021 [Socobat Environnement](https://www.socobat-environnement.fr/) avait besoin d'une application web afin de modéliser la gestion des déchets sur des chantiers d'ascenseurs (collecte, retraitement, revalorisation), l'application devait intégrer un système de gestion de compte, de génération de document PDF à partir de formulaire et doit gérer les relations complexes entre les entitées (entreprises, chantiers, ascenseurs, bennes, audits...) pour correspondre exactement aux besoins métiers spécifiques de Socobat. La partie intéréssante et la plus complexe de ce projet est le besoin de connaitre à tout moment la quantité de matériaux de chaque benne à partir des "déchargements" effectués par les utilisateurs dans telle ou telle benne (la fonctionnalité "suivie de la masse") en: | - Management of the recovering, the processing and the revaluation of wastes from elevator's worksite + In 2021 [Socobat Environnement](https://www.socobat-environnement.fr/) had the need of a web app to model their waste management on worksite with elevators (to manage the collection, the recycling and the refurbishement), more over the app would need to integrate a user account manager, a document PDF generator from user-form and must manage the complex relationship between entities of the databases (compagnies, worksites, elevator, containers, audits...) to suit the specifics business needs of the customer. A quite challenging feature of the app was the need to known the state of each container at any time from the "unloading" records of the users. + solution: + fr: | + La majorité des fonctionnalités demandés pour Tracklift sont de la gestion d'entité classique, j'ai donc utilisé [Api Platform](https://api-platform.com/) afin de facilement créer une API REST qui peut être consommé ensuite par l'application web. J'ai structuré le code du frontend pour qui soit le plus évolutif possible et permette la réutilisation facile de composants. La fonction du suivie de la masse de chaque benne demande une implémentation précise de la propagation des mise à jour dans la base de donnée relationelle. Pour générer les documents PDF ou les archives ZIP, j'ai mit en place un système de tâches asyncrone. Également, pour plus de réactivité dans l'application et une meilleure expérience utilisateur, j'ai ajouté un système de mise à jour en temps réel : [Mercure](https://mercure.rocks/). + en: | + Because the main features of the app was to do CRUD (Create, Read, Update, Delete) I used [Api Platform](https://api-platform.com/) to easily create a REST API that can be consumed by the Vue Web App The challenging feature described is an example of a tight dependency model between entities in the DB that needed propagation. thumbnail: src: logo_square.svg - alt: A 'T' letter encapsulated into brackets + alt: + fr: Une lettre 'T' encapsulé dans des crochets + en: A 'T' letter encapsulated into brackets technologies: - vue - vuetify - symfony - api-platform - php - - mysql + - mariadb + images: + - id: admin_dashboard_home + name: + fr: Page d'accueil pour l'administrateur + en: Home page for the administrator + - id: admin_edit_site + name: + fr: Menu d'édition des chantiers + en: Worksite edition menu + description: + fr: Le menu d'édition des chantiers dispose d'un moyen de rechercher rapidement des entreprises ou des utilisateurs dans la base de donnée afin de les associers au chantier. + en: The worksite edition menu have a quick way to search and grab compagnies or users in the data base to associate them to the worksite. + - id: admin_containers + name: + fr: Gestion des bennes + en: Container management + - id: admin_view_container + name: + fr: Visualiser le status d'un benne + en: Vizualize the state of a container + - id: admin_audit_form + name: + fr: Formulaire d'audit + en: Audit form + description: + fr: Formulaire permettant de savoir quel pièces et matiériaux vont être traités par Socobat + en: Form to get the knownledge of what hardware will be treated by Socobat + - id: admin_users + name: + fr: Gestion des utilisateurs + en: User management + - id: user_details + name: + fr: Détails utilisateurs + en: User details + # - id: login_screen + # name: + # fr: e + # en: e + # description: + # fr: e + # en: e side_projects: - id: werobot + main: true detailled_page: false date: 2018-11 link: https://werobot.fr @@ -122,6 +176,7 @@ side_projects: en: A presentation website along with a blog for the robotic club We Robot. fr: Un site vitrine accompagné d'un blog pour l'association de robotique locale We Robot. - id: retrobox + main: true detailled_page: false name: RetroBox description: @@ -145,10 +200,15 @@ side_projects: - paypal - electron - id: jobatator + main: true name: Jobatator date: 2020-06 link: https://github.com/jobatator - logo: logo.png + thumbnail: + src: logo.png + alt: + fr: Le logo de jobatator montrant une pile aligné. + en: Jobatator logo showing an aligned stack. description: fr: | Un serveur TCP développé comme alternative simplifié à RabbitMQ afin de dispatcher des tâches à des processus. @@ -160,6 +220,7 @@ side_projects: fr: GitHub du projet en: GitHub page - id: keyvaluer + main: false detailled_page: false name: KeyValuer date: 2020-04 @@ -175,6 +236,7 @@ side_projects: fr: GitHub du projet en: GitHub page - id: discord-monolog-handler + main: true detailled_page: false name: Discord Monolog handler date: 2017-08 @@ -190,15 +252,16 @@ side_projects: fr: GitHub du projet en: GitHub page - id: langatator + main: true detailled_page: false name: Langatator date: 2022-05 link: https://gitlab.com/lefuturiste/langatator description: fr: | - Développement d'un langage de programmation impératif interprété afin de découvrir le fonctionnement d'un interpréteur. + Développement d'un langage de programmation impératif interprété en C afin de découvrir le fonctionnement d'un interpréteur. en: | - Creation of an impérative interpreted langage, trying to enforce a grammar with a lexer, a parser and an evaluator. + Programming of an imperative interpreted langage in C, trying to enforce a grammar with a lexer, a parser and an evaluator. technologies: - c action: @@ -211,4 +274,31 @@ side_projects: # technologies: # - python # - latex - + - id: eurobot2020 + main: yes + detailled_page: false + date: 2020-10 + link: https://github.com/werobot-france/eurobot2020-main + thumbnail: + src: sailtheworld-150.png + alt: + fr: "Logo de la saison 2020 : Naviguer le monde" + en: "2020 season logo: Sail The World" + # alt: + # fr: Logo de la coupe de france de robotique représentant un droid antropomorphe voulant jouer + # en: French cup logo representing a human-like droid wanting to play + name: + fr: Coupe de France de robotique + en: French robotics cup + description: + fr: | + Conception d'un robot holonome autonome pour participer à l'édition 2020 de la coupe. J'ai travaillé sur l'électronique et le logiciel embarqué. + en: | + Design of an holonomic autonomus robot to participate in the 2020 edition of the cup, I worked on the electronic and on-board software. + technologies: + - python + - c + - arduino + action: + fr: GitHub du projet + en: GitHub page diff --git a/config/technologies.yaml b/config/technologies.yaml index 9771826..0355e10 100644 --- a/config/technologies.yaml +++ b/config/technologies.yaml @@ -80,7 +80,7 @@ technologies: wikidata: Q15206305 - id: caddy - image: caddy.png + image: caddy-150.png name: Caddy website: https://caddyserver.com/ wikidata: Q24008327 @@ -122,7 +122,7 @@ technologies: wikidata: Q1165204 - id: elasticsearch - image: elasticsearch.png + image: elasticsearch-150.png name: Elastic Search website: https://www.elastic.co/elasticsearch/ wikidata: Q3050461 @@ -150,7 +150,7 @@ technologies: wikidata: Q108740058 - id: composer - image: composer.svg + image: composer-150.png name: Composer height: stretch website: https://getcomposer.org/ @@ -208,5 +208,6 @@ technologies: image: express.svg name: Express.js wikidata: Q16878131 + hidden: true diff --git a/public/LibreBaskerville-Bold.ttf b/public/LibreBaskerville-Bold.ttf new file mode 100644 index 0000000..aa34acc Binary files /dev/null and b/public/LibreBaskerville-Bold.ttf differ diff --git a/public/LibreBaskerville-Italic.ttf b/public/LibreBaskerville-Italic.ttf new file mode 100644 index 0000000..7a7a9dc Binary files /dev/null and b/public/LibreBaskerville-Italic.ttf differ diff --git a/public/LibreBaskerville-Regular.ttf b/public/LibreBaskerville-Regular.ttf new file mode 100644 index 0000000..3fadf70 Binary files /dev/null and b/public/LibreBaskerville-Regular.ttf differ diff --git a/public/LibreBaskerville-Regular.woff b/public/LibreBaskerville-Regular.woff new file mode 100644 index 0000000..94e3f50 Binary files /dev/null and b/public/LibreBaskerville-Regular.woff differ diff --git a/public/dist/app.min.css b/public/dist/app.min.css index 181a338..36e5fa2 100755 --- a/public/dist/app.min.css +++ b/public/dist/app.min.css @@ -1 +1 @@ -@import"https://fonts.googleapis.com/css2?family=Libre+Baskerville&display=swap";html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}table{border-collapse:collapse;border-spacing:0}*{box-sizing:border-box}.landing-section{box-shadow:inset 0 7px 15px -7px rgba(0,0,0,.4),inset 0 -7px 15px -7px rgba(0,0,0,.4);padding:2em 0;background:linear-gradient(90deg, #3ca441 0%, #5fc463 50%);color:#fff;border-bottom:0}.profile-container{display:flex;justify-content:center;align-items:center}.profile-imgs-container{width:28em;height:28em;display:flex;justify-content:center;align-items:center;flex-direction:column;position:relative;margin-right:3em}@keyframes animate{0%{transform:perspective(1000px) rotateY(0deg) rotateZ(-45deg)}100%{transform:perspective(1000px) rotateY(360deg) rotateZ(-45deg)}}.profile-imgs-wrapper:hover{animation:animate 20s linear infinite}.profile-imgs-wrapper{transform:rotateZ(-45deg);border-radius:5px;overflow:hidden;z-index:3}.profile-imgs{position:relative}.profile-shadow{transform:perspective(1000px) rotateX(99deg);z-index:1;position:absolute;bottom:-104px;width:80%;height:50%;border-radius:50%;background:radial-gradient(circle, white 0%, rgba(255, 255, 255, 0) 100%);filter:blur(45px)}.additional-profile,.additional-profile-filter{position:absolute}.additional-profile{z-index:1}.additional-profile-filter{z-index:2}.profile-content{margin-left:1em;display:flex;justify-content:center;align-items:center;flex-direction:column}.profile-content .title-1{text-align:center;font-size:3em;margin-bottom:.4em;line-height:1.5em}.profile-content .title-2{text-align:center;font-size:1.5em;margin-bottom:1em}.profile-content .subtitle{font-size:1.5em}@media(max-width: 900px){.profile-container{flex-direction:column}.profile-imgs-container{margin-right:0}.profile-content{margin-left:0;margin-top:-1em}.profile-content .title-1{font-size:2.5em}.profile-content .title-2{font-size:1.2em}.profile-imgs-container{transform:scale(0.7);margin-top:-4em}}@media(max-width: 400px){.landing-section{padding-top:0}.profile-content{margin-top:-4em;padding:0 1em}.profile-content .title-1{font-size:2.5em}.profile-content .title-2{font-size:1.2em}.profile-imgs-container{transform:scale(0.6);margin-top:-4em}}.projects{display:grid;grid-template-columns:1fr 1fr;grid-gap:1em}.projects .project-card{border:1px solid gray;padding:1.5em;border-radius:5px;display:flex;flex-direction:column;justify-content:space-between}.projects .project-top{display:flex}.projects .project-left{width:100%}.projects .project-title{font-size:1em;padding-bottom:1em}.projects .project-description{font-size:.9em;color:gray}.projects .project-img{width:5em}.projects .project-right{padding-left:.5em}.projects .project-bottom{padding-top:1em}@media(min-width: 1500px){.projects{grid-template-columns:1fr 1fr 1fr}}@media(max-width: 1000px){.projects{grid-template-columns:1fr 1fr}}@media(max-width: 900px){.projects{grid-template-columns:1fr}.project-right{padding-left:1em !important}}.tech-mosaic{display:flex;flex-wrap:wrap}.tech-mosaic .item{position:relative;box-sizing:border-box;background-color:rgba(231,231,231,.425);flex-basis:12.5%}.tech-mosaic .item::before{content:"";display:block;padding-top:100%}.tech-mosaic .item .item-inside{position:absolute;top:0;left:0;height:100%;width:100%}.tech-mosaic .item-bg{width:100%;height:100%;position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;overflow:hidden;padding:2em}.tech-mosaic .item-bg img{width:100%}.tech-mosaic .item-bg img.img-stretch{width:auto;height:100%}.tech-mosaic .item-content{position:absolute;top:0;left:0;width:100%;height:100%;color:#fff;display:flex;justify-content:center;align-items:center;opacity:1;background-color:rgba(95,196,99,.46);transition:all .2s}.tech-mosaic .item-content>div{opacity:0;font-size:1.1em;text-align:center;padding:.5em;line-height:1.5em;max-width:100%}.tech-mosaic .item:hover .item-content{background-color:rgba(0,0,0,0)}@media(min-width: 400px){.item-bg{padding:1em !important}}@media(max-width: 1000px){.tech-mosaic .item{flex-basis:20%}}@media(max-width: 800px){.tech-mosaic .item{flex-basis:25%}}@media(max-width: 400px){.tech-mosaic .item{flex-basis:50%}}.links-container{display:flex;justify-content:center}.links{width:80%;display:flex;justify-content:space-around;flex-wrap:wrap}.links .link-card{margin:1em;display:flex;flex-direction:column;justify-content:center;align-items:center;min-width:10em}.links .link-card-title{margin-top:.9em}.links .link-card-logo{padding:.5em;width:4em;height:4em;overflow:hidden;display:flex;justify-content:center;align-content:center}.links .link-card-logo img{max-width:4em;max-height:4em}@media(max-width: 900px){.links{width:100%}.links .link-card{justify-content:center}}@media(max-width: 400px){.links{width:100%}.links .link-card{min-width:6em}}p{line-height:1.45em;margin-bottom:1em}h1{font-size:xx-large;margin-bottom:1em}h2{font-size:x-large;margin-bottom:.5em}h3{font-size:large}.section-title{display:grid;font-size:1.2em;grid-template-columns:auto 1fr;margin-bottom:1em;margin-top:1.3em}.section-title .title-text{color:#000;display:flex;align-items:center}.section-title::before{margin:8px 15px 8px 8px;content:"";width:10px;height:10px;display:block;background-color:#4ba05f}.footer-buffer{height:2em}footer{margin-top:auto;border-top:1px solid gray;border-color:#545b5e !important}.footer-container{padding:2em 0;display:flex;justify-content:space-between}.footer-left div{margin-bottom:.5em}.locale-switch-large{display:flex;align-items:center}.locale-switch-large .l{margin-right:1em}.locale-switch-large .r a{margin-right:.2em}.locale-switch-short{display:none}@media(max-width: 900px){.locale-switch-large{display:none}.locale-switch-short{display:block}}.means-of-contact p{margin-bottom:1em}.contact-form-container form{border-radius:3px;border:1px dashed #80808054;padding:1em}.contact-form-container .contact-form-first-group{display:flex}.contact-form-container .contact-form-first-group .contact-form-input:first-of-type{margin-right:.4em}.contact-form-container .contact-form-first-group .contact-form-input:nth-of-type(2){margin-left:.4em}.contact-form-container .contact-form-input{width:100%;margin-top:1em}.contact-form-container input,.contact-form-container textarea{width:100%;margin-top:.6em;border-radius:3px;padding:.6em;border:1px solid #dbdbdb;box-shadow:1px 2px 4px 0 rgba(0,0,0,.1)}.contact-form-container .contact-form-message textarea{min-height:8em}.contact-form-container label{display:block}@keyframes rotating{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.contact-form-container .loading-button{display:none}.contact-form-container .loading-button svg{animation:rotating 2s linear infinite}.contact-form-container .contact-form-container{display:flex;justify-content:end}.alert{padding:1em;margin-bottom:1em;border-radius:3px}.alert .alert-content{display:flex;align-items:center}.alert.alert-success{background:green;color:#fff}.alert.alert-error{background:red;color:#fff}.alert .alert-icon{padding-right:.6em}@media(min-width: 900px){.contact-form-first-group .contact-form-input{margin-top:0}}@media(max-width: 900px){.contact-form .contact-form-first-group{display:block}.contact-form .contact-form-first-group .contact-form-input{margin-left:0 !important;margin-right:0 !important}.contact-form-input:first-of-type{margin-top:0}}.btn{border-radius:2px;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08);padding:1em 1.5em;margin-top:1em;border:1px solid #ccc;font-size:16px}.chips{display:flex;flex-wrap:wrap}.chips .chip{margin-right:.5em;padding:.5em .9em;background:#4ba05f;color:#fff;font-size:.9em;border-radius:10rem}body{min-height:100vh;display:flex;flex-direction:column}.hidden{display:none}.container{width:70%;margin:0 auto}.typo,body{font-family:"Libre Baskerville",serif}section{border-bottom:1px solid gray;padding-bottom:1em}section:last-of-type{border-bottom:0}.about-header{margin:2em 0}@media(min-width: 1500px){.container{width:58%}}@media(min-width: 1000px){.container{width:65%}}@media(max-width: 1000px){.container{width:75%}}@media(max-width: 900px){.container{width:90%}} \ No newline at end of file +@font-face{font-family:LibreBaskervilleRegular;src:url("/LibreBaskerville-Regular.woff")}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}table{border-collapse:collapse;border-spacing:0}*{box-sizing:border-box}.intro{display:grid;grid-template-columns:2fr 1fr;gap:2em}.intro-items{border:1px dashed gray;padding:1em}.intro-items .intro-item{display:flex;margin-bottom:.4em}.intro-items .intro-item:last-of-type{margin-bottom:0}.intro-items .item-icon{margin-right:1em;color:#4ba05f}.intro-items .item-content{display:flex;align-items:center}.intro-items .item-content ul{margin-left:.5em;display:flex}.intro-items .item-content ul li{margin-right:.5em}.intro-interests .chip{font-size:.8em !important;padding:.3em 1em !important}.intro-interests .chip-icon svg{width:1.5em}.intro-interests-header{width:100%}.intro-interests-header p{margin-bottom:.5em}@media(max-width: 1200px){.intro{display:block}.intro-items{margin-top:1em}}.landing-section{box-shadow:inset 0 7px 15px -7px rgba(0,0,0,.4),inset 0 -7px 15px -7px rgba(0,0,0,.4);padding:2em 0;background:linear-gradient(90deg, #3ca441 0%, #5fc463 50%);color:#fff;border-bottom:0}.profile-container{display:flex;justify-content:center;align-items:center}.profile-imgs-container{width:28em;height:28em;display:flex;justify-content:center;align-items:center;flex-direction:column;position:relative;margin-right:3em}@keyframes animate{0%{transform:perspective(1000px) rotateY(0deg) rotateZ(-45deg)}100%{transform:perspective(1000px) rotateY(360deg) rotateZ(-45deg)}}.profile-imgs-wrapper:hover{animation:animate 20s linear infinite}.profile-imgs-wrapper{transform:rotateZ(-45deg);border-radius:5px;overflow:hidden;z-index:3}.profile-imgs{position:relative}.profile-shadow{transform:perspective(1000px) rotateX(99deg);z-index:1;position:absolute;bottom:-104px;width:80%;height:50%;border-radius:50%;background:radial-gradient(circle, white 0%, rgba(255, 255, 255, 0) 100%);filter:blur(45px)}.additional-profile,.additional-profile-filter{position:absolute}.additional-profile{z-index:1}.additional-profile-filter{z-index:2}.profile-content{margin-left:1em;display:flex;justify-content:center;align-items:center;flex-direction:column}.profile-content .title-1{text-align:center;font-size:3em;margin-bottom:.4em;line-height:1.5em}.profile-content .title-2{text-align:center;font-size:1.5em;margin-bottom:1em}.profile-content .subtitle{font-size:1.5em}@media(max-width: 900px){.profile-container{flex-direction:column}.profile-imgs-container{margin-right:0}.profile-content{margin-left:0;margin-top:-1em}.profile-content .title-1{font-size:2.5em}.profile-content .title-2{font-size:1.2em}.profile-imgs-container{transform:scale(0.7);margin-top:-4em}}@media(max-width: 400px){.landing-section{padding-top:0}.profile-content{margin-top:-4em;padding:0 1em}.profile-content .title-1{font-size:2.5em}.profile-content .title-2{font-size:1.2em}.profile-imgs-container{transform:scale(0.6);margin-top:-4em}}.projects{display:grid;grid-template-columns:1fr 1fr;grid-gap:1em}.projects .project-card{border:1px solid gray;padding:1.5em;border-radius:5px;display:flex;flex-direction:column;justify-content:space-between}.projects .project-top{display:flex}.projects .project-left{width:100%}.projects .project-title{font-size:1em;padding-bottom:1em}.projects .project-description{font-size:.9em;color:gray}.projects .project-img{width:5em}.projects .project-right{padding-left:.5em}.projects .project-bottom{padding-top:1em}@media(min-width: 1500px){.projects{grid-template-columns:1fr 1fr 1fr}}@media(max-width: 1000px){.projects{grid-template-columns:1fr 1fr}}@media(max-width: 900px){.projects{grid-template-columns:1fr}.project-right{padding-left:1em !important}}.project-page .project-header div{display:flex;align-items:center;margin-bottom:.4em}.project-page .project-header div svg{margin-right:.6em}.project-images-container{width:100%}.project-images-container .project-images{display:flex;overflow-x:scroll}.project-images-container .img{display:block;overflow-y:hidden;height:199px;min-width:295px;margin-right:1em;margin-bottom:1em}.project-images-container .img img{width:100%}.project-images{display:grid;width:100%}.media-modal-container{position:fixed;width:100%;height:100vh;z-index:99;top:0;left:0;background-color:rgba(0,0,0,.8);display:flex;justify-content:center;align-items:center;visibility:hidden;opacity:0;transition:visibility .1s linear,opacity .1s linear}.media-modal{position:relative;width:50%}.media-modal .media-modal-content{border-radius:4px;width:100%;max-height:80vh;overflow-y:scroll;display:flex;align-items:flex-start;justify-content:center}.media-modal img,.media-modal video{width:100%}.media-close{filter:drop-shadow(2px 4px 6px black);position:absolute;width:1.5em;height:1.5em;right:-0.75em;top:-0.75em;color:#fff;cursor:pointer;opacity:.9;transition:all .2s}.media-close:hover{transform:scale(1.2);opacity:1}.media-nav{position:absolute;top:50%;color:#fff;cursor:pointer;font-size:2em}.media-left-nav{left:2em !important}.media-right-nav{right:2em !important}.media-caption{position:absolute;bottom:1.5em;color:wheat;padding:.5em 1em;line-height:1.3em}@media(max-width: 1000px){.project-page .media-modal{width:90%;margin-top:2em}.project-page .media-nav{bottom:0;top:initial;margin-bottom:.5em}.project-page .media-modal-content{max-height:60vh}.project-page .media-caption{font-size:.9em;margin-bottom:.5em !important;bottom:4em;text-align:center}.project-page .media-modal-container{align-items:flex-start}}.tech-mosaic{display:flex;flex-wrap:wrap;overflow:hidden}.tech-mosaic .item{position:relative;box-sizing:border-box;background-color:rgba(231,231,231,.425);flex-basis:12.5%}.tech-mosaic .item::before{content:"";display:block;padding-top:100%}.tech-mosaic .item .item-inside{position:absolute;top:0;left:0;height:100%;width:100%}.tech-mosaic .item-bg{width:100%;height:100%;position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;overflow:hidden;padding:2em}.tech-mosaic .item-bg img{width:100%}.tech-mosaic .item-bg img.img-stretch{width:auto;height:100%}.tech-mosaic .item-content{position:absolute;top:0;left:0;width:100%;height:100%;color:#fff;display:flex;justify-content:center;align-items:center;opacity:1;background-color:rgba(95,196,99,.46);transition:all .2s}.tech-mosaic .item-content>div{opacity:0;font-size:1.1em;text-align:center;padding:.5em;line-height:1.5em;max-width:100%}.tech-mosaic .item:hover .item-content{background-color:rgba(0,0,0,0)}.tech-mosaic-btn-container{position:absolute;bottom:0;width:100%;display:flex;justify-content:center;align-items:center;margin-top:1em}.tech-mosaic-btn-container .btn{margin-bottom:1em}.tech-mosaic-container{position:relative}.tech-mosaic-container.opened .tech-mosaic-btn-container{display:none}.tech-mosaic-container.closed .tech-mosaic-btn-container{background:linear-gradient(0deg, white 0%, rgba(255, 255, 255, 0.738) 19%, rgba(255, 255, 255, 0.541) 34%, rgba(255, 255, 255, 0.382) 47%, rgba(255, 255, 255, 0.278) 56.5%, rgba(255, 255, 255, 0.194) 65%, rgba(255, 255, 255, 0.126) 73%, rgba(255, 255, 255, 0.075) 80.2%, rgba(255, 255, 255, 0.042) 86.1%, rgba(255, 255, 255, 0.021) 91%, rgba(255, 255, 255, 0.008) 95.2%, rgba(255, 255, 255, 0.002) 98.2%, rgba(255, 255, 255, 0) 100%);height:11em}.tech-mosaic-container.closed .tech-mosaic{max-height:20em}@media(min-width: 400px){.item-bg{padding:1em !important}}@media(max-width: 1000px){.tech-mosaic .item{flex-basis:20%}}@media(max-width: 800px){.tech-mosaic .item{flex-basis:25%}}@media(max-width: 400px){.tech-mosaic .item{flex-basis:50%}}.links-container{display:flex;justify-content:center}.links{width:80%;display:flex;justify-content:space-around;flex-wrap:wrap}.links .link-card{margin:1em;display:flex;flex-direction:column;justify-content:center;align-items:center;min-width:10em}.links .link-card-title{margin-top:.9em}.links .link-card-logo{padding:.5em;width:4em;height:4em;overflow:hidden;display:flex;justify-content:center;align-content:center}.links .link-card-logo img{max-width:4em;max-height:4em}@media(max-width: 900px){.links{width:100%}.links .link-card{justify-content:center}}@media(max-width: 400px){.links{width:100%}.links .link-card{min-width:6em}}a:hover{opacity:.8}p{line-height:1.45em;margin-bottom:1em}p.indent,.indent p{text-indent:3em}h1{font-size:xx-large;margin-bottom:1em}h2{font-size:x-large;margin-top:1.5em;margin-bottom:.8em}h3{font-size:large}.section-title{display:grid;font-size:1.2em;grid-template-columns:auto 1fr;margin-bottom:1em;margin-top:1.3em}.section-title .title-text{color:#000;display:flex;align-items:center}.section-title::before{margin:8px 15px 8px 8px;content:"";width:10px;height:10px;display:block;background-color:#4ba05f}.footer-buffer{height:2em}footer{background-color:#3ea643;margin-top:auto;color:#fff}footer a{color:#212121}.footer-container{padding:2em 0;display:flex;justify-content:space-between}.footer-left div{margin-bottom:.5em}.footer-right{display:flex;align-content:center}.locale-switch-large{display:flex;align-items:center}.locale-switch-large .l{margin-right:1em}.locale-switch-large .r a{margin-right:.2em}.locale-switch-short{display:none}@media(max-width: 900px){.locale-switch-large{display:none}.locale-switch-short{display:block}}.means-of-contact p{margin-bottom:1em}.contact-form-container form{border-radius:3px;border:1px dashed #80808054;padding:1em}.contact-form-container .contact-form-first-group{display:flex}.contact-form-container .contact-form-first-group .contact-form-input:first-of-type{margin-right:.4em}.contact-form-container .contact-form-first-group .contact-form-input:nth-of-type(2){margin-left:.4em}.contact-form-container .contact-form-input{width:100%;margin-top:1em}.contact-form-container input,.contact-form-container textarea{width:100%;margin-top:.6em;border-radius:3px;padding:.6em;border:1px solid #dbdbdb;box-shadow:1px 2px 4px 0 rgba(0,0,0,.1)}.contact-form-container .contact-form-message textarea{min-height:8em}.contact-form-container label{display:block}@keyframes rotating{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.contact-form-container .loading-button{display:none}.contact-form-container .loading-button svg{animation:rotating 2s linear infinite}.contact-form-container .contact-form-container{display:flex;justify-content:end}.alert{padding:1em;margin-bottom:1em;border-radius:3px}.alert .alert-content{display:flex;align-items:center}.alert.alert-success{background:green;color:#fff}.alert.alert-error{background:red;color:#fff}.alert .alert-icon{padding-right:.6em}@media(min-width: 900px){.contact-form-first-group .contact-form-input{margin-top:0}}@media(max-width: 900px){.contact-form-container .contact-form-first-group{display:block}.contact-form-container .contact-form-first-group .contact-form-input{margin-left:0 !important;margin-right:0 !important}.contact-form-input:first-of-type{margin-top:0}}.btn{border-radius:2px;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08);padding:1em 1.5em;margin-top:1em;border:1px solid #ccc;font-size:16px}.chips{display:flex;flex-wrap:wrap}.chips .chip{margin-right:.5em;margin-bottom:.5em;padding:.5em .9em;background:#4ba05f;color:#fff;font-size:.9em;border-radius:10rem}.chips .chip-outline{border:1px solid #4ba05f;background:transparent;color:#4ba05f}.chips .chip-with-icon{display:flex;align-items:center}.chips .chip-with-icon .chip-icon{display:flex;align-items:center;margin-right:.6em}body{font-family:LibreBaskervilleRegular,sans-serif;min-height:100vh;display:flex;flex-direction:column}.hidden{display:none}.container{width:70%;margin:0 auto}.typo,body{font-family:"LibreBaskervilleRegular",serif}section{border-bottom:1px solid gray;padding-bottom:1em}section:last-of-type{border-bottom:0}section h2{margin-top:0;margin-bottom:0}.about-header{margin:2em 0}.profile-nav a{color:#fff;opacity:.8;margin-right:.6em}@media(min-width: 1500px){.container{width:58%}}@media(min-width: 1000px){.container{width:65%}}@media(max-width: 1000px){.container{width:75%}}@media(max-width: 900px){.container{width:90%}} \ No newline at end of file diff --git a/public/dist/app.min.js b/public/dist/app.min.js index c5bc4f3..8dffac1 100755 --- a/public/dist/app.min.js +++ b/public/dist/app.min.js @@ -1,2 +1,2 @@ /*! For license information please see app.min.js.LICENSE.txt */ -(()=>{var e={"./assets/scripts/contact.js":(e,t,o)=>{"use strict";o.r(t),o.d(t,{contactFormSetup:()=>s});var r=o("./node_modules/axios/index.js"),n=o.n(r);function s(){const e=document.getElementById("contact-form"),t=document.getElementById("contact-form-name"),o=document.getElementById("contact-form-email"),r=document.getElementById("contact-form-subject"),s=document.getElementById("contact-form-message"),i=document.getElementById("contact-form-submit"),a=document.getElementById("contact-form-loading"),l=document.getElementById("contact-alert-success"),u=document.getElementById("contact-alert-error");e.onsubmit=e=>{e.preventDefault(),console.log("> Attempting to send a message",t.value,o.value,s.value);let c=i.textContent;a.style.display="block",i.style.display="none",n().post("https://contact-form.thingmill.fr/lefuturiste",{name:t.value,email:o.value,subject:r.value,message:s.value}).then((()=>{console.log("> Message sent"),l.style.display="block",a.style.display="none",i.style.display="block",i.textContent=c})).catch((e=>{u.style.display="block",console.error(e)}))}}},"./node_modules/axios/index.js":(e,t,o)=>{e.exports=o("./node_modules/axios/lib/axios.js")},"./node_modules/axios/lib/adapters/xhr.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js"),n=o("./node_modules/axios/lib/core/settle.js"),s=o("./node_modules/axios/lib/helpers/cookies.js"),i=o("./node_modules/axios/lib/helpers/buildURL.js"),a=o("./node_modules/axios/lib/core/buildFullPath.js"),l=o("./node_modules/axios/lib/helpers/parseHeaders.js"),u=o("./node_modules/axios/lib/helpers/isURLSameOrigin.js"),c=o("./node_modules/axios/lib/defaults/transitional.js"),d=o("./node_modules/axios/lib/core/AxiosError.js"),f=o("./node_modules/axios/lib/cancel/CanceledError.js"),p=o("./node_modules/axios/lib/helpers/parseProtocol.js");e.exports=function(e){return new Promise((function(t,o){var m,h=e.data,b=e.headers,x=e.responseType;function v(){e.cancelToken&&e.cancelToken.unsubscribe(m),e.signal&&e.signal.removeEventListener("abort",m)}r.isFormData(h)&&r.isStandardBrowserEnv()&&delete b["Content-Type"];var j=new XMLHttpRequest;if(e.auth){var g=e.auth.username||"",y=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";b.Authorization="Basic "+btoa(g+":"+y)}var _=a(e.baseURL,e.url);function E(){if(j){var r="getAllResponseHeaders"in j?l(j.getAllResponseHeaders()):null,s={data:x&&"text"!==x&&"json"!==x?j.response:j.responseText,status:j.status,statusText:j.statusText,headers:r,config:e,request:j};n((function(e){t(e),v()}),(function(e){o(e),v()}),s),j=null}}if(j.open(e.method.toUpperCase(),i(_,e.params,e.paramsSerializer),!0),j.timeout=e.timeout,"onloadend"in j?j.onloadend=E:j.onreadystatechange=function(){j&&4===j.readyState&&(0!==j.status||j.responseURL&&0===j.responseURL.indexOf("file:"))&&setTimeout(E)},j.onabort=function(){j&&(o(new d("Request aborted",d.ECONNABORTED,e,j)),j=null)},j.onerror=function(){o(new d("Network Error",d.ERR_NETWORK,e,j,j)),j=null},j.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",r=e.transitional||c;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),o(new d(t,r.clarifyTimeoutError?d.ETIMEDOUT:d.ECONNABORTED,e,j)),j=null},r.isStandardBrowserEnv()){var w=(e.withCredentials||u(_))&&e.xsrfCookieName?s.read(e.xsrfCookieName):void 0;w&&(b[e.xsrfHeaderName]=w)}"setRequestHeader"in j&&r.forEach(b,(function(e,t){void 0===h&&"content-type"===t.toLowerCase()?delete b[t]:j.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(j.withCredentials=!!e.withCredentials),x&&"json"!==x&&(j.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&j.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&j.upload&&j.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(m=function(e){j&&(o(!e||e&&e.type?new f:e),j.abort(),j=null)},e.cancelToken&&e.cancelToken.subscribe(m),e.signal&&(e.signal.aborted?m():e.signal.addEventListener("abort",m))),h||(h=null);var R=p(_);R&&-1===["http","https","file"].indexOf(R)?o(new d("Unsupported protocol "+R+":",d.ERR_BAD_REQUEST,e)):j.send(h)}))}},"./node_modules/axios/lib/axios.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js"),n=o("./node_modules/axios/lib/helpers/bind.js"),s=o("./node_modules/axios/lib/core/Axios.js"),i=o("./node_modules/axios/lib/core/mergeConfig.js");var a=function e(t){var o=new s(t),a=n(s.prototype.request,o);return r.extend(a,s.prototype,o),r.extend(a,o),a.create=function(o){return e(i(t,o))},a}(o("./node_modules/axios/lib/defaults/index.js"));a.Axios=s,a.CanceledError=o("./node_modules/axios/lib/cancel/CanceledError.js"),a.CancelToken=o("./node_modules/axios/lib/cancel/CancelToken.js"),a.isCancel=o("./node_modules/axios/lib/cancel/isCancel.js"),a.VERSION=o("./node_modules/axios/lib/env/data.js").version,a.toFormData=o("./node_modules/axios/lib/helpers/toFormData.js"),a.AxiosError=o("./node_modules/axios/lib/core/AxiosError.js"),a.Cancel=a.CanceledError,a.all=function(e){return Promise.all(e)},a.spread=o("./node_modules/axios/lib/helpers/spread.js"),a.isAxiosError=o("./node_modules/axios/lib/helpers/isAxiosError.js"),e.exports=a,e.exports.default=a},"./node_modules/axios/lib/cancel/CancelToken.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/cancel/CanceledError.js");function n(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var o=this;this.promise.then((function(e){if(o._listeners){var t,r=o._listeners.length;for(t=0;t{"use strict";var r=o("./node_modules/axios/lib/core/AxiosError.js");function n(e){r.call(this,null==e?"canceled":e,r.ERR_CANCELED),this.name="CanceledError"}o("./node_modules/axios/lib/utils.js").inherits(n,r,{__CANCEL__:!0}),e.exports=n},"./node_modules/axios/lib/cancel/isCancel.js":e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},"./node_modules/axios/lib/core/Axios.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js"),n=o("./node_modules/axios/lib/helpers/buildURL.js"),s=o("./node_modules/axios/lib/core/InterceptorManager.js"),i=o("./node_modules/axios/lib/core/dispatchRequest.js"),a=o("./node_modules/axios/lib/core/mergeConfig.js"),l=o("./node_modules/axios/lib/core/buildFullPath.js"),u=o("./node_modules/axios/lib/helpers/validator.js"),c=u.validators;function d(e){this.defaults=e,this.interceptors={request:new s,response:new s}}d.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=a(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var o=t.transitional;void 0!==o&&u.assertOptions(o,{silentJSONParsing:c.transitional(c.boolean),forcedJSONParsing:c.transitional(c.boolean),clarifyTimeoutError:c.transitional(c.boolean)},!1);var r=[],n=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(n=n&&e.synchronous,r.unshift(e.fulfilled,e.rejected))}));var s,l=[];if(this.interceptors.response.forEach((function(e){l.push(e.fulfilled,e.rejected)})),!n){var d=[i,void 0];for(Array.prototype.unshift.apply(d,r),d=d.concat(l),s=Promise.resolve(t);d.length;)s=s.then(d.shift(),d.shift());return s}for(var f=t;r.length;){var p=r.shift(),m=r.shift();try{f=p(f)}catch(e){m(e);break}}try{s=i(f)}catch(e){return Promise.reject(e)}for(;l.length;)s=s.then(l.shift(),l.shift());return s},d.prototype.getUri=function(e){e=a(this.defaults,e);var t=l(e.baseURL,e.url);return n(t,e.params,e.paramsSerializer)},r.forEach(["delete","get","head","options"],(function(e){d.prototype[e]=function(t,o){return this.request(a(o||{},{method:e,url:t,data:(o||{}).data}))}})),r.forEach(["post","put","patch"],(function(e){function t(t){return function(o,r,n){return this.request(a(n||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:o,data:r}))}}d.prototype[e]=t(),d.prototype[e+"Form"]=t(!0)})),e.exports=d},"./node_modules/axios/lib/core/AxiosError.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js");function n(e,t,o,r,n){Error.call(this),this.message=e,this.name="AxiosError",t&&(this.code=t),o&&(this.config=o),r&&(this.request=r),n&&(this.response=n)}r.inherits(n,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var s=n.prototype,i={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED"].forEach((function(e){i[e]={value:e}})),Object.defineProperties(n,i),Object.defineProperty(s,"isAxiosError",{value:!0}),n.from=function(e,t,o,i,a,l){var u=Object.create(s);return r.toFlatObject(e,u,(function(e){return e!==Error.prototype})),n.call(u,e.message,t,o,i,a),u.name=e.name,l&&Object.assign(u,l),u},e.exports=n},"./node_modules/axios/lib/core/InterceptorManager.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js");function n(){this.handlers=[]}n.prototype.use=function(e,t,o){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!o&&o.synchronous,runWhen:o?o.runWhen:null}),this.handlers.length-1},n.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},n.prototype.forEach=function(e){r.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=n},"./node_modules/axios/lib/core/buildFullPath.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/helpers/isAbsoluteURL.js"),n=o("./node_modules/axios/lib/helpers/combineURLs.js");e.exports=function(e,t){return e&&!r(t)?n(e,t):t}},"./node_modules/axios/lib/core/dispatchRequest.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js"),n=o("./node_modules/axios/lib/core/transformData.js"),s=o("./node_modules/axios/lib/cancel/isCancel.js"),i=o("./node_modules/axios/lib/defaults/index.js"),a=o("./node_modules/axios/lib/cancel/CanceledError.js");function l(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new a}e.exports=function(e){return l(e),e.headers=e.headers||{},e.data=n.call(e,e.data,e.headers,e.transformRequest),e.headers=r.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),r.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||i.adapter)(e).then((function(t){return l(e),t.data=n.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return s(t)||(l(e),t&&t.response&&(t.response.data=n.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},"./node_modules/axios/lib/core/mergeConfig.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js");e.exports=function(e,t){t=t||{};var o={};function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function s(o){return r.isUndefined(t[o])?r.isUndefined(e[o])?void 0:n(void 0,e[o]):n(e[o],t[o])}function i(e){if(!r.isUndefined(t[e]))return n(void 0,t[e])}function a(o){return r.isUndefined(t[o])?r.isUndefined(e[o])?void 0:n(void 0,e[o]):n(void 0,t[o])}function l(o){return o in t?n(e[o],t[o]):o in e?n(void 0,e[o]):void 0}var u={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:l};return r.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=u[e]||s,n=t(e);r.isUndefined(n)&&t!==l||(o[e]=n)})),o}},"./node_modules/axios/lib/core/settle.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/core/AxiosError.js");e.exports=function(e,t,o){var n=o.config.validateStatus;o.status&&n&&!n(o.status)?t(new r("Request failed with status code "+o.status,[r.ERR_BAD_REQUEST,r.ERR_BAD_RESPONSE][Math.floor(o.status/100)-4],o.config,o.request,o)):e(o)}},"./node_modules/axios/lib/core/transformData.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js"),n=o("./node_modules/axios/lib/defaults/index.js");e.exports=function(e,t,o){var s=this||n;return r.forEach(o,(function(o){e=o.call(s,e,t)})),e}},"./node_modules/axios/lib/defaults/index.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js"),n=o("./node_modules/axios/lib/helpers/normalizeHeaderName.js"),s=o("./node_modules/axios/lib/core/AxiosError.js"),i=o("./node_modules/axios/lib/defaults/transitional.js"),a=o("./node_modules/axios/lib/helpers/toFormData.js"),l={"Content-Type":"application/x-www-form-urlencoded"};function u(e,t){!r.isUndefined(e)&&r.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var c,d={transitional:i,adapter:(("undefined"!=typeof XMLHttpRequest||"undefined"!=typeof process&&"[object process]"===Object.prototype.toString.call(process))&&(c=o("./node_modules/axios/lib/adapters/xhr.js")),c),transformRequest:[function(e,t){if(n(t,"Accept"),n(t,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e))return e;if(r.isArrayBufferView(e))return e.buffer;if(r.isURLSearchParams(e))return u(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();var o,s=r.isObject(e),i=t&&t["Content-Type"];if((o=r.isFileList(e))||s&&"multipart/form-data"===i){var l=this.env&&this.env.FormData;return a(o?{"files[]":e}:e,l&&new l)}return s||"application/json"===i?(u(t,"application/json"),function(e,t,o){if(r.isString(e))try{return(t||JSON.parse)(e),r.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(o||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||d.transitional,o=t&&t.silentJSONParsing,n=t&&t.forcedJSONParsing,i=!o&&"json"===this.responseType;if(i||n&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(i){if("SyntaxError"===e.name)throw s.from(e,s.ERR_BAD_RESPONSE,this,null,this.response);throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:o("./node_modules/axios/lib/helpers/null.js")},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(e){d.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){d.headers[e]=r.merge(l)})),e.exports=d},"./node_modules/axios/lib/defaults/transitional.js":e=>{"use strict";e.exports={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1}},"./node_modules/axios/lib/env/data.js":e=>{e.exports={version:"0.27.2"}},"./node_modules/axios/lib/helpers/bind.js":e=>{"use strict";e.exports=function(e,t){return function(){for(var o=new Array(arguments.length),r=0;r{"use strict";var r=o("./node_modules/axios/lib/utils.js");function n(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,o){if(!t)return e;var s;if(o)s=o(t);else if(r.isURLSearchParams(t))s=t.toString();else{var i=[];r.forEach(t,(function(e,t){null!=e&&(r.isArray(e)?t+="[]":e=[e],r.forEach(e,(function(e){r.isDate(e)?e=e.toISOString():r.isObject(e)&&(e=JSON.stringify(e)),i.push(n(t)+"="+n(e))})))})),s=i.join("&")}if(s){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+s}return e}},"./node_modules/axios/lib/helpers/combineURLs.js":e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},"./node_modules/axios/lib/helpers/cookies.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js");e.exports=r.isStandardBrowserEnv()?{write:function(e,t,o,n,s,i){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(o)&&a.push("expires="+new Date(o).toGMTString()),r.isString(n)&&a.push("path="+n),r.isString(s)&&a.push("domain="+s),!0===i&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},"./node_modules/axios/lib/helpers/isAbsoluteURL.js":e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}},"./node_modules/axios/lib/helpers/isAxiosError.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js");e.exports=function(e){return r.isObject(e)&&!0===e.isAxiosError}},"./node_modules/axios/lib/helpers/isURLSameOrigin.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js");e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");function n(e){var r=e;return t&&(o.setAttribute("href",r),r=o.href),o.setAttribute("href",r),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}return e=n(window.location.href),function(t){var o=r.isString(t)?n(t):t;return o.protocol===e.protocol&&o.host===e.host}}():function(){return!0}},"./node_modules/axios/lib/helpers/normalizeHeaderName.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js");e.exports=function(e,t){r.forEach(e,(function(o,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=o,delete e[r])}))}},"./node_modules/axios/lib/helpers/null.js":e=>{e.exports=null},"./node_modules/axios/lib/helpers/parseHeaders.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js"),n=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,o,s,i={};return e?(r.forEach(e.split("\n"),(function(e){if(s=e.indexOf(":"),t=r.trim(e.substr(0,s)).toLowerCase(),o=r.trim(e.substr(s+1)),t){if(i[t]&&n.indexOf(t)>=0)return;i[t]="set-cookie"===t?(i[t]?i[t]:[]).concat([o]):i[t]?i[t]+", "+o:o}})),i):i}},"./node_modules/axios/lib/helpers/parseProtocol.js":e=>{"use strict";e.exports=function(e){var t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}},"./node_modules/axios/lib/helpers/spread.js":e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},"./node_modules/axios/lib/helpers/toFormData.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/utils.js");e.exports=function(e,t){t=t||new FormData;var o=[];function n(e){return null===e?"":r.isDate(e)?e.toISOString():r.isArrayBuffer(e)||r.isTypedArray(e)?"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}return function e(s,i){if(r.isPlainObject(s)||r.isArray(s)){if(-1!==o.indexOf(s))throw Error("Circular reference detected in "+i);o.push(s),r.forEach(s,(function(o,s){if(!r.isUndefined(o)){var a,l=i?i+"."+s:s;if(o&&!i&&"object"==typeof o)if(r.endsWith(s,"{}"))o=JSON.stringify(o);else if(r.endsWith(s,"[]")&&(a=r.toArray(o)))return void a.forEach((function(e){!r.isUndefined(e)&&t.append(l,n(e))}));e(o,l)}})),o.pop()}else t.append(i,n(s))}(e),t}},"./node_modules/axios/lib/helpers/validator.js":(e,t,o)=>{"use strict";var r=o("./node_modules/axios/lib/env/data.js").version,n=o("./node_modules/axios/lib/core/AxiosError.js"),s={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){s[e]=function(o){return typeof o===e||"a"+(t<1?"n ":" ")+e}}));var i={};s.transitional=function(e,t,o){function s(e,t){return"[Axios v"+r+"] Transitional option '"+e+"'"+t+(o?". "+o:"")}return function(o,r,a){if(!1===e)throw new n(s(r," has been removed"+(t?" in "+t:"")),n.ERR_DEPRECATED);return t&&!i[r]&&(i[r]=!0,console.warn(s(r," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(o,r,a)}},e.exports={assertOptions:function(e,t,o){if("object"!=typeof e)throw new n("options must be an object",n.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),s=r.length;s-- >0;){var i=r[s],a=t[i];if(a){var l=e[i],u=void 0===l||a(l,i,e);if(!0!==u)throw new n("option "+i+" must be "+u,n.ERR_BAD_OPTION_VALUE)}else if(!0!==o)throw new n("Unknown option "+i,n.ERR_BAD_OPTION)}},validators:s}},"./node_modules/axios/lib/utils.js":(e,t,o)=>{"use strict";var r,n=o("./node_modules/axios/lib/helpers/bind.js"),s=Object.prototype.toString,i=(r=Object.create(null),function(e){var t=s.call(e);return r[t]||(r[t]=t.slice(8,-1).toLowerCase())});function a(e){return e=e.toLowerCase(),function(t){return i(t)===e}}function l(e){return Array.isArray(e)}function u(e){return void 0===e}var c=a("ArrayBuffer");function d(e){return null!==e&&"object"==typeof e}function f(e){if("object"!==i(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}var p=a("Date"),m=a("File"),h=a("Blob"),b=a("FileList");function x(e){return"[object Function]"===s.call(e)}var v=a("URLSearchParams");function j(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),l(e))for(var o=0,r=e.length;o0;)i[s=r[n]]||(t[s]=e[s],i[s]=!0);e=Object.getPrototypeOf(e)}while(e&&(!o||o(e,t))&&e!==Object.prototype);return t},kindOf:i,kindOfTest:a,endsWith:function(e,t,o){e=String(e),(void 0===o||o>e.length)&&(o=e.length),o-=t.length;var r=e.indexOf(t,o);return-1!==r&&r===o},toArray:function(e){if(!e)return null;var t=e.length;if(u(t))return null;for(var o=new Array(t);t-- >0;)o[t]=e[t];return o},isTypedArray:y,isFileList:b}}},t={};function o(r){var n=t[r];if(void 0!==n)return n.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,o),s.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");r.length&&(e=r[r.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})();var r={};(()=>{"use strict";o.r({});o("./node_modules/axios/index.js");(0,o("./assets/scripts/contact.js").contactFormSetup)()})(),(()=>{"use strict";o.r(r),o.d(r,{default:()=>e});const e=o.p+"app.min.css"})()})(); \ No newline at end of file +(()=>{var e={"./assets/scripts/contact.js":(e,t,o)=>{"use strict";o.r(t),o.d(t,{contactFormSetup:()=>s});var n=o("./node_modules/axios/index.js"),r=o.n(n);function s(){const e=document.getElementById("contact-form");if(null==e)return;const t=document.getElementById("contact-form-name"),o=document.getElementById("contact-form-email"),n=document.getElementById("contact-form-subject"),s=document.getElementById("contact-form-message"),i=document.getElementById("contact-form-submit"),a=document.getElementById("contact-form-loading"),l=document.getElementById("contact-alert-success"),u=document.getElementById("contact-alert-error");e.onsubmit=e=>{e.preventDefault(),console.log("> Attempting to send a message",t.value,o.value,s.value);let c=i.textContent;a.style.display="block",i.style.display="none",r().post("https://contact-form.thingmill.fr/lefuturiste",{name:t.value,email:o.value,subject:n.value,message:s.value}).then((()=>{console.log("> Message sent"),l.style.display="block",a.style.display="none",i.style.display="block",i.textContent=c})).catch((e=>{u.style.display="block",console.error(e)}))}}},"./assets/scripts/mediaModal.js":(e,t,o)=>{"use strict";function n(){const e=document.getElementById("project-images-data");if(null==e)return;const t=JSON.parse(e.textContent);console.log("mediaData",t);let o=document.querySelector("#media-modal"),n=document.querySelector("#media-modal-content"),r=document.getElementById("caption"),s={},i=e=>{n.innerHTML="";let t=document.createAttribute("src");t.value=e.image;let o=null;o=document.createElement("img"),o.attributes.setNamedItem(t),n.appendChild(o),r.innerText=e.description};setTimeout((()=>{o.style=""}),500),window.openModal=e=>{o.style.visibility="visible",o.style.opacity=1,s=t.filter((t=>t.id===e))[0],i(s),document.body.style.overflow="hidden",document.body.style.touchAction="none",setTimeout((()=>{}),100)};window.closeModal=()=>{o.style.visibility="hidden",o.style.opacity=0,document.body.style.overflow="initial",document.body.style.height="initial",document.body.style.touchAction="initial"},window.navLeft=()=>{0!==t.indexOf(s)&&(s=t[t.indexOf(s)-1],i(s))},window.navRight=()=>{t.indexOf(s)+1!==t.length&&(s=t[t.indexOf(s)+1],i(s))}}o.r(t),o.d(t,{mediaModalSetup:()=>n})},"./assets/scripts/technologiesMosaic.js":(e,t,o)=>{"use strict";o.r(t),o.d(t,{technologiesMosaicSetup:()=>r});let n=!1;function r(){document.getElementById("tech-mosaic");const e=document.getElementById("tech-mosaic-container");document.getElementById("tech-mosaic-btn-container");window.openTechMosaic=()=>{e.className=n?e.className.replace(" opened"," closed"):e.className.replace(" closed"," opened"),n=!n}}},"./node_modules/axios/index.js":(e,t,o)=>{e.exports=o("./node_modules/axios/lib/axios.js")},"./node_modules/axios/lib/adapters/xhr.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js"),r=o("./node_modules/axios/lib/core/settle.js"),s=o("./node_modules/axios/lib/helpers/cookies.js"),i=o("./node_modules/axios/lib/helpers/buildURL.js"),a=o("./node_modules/axios/lib/core/buildFullPath.js"),l=o("./node_modules/axios/lib/helpers/parseHeaders.js"),u=o("./node_modules/axios/lib/helpers/isURLSameOrigin.js"),c=o("./node_modules/axios/lib/defaults/transitional.js"),d=o("./node_modules/axios/lib/core/AxiosError.js"),f=o("./node_modules/axios/lib/cancel/CanceledError.js"),p=o("./node_modules/axios/lib/helpers/parseProtocol.js");e.exports=function(e){return new Promise((function(t,o){var m,h=e.data,b=e.headers,x=e.responseType;function y(){e.cancelToken&&e.cancelToken.unsubscribe(m),e.signal&&e.signal.removeEventListener("abort",m)}n.isFormData(h)&&n.isStandardBrowserEnv()&&delete b["Content-Type"];var g=new XMLHttpRequest;if(e.auth){var v=e.auth.username||"",j=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";b.Authorization="Basic "+btoa(v+":"+j)}var _=a(e.baseURL,e.url);function E(){if(g){var n="getAllResponseHeaders"in g?l(g.getAllResponseHeaders()):null,s={data:x&&"text"!==x&&"json"!==x?g.response:g.responseText,status:g.status,statusText:g.statusText,headers:n,config:e,request:g};r((function(e){t(e),y()}),(function(e){o(e),y()}),s),g=null}}if(g.open(e.method.toUpperCase(),i(_,e.params,e.paramsSerializer),!0),g.timeout=e.timeout,"onloadend"in g?g.onloadend=E:g.onreadystatechange=function(){g&&4===g.readyState&&(0!==g.status||g.responseURL&&0===g.responseURL.indexOf("file:"))&&setTimeout(E)},g.onabort=function(){g&&(o(new d("Request aborted",d.ECONNABORTED,e,g)),g=null)},g.onerror=function(){o(new d("Network Error",d.ERR_NETWORK,e,g,g)),g=null},g.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",n=e.transitional||c;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),o(new d(t,n.clarifyTimeoutError?d.ETIMEDOUT:d.ECONNABORTED,e,g)),g=null},n.isStandardBrowserEnv()){var w=(e.withCredentials||u(_))&&e.xsrfCookieName?s.read(e.xsrfCookieName):void 0;w&&(b[e.xsrfHeaderName]=w)}"setRequestHeader"in g&&n.forEach(b,(function(e,t){void 0===h&&"content-type"===t.toLowerCase()?delete b[t]:g.setRequestHeader(t,e)})),n.isUndefined(e.withCredentials)||(g.withCredentials=!!e.withCredentials),x&&"json"!==x&&(g.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&g.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&g.upload&&g.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(m=function(e){g&&(o(!e||e&&e.type?new f:e),g.abort(),g=null)},e.cancelToken&&e.cancelToken.subscribe(m),e.signal&&(e.signal.aborted?m():e.signal.addEventListener("abort",m))),h||(h=null);var O=p(_);O&&-1===["http","https","file"].indexOf(O)?o(new d("Unsupported protocol "+O+":",d.ERR_BAD_REQUEST,e)):g.send(h)}))}},"./node_modules/axios/lib/axios.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js"),r=o("./node_modules/axios/lib/helpers/bind.js"),s=o("./node_modules/axios/lib/core/Axios.js"),i=o("./node_modules/axios/lib/core/mergeConfig.js");var a=function e(t){var o=new s(t),a=r(s.prototype.request,o);return n.extend(a,s.prototype,o),n.extend(a,o),a.create=function(o){return e(i(t,o))},a}(o("./node_modules/axios/lib/defaults/index.js"));a.Axios=s,a.CanceledError=o("./node_modules/axios/lib/cancel/CanceledError.js"),a.CancelToken=o("./node_modules/axios/lib/cancel/CancelToken.js"),a.isCancel=o("./node_modules/axios/lib/cancel/isCancel.js"),a.VERSION=o("./node_modules/axios/lib/env/data.js").version,a.toFormData=o("./node_modules/axios/lib/helpers/toFormData.js"),a.AxiosError=o("./node_modules/axios/lib/core/AxiosError.js"),a.Cancel=a.CanceledError,a.all=function(e){return Promise.all(e)},a.spread=o("./node_modules/axios/lib/helpers/spread.js"),a.isAxiosError=o("./node_modules/axios/lib/helpers/isAxiosError.js"),e.exports=a,e.exports.default=a},"./node_modules/axios/lib/cancel/CancelToken.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/cancel/CanceledError.js");function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var o=this;this.promise.then((function(e){if(o._listeners){var t,n=o._listeners.length;for(t=0;t{"use strict";var n=o("./node_modules/axios/lib/core/AxiosError.js");function r(e){n.call(this,null==e?"canceled":e,n.ERR_CANCELED),this.name="CanceledError"}o("./node_modules/axios/lib/utils.js").inherits(r,n,{__CANCEL__:!0}),e.exports=r},"./node_modules/axios/lib/cancel/isCancel.js":e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},"./node_modules/axios/lib/core/Axios.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js"),r=o("./node_modules/axios/lib/helpers/buildURL.js"),s=o("./node_modules/axios/lib/core/InterceptorManager.js"),i=o("./node_modules/axios/lib/core/dispatchRequest.js"),a=o("./node_modules/axios/lib/core/mergeConfig.js"),l=o("./node_modules/axios/lib/core/buildFullPath.js"),u=o("./node_modules/axios/lib/helpers/validator.js"),c=u.validators;function d(e){this.defaults=e,this.interceptors={request:new s,response:new s}}d.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=a(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var o=t.transitional;void 0!==o&&u.assertOptions(o,{silentJSONParsing:c.transitional(c.boolean),forcedJSONParsing:c.transitional(c.boolean),clarifyTimeoutError:c.transitional(c.boolean)},!1);var n=[],r=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(r=r&&e.synchronous,n.unshift(e.fulfilled,e.rejected))}));var s,l=[];if(this.interceptors.response.forEach((function(e){l.push(e.fulfilled,e.rejected)})),!r){var d=[i,void 0];for(Array.prototype.unshift.apply(d,n),d=d.concat(l),s=Promise.resolve(t);d.length;)s=s.then(d.shift(),d.shift());return s}for(var f=t;n.length;){var p=n.shift(),m=n.shift();try{f=p(f)}catch(e){m(e);break}}try{s=i(f)}catch(e){return Promise.reject(e)}for(;l.length;)s=s.then(l.shift(),l.shift());return s},d.prototype.getUri=function(e){e=a(this.defaults,e);var t=l(e.baseURL,e.url);return r(t,e.params,e.paramsSerializer)},n.forEach(["delete","get","head","options"],(function(e){d.prototype[e]=function(t,o){return this.request(a(o||{},{method:e,url:t,data:(o||{}).data}))}})),n.forEach(["post","put","patch"],(function(e){function t(t){return function(o,n,r){return this.request(a(r||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:o,data:n}))}}d.prototype[e]=t(),d.prototype[e+"Form"]=t(!0)})),e.exports=d},"./node_modules/axios/lib/core/AxiosError.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js");function r(e,t,o,n,r){Error.call(this),this.message=e,this.name="AxiosError",t&&(this.code=t),o&&(this.config=o),n&&(this.request=n),r&&(this.response=r)}n.inherits(r,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var s=r.prototype,i={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED"].forEach((function(e){i[e]={value:e}})),Object.defineProperties(r,i),Object.defineProperty(s,"isAxiosError",{value:!0}),r.from=function(e,t,o,i,a,l){var u=Object.create(s);return n.toFlatObject(e,u,(function(e){return e!==Error.prototype})),r.call(u,e.message,t,o,i,a),u.name=e.name,l&&Object.assign(u,l),u},e.exports=r},"./node_modules/axios/lib/core/InterceptorManager.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js");function r(){this.handlers=[]}r.prototype.use=function(e,t,o){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!o&&o.synchronous,runWhen:o?o.runWhen:null}),this.handlers.length-1},r.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},r.prototype.forEach=function(e){n.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=r},"./node_modules/axios/lib/core/buildFullPath.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/helpers/isAbsoluteURL.js"),r=o("./node_modules/axios/lib/helpers/combineURLs.js");e.exports=function(e,t){return e&&!n(t)?r(e,t):t}},"./node_modules/axios/lib/core/dispatchRequest.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js"),r=o("./node_modules/axios/lib/core/transformData.js"),s=o("./node_modules/axios/lib/cancel/isCancel.js"),i=o("./node_modules/axios/lib/defaults/index.js"),a=o("./node_modules/axios/lib/cancel/CanceledError.js");function l(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new a}e.exports=function(e){return l(e),e.headers=e.headers||{},e.data=r.call(e,e.data,e.headers,e.transformRequest),e.headers=n.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),n.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||i.adapter)(e).then((function(t){return l(e),t.data=r.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return s(t)||(l(e),t&&t.response&&(t.response.data=r.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},"./node_modules/axios/lib/core/mergeConfig.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js");e.exports=function(e,t){t=t||{};var o={};function r(e,t){return n.isPlainObject(e)&&n.isPlainObject(t)?n.merge(e,t):n.isPlainObject(t)?n.merge({},t):n.isArray(t)?t.slice():t}function s(o){return n.isUndefined(t[o])?n.isUndefined(e[o])?void 0:r(void 0,e[o]):r(e[o],t[o])}function i(e){if(!n.isUndefined(t[e]))return r(void 0,t[e])}function a(o){return n.isUndefined(t[o])?n.isUndefined(e[o])?void 0:r(void 0,e[o]):r(void 0,t[o])}function l(o){return o in t?r(e[o],t[o]):o in e?r(void 0,e[o]):void 0}var u={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:l};return n.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=u[e]||s,r=t(e);n.isUndefined(r)&&t!==l||(o[e]=r)})),o}},"./node_modules/axios/lib/core/settle.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/core/AxiosError.js");e.exports=function(e,t,o){var r=o.config.validateStatus;o.status&&r&&!r(o.status)?t(new n("Request failed with status code "+o.status,[n.ERR_BAD_REQUEST,n.ERR_BAD_RESPONSE][Math.floor(o.status/100)-4],o.config,o.request,o)):e(o)}},"./node_modules/axios/lib/core/transformData.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js"),r=o("./node_modules/axios/lib/defaults/index.js");e.exports=function(e,t,o){var s=this||r;return n.forEach(o,(function(o){e=o.call(s,e,t)})),e}},"./node_modules/axios/lib/defaults/index.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js"),r=o("./node_modules/axios/lib/helpers/normalizeHeaderName.js"),s=o("./node_modules/axios/lib/core/AxiosError.js"),i=o("./node_modules/axios/lib/defaults/transitional.js"),a=o("./node_modules/axios/lib/helpers/toFormData.js"),l={"Content-Type":"application/x-www-form-urlencoded"};function u(e,t){!n.isUndefined(e)&&n.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var c,d={transitional:i,adapter:(("undefined"!=typeof XMLHttpRequest||"undefined"!=typeof process&&"[object process]"===Object.prototype.toString.call(process))&&(c=o("./node_modules/axios/lib/adapters/xhr.js")),c),transformRequest:[function(e,t){if(r(t,"Accept"),r(t,"Content-Type"),n.isFormData(e)||n.isArrayBuffer(e)||n.isBuffer(e)||n.isStream(e)||n.isFile(e)||n.isBlob(e))return e;if(n.isArrayBufferView(e))return e.buffer;if(n.isURLSearchParams(e))return u(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();var o,s=n.isObject(e),i=t&&t["Content-Type"];if((o=n.isFileList(e))||s&&"multipart/form-data"===i){var l=this.env&&this.env.FormData;return a(o?{"files[]":e}:e,l&&new l)}return s||"application/json"===i?(u(t,"application/json"),function(e,t,o){if(n.isString(e))try{return(t||JSON.parse)(e),n.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(o||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||d.transitional,o=t&&t.silentJSONParsing,r=t&&t.forcedJSONParsing,i=!o&&"json"===this.responseType;if(i||r&&n.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(i){if("SyntaxError"===e.name)throw s.from(e,s.ERR_BAD_RESPONSE,this,null,this.response);throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:o("./node_modules/axios/lib/helpers/null.js")},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};n.forEach(["delete","get","head"],(function(e){d.headers[e]={}})),n.forEach(["post","put","patch"],(function(e){d.headers[e]=n.merge(l)})),e.exports=d},"./node_modules/axios/lib/defaults/transitional.js":e=>{"use strict";e.exports={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1}},"./node_modules/axios/lib/env/data.js":e=>{e.exports={version:"0.27.2"}},"./node_modules/axios/lib/helpers/bind.js":e=>{"use strict";e.exports=function(e,t){return function(){for(var o=new Array(arguments.length),n=0;n{"use strict";var n=o("./node_modules/axios/lib/utils.js");function r(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,o){if(!t)return e;var s;if(o)s=o(t);else if(n.isURLSearchParams(t))s=t.toString();else{var i=[];n.forEach(t,(function(e,t){null!=e&&(n.isArray(e)?t+="[]":e=[e],n.forEach(e,(function(e){n.isDate(e)?e=e.toISOString():n.isObject(e)&&(e=JSON.stringify(e)),i.push(r(t)+"="+r(e))})))})),s=i.join("&")}if(s){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+s}return e}},"./node_modules/axios/lib/helpers/combineURLs.js":e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},"./node_modules/axios/lib/helpers/cookies.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js");e.exports=n.isStandardBrowserEnv()?{write:function(e,t,o,r,s,i){var a=[];a.push(e+"="+encodeURIComponent(t)),n.isNumber(o)&&a.push("expires="+new Date(o).toGMTString()),n.isString(r)&&a.push("path="+r),n.isString(s)&&a.push("domain="+s),!0===i&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},"./node_modules/axios/lib/helpers/isAbsoluteURL.js":e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}},"./node_modules/axios/lib/helpers/isAxiosError.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js");e.exports=function(e){return n.isObject(e)&&!0===e.isAxiosError}},"./node_modules/axios/lib/helpers/isURLSameOrigin.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js");e.exports=n.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");function r(e){var n=e;return t&&(o.setAttribute("href",n),n=o.href),o.setAttribute("href",n),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}return e=r(window.location.href),function(t){var o=n.isString(t)?r(t):t;return o.protocol===e.protocol&&o.host===e.host}}():function(){return!0}},"./node_modules/axios/lib/helpers/normalizeHeaderName.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js");e.exports=function(e,t){n.forEach(e,(function(o,n){n!==t&&n.toUpperCase()===t.toUpperCase()&&(e[t]=o,delete e[n])}))}},"./node_modules/axios/lib/helpers/null.js":e=>{e.exports=null},"./node_modules/axios/lib/helpers/parseHeaders.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js"),r=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,o,s,i={};return e?(n.forEach(e.split("\n"),(function(e){if(s=e.indexOf(":"),t=n.trim(e.substr(0,s)).toLowerCase(),o=n.trim(e.substr(s+1)),t){if(i[t]&&r.indexOf(t)>=0)return;i[t]="set-cookie"===t?(i[t]?i[t]:[]).concat([o]):i[t]?i[t]+", "+o:o}})),i):i}},"./node_modules/axios/lib/helpers/parseProtocol.js":e=>{"use strict";e.exports=function(e){var t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}},"./node_modules/axios/lib/helpers/spread.js":e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},"./node_modules/axios/lib/helpers/toFormData.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/utils.js");e.exports=function(e,t){t=t||new FormData;var o=[];function r(e){return null===e?"":n.isDate(e)?e.toISOString():n.isArrayBuffer(e)||n.isTypedArray(e)?"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}return function e(s,i){if(n.isPlainObject(s)||n.isArray(s)){if(-1!==o.indexOf(s))throw Error("Circular reference detected in "+i);o.push(s),n.forEach(s,(function(o,s){if(!n.isUndefined(o)){var a,l=i?i+"."+s:s;if(o&&!i&&"object"==typeof o)if(n.endsWith(s,"{}"))o=JSON.stringify(o);else if(n.endsWith(s,"[]")&&(a=n.toArray(o)))return void a.forEach((function(e){!n.isUndefined(e)&&t.append(l,r(e))}));e(o,l)}})),o.pop()}else t.append(i,r(s))}(e),t}},"./node_modules/axios/lib/helpers/validator.js":(e,t,o)=>{"use strict";var n=o("./node_modules/axios/lib/env/data.js").version,r=o("./node_modules/axios/lib/core/AxiosError.js"),s={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){s[e]=function(o){return typeof o===e||"a"+(t<1?"n ":" ")+e}}));var i={};s.transitional=function(e,t,o){function s(e,t){return"[Axios v"+n+"] Transitional option '"+e+"'"+t+(o?". "+o:"")}return function(o,n,a){if(!1===e)throw new r(s(n," has been removed"+(t?" in "+t:"")),r.ERR_DEPRECATED);return t&&!i[n]&&(i[n]=!0,console.warn(s(n," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(o,n,a)}},e.exports={assertOptions:function(e,t,o){if("object"!=typeof e)throw new r("options must be an object",r.ERR_BAD_OPTION_VALUE);for(var n=Object.keys(e),s=n.length;s-- >0;){var i=n[s],a=t[i];if(a){var l=e[i],u=void 0===l||a(l,i,e);if(!0!==u)throw new r("option "+i+" must be "+u,r.ERR_BAD_OPTION_VALUE)}else if(!0!==o)throw new r("Unknown option "+i,r.ERR_BAD_OPTION)}},validators:s}},"./node_modules/axios/lib/utils.js":(e,t,o)=>{"use strict";var n,r=o("./node_modules/axios/lib/helpers/bind.js"),s=Object.prototype.toString,i=(n=Object.create(null),function(e){var t=s.call(e);return n[t]||(n[t]=t.slice(8,-1).toLowerCase())});function a(e){return e=e.toLowerCase(),function(t){return i(t)===e}}function l(e){return Array.isArray(e)}function u(e){return void 0===e}var c=a("ArrayBuffer");function d(e){return null!==e&&"object"==typeof e}function f(e){if("object"!==i(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}var p=a("Date"),m=a("File"),h=a("Blob"),b=a("FileList");function x(e){return"[object Function]"===s.call(e)}var y=a("URLSearchParams");function g(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),l(e))for(var o=0,n=e.length;o0;)i[s=n[r]]||(t[s]=e[s],i[s]=!0);e=Object.getPrototypeOf(e)}while(e&&(!o||o(e,t))&&e!==Object.prototype);return t},kindOf:i,kindOfTest:a,endsWith:function(e,t,o){e=String(e),(void 0===o||o>e.length)&&(o=e.length),o-=t.length;var n=e.indexOf(t,o);return-1!==n&&n===o},toArray:function(e){if(!e)return null;var t=e.length;if(u(t))return null;for(var o=new Array(t);t-- >0;)o[t]=e[t];return o},isTypedArray:j,isFileList:b}}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var s=t[n]={exports:{}};return e[n](s,s.exports,o),s.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})();var n={};(()=>{"use strict";o.r({});o("./node_modules/axios/index.js");var e=o("./assets/scripts/contact.js"),t=o("./assets/scripts/technologiesMosaic.js"),n=o("./assets/scripts/mediaModal.js");(0,e.contactFormSetup)(),(0,t.technologiesMosaicSetup)(),(0,n.mediaModalSetup)()})(),(()=>{"use strict";o.r(n),o.d(n,{default:()=>e});const e=o.p+"app.min.css"})()})(); \ No newline at end of file diff --git a/public/dist/app.min.js.LICENSE.txt b/public/dist/app.min.js.LICENSE.txt index a791db8..29a646b 100755 --- a/public/dist/app.min.js.LICENSE.txt +++ b/public/dist/app.min.js.LICENSE.txt @@ -82,8 +82,12 @@ /*! ./lib/axios */ +/*! ./mediaModal */ + /*! ./mergeConfig */ +/*! ./technologiesMosaic */ + /*! ./transformData */ /*! ./transitional */ @@ -108,6 +112,10 @@ !*** ./node_modules/axios/index.js ***! \*************************************/ +/*!**************************************!*\ + !*** ./assets/scripts/mediaModal.js ***! + \**************************************/ + /*!*****************************************!*\ !*** ./node_modules/axios/lib/axios.js ***! \*****************************************/ @@ -120,6 +128,10 @@ !*** ./node_modules/axios/lib/env/data.js ***! \********************************************/ +/*!**********************************************!*\ + !*** ./assets/scripts/technologiesMosaic.js ***! + \**********************************************/ + /*!**********************************************!*\ !*** ./node_modules/axios/lib/core/Axios.js ***! \**********************************************/ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..81eb476 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/imgs/favicon.png b/public/imgs/favicon.png new file mode 100644 index 0000000..3b6c6e4 Binary files /dev/null and b/public/imgs/favicon.png differ diff --git a/public/imgs/icons/bike.svg b/public/imgs/icons/bike.svg new file mode 100644 index 0000000..e940ea7 --- /dev/null +++ b/public/imgs/icons/bike.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/imgs/icons/bolt.svg b/public/imgs/icons/bolt.svg new file mode 100644 index 0000000..c2a3e80 --- /dev/null +++ b/public/imgs/icons/bolt.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/imgs/icons/cake.svg b/public/imgs/icons/cake.svg new file mode 100644 index 0000000..51a7ede --- /dev/null +++ b/public/imgs/icons/cake.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/imgs/icons/chart-arcs-3.svg b/public/imgs/icons/chart-arcs-3.svg new file mode 100644 index 0000000..f99f1f5 --- /dev/null +++ b/public/imgs/icons/chart-arcs-3.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/imgs/icons/copyleft.svg b/public/imgs/icons/copyleft.svg new file mode 100644 index 0000000..46fd279 --- /dev/null +++ b/public/imgs/icons/copyleft.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/imgs/icons/database.svg b/public/imgs/icons/database.svg new file mode 100644 index 0000000..bcd1381 --- /dev/null +++ b/public/imgs/icons/database.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/imgs/icons/device-desktop.svg b/public/imgs/icons/device-desktop.svg new file mode 100644 index 0000000..d9ae86b --- /dev/null +++ b/public/imgs/icons/device-desktop.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/imgs/icons/flag.svg b/public/imgs/icons/flag.svg new file mode 100644 index 0000000..70a2326 --- /dev/null +++ b/public/imgs/icons/flag.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/imgs/icons/grid-dots.svg b/public/imgs/icons/grid-dots.svg new file mode 100644 index 0000000..6ba23d6 --- /dev/null +++ b/public/imgs/icons/grid-dots.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/imgs/icons/language.svg b/public/imgs/icons/language.svg new file mode 100644 index 0000000..7f01621 --- /dev/null +++ b/public/imgs/icons/language.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/public/imgs/icons/map-pin.svg b/public/imgs/icons/map-pin.svg new file mode 100644 index 0000000..84f3494 --- /dev/null +++ b/public/imgs/icons/map-pin.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/imgs/icons/map.svg b/public/imgs/icons/map.svg new file mode 100644 index 0000000..fb38bde --- /dev/null +++ b/public/imgs/icons/map.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/imgs/icons/opensource.svg b/public/imgs/icons/opensource.svg new file mode 100644 index 0000000..bfbff9a --- /dev/null +++ b/public/imgs/icons/opensource.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/imgs/icons/robot.svg b/public/imgs/icons/robot.svg new file mode 100644 index 0000000..c87861e --- /dev/null +++ b/public/imgs/icons/robot.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/public/imgs/icons/users.svg b/public/imgs/icons/users.svg new file mode 100644 index 0000000..7992205 --- /dev/null +++ b/public/imgs/icons/users.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/imgs/lefuturiste-300.jpg b/public/imgs/lefuturiste-300.jpg new file mode 100755 index 0000000..93db46b Binary files /dev/null and b/public/imgs/lefuturiste-300.jpg differ diff --git a/public/imgs/logos/osm-150.png b/public/imgs/logos/osm-150.png new file mode 100644 index 0000000..0d79e95 Binary files /dev/null and b/public/imgs/logos/osm-150.png differ diff --git a/public/imgs/logos/osm.png b/public/imgs/logos/osm.png new file mode 100644 index 0000000..c54f416 Binary files /dev/null and b/public/imgs/logos/osm.png differ diff --git a/public/imgs/logos/wikipedia-150.png b/public/imgs/logos/wikipedia-150.png new file mode 100644 index 0000000..ece95ac Binary files /dev/null and b/public/imgs/logos/wikipedia-150.png differ diff --git a/public/imgs/logos/wikipedia.png b/public/imgs/logos/wikipedia.png new file mode 100644 index 0000000..13b4510 Binary files /dev/null and b/public/imgs/logos/wikipedia.png differ diff --git a/public/imgs/profile-300.jpg b/public/imgs/profile-300.jpg new file mode 100644 index 0000000..adec871 Binary files /dev/null and b/public/imgs/profile-300.jpg differ diff --git a/public/imgs/projects/eurobot2020/french-cup-logo-white.png b/public/imgs/projects/eurobot2020/french-cup-logo-white.png new file mode 100644 index 0000000..05860ec Binary files /dev/null and b/public/imgs/projects/eurobot2020/french-cup-logo-white.png differ diff --git a/public/imgs/projects/eurobot2020/french-cup-logo.png b/public/imgs/projects/eurobot2020/french-cup-logo.png new file mode 100644 index 0000000..c31dc72 Binary files /dev/null and b/public/imgs/projects/eurobot2020/french-cup-logo.png differ diff --git a/public/imgs/projects/eurobot2020/sailtheworld-150.png b/public/imgs/projects/eurobot2020/sailtheworld-150.png new file mode 100644 index 0000000..5d56b79 Binary files /dev/null and b/public/imgs/projects/eurobot2020/sailtheworld-150.png differ diff --git a/public/imgs/projects/eurobot2020/sailtheworld.png b/public/imgs/projects/eurobot2020/sailtheworld.png new file mode 100644 index 0000000..6780e7e Binary files /dev/null and b/public/imgs/projects/eurobot2020/sailtheworld.png differ diff --git a/public/imgs/projects/forum_asso/1.png.35.png b/public/imgs/projects/forum_asso/1.png.35.png new file mode 100644 index 0000000..308e176 Binary files /dev/null and b/public/imgs/projects/forum_asso/1.png.35.png differ diff --git a/public/imgs/projects/forum_asso/ask_approval.png.35.png b/public/imgs/projects/forum_asso/ask_approval.png.35.png new file mode 100644 index 0000000..b538ad9 Binary files /dev/null and b/public/imgs/projects/forum_asso/ask_approval.png.35.png differ diff --git a/public/imgs/projects/forum_asso/changes_approval.png.35.png b/public/imgs/projects/forum_asso/changes_approval.png.35.png new file mode 100644 index 0000000..fee062a Binary files /dev/null and b/public/imgs/projects/forum_asso/changes_approval.png.35.png differ diff --git a/public/imgs/projects/forum_asso/edit_contact.png.35.png b/public/imgs/projects/forum_asso/edit_contact.png.35.png new file mode 100644 index 0000000..ceccf54 Binary files /dev/null and b/public/imgs/projects/forum_asso/edit_contact.png.35.png differ diff --git a/public/imgs/projects/forum_asso/edit_description.png.35.png b/public/imgs/projects/forum_asso/edit_description.png.35.png new file mode 100644 index 0000000..1ac90c3 Binary files /dev/null and b/public/imgs/projects/forum_asso/edit_description.png.35.png differ diff --git a/public/imgs/projects/forum_asso/edit_images.png.35.png b/public/imgs/projects/forum_asso/edit_images.png.35.png new file mode 100644 index 0000000..42d75a5 Binary files /dev/null and b/public/imgs/projects/forum_asso/edit_images.png.35.png differ diff --git a/public/imgs/projects/forum_asso/edit_main.png.35.png b/public/imgs/projects/forum_asso/edit_main.png.35.png new file mode 100644 index 0000000..b13855a Binary files /dev/null and b/public/imgs/projects/forum_asso/edit_main.png.35.png differ diff --git a/public/imgs/projects/forum_asso/edit_prices.png.35.png b/public/imgs/projects/forum_asso/edit_prices.png.35.png new file mode 100644 index 0000000..36e70de Binary files /dev/null and b/public/imgs/projects/forum_asso/edit_prices.png.35.png differ diff --git a/public/imgs/projects/forum_asso/edit_schedule.png.35.png b/public/imgs/projects/forum_asso/edit_schedule.png.35.png new file mode 100644 index 0000000..89c890c Binary files /dev/null and b/public/imgs/projects/forum_asso/edit_schedule.png.35.png differ diff --git a/public/imgs/projects/forum_asso/manage_organizations.png.35.png b/public/imgs/projects/forum_asso/manage_organizations.png.35.png new file mode 100644 index 0000000..93d4d4f Binary files /dev/null and b/public/imgs/projects/forum_asso/manage_organizations.png.35.png differ diff --git a/public/imgs/projects/forum_asso/manage_tags.png.35.png b/public/imgs/projects/forum_asso/manage_tags.png.35.png new file mode 100644 index 0000000..122ee83 Binary files /dev/null and b/public/imgs/projects/forum_asso/manage_tags.png.35.png differ diff --git a/public/imgs/projects/forum_asso/public_list.png.35.png b/public/imgs/projects/forum_asso/public_list.png.35.png new file mode 100644 index 0000000..adc0cd3 Binary files /dev/null and b/public/imgs/projects/forum_asso/public_list.png.35.png differ diff --git a/public/imgs/projects/forum_asso/public_page.png.35.png b/public/imgs/projects/forum_asso/public_page.png.35.png new file mode 100644 index 0000000..483f351 Binary files /dev/null and b/public/imgs/projects/forum_asso/public_page.png.35.png differ diff --git a/public/imgs/projects/retrobox/1.png.25.png b/public/imgs/projects/retrobox/1.png.25.png new file mode 100644 index 0000000..a7d6fec Binary files /dev/null and b/public/imgs/projects/retrobox/1.png.25.png differ diff --git a/public/imgs/projects/retrobox/1.png.40.png b/public/imgs/projects/retrobox/1.png.40.png new file mode 100644 index 0000000..934b1eb Binary files /dev/null and b/public/imgs/projects/retrobox/1.png.40.png differ diff --git a/public/imgs/projects/retrobox/1.png.40.png.25.png b/public/imgs/projects/retrobox/1.png.40.png.25.png new file mode 100644 index 0000000..d03301f Binary files /dev/null and b/public/imgs/projects/retrobox/1.png.40.png.25.png differ diff --git a/public/imgs/projects/retrobox/2.png.25.png b/public/imgs/projects/retrobox/2.png.25.png new file mode 100644 index 0000000..574d3f2 Binary files /dev/null and b/public/imgs/projects/retrobox/2.png.25.png differ diff --git a/public/imgs/projects/retrobox/2.png.40.png b/public/imgs/projects/retrobox/2.png.40.png new file mode 100644 index 0000000..444fc17 Binary files /dev/null and b/public/imgs/projects/retrobox/2.png.40.png differ diff --git a/public/imgs/projects/retrobox/2.png.40.png.25.png b/public/imgs/projects/retrobox/2.png.40.png.25.png new file mode 100644 index 0000000..9d2b90a Binary files /dev/null and b/public/imgs/projects/retrobox/2.png.40.png.25.png differ diff --git a/public/imgs/projects/retrobox/3.png.25.png b/public/imgs/projects/retrobox/3.png.25.png new file mode 100644 index 0000000..13c017e Binary files /dev/null and b/public/imgs/projects/retrobox/3.png.25.png differ diff --git a/public/imgs/projects/retrobox/3.png.40.png b/public/imgs/projects/retrobox/3.png.40.png new file mode 100644 index 0000000..1327eef Binary files /dev/null and b/public/imgs/projects/retrobox/3.png.40.png differ diff --git a/public/imgs/projects/retrobox/3.png.40.png.25.png b/public/imgs/projects/retrobox/3.png.40.png.25.png new file mode 100644 index 0000000..e62e1f6 Binary files /dev/null and b/public/imgs/projects/retrobox/3.png.40.png.25.png differ diff --git a/public/imgs/projects/retrobox/4.png.25.png b/public/imgs/projects/retrobox/4.png.25.png new file mode 100644 index 0000000..ed931b5 Binary files /dev/null and b/public/imgs/projects/retrobox/4.png.25.png differ diff --git a/public/imgs/projects/retrobox/4.png.40.png b/public/imgs/projects/retrobox/4.png.40.png new file mode 100644 index 0000000..18a285c Binary files /dev/null and b/public/imgs/projects/retrobox/4.png.40.png differ diff --git a/public/imgs/projects/retrobox/4.png.40.png.25.png b/public/imgs/projects/retrobox/4.png.40.png.25.png new file mode 100644 index 0000000..31226b9 Binary files /dev/null and b/public/imgs/projects/retrobox/4.png.40.png.25.png differ diff --git a/public/imgs/projects/retrobox/5.png.25.png b/public/imgs/projects/retrobox/5.png.25.png new file mode 100644 index 0000000..768ae1d Binary files /dev/null and b/public/imgs/projects/retrobox/5.png.25.png differ diff --git a/public/imgs/projects/retrobox/5.png.40.png b/public/imgs/projects/retrobox/5.png.40.png new file mode 100644 index 0000000..5091685 Binary files /dev/null and b/public/imgs/projects/retrobox/5.png.40.png differ diff --git a/public/imgs/projects/retrobox/5.png.40.png.25.png b/public/imgs/projects/retrobox/5.png.40.png.25.png new file mode 100644 index 0000000..46c0e8f Binary files /dev/null and b/public/imgs/projects/retrobox/5.png.40.png.25.png differ diff --git a/public/imgs/projects/retrobox/6.png.25.png b/public/imgs/projects/retrobox/6.png.25.png new file mode 100644 index 0000000..bc8f0b0 Binary files /dev/null and b/public/imgs/projects/retrobox/6.png.25.png differ diff --git a/public/imgs/projects/retrobox/6.png.40.png b/public/imgs/projects/retrobox/6.png.40.png new file mode 100644 index 0000000..b0602e3 Binary files /dev/null and b/public/imgs/projects/retrobox/6.png.40.png differ diff --git a/public/imgs/projects/retrobox/6.png.40.png.25.png b/public/imgs/projects/retrobox/6.png.40.png.25.png new file mode 100644 index 0000000..ee79e48 Binary files /dev/null and b/public/imgs/projects/retrobox/6.png.40.png.25.png differ diff --git a/public/imgs/projects/tracklift/admin_audit_form.png b/public/imgs/projects/tracklift/admin_audit_form.png new file mode 100644 index 0000000..1de5d3a Binary files /dev/null and b/public/imgs/projects/tracklift/admin_audit_form.png differ diff --git a/public/imgs/projects/tracklift/admin_audit_form.png.35.png b/public/imgs/projects/tracklift/admin_audit_form.png.35.png new file mode 100644 index 0000000..66ec43b Binary files /dev/null and b/public/imgs/projects/tracklift/admin_audit_form.png.35.png differ diff --git a/public/imgs/projects/tracklift/admin_containers.png b/public/imgs/projects/tracklift/admin_containers.png new file mode 100644 index 0000000..96276ab Binary files /dev/null and b/public/imgs/projects/tracklift/admin_containers.png differ diff --git a/public/imgs/projects/tracklift/admin_containers.png.35.png b/public/imgs/projects/tracklift/admin_containers.png.35.png new file mode 100644 index 0000000..ff50555 Binary files /dev/null and b/public/imgs/projects/tracklift/admin_containers.png.35.png differ diff --git a/public/imgs/projects/tracklift/admin_dashboard_home.png b/public/imgs/projects/tracklift/admin_dashboard_home.png new file mode 100644 index 0000000..7fafee7 Binary files /dev/null and b/public/imgs/projects/tracklift/admin_dashboard_home.png differ diff --git a/public/imgs/projects/tracklift/admin_dashboard_home.png.35.png b/public/imgs/projects/tracklift/admin_dashboard_home.png.35.png new file mode 100644 index 0000000..abe219e Binary files /dev/null and b/public/imgs/projects/tracklift/admin_dashboard_home.png.35.png differ diff --git a/public/imgs/projects/tracklift/admin_edit_site.png b/public/imgs/projects/tracklift/admin_edit_site.png new file mode 100644 index 0000000..5105b3c Binary files /dev/null and b/public/imgs/projects/tracklift/admin_edit_site.png differ diff --git a/public/imgs/projects/tracklift/admin_edit_site.png.35.png b/public/imgs/projects/tracklift/admin_edit_site.png.35.png new file mode 100644 index 0000000..2382086 Binary files /dev/null and b/public/imgs/projects/tracklift/admin_edit_site.png.35.png differ diff --git a/public/imgs/projects/tracklift/admin_elevator.png b/public/imgs/projects/tracklift/admin_elevator.png new file mode 100644 index 0000000..90a02a2 Binary files /dev/null and b/public/imgs/projects/tracklift/admin_elevator.png differ diff --git a/public/imgs/projects/tracklift/admin_elevator.png.35.png b/public/imgs/projects/tracklift/admin_elevator.png.35.png new file mode 100644 index 0000000..18c6899 Binary files /dev/null and b/public/imgs/projects/tracklift/admin_elevator.png.35.png differ diff --git a/public/imgs/projects/tracklift/admin_users.png b/public/imgs/projects/tracklift/admin_users.png new file mode 100644 index 0000000..4efb716 Binary files /dev/null and b/public/imgs/projects/tracklift/admin_users.png differ diff --git a/public/imgs/projects/tracklift/admin_users.png.35.png b/public/imgs/projects/tracklift/admin_users.png.35.png new file mode 100644 index 0000000..7d49c35 Binary files /dev/null and b/public/imgs/projects/tracklift/admin_users.png.35.png differ diff --git a/public/imgs/projects/tracklift/admin_view_container.png b/public/imgs/projects/tracklift/admin_view_container.png new file mode 100644 index 0000000..ff86f30 Binary files /dev/null and b/public/imgs/projects/tracklift/admin_view_container.png differ diff --git a/public/imgs/projects/tracklift/admin_view_container.png.35.png b/public/imgs/projects/tracklift/admin_view_container.png.35.png new file mode 100644 index 0000000..c51cf3c Binary files /dev/null and b/public/imgs/projects/tracklift/admin_view_container.png.35.png differ diff --git a/public/imgs/projects/tracklift/1.png b/public/imgs/projects/tracklift/old/1.png similarity index 100% rename from public/imgs/projects/tracklift/1.png rename to public/imgs/projects/tracklift/old/1.png diff --git a/public/imgs/projects/tracklift/old/1.png.25.png b/public/imgs/projects/tracklift/old/1.png.25.png new file mode 100644 index 0000000..1c3da50 Binary files /dev/null and b/public/imgs/projects/tracklift/old/1.png.25.png differ diff --git a/public/imgs/projects/tracklift/old/1.png.40.png b/public/imgs/projects/tracklift/old/1.png.40.png new file mode 100644 index 0000000..5365bc4 Binary files /dev/null and b/public/imgs/projects/tracklift/old/1.png.40.png differ diff --git a/public/imgs/projects/tracklift/old/1.png.40.png.25.png b/public/imgs/projects/tracklift/old/1.png.40.png.25.png new file mode 100644 index 0000000..128a888 Binary files /dev/null and b/public/imgs/projects/tracklift/old/1.png.40.png.25.png differ diff --git a/public/imgs/projects/tracklift/2.png b/public/imgs/projects/tracklift/old/2.png similarity index 100% rename from public/imgs/projects/tracklift/2.png rename to public/imgs/projects/tracklift/old/2.png diff --git a/public/imgs/projects/tracklift/old/2.png.25.png b/public/imgs/projects/tracklift/old/2.png.25.png new file mode 100644 index 0000000..f3ff3d5 Binary files /dev/null and b/public/imgs/projects/tracklift/old/2.png.25.png differ diff --git a/public/imgs/projects/tracklift/old/2.png.40.png b/public/imgs/projects/tracklift/old/2.png.40.png new file mode 100644 index 0000000..c7e0c26 Binary files /dev/null and b/public/imgs/projects/tracklift/old/2.png.40.png differ diff --git a/public/imgs/projects/tracklift/old/2.png.40.png.25.png b/public/imgs/projects/tracklift/old/2.png.40.png.25.png new file mode 100644 index 0000000..3e52c2f Binary files /dev/null and b/public/imgs/projects/tracklift/old/2.png.40.png.25.png differ diff --git a/public/imgs/projects/tracklift/3.png b/public/imgs/projects/tracklift/old/3.png similarity index 100% rename from public/imgs/projects/tracklift/3.png rename to public/imgs/projects/tracklift/old/3.png diff --git a/public/imgs/projects/tracklift/old/3.png.25.png b/public/imgs/projects/tracklift/old/3.png.25.png new file mode 100644 index 0000000..8d93e46 Binary files /dev/null and b/public/imgs/projects/tracklift/old/3.png.25.png differ diff --git a/public/imgs/projects/tracklift/old/3.png.40.png b/public/imgs/projects/tracklift/old/3.png.40.png new file mode 100644 index 0000000..babca66 Binary files /dev/null and b/public/imgs/projects/tracklift/old/3.png.40.png differ diff --git a/public/imgs/projects/tracklift/old/3.png.40.png.25.png b/public/imgs/projects/tracklift/old/3.png.40.png.25.png new file mode 100644 index 0000000..9ea2ee0 Binary files /dev/null and b/public/imgs/projects/tracklift/old/3.png.40.png.25.png differ diff --git a/public/imgs/projects/tracklift/4.png b/public/imgs/projects/tracklift/old/4.png similarity index 100% rename from public/imgs/projects/tracklift/4.png rename to public/imgs/projects/tracklift/old/4.png diff --git a/public/imgs/projects/tracklift/old/4.png.25.png b/public/imgs/projects/tracklift/old/4.png.25.png new file mode 100644 index 0000000..9108d6e Binary files /dev/null and b/public/imgs/projects/tracklift/old/4.png.25.png differ diff --git a/public/imgs/projects/tracklift/old/4.png.40.png b/public/imgs/projects/tracklift/old/4.png.40.png new file mode 100644 index 0000000..fb2bca8 Binary files /dev/null and b/public/imgs/projects/tracklift/old/4.png.40.png differ diff --git a/public/imgs/projects/tracklift/old/4.png.40.png.25.png b/public/imgs/projects/tracklift/old/4.png.40.png.25.png new file mode 100644 index 0000000..8e4d1d3 Binary files /dev/null and b/public/imgs/projects/tracklift/old/4.png.40.png.25.png differ diff --git a/public/imgs/projects/tracklift/5.png b/public/imgs/projects/tracklift/old/5.png similarity index 100% rename from public/imgs/projects/tracklift/5.png rename to public/imgs/projects/tracklift/old/5.png diff --git a/public/imgs/projects/tracklift/old/5.png.25.png b/public/imgs/projects/tracklift/old/5.png.25.png new file mode 100644 index 0000000..be091ad Binary files /dev/null and b/public/imgs/projects/tracklift/old/5.png.25.png differ diff --git a/public/imgs/projects/tracklift/old/5.png.40.png b/public/imgs/projects/tracklift/old/5.png.40.png new file mode 100644 index 0000000..edfe6e8 Binary files /dev/null and b/public/imgs/projects/tracklift/old/5.png.40.png differ diff --git a/public/imgs/projects/tracklift/old/5.png.40.png.25.png b/public/imgs/projects/tracklift/old/5.png.40.png.25.png new file mode 100644 index 0000000..ed7f0c7 Binary files /dev/null and b/public/imgs/projects/tracklift/old/5.png.40.png.25.png differ diff --git a/public/imgs/projects/tracklift/user_details.png b/public/imgs/projects/tracklift/user_details.png new file mode 100644 index 0000000..3ee1a5c Binary files /dev/null and b/public/imgs/projects/tracklift/user_details.png differ diff --git a/public/imgs/projects/tracklift/user_details.png.35.png b/public/imgs/projects/tracklift/user_details.png.35.png new file mode 100644 index 0000000..37a1719 Binary files /dev/null and b/public/imgs/projects/tracklift/user_details.png.35.png differ diff --git a/public/imgs/projects/werobot/1.png.25.png b/public/imgs/projects/werobot/1.png.25.png new file mode 100644 index 0000000..1c7fc64 Binary files /dev/null and b/public/imgs/projects/werobot/1.png.25.png differ diff --git a/public/imgs/projects/werobot/1.png.40.png b/public/imgs/projects/werobot/1.png.40.png new file mode 100644 index 0000000..dc15591 Binary files /dev/null and b/public/imgs/projects/werobot/1.png.40.png differ diff --git a/public/imgs/projects/werobot/1.png.40.png.25.png b/public/imgs/projects/werobot/1.png.40.png.25.png new file mode 100644 index 0000000..a1f9e11 Binary files /dev/null and b/public/imgs/projects/werobot/1.png.40.png.25.png differ diff --git a/public/imgs/projects/werobot/2.png.25.png b/public/imgs/projects/werobot/2.png.25.png new file mode 100644 index 0000000..e208908 Binary files /dev/null and b/public/imgs/projects/werobot/2.png.25.png differ diff --git a/public/imgs/projects/werobot/2.png.40.png b/public/imgs/projects/werobot/2.png.40.png new file mode 100644 index 0000000..95f985b Binary files /dev/null and b/public/imgs/projects/werobot/2.png.40.png differ diff --git a/public/imgs/projects/werobot/2.png.40.png.25.png b/public/imgs/projects/werobot/2.png.40.png.25.png new file mode 100644 index 0000000..a4e3af4 Binary files /dev/null and b/public/imgs/projects/werobot/2.png.40.png.25.png differ diff --git a/public/imgs/projects/werobot/3.png.25.png b/public/imgs/projects/werobot/3.png.25.png new file mode 100644 index 0000000..59aa042 Binary files /dev/null and b/public/imgs/projects/werobot/3.png.25.png differ diff --git a/public/imgs/projects/werobot/3.png.40.png b/public/imgs/projects/werobot/3.png.40.png new file mode 100644 index 0000000..77d13c8 Binary files /dev/null and b/public/imgs/projects/werobot/3.png.40.png differ diff --git a/public/imgs/projects/werobot/3.png.40.png.25.png b/public/imgs/projects/werobot/3.png.40.png.25.png new file mode 100644 index 0000000..f58db78 Binary files /dev/null and b/public/imgs/projects/werobot/3.png.40.png.25.png differ diff --git a/public/imgs/technos/caddy-150.png b/public/imgs/technos/caddy-150.png new file mode 100644 index 0000000..53590dc Binary files /dev/null and b/public/imgs/technos/caddy-150.png differ diff --git a/public/imgs/technos/composer-150.png b/public/imgs/technos/composer-150.png new file mode 100644 index 0000000..6237dae Binary files /dev/null and b/public/imgs/technos/composer-150.png differ diff --git a/public/imgs/technos/elasticsearch-150.png b/public/imgs/technos/elasticsearch-150.png new file mode 100644 index 0000000..eac32e3 Binary files /dev/null and b/public/imgs/technos/elasticsearch-150.png differ diff --git a/public/imgs/technos/mariadb.svg b/public/imgs/technos/mariadb.svg new file mode 100644 index 0000000..333bb70 --- /dev/null +++ b/public/imgs/technos/mariadb.svg @@ -0,0 +1,15 @@ + + + + + + MDB-VLogo_RGB + + + + + + + + + \ No newline at end of file diff --git a/public/index.php b/public/index.php index 9d384ed..8eae556 100755 --- a/public/index.php +++ b/public/index.php @@ -37,7 +37,6 @@ $app->add($container->get(LocalizationMiddleware::class)); $app->add(TwigMiddleware::create($app, $container->get(Twig::class))); - require '../src/routes.php'; addRoutes($app); diff --git a/public/libre-baskerville.zip b/public/libre-baskerville.zip new file mode 100644 index 0000000..c23de2f Binary files /dev/null and b/public/libre-baskerville.zip differ diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index 6128566..2484069 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -13,6 +13,10 @@ class HomeController extends AbstractController { // $locale = $request->getAttributes()['locale']; // dd($locale); + $technologies = array_filter($this->container->get('technologies'), fn ($t) => !isset($t['hidden']) || !$t['hidden']); + $intro = $this->container->get('intro'); + $age = (new \DateTime('now'))->diff(new \DateTime($intro['bornDate']))->y; + return $this->container->get(Twig::class)->render( $response, 'home/home.html.twig', [ @@ -23,10 +27,12 @@ class HomeController extends AbstractController return $link; }, $this->container->get('links')), - 'technologies' => $this->container->get('technologies'), + 'technologies' => $technologies, 'pro_projects' => $this->container->get('pro_projects'), 'side_projects' => $this->container->get('side_projects'), - 'email' => $this->container->get('misc')['email'] + ...$this->container->get('misc'), + ...$this->container->get('intro'), + 'age' => $age ] ); } @@ -48,6 +54,7 @@ class HomeController extends AbstractController $projectsCandidates = array_values(array_filter($projects, fn ($p) => $p['id'] == $id)); if (count($projectsCandidates) === 0) { // TODO: add proper response body + $response->getBody()->write("Project not found"); return $response ->withStatus(404); } diff --git a/src/config/app.php b/src/config/app.php index b18c06c..be3ca4c 100644 --- a/src/config/app.php +++ b/src/config/app.php @@ -14,6 +14,7 @@ return [ 'basePath' => App::getBasePath(), 'misc' => $misc, 'last_update' => new DateTime($misc['updated_at']), + 'intro' => getYAML('config/intro.yaml'), 'links' => getYAML('config/links.yaml')['links'], 'technologies' => getYAML('config/technologies.yaml')['technologies'], 'pro_projects' => getYAML('config/projects.yaml')['pro_projects'], diff --git a/src/config/container.php b/src/config/container.php index 0932dbc..b41c608 100644 --- a/src/config/container.php +++ b/src/config/container.php @@ -7,6 +7,7 @@ use App\Middlewares\LocalizationMiddleware; return [ Twig::class => function(ContainerInterface $container) { $twig = Twig::create('../templates', ['cache' => false]); + $twig->getLoader()->addPath('../public/imgs', 'imgs'); $twig->getEnvironment()->addFunction(new \Twig\TwigFunction('getDynLocalizedStr', function (\Twig\Environment $env, $inp) { $locale = $env->getGlobals()['locale']; @@ -34,6 +35,12 @@ return [ }, ['needs_environment' => true])); $twig->getEnvironment()->addGlobal('lastUpdate', $container->get('last_update')); + + $twig->getEnvironment()->addFilter(new \Twig\TwigFilter('formatMd', function ($inp) { + $Parsedown = new Parsedown(); + + return $Parsedown->text($inp); + })); return $twig; diff --git a/templates/about.html.twig b/templates/about.html.twig index 122a10e..fa4b756 100644 --- a/templates/about.html.twig +++ b/templates/about.html.twig @@ -7,14 +7,64 @@ {% if getLocale() == 'fr' %}

A propos de ce site

-

+

Les sources de ce site web sont ouverte et disponibles sur ce dépot gitlab.com.

+ +

Crédits

+ La police d'écriture utilisé sur ce site web est Libre Baskerville, elle est distribué sous la license SIL Open Font License 1.1. +

+

+ La collection d'icones vectorielle provient de Tabler Icons et est distribué sous la license MIT. +

+

+ Le formulaire de contact utilise la librairie JavaScript Axios distribué sous la license MIT. +

+ +

Confidentialité

+

+ Ce site web ne charge (normalement) pas de contenu depuis un site externe, l'intégralité des ressources présente sur la page sont chargés d'un unique serveur. +

+

+ Ce site web n'inclut pas de logiciel de pistage. +

+

+ En envoyant un message par le formulaire de contact vous vous soumettez au mêmes conditions que lors de l'envoie d'un message électronique SMTP (c'est-à-dire pas vraiment de garantie de confidentialité). +

+ +

Retours et question

+

+ Si vous avez n'importe quel retours à faire sur mon site web que ça soit en positif ou en négatif ou que vous ayez des questions, n'hésitez pas à me contacter soit en utilisant le formulaire de contact ou en me contactant à bonjour@matthieubessat.fr j'essairaie de faire le maximum pour répondre à vos remarques et questions !

{% endif %} {% if getLocale() == 'en' %}

About this website

- +

The source code of this website are open and available on gitlab.com.

+

Credits

+

+ The font use on this website is Libre Baskerville, it is distributed under the SIL Open Font License 1.1. +

+

+ The icon collection is Tabler Icons and is distributed under the MIT License. +

+

+ The contact form uses the JavaScript library Axios which is distributed under the MIT License. +

+

Privacy

+

+ All of the resources of this website are loaded from the same domain and include no 3rd party that could track you. +

+

+ This website doesn't track you. +

+

+ By sending a message via the contact form, you allow to treat your message the same way I treat my mail. +

+ +

Feedback

+

+ Feel free to contact me if you have any remarks, issues or feedbacks by using the contact form or mail to bonjour@matthieubessat.fr. +

{% endif %} {% endblock %} diff --git a/templates/home/home.html.twig b/templates/home/home.html.twig index b3fca4b..fc66e58 100644 --- a/templates/home/home.html.twig +++ b/templates/home/home.html.twig @@ -1,6 +1,7 @@ {% extends 'layout.html.twig' %} {% block content %} {% include('home/profile.html.twig') %} + {% include('home/intro.html.twig') %} {% include('home/technologies.html.twig') %} {% include('home/projects.html.twig') %} {% include('home/links.html.twig') %} diff --git a/templates/home/intro.html.twig b/templates/home/intro.html.twig new file mode 100644 index 0000000..ebed79b --- /dev/null +++ b/templates/home/intro.html.twig @@ -0,0 +1,74 @@ +
+
+
+

{{ getLocalizedStr('intro.title') }}

+
+
+
+

+ {{ getLocalizedStr('intro.description') | formatMd | raw }} +

+
+
+

+ {{ getLocalizedStr('intro.interests') }} +

+
+ {% for interest in interests %} +
+
+ {{ source('@imgs/icons/'~interest.icon) }} +
+ {{ getDynLocalizedStr(interest.name) }} +
+ {% endfor %} + +
+
+
+
    +
  • +
    + {{ source('@imgs/icons/cake.svg') }} +
    +
    + {{ getLocalizedStr('intro.age') | format(age) }} +
    +
  • +
  • +
    + {{ source('@imgs/icons/map-pin.svg') }} +
    +
    + {{ getLocalizedStr('intro.location') }} + {{ getDynLocalizedStr(location.region) }} +
    +
  • +
  • +
    + {{ source('@imgs/icons/flag.svg') }} +
    +
    + {{ getLocalizedStr('intro.speak') }} +
      + {% for locale in languages %} +
    • {{ getLocalizedStr(locale) }}{% if not loop.last %},{% endif %}
    • + {% endfor %} +
    +
    +
  • +
  • +
    + {{ source('@imgs/icons/bike.svg') }} +
    +
    + {{ getLocalizedStr('intro.transport') }} +
    +
  • + +
+
+
+
+
+ diff --git a/templates/home/profile.html.twig b/templates/home/profile.html.twig index 30f1d91..17c0563 100644 --- a/templates/home/profile.html.twig +++ b/templates/home/profile.html.twig @@ -22,7 +22,7 @@ top: {{ [-width, -width + i*width, mainWidth, i*width][side] }}px; left: {{ [-width + i * width, mainWidth, i*width, -width][side] }}px; " - src="imgs/profile.jpg" + src="imgs/profile-300.jpg" />
@@ -50,8 +50,14 @@
- {{ getLocalizedStr('profile.intro.main') }} - {{ getLocalizedStr('profile.intro.secondary') }} + {{ getLocalizedStr('profile.main') }} + {{ getLocalizedStr('profile.secondary') }} +
diff --git a/templates/home/projects.html.twig b/templates/home/projects.html.twig index f72ff87..1d275aa 100644 --- a/templates/home/projects.html.twig +++ b/templates/home/projects.html.twig @@ -6,6 +6,9 @@ {{ getLocalizedStr('projects.pro.title') }} +

+ {{ getLocalizedStr('projects.pro.description') }} +

{% include 'home/projects_list.html.twig' with {'projects': pro_projects} %} @@ -17,6 +20,9 @@ {{ getLocalizedStr('projects.side.title') }} +

+ {{ getLocalizedStr('projects.side.description') }} +

{% include 'home/projects_list.html.twig' with {'projects': side_projects} %} diff --git a/templates/home/technologies.html.twig b/templates/home/technologies.html.twig index c3acab4..0253623 100644 --- a/templates/home/technologies.html.twig +++ b/templates/home/technologies.html.twig @@ -5,24 +5,31 @@ {{ getLocalizedStr('technologies.title') }} -
- {% for tech in technologies %} -
-
-
- -
-
-
-
+
+
+ {% for tech in technologies %} +
+
+
+ +
+
+
+
+
-
- {% endfor %} + {% endfor %} +
+
+ +
diff --git a/templates/layout.html.twig b/templates/layout.html.twig index 82e92b5..10563e2 100644 --- a/templates/layout.html.twig +++ b/templates/layout.html.twig @@ -4,13 +4,26 @@ + + + + + + + + + + + + {% block title %}{% endblock %}{{ getLocalizedStr('page.title') }} + {% block content %}{% endblock %} - +