Previous version made GPDR-friendly
156
.eleventy.js
Normal file
@@ -0,0 +1,156 @@
|
||||
import rssPlugin from '@11ty/eleventy-plugin-rss';
|
||||
import syntaxHighlight from '@11ty/eleventy-plugin-syntaxhighlight';
|
||||
import fs from 'fs';
|
||||
import util from 'util';
|
||||
|
||||
// Import filters
|
||||
import dateFilter from './src/filters/date-filter.js';
|
||||
import markdownFilter from './src/filters/markdown-filter.js';
|
||||
import w3DateFilter from './src/filters/w3-date-filter.js';
|
||||
|
||||
// Import transforms
|
||||
import htmlMinTransform from './src/transforms/html-min-transform.js';
|
||||
import parseTransform from './src/transforms/parse-transform.js';
|
||||
|
||||
// Import data files
|
||||
import {createRequire} from 'node:module';
|
||||
const require = createRequire(import.meta.url);
|
||||
// need this because of issue when using ESM : https://github.com/11ty/eleventy-dependency-tree-esm/issues/2
|
||||
// This will get soon resolved
|
||||
const site = require('./src/_data/site.json');
|
||||
|
||||
export default function(config) {
|
||||
// Filters
|
||||
config.addFilter('dateFilter', dateFilter);
|
||||
config.addFilter('markdownFilter', markdownFilter);
|
||||
config.addFilter('w3DateFilter', w3DateFilter);
|
||||
config.addFilter('dump', obj => {
|
||||
return util.inspect(obj);
|
||||
});
|
||||
|
||||
// Layout aliases
|
||||
config.addLayoutAlias('home', 'layouts/home.njk');
|
||||
|
||||
// Transforms
|
||||
config.addTransform('htmlmin', htmlMinTransform);
|
||||
config.addTransform('parse', parseTransform);
|
||||
|
||||
// Passthrough copy
|
||||
config.addPassthroughCopy('src/fonts');
|
||||
config.addPassthroughCopy('src/images');
|
||||
config.addPassthroughCopy('src/js');
|
||||
config.addPassthroughCopy('src/admin/config.yml');
|
||||
config.addPassthroughCopy('src/admin/previews.js');
|
||||
config.addPassthroughCopy('node_modules/nunjucks/browser/nunjucks-slim.js');
|
||||
config.addPassthroughCopy('src/robots.txt');
|
||||
config.addPassthroughCopy('src/.htaccess');
|
||||
config.addPassthroughCopy('src/form');
|
||||
|
||||
const now = new Date();
|
||||
|
||||
// Custom collections
|
||||
const livePosts = post => post.date <= now && !post.data.draft;
|
||||
const newsPosts = post => post.data.type === 'news';
|
||||
const eventPosts = post => post.data.type === 'event';
|
||||
|
||||
config.addCollection('posts', collection => {
|
||||
return [...collection.getFilteredByGlob('./src/posts/*.md')].reverse();
|
||||
});
|
||||
config.addCollection('news', collection => {
|
||||
return [
|
||||
...collection.getFilteredByGlob('./src/posts/*.md').filter(newsPosts)
|
||||
].reverse();
|
||||
});
|
||||
config.addCollection('events', collection => {
|
||||
return [
|
||||
...collection.getFilteredByGlob('./src/posts/*.md').filter(eventPosts)
|
||||
].reverse();
|
||||
});
|
||||
config.addCollection('newsFeed', collection => {
|
||||
return [...collection.getFilteredByGlob('./src/posts/*.md').filter(livePosts)]
|
||||
.reverse()
|
||||
.slice(0, site.maxNewsPerPage);
|
||||
});
|
||||
config.addCollection('members', collection => {
|
||||
return [...collection.getFilteredByGlob('./src/members/*.md')];
|
||||
});
|
||||
config.addCollection('profiles', collection => {
|
||||
return [...collection.getFilteredByGlob('./src/members/*.md')]
|
||||
.reverse()
|
||||
.slice(0, site.maxProfilePreview);
|
||||
});
|
||||
config.addCollection('tagsList', function(collectionApi) {
|
||||
const tagsList = new Set();
|
||||
collectionApi.getAll().map(item => {
|
||||
if (item.data.tags) {
|
||||
// handle pages that don't have tags
|
||||
item.data.tags.map(tag => tagsList.add(tag));
|
||||
}
|
||||
});
|
||||
return tagsList;
|
||||
});
|
||||
config.addCollection('skillsList', function(collectionApi) {
|
||||
const skillsList = new Set();
|
||||
collectionApi.getFilteredByGlob('./src/members/*.md').map(item => {
|
||||
if (item.data.tags) {
|
||||
// handle pages that don't have skills
|
||||
item.data.tags.map(skill => {
|
||||
// exclude non related tags
|
||||
if (['post', 'news', 'event'].indexOf(skill) == -1) {
|
||||
skillsList.add(skill);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
return skillsList;
|
||||
});
|
||||
config.addCollection('membersLocations', function(collectionApi) {
|
||||
return collectionApi
|
||||
.getFilteredByGlob('./src/members/*.md')
|
||||
.filter(item => typeof item.data.location !== 'undefined')
|
||||
.map(member => {
|
||||
return {
|
||||
name: member.data.name,
|
||||
url: member.data.url,
|
||||
location: member.data.location
|
||||
};
|
||||
});
|
||||
});
|
||||
config.addCollection('customers', collection => {
|
||||
return [...collection.getFilteredByGlob('./src/customers/*.md')]
|
||||
.reverse()
|
||||
.slice(0, site.maxCustomerPerPage);
|
||||
});
|
||||
config.addCollection('partners', collection => {
|
||||
return [...collection.getFilteredByGlob('./src/partners/*.md')]
|
||||
.reverse()
|
||||
.slice(0, site.maxPartnerPerPage);
|
||||
});
|
||||
|
||||
// Plugins
|
||||
config.addPlugin(rssPlugin);
|
||||
config.addPlugin(syntaxHighlight);
|
||||
|
||||
// 404
|
||||
config.setBrowserSyncConfig({
|
||||
callbacks: {
|
||||
ready: function(err, browserSync) {
|
||||
const content_404 = fs.readFileSync('dist/404.html');
|
||||
|
||||
browserSync.addMiddleware('*', (req, res) => {
|
||||
// Provides the 404 content without redirect.
|
||||
res.write(content_404);
|
||||
res.end();
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
dir: {
|
||||
input: 'src',
|
||||
output: 'dist'
|
||||
},
|
||||
passthroughFileCopy: true
|
||||
};
|
||||
}
|
||||
25
.gitignore
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
#.gitignore
|
||||
*~
|
||||
*.log
|
||||
npm-debug.*
|
||||
*.scssc
|
||||
*.log
|
||||
*.swp
|
||||
.DS_Store
|
||||
.vscode
|
||||
nohup.out
|
||||
*.code-workspace
|
||||
.sass-cache
|
||||
node_modules
|
||||
dist/*
|
||||
deploy-prod.js
|
||||
deploy-preprod.js
|
||||
package-lock.json
|
||||
|
||||
# Specifics
|
||||
|
||||
# Hide design tokens
|
||||
src/scss/_tokens.scss
|
||||
|
||||
# Hide compiled CSS
|
||||
src/_includes/assets/*
|
||||
6
.prettierrc
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"printWidth": 90,
|
||||
"tabWidth": 2,
|
||||
"singleQuote": true,
|
||||
"bracketSpacing": false
|
||||
}
|
||||
19
.stylelintrc.json
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"extends": "stylelint-config-sass-guidelines",
|
||||
"rules": {
|
||||
"order/properties-alphabetical-order": null,
|
||||
"property-no-vendor-prefix": null,
|
||||
"selector-class-pattern": [
|
||||
"^[a-z0-9\\-_]+$",
|
||||
{
|
||||
"message":
|
||||
"Selector should be written in lowercase (selector-class-pattern)"
|
||||
}
|
||||
],
|
||||
"max-nesting-depth": 6,
|
||||
"number-leading-zero": "never",
|
||||
"selector-no-qualifying-type": null,
|
||||
"selector-max-compound-selectors": 6,
|
||||
"selector-max-id": 1
|
||||
}
|
||||
}
|
||||
32
LICENSE.txt
Normal file
@@ -0,0 +1,32 @@
|
||||
This project is under MIT License for all its code except following subdirectories and its content :
|
||||
- src/members
|
||||
- src/images/astrolabe
|
||||
- src/images/customers
|
||||
- src/images/partners
|
||||
- src/images/profiles
|
||||
- src/images/posts/AG2022
|
||||
- src/images/posts/AG2023
|
||||
- src/images/posts/copyright
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019-2023 Astrolabe CAE
|
||||
Copyright (c) 2017–2023 Zach Leatherman @zachleat
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
150
README.md
Normal file
@@ -0,0 +1,150 @@
|
||||
# Astrolabe website
|
||||
|
||||
## Getting started
|
||||
|
||||
Requirements :
|
||||
|
||||
- Git
|
||||
- Node.js (minimum version v12.15.0)
|
||||
|
||||
### Install
|
||||
|
||||
1. Clone or fork this repo: `git clone ssh://gitea@git.astrolabe.coop:2106/AstrolabeCAE/SiteWebAstrolabe_public.git`
|
||||
2. Clone or fork the private repo containing members data in the same folder that SiteWebAstrolabe_public : `git clone ssh://gitea@git.astrolabe.coop:2106/AstrolabeCAE/SiteWebAstrolabe_private.git`
|
||||
3. `cd` into the project directory (SiteWebAstrolabe_public) and run `npm install`
|
||||
4. Once all the dependencies are installed run `npm start`
|
||||
5. Open your browser at `http://localhost:8080` and away you go!
|
||||
|
||||
### Deploy
|
||||
|
||||
1. Copy paste deploy.js file in two new files `deploy-preprod.js`and `deploy-prod.js`
|
||||
2. Make sure to fill in correct platform information in the two files
|
||||
3. Run `npm run deploy-preprod` to deploy to the pre-production platform
|
||||
4. Run `npm run deploy-prod` to deploy to the production platform
|
||||
|
||||
## Terminal commands
|
||||
|
||||
### Serve the site locally
|
||||
|
||||
```bash
|
||||
npm start
|
||||
```
|
||||
|
||||
### Build a production version of the site
|
||||
|
||||
```bash
|
||||
npm run prod
|
||||
```
|
||||
|
||||
### Lint Sass
|
||||
|
||||
```bash
|
||||
npm run sass:lint
|
||||
```
|
||||
|
||||
### Compile Sass
|
||||
|
||||
```bash
|
||||
npm run sass:process
|
||||
```
|
||||
|
||||
## Content editing
|
||||
|
||||
All operations are based on the `src` folder as a root.
|
||||
|
||||
### Add a new post
|
||||
|
||||
A post is composed of a markdown file and optionally images.
|
||||
|
||||
There is two kinds of posts :
|
||||
|
||||
- News post
|
||||
- Event post
|
||||
|
||||
#### Add a 'news' post
|
||||
|
||||
In the `posts`folder, create a new mardown file `example.md`(or copy paste one of the existing files)
|
||||
|
||||
Fill in the meta information :
|
||||
|
||||
1. `title:` the post heading
|
||||
2. `date:` the publication date, if further than current date the post won't appear in the posts list until current date is met.
|
||||
3. `type:` 'news' for news post
|
||||
|
||||
Then add the post content in plain mardown language. You can add images to your post, make sure to place them in the `images`folder.
|
||||
|
||||
#### Add an 'event' post
|
||||
|
||||
In the `posts`folder, create a new mardown file `example-date.md`(or copy paste one of the existing files). Use date in post file name to identify them easily (not mandatory).
|
||||
|
||||
Fill in the meta information :
|
||||
|
||||
1. `title:` the post heading
|
||||
2. `date:` the publication date, if further than current date the post won't appear in the posts list until current date is met.
|
||||
3. `time:` the time of the event.
|
||||
4. `type:` 'event' for event post
|
||||
|
||||
Then add the post content in plain mardown language. You can add images to your post, make sure to place them in the `images`folder.
|
||||
|
||||
### Add a new member
|
||||
|
||||
In the `members` folder (SiteWebAstrolabe_private directory!), create a new mardown file `name-surname.md`(or copy paste one of the existing files)
|
||||
|
||||
Fill in the meta information :
|
||||
|
||||
1. `name:` the full name of the member
|
||||
2. `position:` job title
|
||||
3. `positionInternal:` internal role if any
|
||||
4. `date:` date of arrival in the coop
|
||||
5. `profile:` picture of the member, make sure to place it in the `SiteWebAstrolabe_private/profiles` folder
|
||||
6. `personalSite:` website url if any
|
||||
7. `socialMastodon:` profile url if any
|
||||
8. `socialTwitter:` profile url if any
|
||||
9. `socialLinkedin:` profile url if any
|
||||
10. `url:` personal page url in the website, eg `/members/name-surname`
|
||||
|
||||
Then add the member bio or any content
|
||||
|
||||
### Customers & Partners
|
||||
|
||||
The two are listed on the home page in different section. There is maximum of four per section, in reversed order regarding the date of addition.
|
||||
|
||||
#### Add a new customer
|
||||
|
||||
In the `customers`folder, create a new mardown file `customer-name.md`(or copy paste one of the existing files)
|
||||
|
||||
Fill in the meta information :
|
||||
|
||||
1. `name:` the brand name of the customer
|
||||
2. `thumbnail:` the customer brand logo, make sure to place it in the `images/customers/`folder
|
||||
3. `url:` the customer website
|
||||
|
||||
#### Add a new partner
|
||||
|
||||
In the `partners`folder, create a new mardown file `partner-name.md`(or copy paste one of the existing files)
|
||||
|
||||
Fill in the meta information :
|
||||
|
||||
1. `name:` the brand name of the partner
|
||||
2. `thumbnail:` the partner brand logo, make sure to place it in the `images/partner/`folder
|
||||
3. `url:` the partner website
|
||||
|
||||
### FAQ section
|
||||
|
||||
Edit `_data/faq.json` file to add a new Q/A couple object. Plain html e.g. `<br>` or `<a href="">link</a>` is supported
|
||||
|
||||
### Contact form
|
||||
|
||||
Edit `partials/components/contact-form.html` file to modify the contact form and `src/form/contact-form-handler.php` to modify the form handler.
|
||||
|
||||
To test it in a local environment, because there is PHP to execute, you will need to setup a apache vhost with the `dist` folder as the root and the phpmailer library installed.
|
||||
The captcha service is hCaptcha, you will need to create an account and get your own site key (change it in the contact form partial) and secret key.
|
||||
Add these lines to the vhost configuration file (here with mailtrap as smtp provider for testing purposes):
|
||||
|
||||
```
|
||||
SetEnv ASTRO_SMTP_FROM test@astrolabe.test
|
||||
SetEnv ASTRO_SMTP_HOSTNAME sandbox.smtp.mailtrap.io
|
||||
SetEnv ASTRO_SMTP_USERNAME xxxxx
|
||||
SetEnv ASTRO_SMTP_PASSWORD xxxxx
|
||||
SetEnv HCAPTCHA_SECRET_KEY xxxxx
|
||||
```
|
||||
29
deploy.js
Normal file
@@ -0,0 +1,29 @@
|
||||
var FtpDeploy = require("ftp-deploy");
|
||||
var ftpDeploy = new FtpDeploy();
|
||||
|
||||
var config = {
|
||||
user: "user",
|
||||
// Password optional, prompted if none given
|
||||
password: "password",
|
||||
host: "ftp.someserver.com",
|
||||
port: 21,
|
||||
localRoot: __dirname + "/dist",
|
||||
remoteRoot: "/public_html/remote-folder/",
|
||||
include: ["*", "**/*", ".htaccess"], // this would upload everything except dot files
|
||||
// e.g. exclude sourcemaps, and ALL files in node_modules (including dot files)
|
||||
exclude: ["dist/**/*.map", "node_modules/**", "node_modules/**/.*", ".git/**"],
|
||||
// delete ALL existing files at destination before uploading, if true
|
||||
deleteRemote: true,
|
||||
// Passive mode is forced (EPSV command is not sent)
|
||||
forcePasv: true
|
||||
};
|
||||
|
||||
// use with promises
|
||||
ftpDeploy
|
||||
.deploy(config)
|
||||
.then(res => console.log("finished:", res))
|
||||
.catch(err => console.log(err));
|
||||
|
||||
ftpDeploy.on("uploading", function(data) {
|
||||
console.log(data.filename); // partial path with filename being uploaded
|
||||
});
|
||||
65
package.json
Executable file
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"name": "astrolabe-website",
|
||||
"version": "0.1.0",
|
||||
"description": "Site web de la coopérative Astrolabe CAE",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@11ty/eleventy": "^3.0.0",
|
||||
"@11ty/eleventy-plugin-rss": "^2.0.2",
|
||||
"@11ty/eleventy-plugin-syntaxhighlight": "^2.0.3",
|
||||
"@tbranyen/jsdom": "^13.0.0",
|
||||
"bootstrap": "^5.1.3",
|
||||
"concurrently": "^7.0.0",
|
||||
"html-minifier": "^4.0.0",
|
||||
"image-size": "^0.8.3",
|
||||
"json-to-scss": "^1.3.1",
|
||||
"leaflet": "^1.7.1",
|
||||
"sass": "^1.26.3",
|
||||
"semver": "^6.3.0",
|
||||
"slugify": "^1.4.0",
|
||||
"stalfos": "github:hankchizljaw/stalfos#c8971d22726326cfc04089b2da4d51eeb1ebb0eb"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@erquhart/rollup-plugin-node-builtins": "^2.1.5",
|
||||
"bl": "^3.0.0",
|
||||
"chokidar-cli": "^3.0.0",
|
||||
"copyfiles": "^2.4.1",
|
||||
"cross-env": "^5.2.1",
|
||||
"ftp-deploy": "^2.3.7",
|
||||
"make-dir-cli": "^3.0.0",
|
||||
"prettier": "^1.19.1",
|
||||
"rimraf": "^3.0.2",
|
||||
"rollup": "^4.24.0",
|
||||
"rollup-plugin-commonjs": "^10.1.0",
|
||||
"rollup-plugin-json": "^4.0.0",
|
||||
"rollup-plugin-node-resolve": "^5.2.0",
|
||||
"stylelint": "^14.2.0",
|
||||
"stylelint-config-sass-guidelines": "^9.0.1"
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rimraf dist",
|
||||
"sass:tokens": "npx json-to-scss src/_data/tokens.json src/scss/_tokens.scss",
|
||||
"sass:lint": "npx stylelint src/scss/**/*.scss",
|
||||
"sass:process": "npm run sass:tokens && npm run sass:lint && sass src/scss/global.scss src/_includes/assets/css/global.css --style=compressed",
|
||||
"vendor:css": "copyfiles node_modules/leaflet/dist/leaflet.css node_modules/bootstrap/dist/css/bootstrap.min.css -f dist/vendor/css",
|
||||
"vendor:js": "copyfiles node_modules/leaflet/dist/leaflet.js node_modules/bootstrap/dist/js/bootstrap.min.js -f dist/vendor/js",
|
||||
"vendor": "npm run clean && npm run vendor:css && npm run vendor:js",
|
||||
"start": "concurrently \"npm run vendor\" \"npm run sass:process -- --watch\" \"npm run serve\"",
|
||||
"serve": "cross-env ELEVENTY_ENV=development npx eleventy --serve",
|
||||
"prod": "cross-env ELEVENTY_ENV=prod npm run vendor && npm run sass:process && npx eleventy",
|
||||
"deploy-preprod": "npm run prod && node deploy-preprod",
|
||||
"deploy-prod": "npm run prod && node deploy-prod"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://git.astrolabe.coop/AstrolabeCAE/SiteWebAstrolabe.git"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "Yves Gatesoupe",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://git.astrolabe.coop/AstrolabeCAE/SiteWebAstrolabe/issues"
|
||||
},
|
||||
"homepage": "https://git.astrolabe.coop/AstrolabeCAE/SiteWebAstrolabe"
|
||||
}
|
||||
16
src/.htaccess
Normal file
@@ -0,0 +1,16 @@
|
||||
# Prevent viewing of htaccess file.
|
||||
<Files .htaccess>
|
||||
<IfModule mod_access_compat.c>
|
||||
Order Allow,Deny
|
||||
Deny from all
|
||||
</IfModule>
|
||||
</Files>
|
||||
# Prevent directory listings
|
||||
Options All -Indexes
|
||||
ErrorDocument 404 /404.html
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine On
|
||||
RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR]
|
||||
RewriteCond %{HTTP_HOST} ^astrolabe\.coop [NC]
|
||||
RewriteRule ^ https://www.astrolabe.coop%{REQUEST_URI} [L,NE,R=301]
|
||||
</IfModule>
|
||||
10
src/404.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: '404 - not found'
|
||||
layout: layouts/page.njk
|
||||
permalink: 404.html
|
||||
eleventyExcludeFromCollections: true
|
||||
---
|
||||
|
||||

|
||||
|
||||
Nous sommes désolés, ce contenu n'a pas pu être trouvé. Vous pouvez [revenir à l'accueil](/)
|
||||
27
src/_data/faq.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"q": "Qu'est ce que l'ESS ?",
|
||||
"a": "Le concept d'économie sociale et solidaire (ESS) désigne un ensemble d'entreprises organisées sous forme de coopératives, mutuelles, associations, ou fondations, dont le fonctionnement interne et les activités sont fondés sur un principe de solidarité et d'utilité sociale. (Cf : https://www.economie.gouv.fr/cedef/economie-sociale-et-solidaire )"
|
||||
},
|
||||
{
|
||||
"q": "Qu'est ce qu'une SCOP ?",
|
||||
"a": "Une Société COopérative et Participative (SCOP) parfois également appelée société coopérative de production ou « société coopérative ouvrière de production » ou « société coopérative de travailleurs », est en droit français, une société commerciale qui se distingue des sociétés classiques par une détention majoritaire du capital et du pouvoir de décision par les salariés. (Cf : https://wikipedia.org/wiki/Société_coopérative_et_participative )"
|
||||
},
|
||||
{
|
||||
"q": "Qu'est ce qu'une CAE ?",
|
||||
"a": "Une Coopérative d'Activités et d'Entrepreneur·e·s (CAE - on parle aussi de coopérative d’activité, coopérative d'entrepreneurs ou coopérative d'activité et d'emploi), telle que définie par la Loi sur l'économie sociale et solidaire de juillet 20141 est, en France, une structure d'entreprise coopérative permettant la création et le développement d'activités économiques par des entrepreneurs indépendants. (Cf : https://fr.wikipedia.org/wiki/Coopérative_d'activité_et_d'emploi )"
|
||||
},
|
||||
{
|
||||
"q": "Doit-on être expert de la coopération pour rentrer dans la coopérative ?",
|
||||
"a": "Non ce n'est pas nécessaire, le plus important est de s'intéresser au sujet, et de vouloir participer à un projet collectif."
|
||||
},
|
||||
{
|
||||
"q": "Doit-on être rennais pour rejoindre Astrolabe ?",
|
||||
"a": "Pas forcement, de nombreux membres sont des differents coins de la France, mais à ce jour la majorité des membres sont en bretagne."
|
||||
},
|
||||
{
|
||||
"q": "Comment la structure se finance-t-elle ?",
|
||||
"a": "Le financement est assuré par la Contribution Coopérative, qui est un pourcentage de la facturation des membres."
|
||||
}]
|
||||
}
|
||||
9
src/_data/global.js
Normal file
@@ -0,0 +1,9 @@
|
||||
export default {
|
||||
random() {
|
||||
const segment = () => {
|
||||
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
|
||||
};
|
||||
return `${segment()}-${segment()}-${segment()}`;
|
||||
},
|
||||
now: Date.now()
|
||||
};
|
||||
10
src/_data/helpers.js
Normal file
@@ -0,0 +1,10 @@
|
||||
export default {
|
||||
getNextHeadingLevel(currentLevel) {
|
||||
return parseInt(currentLevel, 10) + 1;
|
||||
},
|
||||
getReadingTime(text) {
|
||||
const wordsPerMinute = 200;
|
||||
const numberOfWords = text.split(/\s/g).length;
|
||||
return Math.ceil(numberOfWords / wordsPerMinute);
|
||||
}
|
||||
};
|
||||
34
src/_data/navigation.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"text": "Accueil",
|
||||
"url": "/",
|
||||
"external": false
|
||||
},
|
||||
{
|
||||
"text": "Comprendre la CAE",
|
||||
"url": "/comprendre-la-cae/",
|
||||
"external": false
|
||||
},
|
||||
{
|
||||
"text": "Nous rejoindre",
|
||||
"url": "/nous-rejoindre/",
|
||||
"external": false
|
||||
},
|
||||
{
|
||||
"text": "L'équipe",
|
||||
"url": "/equipe/",
|
||||
"external": false
|
||||
},
|
||||
{
|
||||
"text": "Actualité",
|
||||
"url": "/posts/",
|
||||
"external": false
|
||||
},
|
||||
{
|
||||
"text": "FAQ / Nous contacter",
|
||||
"url": "/faq+contact/",
|
||||
"external": false
|
||||
}
|
||||
]
|
||||
}
|
||||
31
src/_data/site.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"showThemeCredit": true,
|
||||
"name": "Astrolabe CAE",
|
||||
"shortDesc": "Site web de la Coopérative d'Entrepreneur·e·s spécialisée dans le numérique Astrolabe CAE, pour les indépendant·e·s qui ne veulent pas être seul.",
|
||||
"url": "https://www.astrolabe.coop",
|
||||
"authorEmail": "contact@astrolabe.coop",
|
||||
"authorHandle": "@AstrolabeCae",
|
||||
"authorName": "Astrolabe CAE",
|
||||
"authorAddress": "8 place du Colombier",
|
||||
"authorCity": "35000 Rennes",
|
||||
"authorSocial": {
|
||||
"mastodon": "https://framapiaf.org/@AstrolabeCAE",
|
||||
"linkedin": "https://www.linkedin.com/company/astrolabe-cae/",
|
||||
"facebook": "https://www.facebook.com/profile.php?id=61558600207926",
|
||||
"instagram": "https://www.instagram.com/cae_astrolabe/",
|
||||
"peertube" : "https://peertube.astrolabe.coop/c/astrolabe_cae/videos",
|
||||
"youtube" : "https://www.youtube.com/channel/UCdxBGpXwL_A5rOcGbN_Xiag",
|
||||
"twitch" : "https://www.twitch.tv/astrolabe_cae",
|
||||
"rss" : "https://www.astrolabe.coop/feed.xml"
|
||||
},
|
||||
"designerName": "Yves Gatesoupe et Astrolabe",
|
||||
"designerHandle": "/equipe/",
|
||||
"illustrators": "Igé Maulana, Leopold Merleau, Visual Glow, Galaxicon, Made, Eucalyp, yurr",
|
||||
"enableThirdPartyComments": false,
|
||||
"maxPostsPerPage": 5,
|
||||
"maxNewsPerPage": 4,
|
||||
"maxProfilePreview": 3,
|
||||
"maxCustomerPerPage": 8,
|
||||
"maxPartnerPerPage": 8,
|
||||
"faviconPath": "/images/astrolabe/favicon.png"
|
||||
}
|
||||
33
src/_data/styleguide.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import {createRequire} from 'node:module';
|
||||
const require = createRequire(import.meta.url);
|
||||
// need this because of issue when using ESM : https://github.com/11ty/eleventy-dependency-tree-esm/issues/2
|
||||
// This will get soon resolved
|
||||
|
||||
const tokens = require('./tokens.json');
|
||||
|
||||
export default {
|
||||
colors() {
|
||||
let response = [];
|
||||
|
||||
Object.keys(tokens.colors).forEach(key => {
|
||||
response.push({
|
||||
value: tokens.colors[key],
|
||||
key
|
||||
});
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
sizes() {
|
||||
let response = [];
|
||||
|
||||
Object.keys(tokens['size-scale']).forEach(key => {
|
||||
response.push({
|
||||
value: tokens['size-scale'][key],
|
||||
key
|
||||
});
|
||||
});
|
||||
|
||||
return response;
|
||||
}
|
||||
};
|
||||
29
src/_data/tokens.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"size-scale": {
|
||||
"base": "1rem",
|
||||
"300": ".8rem",
|
||||
"500": "1.25rem",
|
||||
"600": "1.56rem",
|
||||
"700": "1.95rem",
|
||||
"800": "2.44rem",
|
||||
"900": "3.05rem",
|
||||
"max": "4rem"
|
||||
},
|
||||
"colors": {
|
||||
"primary": "#d6f253",
|
||||
"primary-shade": "#102538",
|
||||
"primary-glare": "#f1fcbe",
|
||||
"secondary": "#282156",
|
||||
"highlight": "#d6f253",
|
||||
"light-blue": "#97dffc",
|
||||
"light-gray": "#f1f0f7",
|
||||
"light": "#fff",
|
||||
"mid": "#ccc",
|
||||
"dark": "#111",
|
||||
"slate": "#404040"
|
||||
},
|
||||
"fonts": {
|
||||
"base": "\"'Open Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'\"",
|
||||
"brand": "\"'Varela', sans-serif\""
|
||||
}
|
||||
}
|
||||
63
src/_includes/layouts/base.njk
Normal file
@@ -0,0 +1,63 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="no-js">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="google-site-verification" content="-haql21y-2aWWdYUVglG0kBA4yjCcyG6y8mAzTrZ-Eg" />
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<link rel="icon" href="{{ site.faviconPath }}" type="image/png" />
|
||||
{% include "partials/global/meta-info.njk" %}
|
||||
<script>document.documentElement.classList.remove('no-js');</script>
|
||||
<link rel = "stylesheet" href="/vendor/css/leaflet.css"/>
|
||||
<link rel = "stylesheet" href="/vendor/css/bootstrap.min.css"/>
|
||||
<style>{% include "assets/css/global.css" %}</style>
|
||||
{% block head %}
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
{% include "partials/global/site-head.njk" %}
|
||||
{% block content %}
|
||||
{% endblock content %}
|
||||
{% include "partials/global/site-foot.njk" %}
|
||||
{% block foot %}
|
||||
{% endblock %}
|
||||
<script type="text/javascript" src="/js/components/menu-toggle.js" async defer></script>
|
||||
<script type="text/javascript" src="/js/components/search.js" async defer></script>
|
||||
<script type="text/javascript" src="/vendor/js/bootstrap.min.js" async defer></script>
|
||||
<script>
|
||||
if ('serviceWorker' in navigator) {
|
||||
window.addEventListener('load', () => {
|
||||
navigator.serviceWorker.register('/service-worker.js');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
var $buoop = {required:{e:-4,f:-3,o:-3,s:-1,c:-3},insecure:true,api:2021.04 };
|
||||
function $buo_f(){
|
||||
var e = document.createElement("script");
|
||||
e.src = "//browser-update.org/update.min.js";
|
||||
document.body.appendChild(e);
|
||||
};
|
||||
try {document.addEventListener("DOMContentLoaded", $buo_f,false)}
|
||||
catch(e){window.attachEvent("onload", $buo_f)}
|
||||
</script>
|
||||
<!-- Matomo -->
|
||||
<script>
|
||||
var _paq = window._paq = window._paq || [];
|
||||
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||
_paq.push(["setDoNotTrack", true]);
|
||||
_paq.push(["disableCookies"]);
|
||||
_paq.push(['trackPageView']);
|
||||
_paq.push(['enableLinkTracking']);
|
||||
(function() {
|
||||
var u="https://analytics.astrolabe.coop/";
|
||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||
_paq.push(['setSiteId', '1']);
|
||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
|
||||
})();
|
||||
</script>
|
||||
<noscript><p><img src="https://analytics.astrolabe.coop/matomo.php?idsite=1&rec=1" style="border:0;" alt="" /></p></noscript>
|
||||
<!-- End Matomo Code -->
|
||||
</body>
|
||||
</html>
|
||||
11
src/_includes/layouts/contact.njk
Normal file
@@ -0,0 +1,11 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" tabindex="-1">
|
||||
{% include "partials/components/meeting.njk" %}
|
||||
{% include "partials/components/faq.njk" %}
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
|
||||
{{ content | safe }}
|
||||
19
src/_includes/layouts/home.njk
Normal file
@@ -0,0 +1,19 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{# Set lists content #}
|
||||
{% set newsListHeading = newsHeading %}
|
||||
{% set newsListItems = collections.newsFeed %}
|
||||
{% set customersListItems = collections.customers %}
|
||||
{% set partnersListItems = collections.partners %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" class="home" tabindex="-1">
|
||||
{% include "partials/components/intro.njk" %}
|
||||
{% include "partials/components/meeting.njk" %}
|
||||
{% include "partials/components/posts-list-home.njk" %}
|
||||
{% include "partials/components/presentation.njk" %}
|
||||
{% include "partials/components/customers.njk" %}
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
{% include "partials/components/partners.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
70
src/_includes/layouts/member.njk
Normal file
@@ -0,0 +1,70 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{% set title = name %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" tabindex="-1">
|
||||
<section class="[ wrapper member ]">
|
||||
<article>
|
||||
<h1>{{ name }}</h1>
|
||||
<p class="position">{{ position }}</p>
|
||||
{% if positionInternal %}
|
||||
<p>{{ positionInternal }}</p>
|
||||
{% endif %}
|
||||
<div class="[ member__wrapper ]">
|
||||
<div class="member__info">
|
||||
<img src="{{ profile }}" alt="photo de {{ name }}">
|
||||
{% if personalSite %}
|
||||
<p class="member-url">
|
||||
<strong>site web :</strong>
|
||||
<a href="{{ personalSite }}">{{ personalSite }}</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
<ul class="social-links">
|
||||
<li><a href="{{ [url , "/contact/"] | join | url }}" title="Écrire à {{ name }}" class="member-contact-at"><span>@</span></a></li>
|
||||
{% if socialMastodon %}
|
||||
<li><a href="{{ socialMastodon }}" title="mastodon"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.956 18.293c3.007-.36 5.625-2.212 5.954-3.905.519-2.667.476-6.508.476-6.508 0-5.207-3.411-6.733-3.411-6.733C18.255.357 15.302.025 12.233 0h-.075c-3.068.025-6.02.357-7.74 1.147 0 0-3.41 1.526-3.41 6.733 0 .315-.003.647-.004.993-.005.96-.01 2.024.018 3.136.123 5.091.933 10.11 5.64 11.355 2.171.575 4.035.695 5.535.613 2.722-.151 4.25-.972 4.25-.972l-.09-1.974s-1.945.613-4.13.538c-2.163-.074-4.448-.233-4.798-2.89a5.448 5.448 0 01-.048-.745s2.124.519 4.816.642c1.647.076 3.19-.096 4.759-.283zm2.406-3.705V8.283c0-1.288-.328-2.312-.987-3.07-.68-.757-1.57-1.145-2.674-1.145-1.278 0-2.246.491-2.885 1.474l-.623 1.043-.622-1.043c-.64-.983-1.608-1.474-2.886-1.474-1.104 0-1.994.388-2.674 1.146-.659.757-.987 1.781-.987 3.07v6.303h2.498V8.47c0-1.29.543-1.945 1.628-1.945 1.2 0 1.802.777 1.802 2.312v3.35h2.483v-3.35c0-1.535.601-2.312 1.801-2.312 1.086 0 1.629.655 1.629 1.945v6.119h2.497z"/></svg></a></li>
|
||||
{% endif %}
|
||||
{% if socialTwitter %}
|
||||
<li><a href="{{ socialTwitter }}" title="twitter"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M24 4.309a9.83 9.83 0 01-2.828.775 4.932 4.932 0 002.165-2.724 9.864 9.864 0 01-3.127 1.195A4.916 4.916 0 0016.616 2c-3.179 0-5.515 2.966-4.797 6.045A13.978 13.978 0 011.671 2.901a4.93 4.93 0 001.523 6.574 4.903 4.903 0 01-2.229-.616c-.054 2.281 1.581 4.415 3.949 4.89a4.935 4.935 0 01-2.224.084 4.928 4.928 0 004.6 3.419A9.9 9.9 0 010 19.292a13.94 13.94 0 007.548 2.212c9.142 0 14.307-7.721 13.995-14.646A10.025 10.025 0 0024 4.309z"/></svg></a></li>
|
||||
{% endif %}
|
||||
{% if socialLinkedin %}
|
||||
<li><a href="{{ socialLinkedin }}" title="linkedin"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.98 2.5A2.49 2.49 0 012.5 5 2.49 2.49 0 01.02 2.5C.02 1.12 1.13 0 2.5 0a2.49 2.49 0 012.48 2.5zM5 7H0v16h5V7zm7.982 0H8.014v16h4.969v-8.399c0-4.67 6.029-5.052 6.029 0V23H24V12.869c0-7.88-8.922-7.593-11.018-3.714V7z"/></svg></a></li>
|
||||
{% endif %}
|
||||
{% if socialGithub %}
|
||||
<li><a href="{{ socialGithub }}" title="github"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0 1 12 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12Z"/></svg></a></li>
|
||||
{% endif %}
|
||||
{% if socialInstagram %}
|
||||
<li><a href="{{ socialInstagram }}" title="instagram"><svg width="29" height="29" fill="none" viewBox="0 0 29 29" xmlns="http://www.w3.org/2000/svg"><path d="M 9.9980469 3 C 6.1390469 3 3 6.1419531 3 10.001953 L 3 20.001953 C 3 23.860953 6.1419531 27 10.001953 27 L 20.001953 27 C 23.860953 27 27 23.858047 27 19.998047 L 27 9.9980469 C 27 6.1390469 23.858047 3 19.998047 3 L 9.9980469 3 z M 22 7 C 22.552 7 23 7.448 23 8 C 23 8.552 22.552 9 22 9 C 21.448 9 21 8.552 21 8 C 21 7.448 21.448 7 22 7 z M 15 9 C 18.309 9 21 11.691 21 15 C 21 18.309 18.309 21 15 21 C 11.691 21 9 18.309 9 15 C 9 11.691 11.691 9 15 9 z M 15 11 A 4 4 0 0 0 11 15 A 4 4 0 0 0 15 19 A 4 4 0 0 0 19 15 A 4 4 0 0 0 15 11 z"></path></svg></a></li>
|
||||
{% endif %}
|
||||
{% if socialBehance %}
|
||||
<li><a href="{{ socialBehance }}" title="behance"><svg width="29" height="29" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22 7h-7v-2h7v2zm1.726 10c-.442 1.297-2.029 3-5.101 3-3.074 0-5.564-1.729-5.564-5.675 0-3.91 2.325-5.92 5.466-5.92 3.082 0 4.964 1.782 5.375 4.426.078.506.109 1.188.095 2.14h-8.027c.13 3.211 3.483 3.312 4.588 2.029h3.168zm-7.686-4h4.965c-.105-1.547-1.136-2.219-2.477-2.219-1.466 0-2.277.768-2.488 2.219zm-9.574 6.988h-6.466v-14.967h6.953c5.476.081 5.58 5.444 2.72 6.906 3.461 1.26 3.577 8.061-3.207 8.061zm-3.466-8.988h3.584c2.508 0 2.906-3-.312-3h-3.272v3zm3.391 3h-3.391v3.016h3.341c3.055 0 2.868-3.016.05-3.016z"/></svg></a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="member__bio">
|
||||
{{ content | safe }}
|
||||
{% if tags %}
|
||||
<h2 class="font-base weight-mid mt-5">Mots-clés</h2>
|
||||
<ul class="tag-list mt-3">
|
||||
{% for item in tags %}
|
||||
<li class="tag-item">
|
||||
<a href="/equipe/{{ item }}/">{{ item }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<a class="return-link" href="/equipe/">Voir tous les membres</a>
|
||||
</section>
|
||||
{% if emailSlug %}
|
||||
{% set contactMember = emailSlug %}
|
||||
{% elif url %}
|
||||
{% set contactMember = url | replace("/members/","") | replace("-",".") %}
|
||||
{% endif %}
|
||||
{% set contactTitle = ["Écrire à ",name] | join %}
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
12
src/_includes/layouts/page.njk
Normal file
@@ -0,0 +1,12 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" tabindex="-1">
|
||||
<article class="[ post ]">
|
||||
<div class="[ post__body ] [ wrapper ]">
|
||||
{{ content | safe }}
|
||||
</div>
|
||||
</article>
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
20
src/_includes/layouts/post.njk
Normal file
@@ -0,0 +1,20 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" tabindex="-1">
|
||||
<article class="[ post wrapper ]">
|
||||
<div class="[ post__body ]">
|
||||
<h1>{{ title }}</h1>
|
||||
<div class="post-info">
|
||||
Publié le <strong>{{ date | dateFilter }}</strong>{%if author %} | {{ author }}{% endif %}
|
||||
</div>
|
||||
{% if illustration %}
|
||||
<img class="post-pic" src="{{ illustration }}" alt="illustration de l'article">
|
||||
{% endif %}
|
||||
{{ content | safe }}
|
||||
<a class="return-link" href="/posts/">Voir toute l'actualité</a>
|
||||
</div>
|
||||
</article>
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
26
src/_includes/layouts/posts-events.njk
Normal file
@@ -0,0 +1,26 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{% set newsListItems = collections.events %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" class="posts" tabindex="-1">
|
||||
<div class="[ wrapper ]">
|
||||
<h1 class="[ member-list__heading ]">{{ pageHeading }}</h1>
|
||||
<ul class="post-filter">
|
||||
<li>
|
||||
<a href="/posts/">Tout</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/posts-news/">Actualités</a>
|
||||
</li>
|
||||
<li class="active">
|
||||
<a href="/posts-events/">Évènements</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<section class="[ news-list wrapper ]">
|
||||
{% include "partials/components/posts-list.njk" %}
|
||||
</section>
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
26
src/_includes/layouts/posts-news.njk
Normal file
@@ -0,0 +1,26 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{% set newsListItems = collections.news %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" class="posts" tabindex="-1">
|
||||
<div class="[ wrapper ]">
|
||||
<h1 class="[ member-list__heading ]">{{ pageHeading }}</h1>
|
||||
<ul class="post-filter">
|
||||
<li>
|
||||
<a href="/posts/">Tout</a>
|
||||
</li>
|
||||
<li class="active">
|
||||
<a href="/posts-news/">Actualités</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/posts-events/">Évènements</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<section class="[ news-list wrapper ]">
|
||||
{% include "partials/components/posts-list.njk" %}
|
||||
</section>
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
27
src/_includes/layouts/posts.njk
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{% set newsListItems = collections.posts %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" class="posts" tabindex="-1">
|
||||
<div class="[ wrapper ]">
|
||||
<h1 class="[ member-list__heading ]">{{ pageHeading }}</h1>
|
||||
<ul class="post-filter">
|
||||
<li class="active">
|
||||
<a href="/posts/">Tout</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/posts-news/">Actualités</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/posts-events/">Évènements</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<section class="[ news-list wrapper ]">
|
||||
{% include "partials/components/posts-list.njk" %}
|
||||
</section>
|
||||
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
25
src/_includes/layouts/team.njk
Normal file
@@ -0,0 +1,25 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{% set teamListItems = collections.members %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" tabindex="-1">
|
||||
<div class="[ wrapper ]">
|
||||
<h1 class="[ member-list__heading ]">{{ teamListHeading }}</h1>
|
||||
{{ content | safe }}
|
||||
<div class="search-bar">
|
||||
<label for="site-search">Rechercher par mots-clés :</label>
|
||||
<input type="search" id="searchInput" name="q" aria-label="Filtrer par mots-clés" oninput="doSearch()" placeholder="dev, linux, ...">
|
||||
</div>
|
||||
<ul class="tag-list mt-3" id="tagList">
|
||||
{% for skill in collections.skillsList %}
|
||||
<li class="tag-item visually-hidden"><a href="/equipe/{{ skill }}/">{{ skill }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% include "partials/components/member-list.njk" %}
|
||||
{% include "partials/components/map.njk" %}
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
|
||||
{% endblock %}
|
||||
181
src/_includes/macros/form.njk
Normal file
@@ -0,0 +1,181 @@
|
||||
{# ===================
|
||||
Forms
|
||||
=================== #}
|
||||
|
||||
{% macro label( text, name ) %}
|
||||
<label class="question__label" for="field-{{ name }}">{{ text }}</label>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro field( type, name, data ) %}
|
||||
<br>
|
||||
<input class="question__field"
|
||||
type="{{ type }}"
|
||||
name="{{ name }}"
|
||||
id="field-{{ name }}"
|
||||
{% if data.required %}required aria-required="true"{% endif %}
|
||||
{% if data.placeholder %}placeholder="{{ data.placeholder }}"{% endif %}
|
||||
{% if data.pattern %}pattern="{{ data.pattern }}"{% endif %}
|
||||
{% if data.description %}aria-describedby="description-{{ name }}"{% endif %}
|
||||
{% if data.autocomplete %}autocomplete="{{ data.autocomplete }}"{% endif %}
|
||||
{% if data.autocorrect %}autocorrect="{{ data.autocorrect }}"{% endif %}
|
||||
{% if data.spellcheck %}spellcheck="{{ data.spellcheck }}"{% endif %}
|
||||
{% if data.autocapitalize %}autocapitalize="{{ data.autocapitalize }}"{% endif %}
|
||||
>
|
||||
{% if data.description %}
|
||||
<br>
|
||||
{{ description( name, data.description ) }}
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro confirm( text, name, data ) %}
|
||||
<label for="field-{{ name }}" class="question--confirm">
|
||||
<input class="question__field question__field--confirm"
|
||||
type="checkbox"
|
||||
name="{{ name }}"
|
||||
id="field-{{ name }}"
|
||||
value="1"
|
||||
{% if data.required %}required aria-required="true"{% endif %}
|
||||
{% if data.description %}aria-describedby="description-{{ name }}"{% endif %}
|
||||
>
|
||||
{{ text }}
|
||||
</label>
|
||||
{% if data.description %}
|
||||
<br>
|
||||
{{ description( name, data.description ) }}
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro select( name, options, data ) %}
|
||||
<br>
|
||||
<select id="field-{{ name }}"
|
||||
name="{{ name }}"
|
||||
{% if data.required %}required aria-required="true"{% endif %}
|
||||
{% if data.multiple %}multiple{% endif %}
|
||||
{% if data.description %}aria-describedby="description-{{ name }}"{% endif %}
|
||||
>
|
||||
{% for opt in data.options_before %}
|
||||
{{ option( opt ) }}
|
||||
{% endfor %}
|
||||
{% for opt in options %}
|
||||
{{ option( opt ) }}
|
||||
{% endfor %}
|
||||
{% for opt in data.options_after %}
|
||||
{{ option( opt ) }}
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% if data.description %}
|
||||
<br>
|
||||
{{ description( name, data.description ) }}
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro option( data ) %}
|
||||
{% if data.value %}
|
||||
<option value="{{ data.value }}">{{ data.label }}</option>
|
||||
{% else %}
|
||||
<option>{{ data }}</option>
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro textarea( name, data ) %}
|
||||
<br>
|
||||
<textarea id="field-{{ name }}"
|
||||
name="{{ name }}"
|
||||
{% if data.rows %}rows="{{ data.rows }}"{% else %}rows="5"{% endif %}
|
||||
cols="100"
|
||||
{% if data.required %}required aria-required="true"{% endif %}
|
||||
{% if data.autocorrect %}autocorrect="{{ data.autocorrect }}"{% endif %}
|
||||
{% if data.spellcheck %}spellcheck="{{ data.spellcheck }}"{% endif %}
|
||||
{% if data.autocapitalize %}autocapitalize="{{ data.autocapitalize }}"{% endif %}
|
||||
{% if data.description %}aria-describedby="description-{{ name }}"{% endif %}
|
||||
></textarea>
|
||||
{% if data.description %}
|
||||
{{ description( name, data.description ) }}
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro radios( label, name, options, data ) %}
|
||||
<fieldset>
|
||||
<legend
|
||||
{% if data.description %}aria-describedby="description-{{ name }}"{% endif %}
|
||||
>{{ label }}</legend>
|
||||
<ul class="field-list__field-group__list">
|
||||
{% for option in options %}
|
||||
<li>
|
||||
{% if option.value %}
|
||||
<label for="field-{{ name }}-{{ option.value }}">
|
||||
<input type="radio"
|
||||
name="{{ name }}"
|
||||
id="field-{{ name }}-{{ option.value }}"
|
||||
value="{{ option.value }}"
|
||||
{% if option.note %}aria-describedby="description-{{ name }}-{{ option.value }}"{% endif %}
|
||||
>{{ option.label }}</label>
|
||||
{% else %}
|
||||
<label for="field-{{ name }}-{{ option }}">
|
||||
<input type="radio"
|
||||
name="{{ name }}"
|
||||
id="field-{{ name }}-{{ option }}"
|
||||
value="{{ option }}"
|
||||
>{{ option }}</label>
|
||||
{% endif %}
|
||||
{% if option.note %}
|
||||
<br>
|
||||
{{ description( ( name + '-' + option.value ), option.note ) }}
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% if data.description %}
|
||||
{{ description( name, data.description ) }}
|
||||
{% endif %}
|
||||
</fieldset>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro checkboxes( label, name, options, data ) %}
|
||||
<fieldset>
|
||||
<legend
|
||||
{% if data.description %}aria-describedby="description-{{ name }}"{% endif %}
|
||||
>{{ label }}</legend>
|
||||
<ul class="field-list__field-group__list">
|
||||
{% for option in options %}
|
||||
<li>
|
||||
{% if option.value %}
|
||||
<label for="field-{{ name }}-{{ option.value }}">
|
||||
<input type="checkbox"
|
||||
name="{{ name }}"
|
||||
id="field-{{ name }}-{{ option.value }}"
|
||||
value="{{ option.value }}"
|
||||
{% if option.note %}aria-describedby="description-{{ name }}-{{ option.value }}"{% endif %}
|
||||
>{{ option.label }}</label>
|
||||
{% else %}
|
||||
<label for="field-{{ name }}-{{ option }}">
|
||||
<input type="checkbox"
|
||||
name="{{ name }}"
|
||||
id="field-{{ name }}-{{ option }}"
|
||||
value="{{ option }}"
|
||||
>{{ option }}</label>
|
||||
{% endif %}
|
||||
{% if option.note %}
|
||||
<br>
|
||||
{{ description( ( name + '-' + option.value ), option.note ) }}
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% if data.description %}
|
||||
{{ description( name, data.description ) }}
|
||||
{% endif %}
|
||||
</fieldset>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro description( id, html ) %}
|
||||
<em class="[ field-list__field-group__description ]" id="description-{{ id }}">{{ html | safe }}</em>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro hidden_field( name, value ) %}
|
||||
<input type="hidden" name="{{ name }}" id="field-{{ name }}" value="{{ value }}">
|
||||
{% endmacro %}
|
||||
|
||||
{% macro button( text ) %}
|
||||
<button type="submit" class="[ btn btn-secondary ]">{{ text }}</button>
|
||||
{% endmacro %}
|
||||
4
src/_includes/macros/site.njk
Normal file
@@ -0,0 +1,4 @@
|
||||
{# ========================
|
||||
Site-specific Macros
|
||||
======================== #}
|
||||
|
||||
140
src/_includes/partials/components/contact-form.njk
Normal file
@@ -0,0 +1,140 @@
|
||||
{% from "macros/form.njk" import label, field, select, option, textarea, checkboxes, button, hidden_field %}
|
||||
|
||||
<section class="[ form-container ]">
|
||||
{% if not removeWave %}
|
||||
<svg aria-hidden="true" viewBox="0 0 1440 131" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" d="M0 0h1440v131H0z"/><path d="M0 4.643l40-2.326c40-2.5 120-6.888 200 11.67 80 18.735 160 60.854 240 74.894 80 14.04 160 0 240-16.365 80-16.54 160-34.968 240-28.08 80 7.152 160 39.619 240 39.75 80-.131 160-32.598 200-49.139l40-16.365V131H0V4.643z" fill="#D6F253"/></svg>
|
||||
{% endif %}
|
||||
<div class="[ inner-wrapper ]">
|
||||
{% if not contactMember %}
|
||||
<h2 id="contact-form" class="[ contact-heading ]">Nous contacter</h2>
|
||||
{% elif contactTitle %}
|
||||
<h2 id="contact-form" class="[ contact-heading ]">{{ contactTitle }}</h2>
|
||||
{% endif %}
|
||||
|
||||
<div class="form-messages" aria-live="polite"></div>
|
||||
|
||||
<form name="contact" method="POST" action="/form/contact-form-handler.php" class="contact-form">
|
||||
<ol class="[ field-list ]">
|
||||
<li class="[ field-list__field-group ]">
|
||||
{{ label("Nom", "namezzz") }}
|
||||
{{ field( "text", "namezzz", { required: true, placeholder: "", autocomplete: "name", autocorrect: "off", autocapitalize: "off" } ) }}
|
||||
</li>
|
||||
<li class="[ field-list__field-group ]">
|
||||
{{ label("Email", "emailzzz") }}
|
||||
{{ field( "email", "emailzzz", { required: true, placeholder: "", autocomplete: "email" } ) }}
|
||||
</li>
|
||||
<li class="[ field-list__field-group ] [ full-width ]">
|
||||
{{ label("Je vous contacte pour :", "select") }}
|
||||
{% if contactMember %}
|
||||
{{ select( "select", [
|
||||
{label: "Obtenir un rendez-vous (décrivez votre projet en quelques lignes)", value: "option 1"},
|
||||
{label: "Proposer une mission à un coopérateur", value: "option 3"}
|
||||
], { required: true, options_before: [""], options_after: ["Autre demande"] } ) }}
|
||||
{% else %}
|
||||
{{ select( "select", [
|
||||
{label: "Obtenir un rendez-vous (décrivez votre projet en quelques lignes)", value: "option 1"},
|
||||
{label: "Obtenir des précisions sur le statut d'entrepreneur salarié", value: "option 2"},
|
||||
{label: "Proposer une mission à un coopérateur", value: "option 3"},
|
||||
{label: "Proposer un partenariat", value: "option 4"}
|
||||
], { required: true, options_before: [""], options_after: ["Autre demande"] } ) }}
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="[ field-list__field-group ] [ full-width ]">
|
||||
{{ label("Votre message", "message") }}
|
||||
{{ textarea( "message", { required: true, autocapitalize: "sentences", spellcheck: "true" } ) }}
|
||||
</li>
|
||||
{% if contactMember %}
|
||||
{{ hidden_field('subscribe', '') }}
|
||||
{% else %}
|
||||
<li class="[ field-list__field-group ] [ full-width ]">
|
||||
{{ checkboxes("", "subscribe", [ "Je souhaite être tenu au courant de l'actualité Astrolabe"], { description: "" } ) }}
|
||||
</li>
|
||||
{% endif %}
|
||||
<!-- H o n e y p o t -->
|
||||
<li aria-hidden="true">
|
||||
<label class="ohnohoney" for="name"></label>
|
||||
<input tabindex="-1" class="ohnohoney" autocomplete="off" type="text" id="name" name="name" placeholder="Your name here">
|
||||
</li>
|
||||
<li aria-hidden="true">
|
||||
<label class="ohnohoney" for="email"></label>
|
||||
<input tabindex="-1" class="ohnohoney" autocomplete="off" type="email" id="email" name="email" placeholder="Your e-mail here">
|
||||
</li>
|
||||
|
||||
<div class="h-captcha" data-sitekey="b07c49fe-50ee-4432-af0a-96d675c6326a"></div>
|
||||
<script src="https://js.hcaptcha.com/1/api.js" async defer></script>
|
||||
</ol>
|
||||
{% if contactMember %}
|
||||
{{ hidden_field('contactTo', contactMember) }}
|
||||
{% endif %}
|
||||
{{ button("Envoyer") }}
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<style>
|
||||
.form-messages {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.form-messages .error {
|
||||
color: #dc3545;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.form-messages .success {
|
||||
color: #28a745;
|
||||
}
|
||||
|
||||
.field-error {
|
||||
color: #dc3545;
|
||||
font-size: 0.875rem;
|
||||
margin-top: 0.25rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const form = document.querySelector('.contact-form');
|
||||
const messagesContainer = document.querySelector('.form-messages');
|
||||
|
||||
form.addEventListener('submit', async function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
// Clean previous messages
|
||||
messagesContainer.innerHTML = '';
|
||||
|
||||
// Get form data
|
||||
const formData = new FormData(form);
|
||||
|
||||
try {
|
||||
const response = await fetch(form.action, {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
// Display success message
|
||||
messagesContainer.innerHTML = `<div class="success">${data.message}</div>`;
|
||||
form.reset();
|
||||
// Redirect to thank you page
|
||||
window.location.href = '/thank-you/index.html';
|
||||
} else {
|
||||
// Display errors
|
||||
const errorHtml = data.errors.map(error =>
|
||||
`<div class="error">${error}</div>`
|
||||
).join('');
|
||||
messagesContainer.innerHTML = errorHtml;
|
||||
|
||||
// Scroll to error messages
|
||||
messagesContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
||||
}
|
||||
} catch (error) {
|
||||
messagesContainer.innerHTML = `
|
||||
<div class="error">Une erreur est survenue lors de l'envoi du formulaire. Veuillez réessayer.</div>
|
||||
`;
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
16
src/_includes/partials/components/customers.njk
Normal file
@@ -0,0 +1,16 @@
|
||||
<section class="[ partner ]">
|
||||
<div class="[ wrapper ]">
|
||||
<p class="[ partner__heading ]">{{ customersHeading }}</p>
|
||||
{% if customersListItems.length %}
|
||||
<ol class="[ partner__list ]">
|
||||
{% for item in customersListItems %}
|
||||
<li class="partner__list-item">
|
||||
<a href="{{ item.data.url }}" title="{{ item.data.name }}" target="_blank" rel="noreferrer noopener">
|
||||
<img src="{{ item.data.thumbnail }}" alt="logo de {{ item.data.name }}">
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
||||
24
src/_includes/partials/components/faq.njk
Normal file
@@ -0,0 +1,24 @@
|
||||
<section class="[ faq ]">
|
||||
{% if faq.items %}
|
||||
<div class="[ inner-wrapper ]">
|
||||
<h1 class="faq__heading">{{ faqHeading }}</h1>
|
||||
{{ content | safe }}
|
||||
<div class="accordion accordion-flush" id="accordionFlushExample">
|
||||
{% for item in faq.items %}
|
||||
<div class="accordion-item">
|
||||
<h3 class="accordion-header" id="flush-heading{{ loop.index }}">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapse{{ loop.index }}" aria-expanded="false" aria-controls="flush-collapse{{ loop.index }}">
|
||||
{{ item.q }}
|
||||
</button>
|
||||
</h3>
|
||||
<div id="flush-collapse{{ loop.index }}" class="accordion-collapse collapse" aria-labelledby="flush-heading{{ loop.index }}" data-bs-parent="#accordionFlushExample">
|
||||
<div class="accordion-body">
|
||||
{{ item.a | urlize | safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</section>
|
||||
13
src/_includes/partials/components/intro.njk
Normal file
@@ -0,0 +1,13 @@
|
||||
<header class="[ intro ]">
|
||||
<div class="[ wrapper ]">
|
||||
<h1 class="[ intro__heading ]">{{ brandHeading }}</h1>
|
||||
<svg viewBox="0 0 127 237" width="100%" height="100%" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M116.77 20.74c-.472-1.843-2.433-5.326-6.48-5.326h-4.283C105.395 6.814 98.249 0 89.533 0c-9.116 0-16.534 7.448-16.534 16.605v20.597L10.073 61.124a2.422 2.422 0 00-1.403 3.124c6.302 16.578 22.13 26.795 38.897 26.795 2.778 0 5.582-.315 8.375-.895 2.026.425 4.09.704 6.169.824v21.449a2.422 2.422 0 104.842 0V90.962a41.398 41.398 0 006.046-.8v22.259a2.422 2.422 0 104.843 0v-23.59c16.39-5.573 28.22-21.102 28.22-39.352V20.256h4.228c1.262 0 1.737 1.513 1.793 1.708a2.425 2.425 0 002.94 1.723 2.424 2.424 0 001.747-2.948zM32.478 82.973c-8.206-3.684-14.61-10.117-18.31-18.225l62.113-23.615c.013-.004.023-.013.034-.017.09-.036.173-.083.257-.128.058-.032.119-.058.174-.093.066-.044.124-.096.186-.146.06-.05.127-.095.184-.151.05-.05.092-.109.138-.162.054-.063.112-.124.159-.192.043-.065.077-.136.116-.203.037-.067.079-.131.11-.202.03-.07.05-.146.074-.22.024-.076.053-.15.07-.229.015-.065.019-.132.028-.199.013-.093.028-.187.03-.282l.003-.039V16.605c0-6.485 5.245-11.762 11.69-11.762 6.416 0 11.637 5.226 11.687 11.667v30.547H86.663a2.421 2.421 0 00-2.422 2.422c0 .023.007.043.007.068-.033 15.12-9.538 28.88-23.678 34.255-9.166 3.483-19.144 3.192-28.092-.828zm34.639 3.12c12.614-6.78 21.023-19.79 21.88-34.194h12.133c-1.194 18.255-15.785 32.903-34.013 34.195z" fill="#1E1E1E"/><path d="M89.53 20.256h4.464a2.421 2.421 0 100-4.842h-4.463a2.421 2.421 0 100 4.842zM123.897 194.561h-4.496V114.15a2.241 2.241 0 00-2.248-2.233H6.994c-1.24 0-2.248 1-2.248 2.233v80.411H2.498a2.242 2.242 0 00-2.248 2.234v37.971A2.242 2.242 0 002.498 237h121.399a2.243 2.243 0 002.249-2.234v-37.971a2.243 2.243 0 00-2.249-2.234zM9.243 116.384h105.662v78.177H9.243v-78.177zm112.406 116.149H4.746v-33.505H121.65v33.505z" fill="#1E1E1E"/><path d="M103.663 125.318h-83.18a2.242 2.242 0 00-2.249 2.234v55.841a2.241 2.241 0 002.248 2.233h83.181c1.241 0 2.248-1 2.248-2.233v-55.841a2.242 2.242 0 00-2.248-2.234zm-2.248 55.841H22.73v-51.373h78.685v51.373zM114.904 206.846h-13.488a2.242 2.242 0 00-2.248 2.234v13.401a2.242 2.242 0 002.248 2.234h13.488a2.243 2.243 0 002.249-2.234V209.08a2.243 2.243 0 00-2.249-2.234zm-2.248 13.402h-8.992v-8.935h8.992v8.935zM92.423 206.846h-13.49a2.242 2.242 0 00-2.247 2.234v13.401a2.242 2.242 0 002.248 2.234h13.489a2.242 2.242 0 002.248-2.234V209.08a2.242 2.242 0 00-2.248-2.234zm-2.248 13.402h-8.993v-8.935h8.993v8.935z" fill="#1E1E1E"/><path d="M78.934 134.253H27.227v4.467h51.707v-4.467zM63.197 143.187h-35.97v4.468h35.97v-4.468zM45.212 152.122H27.227v4.467h17.985v-4.467zM58.7 152.122h-8.993v4.467h8.992v-4.467z" fill="#111"/></svg>
|
||||
<div class="btn-grp">
|
||||
<a role="button" href="/comprendre-la-cae/" class="btn btn-secondary">Une CAE c'est quoi ?</a>
|
||||
<a role="button" href="/nous-rejoindre/" class="btn btn-primary">Nous rejoindre
|
||||
<svg width="18" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M17.602 5.823L12.05.376a1.357 1.357 0 00-1.875 0 1.295 1.295 0 000 1.84l3.278 3.235H1.326C.587 5.451 0 6.027 0 6.752s.587 1.302 1.326 1.302h12.127l-3.278 3.215a1.295 1.295 0 000 1.84 1.349 1.349 0 001.894 0l5.533-5.427c.246-.242.398-.576.398-.93 0-.353-.133-.687-.398-.93z" fill="#111"/></svg>
|
||||
</a>
|
||||
<a role="button" href="/posts/flyer-2023/" class="btn btn-secondary">Notre flyer 📄</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
50
src/_includes/partials/components/map.njk
Normal file
@@ -0,0 +1,50 @@
|
||||
<div class="[ wrapper ]">
|
||||
<h2 class="mt-5 mb-2">Où sommes-nous ?</h2>
|
||||
</div>
|
||||
<div id = "map" style = "width: 100%; height: 500px; margin-bottom: 8rem;"></div>
|
||||
<script type="text/javascript" src="/vendor/js/leaflet.js"></script>
|
||||
<script>
|
||||
// Creating map options
|
||||
var mapOptions = {
|
||||
center: [48.10494125597395, -1.6795760019626425],
|
||||
zoom: 15
|
||||
}
|
||||
|
||||
// Creating a map object
|
||||
var map = new L.map('map', mapOptions);
|
||||
|
||||
var iconMarker = L.icon({
|
||||
iconUrl: '/images/marker-stroke.svg',
|
||||
iconSize: [28, 40],
|
||||
iconAnchor: [14, 40],
|
||||
popupAnchor: [0, -40]
|
||||
});
|
||||
|
||||
var iconMarkerAlt = L.icon({
|
||||
iconUrl: '/images/astrolabe/marker-logo-alt.svg',
|
||||
iconSize: [40, 40],
|
||||
iconAnchor: [20, 40],
|
||||
popupAnchor: [0, -40]
|
||||
});
|
||||
|
||||
var members = {{ collections.membersLocations | dump | safe }};
|
||||
|
||||
var markerGroup = members.map( member => {
|
||||
return new L.marker(member.location, {icon: iconMarker}).bindPopup('<a href="'+member.url+'/">'+member.name+'</a>');
|
||||
});
|
||||
|
||||
var markerSiege = L.marker([48.10494125597395, -1.6795760019626425], {icon: iconMarkerAlt}).bindPopup('Siège Astrolabe CAE')
|
||||
.openPopup();
|
||||
|
||||
markerGroup.push(markerSiege)
|
||||
|
||||
var featureGroup = L.featureGroup(markerGroup).addTo(map);
|
||||
|
||||
map.fitBounds(featureGroup.getBounds());
|
||||
|
||||
// Creating a Layer object
|
||||
var layer = new L.TileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
|
||||
|
||||
// Adding layer to the map
|
||||
map.addLayer(layer);
|
||||
</script>
|
||||
6
src/_includes/partials/components/meeting.njk
Normal file
@@ -0,0 +1,6 @@
|
||||
<section id="Meeting" class="[ meeting ]">
|
||||
<a class="[ meeting__link btn btn-secondary ]" href="https://nuage.astrolabe.coop/apps/forms/embed/jiKKjDLEJZ7DEck3tacdRMX3" target="_blank">
|
||||
Réunions d'information
|
||||
<svg width="18" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M17.602 5.823L12.05.376a1.357 1.357 0 00-1.875 0 1.295 1.295 0 000 1.84l3.278 3.235H1.326C.587 5.451 0 6.027 0 6.752s.587 1.302 1.326 1.302h12.127l-3.278 3.215a1.295 1.295 0 000 1.84 1.349 1.349 0 001.894 0l5.533-5.427c.246-.242.398-.576.398-.93 0-.353-.133-.687-.398-.93z" fill="#FFF"></path></svg>
|
||||
</a>
|
||||
</section>
|
||||
20
src/_includes/partials/components/member-list-simple.njk
Normal file
@@ -0,0 +1,20 @@
|
||||
<section class="[ member-list ]">
|
||||
<div class="[ wrapper ]">
|
||||
{% if teamListItems.length %}
|
||||
<ol class="[ member-list__items ]" reversed>
|
||||
{% for item in teamListItems %}
|
||||
<li class="member-list__item">
|
||||
<a href="{{ item.data.url }}/" class="">
|
||||
<img src=" {{ item.data.profile }}" alt="photo de {{ item.data.name }}">
|
||||
<span class="member-name btn btn-primary">{{ item.data.name }}</span>
|
||||
</a>
|
||||
<p>{{ item.data.position }}</p>
|
||||
{% if item.data.positionInternal %}
|
||||
<p>{{ item.data.positionInternal }}</p>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
||||
24
src/_includes/partials/components/member-list.njk
Normal file
@@ -0,0 +1,24 @@
|
||||
<section class="[ member-list ]">
|
||||
<div class="[ wrapper ]">
|
||||
{% if teamListItems.length %}
|
||||
<ol class="[ member-list__items ]" reversed>
|
||||
{% for item in teamListItems %}
|
||||
<li class="member-list__item">
|
||||
<a href="{{ item.data.url }}/" class="">
|
||||
<img src=" {{ item.data.profile }}" alt="photo de {{ item.data.name }}">
|
||||
<span class="member-name btn btn-primary">{{ item.data.name }}</span>
|
||||
</a>
|
||||
<p>{{ item.data.position }}</p>
|
||||
{% if item.data.positionInternal %}
|
||||
<p>{{ item.data.positionInternal }}</p>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
<li class="member-list__item info">
|
||||
<p>Vous êtes porteur d’un projet entrepreneurial en numérique et nouvelles technologies ?</p>
|
||||
<a role="button" href="/nous-rejoindre/" class="btn btn-secondary">Rejoignez-nous</a>
|
||||
</li>
|
||||
</ol>
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
||||
26
src/_includes/partials/components/nav.njk
Normal file
@@ -0,0 +1,26 @@
|
||||
{% if navigation.items %}
|
||||
<nav id="menu" class="nav" aria-label="{{ariaLabel}}">
|
||||
<ul class="[ nav__list ]">
|
||||
{% for item in navigation.items %}
|
||||
{% set relAttribute = '' %}
|
||||
{% set currentAttribute = '' %}
|
||||
|
||||
{% if item.rel %}
|
||||
{% set relAttribute = ' rel="' + item.rel + '"' %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.url == item.url %}
|
||||
{% set currentAttribute = ' aria-current="page"' %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.url == item.url %}
|
||||
<li class="nav__item active">
|
||||
{% else %}
|
||||
<li class="nav__item">
|
||||
{% endif %}
|
||||
<a href="{{ item.url | url }}" {{ relAttribute | safe }}{{ currentAttribute | safe }}>{{ item.text }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</nav>
|
||||
{% endif %}
|
||||
16
src/_includes/partials/components/partners.njk
Normal file
@@ -0,0 +1,16 @@
|
||||
<section class="[ partner ]">
|
||||
<div class="[ wrapper ]">
|
||||
<p class="[ partner__heading ]">{{ partnersHeading }}</p>
|
||||
{% if partnersListItems.length %}
|
||||
<ol class="[ partner__list ]">
|
||||
{% for item in partnersListItems %}
|
||||
<li class="partner__list-item">
|
||||
<a href="{{ item.data.url }}" title="{{ item.data.name }}" target="_blank" rel="noreferrer noopener">
|
||||
<img src="{{ item.data.thumbnail }}" alt="logo de {{ item.data.name }}">
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
||||
10
src/_includes/partials/components/posts-list-home.njk
Normal file
@@ -0,0 +1,10 @@
|
||||
<section class="[ news-list ]">
|
||||
<svg aria-hidden="true" viewBox="0 0 1440 349" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#282156" d="M1440 154H0v195h1440z"/><path d="M1440 54.078l-48 12.41c-48 12.41-144 37.23-240 45.53-96 7.989-192 .232-288-29.01C768 54.079 672 4.438 576 .327c-96-4.421-192 37.463-288 45.452-96 8.3-192-16.52-240-28.931L0 4.437V203h1440V54.078z" fill="#282156"/></svg>
|
||||
<div class="[ wrapper ]">
|
||||
<div class="news-list__inner">
|
||||
<h2 class="[ news-list__heading ]">{{ newsListHeading }}</h2>
|
||||
{% include "partials/components/posts-list.njk" %}
|
||||
<a href="/posts/" class="return-link">Voir tout</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
28
src/_includes/partials/components/posts-list.njk
Normal file
@@ -0,0 +1,28 @@
|
||||
{% if newsListItems.length %}
|
||||
<ol class="[ news-list__items ]" reversed>
|
||||
{% for item in newsListItems %}
|
||||
{% if item.date.getTime() <= global.now %}
|
||||
<li class="news-list__item {{ item.data.type }}">
|
||||
<a href="{{ item.url | url }}" class="news-list__link" style="background-image: url({{ item.data.illustration }});">
|
||||
{% if item.data.type == 'event' %}
|
||||
<p class="news-list__item-type">Évènement</p>
|
||||
{% else %}
|
||||
<p class="news-list__item-type">Actualité</p>
|
||||
{% endif %}
|
||||
<h3 class="news-list__item-heading">{{ item.data.title }}</h3>
|
||||
<p class="news-list__item-date">
|
||||
{% if item.data.eventDate %}
|
||||
<time datetime="{{ item.data.eventDate | w3DateFilter }}">{{ item.data.eventDate | dateFilter }}</time>
|
||||
{% else %}
|
||||
<time datetime="{{ item.date | w3DateFilter }}">{{ item.date | dateFilter }}</time>
|
||||
{% endif %}
|
||||
{% if item.data.eventTime %}
|
||||
<time datetime="{{ item.data.eventTime }}">{{ item.data.eventTime }}</time>
|
||||
{% endif %}
|
||||
</p>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% endif %}
|
||||
62
src/_includes/partials/components/presentation.njk
Normal file
@@ -0,0 +1,62 @@
|
||||
{% set profilePics = collections.profiles %}
|
||||
|
||||
<section class="[ presentation ]">
|
||||
<div class="[ wrapper ]">
|
||||
<article>
|
||||
<div class="content">
|
||||
<h2>Qui sommes-nous ?</h2>
|
||||
<p>
|
||||
Astrolabe CAE est une scop spécialisée dans le développement de <strong>projets</strong> ou de prestation de <strong>services</strong> autour des métiers du <strong>numérique</strong>.
|
||||
Notre objectif est de favoriser l’<strong>autonomie</strong> et l’<strong>émancipation</strong> de nos membres sur un modèle d’économie sociale et <strong>solidaire</strong> (ESS).
|
||||
</p>
|
||||
</div>
|
||||
<div class="side-info">
|
||||
{# <figure> #}
|
||||
<img src="/images/crew-join.svg" alt="équipage astrolabe" loading="lazy" style="width: 22rem;">
|
||||
{# </figure> #}
|
||||
<a role="button" href="/nous-rejoindre/" class="btn btn-primary">Nous rejoindre
|
||||
<svg width="18" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M17.602 5.823L12.05.376a1.357 1.357 0 00-1.875 0 1.295 1.295 0 000 1.84l3.278 3.235H1.326C.587 5.451 0 6.027 0 6.752s.587 1.302 1.326 1.302h12.127l-3.278 3.215a1.295 1.295 0 000 1.84 1.349 1.349 0 001.894 0l5.533-5.427c.246-.242.398-.576.398-.93 0-.353-.133-.687-.398-.93z" fill="#111"></path></svg>
|
||||
</a>
|
||||
</div>
|
||||
</article>
|
||||
<article>
|
||||
<div class="content">
|
||||
<h2>Communs numérique</h2>
|
||||
<p>
|
||||
Chez Astrolabe nous aimons et faisons la promotion du <a href="https://fr.wikipedia.org/wiki/Logiciel_libre" target="_blank" rel="noreferrer noopener">logiciel libre</a>. Nos sommes membres d’<a href="http://www.alliance-libre.org/" target="_blank" rel="noreferrer noopener">Alliance Libre</a>
|
||||
et nous mettons nos documents et projets internes à disposition sur <a href="https://git.astrolabe.coop/explore/repos" target="_blank" rel="noreferrer noopener">notre instance Gitea</a>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="side-info">
|
||||
<figure>
|
||||
<img src="/images/gitea.svg" alt="logo Gitea" loading="lazy" width="100" height="100">
|
||||
</figure>
|
||||
<a role="button" href="https://git.astrolabe.coop/explore/repos" class="btn btn-primary btn-icon" target="_blank" rel="noreferrer noopener">Gitea</a>
|
||||
</div>
|
||||
</article>
|
||||
<article>
|
||||
<div class="content">
|
||||
<h2>Des profils variés</h2>
|
||||
<p>
|
||||
Nos coopérateurs possèdent des compétences propres allant de développement linux embarqué au web design et créent ainsi la <b>pluralité</b> de nos prestations.
|
||||
<br><br>
|
||||
Nous sommes également <b>fournisseur de service SAAS</b> de la solution logicielle libre de gestion de CAE <a href="https://www.baloop-erp.fr/" target="_blank" rel="noreferrer noopener">Baloop</a>.
|
||||
<br><br>
|
||||
Nous sommes détenteur de l'<a href="https://www.astrolabe.coop/posts/agrement-cir-2024/" target="_blank" rel="noreferrer noopener">Agrément CIR</a> utile pour nos membres qui travaillent dans le domaine de la R&D.
|
||||
</p>
|
||||
</div>
|
||||
<div class="side-info">
|
||||
<ul class="profile-preview">
|
||||
{% for profile in profilePics %}
|
||||
<li>
|
||||
<a href="{{ profile.data.url }}/" title="{{ profile.data.name }}">
|
||||
<img src="{{ profile.data.profile }}" alt="photo de {{ profile.data.name }}">
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<a role="button" href="/equipe/" class="btn btn-primary">Voir l'équipe</a>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
42
src/_includes/partials/global/meta-info.njk
Normal file
@@ -0,0 +1,42 @@
|
||||
{% set pageTitle = site.name + ' - ' + title %}
|
||||
{% set pageDesc = '' %}
|
||||
{% set siteTitle = site.name %}
|
||||
{% set currentUrl = site.url + page.url %}
|
||||
|
||||
{% if metaTitle %}
|
||||
{% set pageTitle = metaTitle %}
|
||||
{% endif %}
|
||||
|
||||
{% if description %}
|
||||
{% set pageDesc = description %}
|
||||
{% endif %}
|
||||
|
||||
<title>{{ pageTitle }}</title>
|
||||
<link rel="canonical" href="{{ currentUrl }}" />
|
||||
<link rel="alternate" type="application/rss+xml" title="Astrolabe CAE's RSS Feed" href="/feed.xml" />
|
||||
|
||||
<meta property="og:site_name" content="{{ siteTitle }}" />
|
||||
<meta property="og:title" content="{{ pageTitle }}" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="{{ currentUrl }}" />
|
||||
|
||||
{% if site.authorHandle %}
|
||||
<meta name="twitter:creator" content="@{{ site.authorHandle | replace('@', '') }}" />
|
||||
{% endif %}
|
||||
|
||||
{% if description %}
|
||||
<meta name="description" content="{{ description }}" />
|
||||
<meta name="twitter:description" content="{{ description }}" />
|
||||
<meta property="og:description" content="{{ description }}" />
|
||||
{% endif %}
|
||||
|
||||
{% if socialImage %}
|
||||
<meta property="og:image" content="{{ socialImage }}" />
|
||||
<meta name="twitter:image" content="{{ socialImage }}" />
|
||||
<meta property="og:image:alt" content="Page image for {{ site.name }}" />
|
||||
<meta name="twitter:image:alt" content="Page image for {{ site.name }}" />
|
||||
{% endif %}
|
||||
|
||||
{% if site.paymentPointer %}
|
||||
<meta name="monetization" content="{{ site.paymentPointer }}" />
|
||||
{% endif %}
|
||||
96
src/_includes/partials/global/service-worker.js
Normal file
@@ -0,0 +1,96 @@
|
||||
const CACHE_KEYS = {
|
||||
PRE_CACHE: `precache-${VERSION}`,
|
||||
RUNTIME: `runtime-${VERSION}`
|
||||
};
|
||||
|
||||
// URLS that we don’t want to end up in the cache
|
||||
const EXCLUDED_URLS = [
|
||||
'/contact',
|
||||
'/thank-you'
|
||||
];
|
||||
|
||||
// URLS that we want to be cached when the worker is installed
|
||||
const PRE_CACHE_URLS = [
|
||||
'/',
|
||||
'/fonts/varela-round-v12-latin-regular.woff',
|
||||
'/fonts/varela-v10-latin-regular.woff',
|
||||
'/fonts/open-sans-v17-latin-300.woff',
|
||||
'/fonts/open-sans-v17-latin-regular.woff',
|
||||
'/fonts/open-sans-v17-latin-600.woff',
|
||||
'/fonts/open-sans-v17-latin-700.woff'
|
||||
];
|
||||
|
||||
// You might want to bypass a certain host
|
||||
const IGNORED_HOSTS = ['localhost', 'unpkg.com', ];
|
||||
|
||||
/**
|
||||
* Takes an array of strings and puts them in a named cache store
|
||||
*
|
||||
* @param {String} cacheName
|
||||
* @param {Array} items=[]
|
||||
*/
|
||||
const addItemsToCache = function(cacheName, items = []) {
|
||||
caches.open(cacheName).then(cache => cache.addAll(items));
|
||||
};
|
||||
|
||||
self.addEventListener('install', evt => {
|
||||
self.skipWaiting();
|
||||
|
||||
addItemsToCache(CACHE_KEYS.PRE_CACHE, PRE_CACHE_URLS);
|
||||
});
|
||||
|
||||
self.addEventListener('activate', evt => {
|
||||
// Look for any old caches that don't match our set and clear them out
|
||||
evt.waitUntil(
|
||||
caches
|
||||
.keys()
|
||||
.then(cacheNames => {
|
||||
return cacheNames.filter(item => !Object.values(CACHE_KEYS).includes(item));
|
||||
})
|
||||
.then(itemsToDelete => {
|
||||
return Promise.all(
|
||||
itemsToDelete.map(item => {
|
||||
return caches.delete(item);
|
||||
})
|
||||
);
|
||||
})
|
||||
.then(() => self.clients.claim())
|
||||
);
|
||||
});
|
||||
|
||||
self.addEventListener('fetch', evt => {
|
||||
const {hostname} = new URL(evt.request.url);
|
||||
|
||||
// Check we don't want to ignore this host
|
||||
if (IGNORED_HOSTS.indexOf(hostname) >= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check we don't want to ignore this URL
|
||||
if (EXCLUDED_URLS.some(page => evt.request.url.indexOf(page) > -1)) {
|
||||
return;
|
||||
}
|
||||
|
||||
evt.respondWith(
|
||||
caches.match(evt.request).then(cachedResponse => {
|
||||
// Item found in cache so return
|
||||
if (cachedResponse) {
|
||||
return cachedResponse;
|
||||
}
|
||||
|
||||
// Nothing found so load up the request from the network
|
||||
return caches.open(CACHE_KEYS.RUNTIME).then(cache => {
|
||||
return fetch(evt.request)
|
||||
.then(response => {
|
||||
// Put the new response in cache and return it
|
||||
return cache.put(evt.request, response.clone()).then(() => {
|
||||
return response;
|
||||
});
|
||||
})
|
||||
.catch(ex => {
|
||||
return;
|
||||
});
|
||||
});
|
||||
})
|
||||
);
|
||||
});
|
||||
32
src/_includes/partials/global/site-foot.njk
Normal file
@@ -0,0 +1,32 @@
|
||||
<footer role="contentinfo" class="[ site-foot ]">
|
||||
<div class="wrapper">
|
||||
<div class="[ site-foot__inner ]">
|
||||
<div class="">
|
||||
<h3>Crédits</h3>
|
||||
<p>Design et intégration : <a class="footer-link" href="{{site.designerHandle}}" target="_blank" rel="noreferrer noopener">{{site.designerName}}</a></p>
|
||||
<p>Illustrations inspirées par : {{site.illustrators}}
|
||||
<p>
|
||||
Généré avec <a class="footer-link" href="https://www.11ty.dev/" target="_blank" rel="noreferrer noopener">Eleventy</a>, basé sur le starter kit <a class="footer-link" href="https://hylia.website/" target="_blank" rel="noreferrer noopener">Hylia</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="">
|
||||
<h3><a class="footer-link" href="{{site.url}}/mentions-legales/" title="Mentions légales">Mentions légales</a></h3>
|
||||
<p><a class="footer-link" href="{{site.url}}/rgpd/" title="Protection des données">Protection des données</a></p>
|
||||
</div>
|
||||
<div class="">
|
||||
<h3>Contact</h3>
|
||||
<p>{{site.authorName}}</p>
|
||||
<p>{{site.authorAddress}}<br>{{site.authorCity}}</p>
|
||||
<div class="socials">
|
||||
<a href="{{site.authorSocial.mastodon}}" class="social" title="Mastodon"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.956 18.293c3.007-.36 5.625-2.212 5.954-3.905.519-2.667.476-6.508.476-6.508 0-5.207-3.411-6.733-3.411-6.733C18.255.357 15.302.025 12.233 0h-.075c-3.068.025-6.02.357-7.74 1.147 0 0-3.41 1.526-3.41 6.733 0 .315-.003.647-.004.993-.005.96-.01 2.024.018 3.136.123 5.091.933 10.11 5.64 11.355 2.171.575 4.035.695 5.535.613 2.722-.151 4.25-.972 4.25-.972l-.09-1.974s-1.945.613-4.13.538c-2.163-.074-4.448-.233-4.798-2.89a5.448 5.448 0 01-.048-.745s2.124.519 4.816.642c1.647.076 3.19-.096 4.759-.283zm2.406-3.705V8.283c0-1.288-.328-2.312-.987-3.07-.68-.757-1.57-1.145-2.674-1.145-1.278 0-2.246.491-2.885 1.474l-.623 1.043-.622-1.043c-.64-.983-1.608-1.474-2.886-1.474-1.104 0-1.994.388-2.674 1.146-.659.757-.987 1.781-.987 3.07v6.303h2.498V8.47c0-1.29.543-1.945 1.628-1.945 1.2 0 1.802.777 1.802 2.312v3.35h2.483v-3.35c0-1.535.601-2.312 1.801-2.312 1.086 0 1.629.655 1.629 1.945v6.119h2.497z" fill="#fff"/></svg></a>
|
||||
<a href="{{site.authorSocial.facebook}}" class="social" title="Facebook"><svg fill="#FFFFFF" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="24px" height="24px"><path d="M24,4C12.972,4,4,12.972,4,24c0,10.006,7.394,18.295,17,19.75V29h-4c-0.552,0-1-0.447-1-1v-3c0-0.553,0.448-1,1-1h4v-3.632 C21,15.617,23.427,13,27.834,13c1.786,0,3.195,0.124,3.254,0.129C31.604,13.175,32,13.607,32,14.125V17.5c0,0.553-0.448,1-1,1h-2 c-1.103,0-2,0.897-2,2V24h4c0.287,0,0.56,0.123,0.75,0.338c0.19,0.216,0.278,0.502,0.243,0.786l-0.375,3 C31.555,28.624,31.129,29,30.625,29H27v14.75c9.606-1.455,17-9.744,17-19.75C44,12.972,35.028,4,24,4z"/></svg></a>
|
||||
<a href="{{site.authorSocial.linkedin}}" class="social" title="Linkedin"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.98 2.5A2.49 2.49 0 012.5 5 2.49 2.49 0 01.02 2.5C.02 1.12 1.13 0 2.5 0a2.49 2.49 0 012.48 2.5zM5 7H0v16h5V7zm7.982 0H8.014v16h4.969v-8.399c0-4.67 6.029-5.052 6.029 0V23H24V12.869c0-7.88-8.922-7.593-11.018-3.714V7z" fill="#fff"/></svg></a>
|
||||
<a href="{{site.authorSocial.instagram}}" class="social" title="Instagram"><svg fill="#FFFFFF" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="24px" height="24px"><path d="M 16 3 C 8.83 3 3 8.83 3 16 L 3 34 C 3 41.17 8.83 47 16 47 L 34 47 C 41.17 47 47 41.17 47 34 L 47 16 C 47 8.83 41.17 3 34 3 L 16 3 z M 37 11 C 38.1 11 39 11.9 39 13 C 39 14.1 38.1 15 37 15 C 35.9 15 35 14.1 35 13 C 35 11.9 35.9 11 37 11 z M 25 14 C 31.07 14 36 18.93 36 25 C 36 31.07 31.07 36 25 36 C 18.93 36 14 31.07 14 25 C 14 18.93 18.93 14 25 14 z M 25 16 C 20.04 16 16 20.04 16 25 C 16 29.96 20.04 34 25 34 C 29.96 34 34 29.96 34 25 C 34 20.04 29.96 16 25 16 z"/></svg></a>
|
||||
<a href="{{site.authorSocial.peertube}}" class="social" title="Peertube"><svg fill="#FFFFFF" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="24px" height="24px"><path d="M8.83,4.5l16.89,9.75L42.6,24,25.72,33.75,8.83,43.5V24l8.36,4.83,8.42,4.87V14.27l-8.42,4.87L8.83,24V4.5Z"/></g></svg></a>
|
||||
<a href="{{site.authorSocial.youtube}}" class="social" title="Youtube"><svg fill="#FFFFFF" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="24px" height="24px"><path d="M44.9,14.5c-0.4-2.2-2.3-3.8-4.5-4.3C37.1,9.5,31,9,24.4,9c-6.6,0-12.8,0.5-16.1,1.2c-2.2,0.5-4.1,2-4.5,4.3C3.4,17,3,20.5,3,25s0.4,8,0.9,10.5c0.4,2.2,2.3,3.8,4.5,4.3c3.5,0.7,9.5,1.2,16.1,1.2s12.6-0.5,16.1-1.2c2.2-0.5,4.1-2,4.5-4.3c0.4-2.5,0.9-6.1,1-10.5C45.9,20.5,45.4,17,44.9,14.5z M19,32V18l12.2,7L19,32z"/></g></svg></a>
|
||||
<a href="{{site.authorSocial.twitch}}" class="social" title="Twitch"><svg fill="#FFFFFF" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="24px" height="24px"><path d="M31.16,12.16v8.19h2.47V12.16Zm-7.75,0v8.19H26V12.16ZM14.11,4.5,7.23,11.34l0,25.12h8.3l0,7,7.06-7H28.2L40.77,24V4.5Zm1.42,2.89H38v15.2L32.55,28H26.94l-5.12,5.13V28H15.53Z"/></g></svg></a>
|
||||
<a href="{{site.authorSocial.rss}}" class="social" title="RSS"><svg fill="#FFFFFF" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="24px" height="24px"><path class="a" d="M5.5,13.5729A28.9269,28.9269,0,0,1,34.4271,42.5v0H42.5a37,37,0,0,0-37-37Z"></path><path class="a" d="M29.7179,42.5h-7.4A16.818,16.818,0,0,0,5.5,25.6819v-7.4A24.2183,24.2183,0,0,1,29.7181,42.5Z"></path><circle class="a" cx="10.2459" cy="37.7549" r="4.7453"></circle>/svg></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
18
src/_includes/partials/global/site-head.njk
Normal file
@@ -0,0 +1,18 @@
|
||||
<a class="skip-link" href="#main-content">Skip to content</a>
|
||||
<header role="banner" class="[ site-head ]">
|
||||
<div class="wrapper">
|
||||
<div class="[ site-head__inner ]">
|
||||
<a href="/" class="[ site-head__site-name ]">
|
||||
<span class="visually-hidden">{{ site.name }} - Home</span>
|
||||
{% include "../../../images/astrolabe/astrolabe_logo.svg" %}
|
||||
</a>
|
||||
<button class="menu-toggle" onclick="menuToggle(this)" title="ouvrir / fermer le menu">
|
||||
<svg id="icon-show" aria-hidden="true" width="32" height="32" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M13 10h12M6 16h19m-15 6h15" stroke="#111" stroke-width="2" stroke-linecap="round"/></svg>
|
||||
<svg id="icon-close" aria-hidden="true" width="32" height="32" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M25.5 7l-19 17m19 0L6.5 7" stroke="#111" stroke-width="2" stroke-linecap="round"/></svg>
|
||||
<span class="menu-toggle__label">menu</span>
|
||||
</button>
|
||||
{% set ariaLabel = 'navigation' %}
|
||||
{% include "partials/components/nav.njk" %}
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
5
src/customers/biocoop-lacanopee.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'Biocoop La Canopée'
|
||||
thumbnail: '/images/customers/logo-biocoop-lacanopee.png'
|
||||
url: 'https://www.biocoopbesancon.fr/'
|
||||
---
|
||||
5
src/customers/builddata.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'Build Data'
|
||||
thumbnail: '/images/customers/logo-builddata.png'
|
||||
url: 'https://www.build-data.fr/'
|
||||
---
|
||||
5
src/customers/deltadore.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'Delta Dore'
|
||||
thumbnail: '/images/customers/logo-deltadore.png'
|
||||
url: 'https://www.deltadore.fr'
|
||||
---
|
||||
5
src/customers/epv.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'Énergies citoyennes en Pays de Vilaine'
|
||||
thumbnail: '/images/customers/logo-epv.png'
|
||||
url: 'https://www.enr-citoyennes.fr/'
|
||||
---
|
||||
5
src/customers/smardtv.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'SmarDTV'
|
||||
thumbnail: '/images/customers/logo-smardtv.png'
|
||||
url: 'https://www.smardtv.com/'
|
||||
---
|
||||
5
src/customers/vantiva.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'Vantiva'
|
||||
thumbnail: '/images/customers/logo-vantiva.png'
|
||||
url: 'https://www.vantiva.com/'
|
||||
---
|
||||
5
src/customers/wiztivi.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'WIZTIVI'
|
||||
thumbnail: '/images/customers/logo-wiztivi.png'
|
||||
url: 'https://www.wiztivi.com/'
|
||||
---
|
||||
5
src/customers/workadventure.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'Work Adventure'
|
||||
thumbnail: '/images/customers/logo-workadventure.png'
|
||||
url: 'https://workadventu.re/'
|
||||
---
|
||||
35
src/feed.njk
Normal file
@@ -0,0 +1,35 @@
|
||||
---json
|
||||
{
|
||||
"permalink": "feed.xml",
|
||||
"eleventyExcludeFromCollections": true,
|
||||
"metadata": {
|
||||
"title": "Actualité d'Astrolabe",
|
||||
"description": "Retrouvez nos dernières actualités",
|
||||
"language": "fr",
|
||||
"base": "https://www.astrolabe.coop/",
|
||||
"author": "Astrolabe CAE"
|
||||
}
|
||||
}
|
||||
---
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="{{ metadata.base | addPathPrefixToFullUrl }}" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>{{ metadata.title }}</title>
|
||||
<link>{{ metadata.base | addPathPrefixToFullUrl }}</link>
|
||||
<atom:link href="{{ permalink | htmlBaseUrl(metadata.base) }}" rel="self" type="application/rss+xml" />
|
||||
<description>{{ metadata.description }}</description>
|
||||
<language>{{ metadata.language or page.lang }}</language>
|
||||
{%- for post in collections.posts %}
|
||||
{%- set absolutePostUrl = post.url | htmlBaseUrl(metadata.base) %}
|
||||
<item>
|
||||
<title>{{ post.data.title }}</title>
|
||||
<link>{{ absolutePostUrl }}</link>
|
||||
<description>{{ post.data.description }}</description>
|
||||
<pubDate>{{ post.date | dateToRfc822 }}</pubDate>
|
||||
<category>{{ post.data.type }}</category>
|
||||
<dc:creator>{{ post.data.author or metadata.author }}</dc:creator>
|
||||
<guid>{{ absolutePostUrl }}</guid>
|
||||
</item>
|
||||
{%- endfor %}
|
||||
</channel>
|
||||
</rss>
|
||||
32
src/filters/date-filter.js
Normal file
@@ -0,0 +1,32 @@
|
||||
// Stolen from https://stackoverflow.com/a/31615643
|
||||
const appendSuffix = n => {
|
||||
var s = ['th', 'st', 'nd', 'rd'],
|
||||
v = n % 100;
|
||||
return n + (s[(v - 20) % 10] || s[v] || s[0]);
|
||||
};
|
||||
|
||||
export default function dateFilter(value) {
|
||||
const dateObject = new Date(value);
|
||||
|
||||
// const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
||||
const months = [
|
||||
'janv.',
|
||||
'févr.',
|
||||
'mars',
|
||||
'avr.',
|
||||
'mai',
|
||||
'juin',
|
||||
'juill.',
|
||||
'août',
|
||||
'sept.',
|
||||
'oct.',
|
||||
'nov.',
|
||||
'déc.'
|
||||
];
|
||||
const dayWithSuffix = appendSuffix(dateObject.getDate());
|
||||
|
||||
// return `${dayWithSuffix} ${months[dateObject.getMonth()]} ${dateObject.getFullYear()}`;
|
||||
return `${dateObject.getDate()} ${
|
||||
months[dateObject.getMonth()]
|
||||
} ${dateObject.getFullYear()}`;
|
||||
}
|
||||
11
src/filters/markdown-filter.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import markdownIt from 'markdown-it';
|
||||
|
||||
const m = markdownIt({
|
||||
html: true,
|
||||
breaks: true,
|
||||
linkify: true
|
||||
});
|
||||
|
||||
export default function markdown(value) {
|
||||
return m.render(value);
|
||||
}
|
||||
5
src/filters/w3-date-filter.js
Normal file
@@ -0,0 +1,5 @@
|
||||
export default function w3cDate(value) {
|
||||
const dateObject = new Date(value);
|
||||
|
||||
return dateObject.toISOString();
|
||||
}
|
||||
BIN
src/fonts/open-sans-v17-latin-300.woff
Normal file
BIN
src/fonts/open-sans-v17-latin-600.woff
Normal file
BIN
src/fonts/open-sans-v17-latin-700.woff
Normal file
BIN
src/fonts/open-sans-v17-latin-regular.woff
Normal file
BIN
src/fonts/varela-round-v12-latin-regular.woff
Normal file
BIN
src/fonts/varela-v10-latin-regular.woff
Normal file
152
src/form/contact-form-handler.php
Normal file
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
require("/usr/share/php/libphp-phpmailer/autoload.php");
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
// Set header to return JSON
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$mail = new PHPMailer(true);
|
||||
|
||||
$errors = [];
|
||||
$myEmail = getenv('ASTRO_SMTP_FROM');
|
||||
$myEmailSplitted = explode('@', $myEmail);
|
||||
$domainFromMyEmail = (
|
||||
empty($myEmailSplitted[1])
|
||||
|| count($myEmailSplitted) != 2
|
||||
) ? ''
|
||||
: $myEmailSplitted[1];
|
||||
|
||||
$wantedContact = filter_input(INPUT_POST, 'contactTo', FILTER_SANITIZE_SPECIAL_CHARS);
|
||||
$wantedContact = (
|
||||
empty($wantedContact)
|
||||
|| strpos($wantedContact, '@') !== false
|
||||
|| strpos($wantedContact, '&') !== false
|
||||
|| empty($domainFromMyEmail)
|
||||
) ? $myEmail : "$wantedContact@$domainFromMyEmail" ;
|
||||
|
||||
/* hCaptcha */
|
||||
$hcaptchaSecret = getenv('HCAPTCHA_SECRET_KEY');
|
||||
$hcaptchaVerifyUrl = "https://api.hcaptcha.com/siteverify";
|
||||
|
||||
if(empty($_POST['namezzz']) || empty($_POST['emailzzz']) || empty($_POST['message'])) {
|
||||
$errors[] = "Erreur : champs obligatoires manquants.";
|
||||
}
|
||||
|
||||
if(!empty($_POST['name']) && !empty($_POST['email'])) {
|
||||
$errors[] = "Erreur : spam détecté.";
|
||||
}
|
||||
|
||||
/* Captcha verification */
|
||||
if(!empty($_POST['h-captcha-response'])) {
|
||||
$responseKey = $_POST['h-captcha-response'];
|
||||
$data = array(
|
||||
'secret' => $hcaptchaSecret,
|
||||
'response' => $responseKey
|
||||
);
|
||||
|
||||
$checkRequest = curl_init();
|
||||
curl_setopt($checkRequest, CURLOPT_URL, $hcaptchaVerifyUrl);
|
||||
curl_setopt($checkRequest, CURLOPT_POST, 1);
|
||||
curl_setopt($checkRequest, CURLOPT_POSTFIELDS, http_build_query($data));
|
||||
curl_setopt($checkRequest, CURLOPT_RETURNTRANSFER, true);
|
||||
$response = curl_exec($checkRequest);
|
||||
curl_close($checkRequest);
|
||||
|
||||
$responseData = json_decode($response, true);
|
||||
|
||||
if(!$responseData['success']) {
|
||||
$errors[] = "Erreur lors de la validation du captcha.";
|
||||
}
|
||||
} else {
|
||||
$errors[] = "Erreur lors de la validation du captcha.";
|
||||
}
|
||||
|
||||
$name = $_POST['namezzz'];
|
||||
$emailAddress = $_POST['emailzzz'];
|
||||
$select = $_POST['select'];
|
||||
$message = $_POST['message'];
|
||||
$subscribe = $_POST['subscribe'];
|
||||
|
||||
if (!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
|
||||
$errors[] = "Erreur d'adresse e-mail invalide : $emailAddress";
|
||||
}
|
||||
|
||||
if(empty($errors)) {
|
||||
try {
|
||||
$emailSubject = "[Formulaire Astrolabe] Nouveau message";
|
||||
|
||||
switch ($select) {
|
||||
case "option 1":
|
||||
$purpose = "Demande de rendez-vous";
|
||||
break;
|
||||
case "option 2":
|
||||
$purpose = "Demande de précisions sur le statut d'entrepreneur salarié";
|
||||
break;
|
||||
case "option 3":
|
||||
$purpose = "Proposition de misson";
|
||||
break;
|
||||
case "option 4":
|
||||
$purpose = "Proposition de partenariat";
|
||||
break;
|
||||
default:
|
||||
$purpose = "Autre demande";
|
||||
}
|
||||
$emailSubject .= " : $purpose";
|
||||
|
||||
$emailBody = "Vous avez reçu un nouveau message depuis le formulaire du site Astrolabe :".
|
||||
"\r\n\r\nNom: $name \r\nEmail: $emailAddress \r\nRaison: $purpose\r\nSubscribe: $subscribe\r\n\r\n$message";
|
||||
|
||||
$emailBodyHTML = str_replace("\r\n", "<br>", $emailBody);
|
||||
|
||||
$mail->isSMTP();
|
||||
$mail->Host = getenv('ASTRO_SMTP_HOSTNAME');
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->Username = getenv('ASTRO_SMTP_USERNAME');
|
||||
$mail->Password = getenv('ASTRO_SMTP_PASSWORD');
|
||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
|
||||
$mail->Port = 587;
|
||||
|
||||
//Options
|
||||
$mail->CharSet = 'UTF-8';
|
||||
$mail->WordWrap = 70;
|
||||
|
||||
//Recipients
|
||||
$mail->setFrom($myEmail);
|
||||
$mail->addAddress($wantedContact);
|
||||
$mail->addReplyTo($emailAddress, $name);
|
||||
|
||||
// Content
|
||||
$mail->isHTML(true);
|
||||
$mail->Subject = $emailSubject;
|
||||
$mail->Body = $emailBodyHTML;
|
||||
$mail->AltBody = $emailBody;
|
||||
|
||||
$mail->send();
|
||||
|
||||
// if subscribe add to mailing list
|
||||
if(!empty($subscribe)) {
|
||||
// process
|
||||
// enovoi mail add to mailing list
|
||||
}
|
||||
|
||||
http_response_code(200);
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Message envoyé avec succès'
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
http_response_code(500);
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'errors' => ["Erreur lors de l'envoi du message : " . $mail->ErrorInfo]
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
http_response_code(400);
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'errors' => $errors
|
||||
]);
|
||||
}
|
||||
1
src/images/404.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="1084" height="605" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M214.557 403h-203.5v-77l132-231h110l-132 231h93.5v-82.5h99V326h38.5v77h-38.5v77h-99v-77zm390.714-203.5c0-22-11-33-33-33h-60.5c-22 0-33 11-33 33v176c0 22 11 33 33 33h60.5c22 0 33-11 33-33v-176zm99.001 176c0 38.5-8.8 66.55-26.401 84.15-17.233 17.233-45.1 25.85-83.6 25.85h-104.5c-38.5 0-66.55-8.617-84.15-25.85-17.233-17.6-25.85-45.65-25.85-84.15v-176c0-38.5 8.617-66.367 25.85-83.6 17.6-17.6 45.65-26.4 84.15-26.4h104.5c38.5 0 66.367 8.8 83.6 26.4 17.601 17.233 26.401 45.1 26.401 83.6v176zM940.729 403h-203.5v-77l132-231h110l-132 231h93.5v-82.5h99.001V326h38.5v77h-38.5v77h-99.001v-77z" fill="#F1F0F6"/><path d="M261.653 487.589l-2.066-5.789c11.231-4.903 16.955-17.719 12.796-29.387-4.349-12.184-17.839-18.545-30.075-14.181l-27.632 9.859-62.153-72.901a3.387 3.387 0 00-4.776-.38c-12.004 10.236-19.304 24.534-20.557 40.262-1.003 12.613 1.989 24.929 8.49 35.505a59.349 59.349 0 002.875 11.774c4.75 13.313 13.914 24.224 26.017 31.218v21.677a3.386 3.386 0 106.774 0V496.96a59.284 59.284 0 008.712 2.89v15.396a3.386 3.386 0 106.774 0v-14.127a57.99 57.99 0 007.307.477 59.12 59.12 0 0019.887-3.466l39.204-13.987 2.039 5.72c.619 1.737-1.217 3.118-1.452 3.286a3.39 3.39 0 003.816 5.6c2.234-1.502 5.941-5.772 4.02-11.16zm-127.712-71.982c1.019-12.788 6.598-24.473 15.73-33.32l61.361 71.973c.185.217.392.398.614.556.047.034.097.056.146.085.217.138.443.249.68.335.079.027.154.054.235.076.287.079.578.134.874.136.009 0 .018.004.027.004a3.36 3.36 0 001.138-.198l.005-.003a.033.033 0 01.015-.004l29.814-10.635c8.707-3.105 18.324 1.411 21.417 10.077 3.076 8.622-1.443 18.146-10.077 21.305l-40.984 14.621-6.969-19.539v-.005l-.002-.004-.002-.007a3.385 3.385 0 00-4.329-2.052c-.025.009-.045.024-.07.033-20.3 7.204-43.312 1.037-57.289-15.361-9.062-10.629-13.44-24.15-12.334-38.073zm37.841 74.143c-.528-.25-1.018-.555-1.536-.822a3.373 3.373 0 00-1.497-.801c-10.053-5.587-17.859-14.188-22.443-24.731 10.981 9.972 25.338 15.391 39.948 15.391 5.498 0 11.024-.815 16.423-2.391l5.828 16.337c-12.219 3.5-25.132 2.513-36.723-2.983zM241.767 511.859h-13.198a3.386 3.386 0 100 6.774h13.198a3.386 3.386 0 100-6.774z" fill="#000"/><path d="M249.608 469.283c.614 0 1.224-.104 1.808-.314a5.385 5.385 0 003.254-6.873c-.971-2.715-4.134-4.225-6.873-3.254a5.345 5.345 0 00-3.051 2.761 5.332 5.332 0 00-.205 4.106 5.387 5.387 0 005.067 3.574zM249.164 504.82l-11.236-6.923a3.387 3.387 0 00-3.555 5.767l11.237 6.924a3.384 3.384 0 004.66-1.107 3.39 3.39 0 00-1.106-4.661zM279.766 511.859h-13.201a3.387 3.387 0 000 6.774h13.201a3.386 3.386 0 100-6.774zM275.069 499.004a3.383 3.383 0 00-4.66-1.107l-11.239 6.923a3.385 3.385 0 001.78 6.269c.607 0 1.221-.163 1.775-.504l11.238-6.923a3.382 3.382 0 001.106-4.658z" fill="#000"/></svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
1
src/images/arrow-left.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" style="isolation:isolate" viewBox="5416.49 7375.386 77.988 66.385" width="103.984" height="88.513"><g fill="#111"><path d="M5418.41 7440.4c-.15.13-.35.19-.55.17a.79.79 0 01-.51-.26.772.772 0 01-.17-.55c.02-.2.11-.38.26-.51 1.18-.99 2.36-1.99 3.54-2.98 5.12-4.28 10.22-8.59 15.3-12.92 2.43-2.06 4.85-4.14 7.25-6.24.88-.77 1.76-1.55 2.63-2.33.55-.5 1.09-1.01 1.61-1.53 2.17-1.99 4.33-3.98 6.48-5.97 2.1-1.96 4.21-3.9 6.33-5.82 1.9-1.71 3.84-3.38 5.82-5 2.2-1.73 4.41-3.45 6.62-5.17l10.9-8.47c3.12-2.42 6.23-4.85 9.35-7.28.15-.12.35-.17.55-.15.2.03.38.13.5.28.12.16.18.36.15.56a.75.75 0 01-.28.5l-9.35 7.27-10.9 8.48a832.2 832.2 0 00-6.6 5.15c-1.96 1.6-3.88 3.25-5.75 4.95-2.12 1.91-4.23 3.84-6.32 5.79-2.14 2-4.3 3.98-6.46 5.96-.53.54-1.08 1.06-1.65 1.56-.87.79-1.76 1.58-2.64 2.35-2.41 2.1-4.83 4.19-7.26 6.26-5.09 4.32-10.2 8.63-15.31 12.92-1.18.99-2.36 1.98-3.54 2.98z"/><path d="M5416.49 7439.53l.01-.09.46-6.07c.02-.2.11-.38.26-.51.15-.13.35-.2.55-.18.2.02.38.11.51.26.13.15.19.35.18.55l-.46 6.03-.01.05c.01.12.11.23.23.24l6.06.46c.2.02.38.11.51.26.13.15.19.35.18.55a.79.79 0 01-.26.51c-.15.13-.35.19-.55.18l-6.05-.47a1.742 1.742 0 01-1.62-1.74v-.03z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
1
src/images/arrow-right.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" style="isolation:isolate" viewBox="5549.532 7373.252 77.988 66.381" width="103.984" height="88.508"><g fill="#111"><path d="M5549.82 7374.59a.71.71 0 01-.28-.5c-.03-.2.03-.39.15-.55.12-.16.3-.26.5-.28.2-.03.4.03.55.15 3.11 2.43 6.23 4.85 9.35 7.27 3.63 2.83 7.27 5.65 10.9 8.48 2.21 1.71 4.42 3.43 6.62 5.17 1.98 1.61 3.92 3.28 5.82 5 2.12 1.92 4.23 3.86 6.33 5.81 2.15 2 4.31 3.99 6.48 5.97.52.53 1.06 1.04 1.61 1.53.87.79 1.75 1.57 2.63 2.34 2.4 2.09 4.82 4.17 7.24 6.24l15.31 12.92 3.54 2.97c.15.13.24.32.26.51.02.2-.05.4-.17.55-.13.15-.32.25-.51.27-.2.01-.4-.05-.55-.18l-3.54-2.97c-5.11-4.29-10.22-8.6-15.31-12.93-2.43-2.07-4.85-4.15-7.26-6.25-.89-.78-1.77-1.56-2.64-2.35-.57-.51-1.12-1.03-1.65-1.57-2.16-1.97-4.32-3.96-6.46-5.95-2.1-1.95-4.2-3.88-6.32-5.8-1.88-1.7-3.79-3.34-5.75-4.94-2.19-1.73-4.39-3.45-6.6-5.16l-10.9-8.47c-3.12-2.42-6.24-4.85-9.35-7.28z"/><path d="M5619.73 7438.13l6.05-.46c.13-.01.23-.11.24-.24l-.01-.04-.46-6.04c-.01-.2.05-.4.18-.55.13-.15.31-.24.51-.26.2-.01.4.05.55.18.15.13.24.32.26.51l.46 6.07v.09c.01.01.01.02.01.03 0 .44-.17.87-.47 1.19-.3.32-.71.52-1.15.56l-6.05.46c-.2.02-.4-.05-.55-.18a.768.768 0 01-.26-.51c-.01-.2.05-.39.18-.55.13-.15.31-.24.51-.26z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
1
src/images/arrow.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" style="isolation:isolate" viewBox="5539.25 7677.669 11.5 57.081" width="11.5pt" height="76.108"><g fill="#111"><path d="M5544.25 7678.38c.01-.2.1-.39.24-.52.15-.13.35-.2.54-.19.2.01.39.1.52.24.14.15.2.35.19.55-.1 2.03-.24 4.06-.4 6.09-.17 2.12-.31 4.23-.41 6.34-.07 2.84-.11 5.67-.11 8.5.01 6.08.12 12.15.32 18.22.42 4.82.62 9.65.61 14.48v1.33a.76.76 0 01-.23.53.75.75 0 01-.53.22.72.72 0 01-.53-.23.7.7 0 01-.21-.53v-1.32c.01-4.8-.19-9.61-.61-14.39-.2-6.1-.3-12.2-.32-18.31 0-2.85.04-5.7.11-8.55.1-2.14.24-4.27.42-6.41.16-2.01.29-4.03.4-6.05z"/><path d="M5540.53 7728.89l4.29 4.29c.05.05.11.07.18.07.07 0 .13-.02.18-.07l4.29-4.29a.75.75 0 111.06 1.06l-4.29 4.29c-.33.33-.78.51-1.24.51-.46 0-.91-.18-1.24-.51l-4.29-4.29a.75.75 0 111.06-1.06z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 794 B |
4
src/images/astrolabe/COPYRIGHT.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Copyright 2023 Astrolabe CAE : All rights reserved
|
||||
This licence applies to the current folder.
|
||||
|
||||
It is not authorized to copy, display, use, adapt, change, include, translate, sell part or the whole of contents of this folder without a preciding written authorization from owners of this website.
|
||||
3
src/images/astrolabe/astrolabe_logo.svg
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
src/images/astrolabe/favicon.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
3
src/images/astrolabe/marker-logo-alt.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 20C0 8.96178 8.96183 0 20 0C31.0387 0 40 8.96178 40 20C40 31.0382 31.0387 40 20 40C8.96183 40 0 31.0382 0 20ZM25.3303 22.6563L28.3342 29.1806C28.5043 29.5573 28.8225 29.8524 29.2122 29.9957C29.602 30.1398 30.036 30.1215 30.4123 29.9462C30.789 29.776 31.0842 29.4584 31.2279 29.0686C31.3715 28.6788 31.3533 28.2448 31.1784 27.8681L27.7869 20.4983L25.3303 22.6563ZM23.1467 17.9132L20.105 11.3073L17.0339 17.9149L13.4188 18.25L18.0417 8.30295C19.1879 5.83678 21.0417 5.84032 22.1784 8.31076L26.7513 18.2474L23.1467 17.9132ZM14.8411 22.6328L11.7192 29.3507C11.5442 29.7274 11.2261 30.0226 10.8368 30.1615C10.447 30.3056 10.0121 30.2873 9.63585 30.112C9.25952 29.9375 8.96831 29.6198 8.82509 29.23C8.68186 28.8403 8.69963 28.4062 8.87413 28.0295L12.385 20.4748L14.8411 22.6328Z" fill="#282156"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 946 B |
1
src/images/astrolabe/sailor-thinking.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="172" height="164" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M102 20.5C102 9.186 111.186 0 122.5 0S143 9.186 143 20.5 133.814 41 122.5 41 102 31.814 102 20.5zm25.964 2.722l3.078 6.688a1.603 1.603 0 002.13.785 1.594 1.594 0 00.786-2.13l-3.476-7.555-2.518 2.212zm-2.239-4.861l-3.117-6.771-3.148 6.773-3.706.343 4.739-10.196c1.175-2.528 3.075-2.524 4.24.008l4.687 10.185-3.695-.342zm-8.513 4.837l-3.2 6.886a1.605 1.605 0 01-2.966-.123c-.147-.4-.129-.845.05-1.231l3.599-7.744 2.517 2.212z" fill="#D6F253"/><path d="M162.633 28v-3.136h3.136V28h-3.136zm-3.416-18.34c1.773-.99 3.556-1.484 5.348-1.484 1.792 0 3.257.476 4.396 1.428 1.157.952 1.736 2.24 1.736 3.864 0 .859-.187 1.624-.56 2.296a5.411 5.411 0 01-1.316 1.624c-.504.43-1.017.85-1.54 1.26-1.232 1.027-1.848 2.23-1.848 3.612v.336h-2.464v-.448c0-.99.177-1.867.532-2.632.355-.784.784-1.41 1.288-1.876a23.34 23.34 0 011.54-1.316c1.232-.933 1.848-1.839 1.848-2.716 0-2.035-1.335-3.052-4.004-3.052-1.549 0-3.164.55-4.844 1.652h-.112V9.66z" fill="#111"/><path d="M77 64c0 .706-.391 1.432-1.2 2.02-.806.586-1.97.98-3.3.98-1.33 0-2.494-.394-3.3-.98-.809-.588-1.2-1.314-1.2-2.02s.391-1.432 1.2-2.02c.806-.586 1.97-.98 3.3-.98 1.33 0 2.494.394 3.3.98.809.588 1.2 1.314 1.2 2.02z" stroke="#111" stroke-width="2" stroke-linejoin="round"/><path d="M95 48.5c0 1.124-.619 2.225-1.788 3.083C92.043 52.44 90.38 53 88.5 53c-1.88 0-3.543-.56-4.712-1.417C82.62 50.725 82 49.623 82 48.5c0-1.124.619-2.225 1.788-3.083C84.957 44.56 86.62 44 88.5 44c1.88 0 3.543.56 4.712 1.417C94.38 46.275 95 47.377 95 48.5z" stroke="#111" stroke-width="2"/><path d="M70.923 123.361l-22.56-4.99v-6.029c4.064-2.434 6.778-6.661 6.778-11.462v-2.423c3.192-.531 5.631-3.12 5.631-6.23a5.78 5.78 0 00-.633-2.632 8.953 8.953 0 001.96.232c.168 0 .323 0 .49-.011 4.616-.255 7.832-4.05 7.963-4.204a1.053 1.053 0 00-.143-1.505c-1.71-1.416-3.408-2.423-5.034-3.02.562-1.715.586-3.142.586-3.253 0-.575-.478-1.062-1.1-1.106-4.256-.3-7.424.508-9.445 2.39l.012-.233C55.428 71.229 48.745 65 40.543 65s-14.885 6.229-14.885 13.885v7.103c-3.276.476-5.8 3.098-5.8 6.25 0 3.154 2.524 5.787 5.8 6.252v2.401c0 4.812 2.702 9.039 6.779 11.462v6.029l-22.561 4.99C4.066 124.655 0 129.413 0 134.945v27.449c0 .608.538 1.106 1.196 1.106.657 0 1.195-.498 1.195-1.106V155.8h13.821v6.594c0 .608.538 1.106 1.196 1.106.657 0 1.196-.498 1.196-1.106V155.8h42.145v6.594c0 .608.537 1.106 1.195 1.106s1.196-.498 1.196-1.106V155.8h15.267v6.594c0 .608.539 1.106 1.196 1.106.658 0 1.196-.498 1.196-1.106v-27.46c0-5.532-4.065-10.29-9.876-11.573zm-52.331 17.281h42.145v5.355H18.591v-5.355zm-2.392 5.366H2.367v-5.355h13.821v5.355h.012zm46.928-5.366h15.28v5.355h-15.28v-5.355zm-60.76-2.212v-3.508c0-.63.071-1.25.203-1.858h75.645c.132.597.204 1.217.204 1.858v3.508H2.367zm30.344-17.846c.466 1.051 1.183 1.958 2.056 2.711H20.457l12.255-2.711zm15.387.011l12.231 2.7H46.055c.872-.753 1.578-1.66 2.044-2.7zm7.042-24.429v-7.9c1.865.499 3.24 2.07 3.24 3.95 0 1.882-1.375 3.464-3.24 3.95zm12.745-11.152c-1.04.952-3.048 2.445-5.452 2.578-1.124.066-2.223-.2-3.3-.752 1.232-.266 2.332-.72 3.276-1.439.885-.663 1.543-1.471 2.045-2.3 1.088.398 2.236 1.04 3.431 1.913zM56.911 80.81c1.315-1.339 3.515-1.992 6.54-1.947-.204 1.305-.813 3.496-2.583 4.835-1.327.995-3.132 1.36-5.38 1.095-.012-.974.155-2.689 1.423-3.983zm-28.886-1.947c0-6.44 5.607-11.672 12.494-11.672s12.494 5.233 12.494 11.639l-.24 6.848-24.748.41v-7.225zm-5.787 13.354c0-1.936 1.459-3.552 3.408-3.994v7.988c-1.961-.432-3.408-2.058-3.408-3.994zm5.787 8.663V88.3l24.725-.41v12.978c0 6.307-5.548 11.44-12.363 11.44-6.815 0-12.362-5.122-12.362-11.428zm12.362 13.652c1.973 0 3.862-.365 5.584-1.018v6.063c-.849 2.124-3.049 3.596-5.56 3.596-2.558 0-4.794-1.538-5.607-3.74v-5.908a16.24 16.24 0 005.583 1.007zm-29.985 10.975l.036-.011h59.9l.035.011c3.216.708 5.763 2.722 7.066 5.355H3.336c1.303-2.622 3.862-4.636 7.066-5.355zm-8.035 28.069v-5.355h13.821v5.355H2.368zm16.225 0v-5.355h42.145v5.355H18.591zm44.536 0v-5.355h15.28v5.355h-15.28z" fill="#111"/></svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
1
src/images/astrolabe/thinking.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="105" height="68" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M35 20.5C35 9.186 44.186 0 55.5 0S76 9.186 76 20.5 66.814 41 55.5 41 35 31.814 35 20.5zm25.964 2.722l3.078 6.688c.175.386.501.689.9.836.4.147.845.128 1.23-.051.387-.175.69-.5.837-.9.147-.4.128-.844-.051-1.23l-3.476-7.555-2.518 2.212zm-2.239-4.861l-3.117-6.771-3.148 6.773-3.706.343L53.493 8.51c1.175-2.528 3.075-2.524 4.24.008l4.687 10.185-3.695-.342zm-8.513 4.837l-3.2 6.886a1.605 1.605 0 01-2.966-.123c-.147-.4-.129-.845.05-1.231l3.599-7.744 2.517 2.212z" fill="#D6F253"/><path d="M95.633 28v-3.136h3.136V28h-3.136zM92.217 9.66c1.773-.99 3.556-1.484 5.348-1.484 1.792 0 3.257.476 4.396 1.428 1.157.952 1.736 2.24 1.736 3.864 0 .859-.187 1.624-.56 2.296a5.411 5.411 0 01-1.316 1.624c-.504.43-1.017.85-1.54 1.26-1.232 1.027-1.848 2.23-1.848 3.612v.336h-2.464v-.448c0-.99.177-1.867.532-2.632.355-.784.784-1.41 1.288-1.876a23.263 23.263 0 011.54-1.316c1.232-.933 1.848-1.839 1.848-2.716 0-2.035-1.335-3.052-4.004-3.052-1.55 0-3.164.55-4.844 1.652h-.112V9.66z" fill="#111"/><path d="M10 64c0 .706-.391 1.432-1.2 2.02-.806.586-1.97.98-3.3.98-1.33 0-2.494-.394-3.3-.98C1.39 65.432 1 64.706 1 64s.391-1.432 1.2-2.02c.806-.586 1.97-.98 3.3-.98 1.33 0 2.494.394 3.3.98.809.588 1.2 1.314 1.2 2.02z" stroke="#111" stroke-width="2" stroke-linejoin="round"/><path d="M28 48.5c0 1.124-.619 2.225-1.788 3.083C25.044 52.44 23.38 53 21.5 53c-1.88 0-3.544-.56-4.712-1.417C15.62 50.725 15 49.623 15 48.5c0-1.124.619-2.225 1.788-3.083C17.956 44.56 19.62 44 21.5 44c1.88 0 3.544.56 4.712 1.417C27.38 46.275 28 47.377 28 48.5z" stroke="#111" stroke-width="2"/></svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
1
src/images/big-boat.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="80" height="80" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M26.79 19.182a5.212 5.212 0 00-5.206 5.205 5.212 5.212 0 005.206 5.206 5.212 5.212 0 005.205-5.206 5.212 5.212 0 00-5.205-5.205zm0 8.41a3.21 3.21 0 01-3.206-3.205 3.21 3.21 0 013.206-3.205 3.21 3.21 0 013.205 3.205 3.21 3.21 0 01-3.205 3.206zM45.198 24.387a5.212 5.212 0 00-5.205-5.205 5.212 5.212 0 00-5.206 5.205 5.212 5.212 0 005.206 5.206 5.212 5.212 0 005.205-5.206zm-8.41 0a3.21 3.21 0 013.205-3.205 3.21 3.21 0 013.205 3.205 3.21 3.21 0 01-3.205 3.206 3.21 3.21 0 01-3.206-3.206zM53.198 29.593a5.212 5.212 0 005.205-5.206 5.212 5.212 0 00-5.205-5.205 5.212 5.212 0 00-5.206 5.205 5.212 5.212 0 005.206 5.206zm0-8.411a3.21 3.21 0 013.205 3.205 3.21 3.21 0 01-3.205 3.206 3.21 3.21 0 01-3.206-3.206 3.21 3.21 0 013.206-3.205z" fill="#111"/><path d="M79 78c-2.742 0-5.3-1.24-7.018-3.401-.379-.478-1.186-.478-1.565 0a9.003 9.003 0 01-3.181 2.534L73.45 40.74a1 1 0 00-.802-1.152l-8.362-1.562V13.308a1 1 0 00-1-1H46.687v-7.22A5.093 5.093 0 0041.6 0h-3.2a5.093 5.093 0 00-5.087 5.087v7.221h-16.6a1 1 0 00-1 1v24.717l-8.36 1.562a1 1 0 00-.803 1.152l6.214 36.394A9.005 9.005 0 019.583 74.6c-.379-.478-1.187-.478-1.565 0A8.923 8.923 0 011 78a1 1 0 000 2c2.96 0 5.744-1.18 7.8-3.272A10.89 10.89 0 0016.6 80c2.96 0 5.744-1.18 7.8-3.272A10.89 10.89 0 0032.2 80c2.96 0 5.744-1.18 7.8-3.272A10.89 10.89 0 0047.8 80c2.961 0 5.744-1.18 7.8-3.272A10.891 10.891 0 0063.4 80c2.96 0 5.744-1.18 7.8-3.272A10.891 10.891 0 0079 80a1 1 0 000-2zM35.312 5.087A3.09 3.09 0 0138.4 2h3.2a3.09 3.09 0 013.087 3.087v7.221h-9.374v-7.22zm-17.598 9.221h44.572v23.343l-22.102-4.13c-.033-.006-.066.003-.1 0-.029-.002-.054-.017-.084-.017-.03 0-.055.015-.085.018-.033.002-.066-.007-.099 0l-22.102 4.13V14.307zM32.2 78c-2.742 0-5.3-1.24-7.016-3.401-.38-.478-1.187-.478-1.566 0A8.923 8.923 0 0116.6 78a8.962 8.962 0 01-1.689-.172L8.688 41.373 39 35.708v39.135C37.287 76.848 34.833 78 32.2 78zm24.184-3.401a1 1 0 00-1.567 0A8.922 8.922 0 0147.8 78c-2.633 0-5.088-1.153-6.8-3.158V35.708l30.313 5.665-6.225 36.455A8.96 8.96 0 0163.4 78c-2.743 0-5.3-1.24-7.016-3.401z" fill="#111"/></svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
1
src/images/crew-join.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
1
src/images/crew.svg
Normal file
|
After Width: | Height: | Size: 21 KiB |
4
src/images/customers/COPYRIGHT.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Copyright 2023 Astrolabe CAE : All rights reserved
|
||||
This licence applies to the current folder.
|
||||
|
||||
It is not authorized to copy, display, use, adapt, change, include, translate, sell part or the whole of contents of this folder without a preciding written authorization from owners of this website.
|
||||
BIN
src/images/customers/logo-biocoop-lacanopee.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
src/images/customers/logo-builddata.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
src/images/customers/logo-deltadore.png
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
BIN
src/images/customers/logo-epv.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
src/images/customers/logo-smardtv.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
src/images/customers/logo-vantiva.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
src/images/customers/logo-wiztivi.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
src/images/customers/logo-workadventure.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
4
src/images/default-profile.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="364" height="375" viewBox="0 0 364 375" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="364" height="375" fill="#F1F0F6"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M122 190C122 156.333 149.11 129 182.499 129C215.891 129 243 156.333 243 190C243 223.667 215.891 251 182.499 251C149.11 251 122 223.667 122 190ZM198.624 198.101L207.71 218C208.225 219.15 209.188 220.05 210.367 220.487C211.546 220.926 212.859 220.87 213.996 220.336C215.137 219.817 216.029 218.847 216.464 217.658C216.898 216.469 216.844 215.146 216.314 213.998L206.055 191.519L198.624 198.101ZM192.019 183.635L182.817 163.487L173.528 183.641L162.592 184.662L176.576 154.323C180.043 146.802 185.651 146.812 189.09 154.347L202.923 184.654L192.019 183.635ZM166.895 198.029L157.45 218.519C156.921 219.669 155.959 220.569 154.781 220.992C153.602 221.431 152.286 221.377 151.149 220.841C150.01 220.309 149.13 219.341 148.696 218.152C148.263 216.963 148.317 215.639 148.845 214.489L159.465 191.448L166.895 198.029Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
12
src/images/gitea.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve">
|
||||
<g>
|
||||
<path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8 c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4 c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/>
|
||||
<g>
|
||||
<g>
|
||||
<path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2 c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5 c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5 c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3 c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1 C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4 c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7 S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55 c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8 l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/>
|
||||
<path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4 c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1 c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9 c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3 c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3 c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29 c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8 C343.2,346.5,335,363.3,326.8,380.1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
1
src/images/mail-sent.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="432" height="424" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M427.138 47.33c-.131-2.168-1.579-6.5-6.12-7.375l-4.802-.926c1.171-9.779-5.371-18.966-15.147-20.85-10.227-1.972-20.156 4.78-22.136 15.051l-4.115 21.344-65.822-35.88a2.76 2.76 0 00-3.754 1.106c-11.599 21.278-5.161 47.608 14.089 61.344 4.11 14.377 15.043 25.867 28.94 30.818l-4.924 25.542a2.766 2.766 0 002.193 3.241c1.5.29 2.952-.691 3.241-2.193l4.832-25.066c.438.097.868.216 1.312.301 1.849.357 3.692.582 5.525.712l-4.889 25.36a2.768 2.768 0 005.434 1.048l5.081-26.353c20.654-1.089 38.75-16.1 42.838-37.303l6.318-32.776 4.741.914c1.416.273 1.622 2.072 1.643 2.303a2.77 2.77 0 002.926 2.569 2.77 2.77 0 002.596-2.93zm-71.166 61.023c-12.872-2.481-23.686-11.153-29.119-22.832a47.148 47.148 0 0010.964 3.57c13.995 2.698 28.876-.966 40.013-10.503a2.768 2.768 0 00-3.599-4.203c-13.142 11.254-32.182 13.25-47.372 4.968-19.492-10.625-27.188-34.563-17.992-54.426l66.678 36.346a2.766 2.766 0 003.754-1.106 2.73 2.73 0 00.326-1.27l4.746-24.62c1.402-7.275 8.425-12.06 15.654-10.666 7.197 1.388 11.922 8.378 10.585 15.613l-7.129 36.98c-4.237 21.96-25.547 36.383-47.509 32.149z" fill="#111"/><path d="M401.327 34.763a4.361 4.361 0 00-2.878 1.745 4.35 4.35 0 00-.8 3.261 4.4 4.4 0 005.008 3.68 4.4 4.4 0 003.675-5.012c-.357-2.33-2.673-4.027-5.005-3.674zM299.444 143.496c-2.86.283-5.008 2.903-4.725 5.763l6.485 65.545c.283 2.859 2.902 5.007 5.762 4.724l99.629-9.856c2.859-.283 5.007-2.903 4.725-5.763l-6.485-65.545c-.283-2.859-2.903-5.008-5.763-4.725l-99.628 9.857zm3.14 4.984l94.385-9.338-40.859 46.94c-.915 1.05-3.158 1.272-4.26.422l-49.266-38.024zm-2.151 5.012l33.495 25.808-27.821 31.544-5.674-57.352zm99.628-9.857l5.675 57.352-33.464-25.481 27.789-31.871zm-61.966 38.893l10.527 8.142c3.506 2.705 8.562 2.205 11.47-1.135l8.727-10.047 33.242 25.337-91.599 9.063 27.633-31.36z" fill="#111"/><ellipse cx="193.5" cy="382" rx="193.5" ry="42" fill="#F1F0F6"/></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
3
src/images/marker-alt.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="14" height="20" viewBox="0 0 14 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.0392 19.7082C7.09406 20.2815 5.8626 19.9809 5.28869 19.0368C1.76195 13.2353 0 9.28709 0 6.99256C0 3.13068 3.13401 0 7 0C10.866 0 14 3.13068 14 6.99256C14 9.28709 12.238 13.2353 8.71131 19.0368C8.54447 19.3112 8.31394 19.5415 8.0392 19.7082ZM7.00745 10C8.66606 10 10.0106 8.65685 10.0106 7C10.0106 5.34315 8.66606 4 7.00745 4C5.34883 4 4.00426 5.34315 4.00426 7C4.00426 8.65685 5.34883 10 7.00745 10Z" fill="#282156"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 533 B |
3
src/images/marker-stroke.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="28" height="40" viewBox="0 0 28 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.8191 38.9909C14.1645 39.9946 12.009 39.4681 11.0046 37.8158L10.5774 38.0755L11.0046 37.8158C7.48332 32.0229 4.85137 27.1687 3.10115 23.1986C1.34537 19.2159 0.5 16.1729 0.5 13.9858C0.5 6.53829 6.54368 0.5 14 0.5C21.4563 0.5 27.5 6.53829 27.5 13.9858C27.5 16.1729 26.6546 19.2159 24.8989 23.1986C23.1486 27.1687 20.5167 32.0229 16.9954 37.8158C16.7034 38.2961 16.3 38.6991 15.8191 38.9909ZM14.0149 20.501C17.6078 20.501 20.5213 17.5912 20.5213 14.0007C20.5213 10.4102 17.6078 7.5004 14.0149 7.5004C10.422 7.5004 7.50851 10.4102 7.50851 14.0007C7.50851 17.5912 10.422 20.501 14.0149 20.501Z" fill="#D6F253" stroke="#282156"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 739 B |
BIN
src/images/pages/poisson-2023.jpg
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
src/images/pages/poisson-2024-guijaune.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
4
src/images/partners/COPYRIGHT.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Copyright 2023 Astrolabe CAE : All rights reserved
|
||||
This licence applies to the current folder.
|
||||
|
||||
It is not authorized to copy, display, use, adapt, change, include, translate, sell part or the whole of contents of this folder without a preciding written authorization from owners of this website.
|
||||
BIN
src/images/partners/logo-alliancelibre.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
src/images/partners/logo-bigre.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
src/images/partners/logo-coop-tech.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
src/images/partners/logo-fede-cae.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
src/images/partners/logo-inr.png
Normal file
|
After Width: | Height: | Size: 16 KiB |