Merge branch 'dev' car site déployé et en production => Version 1.0
This commit is contained in:
commit
d91f904bda
114
.eleventy.js
Normal file
114
.eleventy.js
Normal file
@ -0,0 +1,114 @@
|
||||
const rssPlugin = require('@11ty/eleventy-plugin-rss');
|
||||
const syntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight');
|
||||
const fs = require('fs');
|
||||
|
||||
// Import filters
|
||||
const dateFilter = require('./src/filters/date-filter.js');
|
||||
const markdownFilter = require('./src/filters/markdown-filter.js');
|
||||
const w3DateFilter = require('./src/filters/w3-date-filter.js');
|
||||
|
||||
// Import transforms
|
||||
const htmlMinTransform = require('./src/transforms/html-min-transform.js');
|
||||
const parseTransform = require('./src/transforms/parse-transform.js');
|
||||
|
||||
// Import data files
|
||||
const site = require('./src/_data/site.json');
|
||||
|
||||
module.exports = function(config) {
|
||||
// Filters
|
||||
config.addFilter('dateFilter', dateFilter);
|
||||
config.addFilter('markdownFilter', markdownFilter);
|
||||
config.addFilter('w3DateFilter', w3DateFilter);
|
||||
|
||||
// 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('customers', collection => {
|
||||
return [...collection.getFilteredByGlob("./src/customers/*.md")]
|
||||
.reverse()
|
||||
.slice(0, site.maxPartnerPerPage);
|
||||
});
|
||||
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,
|
||||
};
|
||||
};
|
21
.gitignore
vendored
Normal file
21
.gitignore
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
*.log
|
||||
npm-debug.*
|
||||
*.scssc
|
||||
*.log
|
||||
*.swp
|
||||
.DS_Store
|
||||
.vscode
|
||||
*.code-workspace
|
||||
.sass-cache
|
||||
node_modules
|
||||
dist/*
|
||||
deploy-prod.js
|
||||
deploy-preprod.js
|
||||
|
||||
# Specifics
|
||||
|
||||
# Hide design tokens
|
||||
src/scss/_tokens.scss
|
||||
|
||||
# Hide compiled CSS
|
||||
src/_includes/assets/*
|
6
.prettierrc
Normal file
6
.prettierrc
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"printWidth": 90,
|
||||
"tabWidth": 2,
|
||||
"singleQuote": true,
|
||||
"bracketSpacing": false
|
||||
}
|
19
.stylelintrc.json
Normal file
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
|
||||
}
|
||||
}
|
21
LICENSE.txt
Normal file
21
LICENSE.txt
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 andy-bell.design and other contributors
|
||||
|
||||
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.
|
129
README.md
Normal file
129
README.md
Normal file
@ -0,0 +1,129 @@
|
||||
# Astrolabe website
|
||||
|
||||
## Getting started
|
||||
|
||||
Requirements :
|
||||
|
||||
- Git
|
||||
- Node.js (minimum version v12.15.0)
|
||||
|
||||
### Install
|
||||
|
||||
1. Clone or fork this repo: `git clone https://git.ouvaton.coop/astrolabe/SiteWebAstrolabe`
|
||||
2. `cd` into the project directory and run `npm install`
|
||||
3. Once all the dependencies are installed run `npm start`
|
||||
4. 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, 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 `images/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
|
29
deploy.js
Normal file
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: false,
|
||||
// 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
|
||||
});
|
9665
package-lock.json
generated
Normal file
9665
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
56
package.json
Executable file
56
package.json
Executable file
@ -0,0 +1,56 @@
|
||||
{
|
||||
"name": "astrolabe-website",
|
||||
"version": "0.1.0",
|
||||
"description": "Site web de la coopérative Astrolabe CAE",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"@11ty/eleventy": "^0.10.0",
|
||||
"@11ty/eleventy-plugin-rss": "^1.0.7",
|
||||
"@11ty/eleventy-plugin-syntaxhighlight": "^2.0.3",
|
||||
"@tbranyen/jsdom": "^13.0.0",
|
||||
"concurrently": "^4.1.2",
|
||||
"html-minifier": "^4.0.0",
|
||||
"image-size": "^0.8.3",
|
||||
"json-to-scss": "^1.5.0",
|
||||
"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": "^2.1.0",
|
||||
"cross-env": "^5.2.1",
|
||||
"ftp-deploy": "^2.3.7",
|
||||
"make-dir-cli": "^2.0.0",
|
||||
"prettier": "^1.19.1",
|
||||
"rollup": "^1.32.1",
|
||||
"rollup-plugin-commonjs": "^10.1.0",
|
||||
"rollup-plugin-json": "^4.0.0",
|
||||
"rollup-plugin-node-resolve": "^5.2.0",
|
||||
"stylelint": "^13.6.1",
|
||||
"stylelint-config-sass-guidelines": "^7.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"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",
|
||||
"start": "concurrently \"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 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.ouvaton.coop/astrolabe/SiteWebAstrolabe.git"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "Yves Gatesoupe",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://git.ouvaton.coop/astrolabe/SiteWebAstrolabe/issues"
|
||||
},
|
||||
"homepage": "https://git.ouvaton.coop/astrolabe/SiteWebAstrolabe"
|
||||
}
|
12
src/.htaccess
Normal file
12
src/.htaccess
Normal file
@ -0,0 +1,12 @@
|
||||
# Prevent viewing of htaccess file.
|
||||
<Files .htaccess>
|
||||
order allow,deny
|
||||
deny from all
|
||||
</Files>
|
||||
# Prevent directory listings
|
||||
Options All -Indexes
|
||||
ErrorDocument 404 /404.html
|
||||
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]
|
10
src/404.md
Normal file
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](/)
|
9
src/_data/global.js
Normal file
9
src/_data/global.js
Normal file
@ -0,0 +1,9 @@
|
||||
module.exports = {
|
||||
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
10
src/_data/helpers.js
Normal file
@ -0,0 +1,10 @@
|
||||
module.exports = {
|
||||
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
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": "Nous contacter",
|
||||
"url": "#contact-form",
|
||||
"external": false
|
||||
}
|
||||
]
|
||||
}
|
25
src/_data/site.json
Normal file
25
src/_data/site.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"showThemeCredit": true,
|
||||
"name": "Astrolabe CAE",
|
||||
"shortDesc": "Site web de la coopérative Astrolabe CAE",
|
||||
"url": "https:/preprod.astrolabe.coop",
|
||||
"authorEmail": "contacte@astrolabe.coop",
|
||||
"authorHandle": "@AstrolabeCae",
|
||||
"authorName": "Astrolabe CAE",
|
||||
"authorAddress": "34 La Ville Allée",
|
||||
"authorCity": "35630 HEDE BAZOUGES",
|
||||
"authorSocial": {
|
||||
"mastodon": "https://framapiaf.org/@AstrolabeCAE",
|
||||
"twitter": "https://twitter.com/AstrolabeCae",
|
||||
"linkedin": "https://www.linkedin.com/company/astrolabe-cae/"
|
||||
},
|
||||
"designerName": "Yves Gatesoupe",
|
||||
"designerHandle": "/members/yves-gatesoupe/",
|
||||
"illustrators": "Igé Maulana, Leopold Merleau, Visual Glow, Galaxicon, Made, Eucalyp, yurr",
|
||||
"enableThirdPartyComments": false,
|
||||
"maxPostsPerPage": 5,
|
||||
"maxNewsPerPage": 4,
|
||||
"maxProfilePreview": 3,
|
||||
"maxPartnerPerPage": 4,
|
||||
"faviconPath": "/images/favicon.png"
|
||||
}
|
28
src/_data/styleguide.js
Normal file
28
src/_data/styleguide.js
Normal file
@ -0,0 +1,28 @@
|
||||
const tokens = require('./tokens.json');
|
||||
|
||||
module.exports = {
|
||||
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
29
src/_data/tokens.json
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"size-scale": {
|
||||
"base": "1rem",
|
||||
"300": "0.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\""
|
||||
}
|
||||
}
|
30
src/_includes/layouts/base.njk
Normal file
30
src/_includes/layouts/base.njk
Normal file
@ -0,0 +1,30 @@
|
||||
<!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 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>
|
||||
<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>
|
||||
if ('serviceWorker' in navigator) {
|
||||
window.addEventListener('load', () => {
|
||||
navigator.serviceWorker.register('/service-worker.js');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
18
src/_includes/layouts/contact.njk
Normal file
18
src/_includes/layouts/contact.njk
Normal file
@ -0,0 +1,18 @@
|
||||
{% extends 'layouts/base.njk' %}
|
||||
|
||||
{# Intro content #}
|
||||
{% set introHeading = title %}
|
||||
|
||||
{% block content %}
|
||||
<main id="main-content" tabindex="-1">
|
||||
<article class="[ post ] [ h-entry ]">
|
||||
{% include "partials/components/intro.njk" %}
|
||||
<div class="[ post__body ] [ inner-wrapper ] [ leading-loose pad-top-900 pad-bottom-900 text-500 ] [ sf-flow ] [ e-content ]">
|
||||
{{ content | safe }}
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</div>
|
||||
</article>
|
||||
</main>
|
||||
{% endblock %}
|
||||
|
||||
{{ content | safe }}
|
18
src/_includes/layouts/home.njk
Normal file
18
src/_includes/layouts/home.njk
Normal file
@ -0,0 +1,18 @@
|
||||
{% 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/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 %}
|
42
src/_includes/layouts/member.njk
Normal file
42
src/_includes/layouts/member.njk
Normal file
@ -0,0 +1,42 @@
|
||||
{% 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>
|
||||
<strong>site web :</strong>
|
||||
<a href="{{ personalSite }}">{{ personalSite }}</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if socialMastodon %}
|
||||
<a href="{{ socialMastodon }}" 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="#282156"/></svg></a>
|
||||
{% endif %}
|
||||
{% if socialTwitter %}
|
||||
<a href="{{ socialTwitter }}" class="social" 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" fill="#282156"/></svg></a>
|
||||
{% endif %}
|
||||
{% if socialLinkedin %}
|
||||
<a href="{{ socialLinkedin }}" 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="#282156"/></svg></a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="member__bio">
|
||||
{{ content | safe }}
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<a class="return-link" href="/equipe">Voir tous les membres</a>
|
||||
</section>
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
12
src/_includes/layouts/page.njk
Normal file
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
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
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
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
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 %}
|
14
src/_includes/layouts/team.njk
Normal file
14
src/_includes/layouts/team.njk
Normal file
@ -0,0 +1,14 @@
|
||||
{% 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>
|
||||
{% include "partials/components/member-list.njk" %}
|
||||
{% include "partials/components/contact-form.njk" %}
|
||||
</main>
|
||||
{% endblock %}
|
181
src/_includes/macros/form.njk
Normal file
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
4
src/_includes/macros/site.njk
Normal file
@ -0,0 +1,4 @@
|
||||
{# ========================
|
||||
Site-specific Macros
|
||||
======================== #}
|
||||
|
46
src/_includes/partials/components/contact-form.njk
Normal file
46
src/_includes/partials/components/contact-form.njk
Normal file
@ -0,0 +1,46 @@
|
||||
{% from "macros/form.njk" import label, field, select, option, textarea, checkboxes, button %}
|
||||
|
||||
<section class="[ form-container ]">
|
||||
<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>
|
||||
<div class="[ inner-wrapper ]">
|
||||
<h2 id="contact-form" class="[ contact-heading ]">Nous contacter</h2>
|
||||
<form name="contact" method="POST" action="/form/contact-form-handler.php">
|
||||
<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") }}
|
||||
{{ 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"] } ) }}
|
||||
</li>
|
||||
<li class="[ field-list__field-group ] [ full-width ]">
|
||||
{{ label("Votre message", "message") }}
|
||||
{{ textarea( "message", { required: true, autocapitalize: "sentences", spellcheck: "true" } ) }}
|
||||
</li>
|
||||
<li class="[ field-list__field-group ] [ full-width ]">
|
||||
{{ checkboxes("", "subscribe", [ "Je souhaite être tenu au courant de l’actualité Astrolabe"], { description: "" } ) }}
|
||||
</li>
|
||||
<!-- 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>
|
||||
</ol>
|
||||
{{ button("Envoyer") }}
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
16
src/_includes/partials/components/customers.njk
Normal file
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>
|
12
src/_includes/partials/components/intro.njk
Normal file
12
src/_includes/partials/components/intro.njk
Normal file
@ -0,0 +1,12 @@
|
||||
<header class="[ intro ]">
|
||||
<div class="[ wrapper ]">
|
||||
<h1 class="[ intro__heading ]">{{ brandHeading }}</h1>
|
||||
<svg viewBox="0 0 127 237" width="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>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
28
src/_includes/partials/components/member-list.njk
Normal file
28
src/_includes/partials/components/member-list.njk
Normal file
@ -0,0 +1,28 @@
|
||||
<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">
|
||||
{# <div class="img-wrapper"> #}
|
||||
<img src=" {{ item.data.profile }}" alt="photo de {{ item.data.name }}">
|
||||
{# </div> #}
|
||||
<a role="button" href="{{ item.data.url }}" class="btn btn-primary">{{ item.data.name }}
|
||||
<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>
|
||||
<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
|
||||
<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"/></svg>
|
||||
</a>
|
||||
</li>
|
||||
</ol>
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
26
src/_includes/partials/components/nav.njk
Normal file
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
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
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>
|
23
src/_includes/partials/components/posts-list.njk
Normal file
23
src/_includes/partials/components/posts-list.njk
Normal file
@ -0,0 +1,23 @@
|
||||
{% 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 }}">
|
||||
<h3 class="news-list__item-heading">
|
||||
<a href="{{ item.url | url }}" class="news-list__link" rel="bookmark">{{ item.data.title }}</a>
|
||||
</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>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% endif %}
|
60
src/_includes/partials/components/presentation.njk
Normal file
60
src/_includes/partials/components/presentation.njk
Normal file
@ -0,0 +1,60 @@
|
||||
{% 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 <b>logiciel libre</b>. 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 notre gitlab.
|
||||
</p>
|
||||
</div>
|
||||
<div class="side-info">
|
||||
<figure>
|
||||
<img src="/images/gitlab.svg" alt="logo Gitlab" loading="lazy" width="110" height="101">
|
||||
</figure>
|
||||
<a role="button" href="https://framagit.org/astrolabe" class="btn btn-primary btn-icon" target="_blank" rel="noreferrer noopener">Gitlab</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>distributeurs</b> de la solution logicielle <a href="https://www.crealead.com/naega#bootstrap-fieldgroup-nav-item--prsentation" target="_blank" rel="noreferrer noopener">Naega</a>.
|
||||
</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>
|
41
src/_includes/partials/global/meta-info.njk
Normal file
41
src/_includes/partials/global/meta-info.njk
Normal file
@ -0,0 +1,41 @@
|
||||
{% set pageTitle = site.name + ' - ' + title %}
|
||||
{% set pageDesc = '' %}
|
||||
{% set siteTitle = site.name %}
|
||||
{% set currentUrl = site.url + page.url %}
|
||||
|
||||
{% if metaTitle %}
|
||||
{% set pageTitle = metaTitle %}
|
||||
{% endif %}
|
||||
|
||||
{% if metaDesc %}
|
||||
{% set pageDesc = metaDesc %}
|
||||
{% endif %}
|
||||
|
||||
<title>{{ pageTitle }}</title>
|
||||
<link rel="canonical" href="{{ currentUrl }}" />
|
||||
|
||||
<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 metaDesc %}
|
||||
<meta name="description" content="{{ metaDesc }}" />
|
||||
<meta name="twitter:description" content="{{ metaDesc }}" />
|
||||
<meta property="og:description" content="{{ metaDesc }}" />
|
||||
{% 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
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;
|
||||
});
|
||||
});
|
||||
})
|
||||
);
|
||||
});
|
25
src/_includes/partials/global/site-foot.njk
Normal file
25
src/_includes/partials/global/site-foot.njk
Normal file
@ -0,0 +1,25 @@
|
||||
<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 sarter kit <a class="footer-link" href="https://hylia.website/" target="_blank" rel="noreferrer noopener">Hylia</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="">
|
||||
<h3>Mentions légales</h3>
|
||||
<p>Protection des données</p>
|
||||
</div>
|
||||
<div class="">
|
||||
<h3>Contact</h3>
|
||||
<p>{{site.authorName}}</p>
|
||||
<p>{{site.authorAddress}}<br>{{site.authorCity}}</p>
|
||||
<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.twitter}}" class="social" 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" fill="#fff"/></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>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
18
src/_includes/partials/global/site-head.njk
Normal file
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_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/lewebenplus.md
Normal file
5
src/customers/lewebenplus.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'Le Web en plus'
|
||||
thumbnail: '/images/customers/logo-lewebenplus.png'
|
||||
url: 'https://www.lewebenplus.net/'
|
||||
---
|
5
src/customers/naega.md
Normal file
5
src/customers/naega.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'Naega'
|
||||
thumbnail: '/images/customers/logo-naega.png'
|
||||
url: 'https://www.crealead.com/naega'
|
||||
---
|
5
src/customers/smardtv.md
Normal file
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/technicolor.md
Normal file
5
src/customers/technicolor.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
name: 'Technicolor'
|
||||
thumbnail: '/images/customers/logo-technicolor.png'
|
||||
url: 'https://www.technicolor.com/'
|
||||
---
|
17
src/filters/date-filter.js
Normal file
17
src/filters/date-filter.js
Normal file