Compare commits
110 Commits
2022.1.001
...
master
Author | SHA1 | Date | |
---|---|---|---|
df42311429 | |||
90008a1fef | |||
7ce2783bf2 | |||
ae8c57a888 | |||
1c8f370c61 | |||
afe3c0bed6 | |||
b7a4a0c99a | |||
fce5e2abfe | |||
d439c6f030 | |||
a5a368fd31 | |||
c9b071cd8d | |||
58d74e76bb | |||
81045f6d31 | |||
b967bb134e | |||
d184317982 | |||
e2a3ecb1d7 | |||
d45ac2aa06 | |||
49ba9e4d5d | |||
e06b3aa65b | |||
7e2447415f | |||
655e87fa52 | |||
79f42686de | |||
585223d18e | |||
69044e7077 | |||
ed2ccdfc3e | |||
d5fa6c6900 | |||
8948ec3f23 | |||
![]() |
732991213c | ||
![]() |
806f75a5af | ||
![]() |
a388e7952b | ||
![]() |
39cea7859e | ||
21da07eb4c | |||
![]() |
6fb0f69f6f | ||
a5a6476557 | |||
c86a601800 | |||
6372c1a512 | |||
![]() |
6a84ebd8a7 | ||
![]() |
26a91bbedd | ||
![]() |
bfce14f3f5 | ||
04069faa62 | |||
ee7711083b | |||
![]() |
96b1e28d8e | ||
af872f75fd | |||
c0468654cd | |||
0afb2402ab | |||
![]() |
c8e63e28d6 | ||
1cd5741a2d | |||
cb4c54bd3f | |||
e86964980e | |||
![]() |
e46cf3f5a6 | ||
![]() |
ced5a64e2b | ||
008fc40adb | |||
e8dddc7103 | |||
54cadc072f | |||
c6a239608f | |||
![]() |
b530f196c6 | ||
3596338dfb | |||
eebb5ed6b5 | |||
d7a9029a42 | |||
6db8878b3d | |||
45b3b37d89 | |||
![]() |
4fa78d504f | ||
![]() |
3b4571902b | ||
![]() |
e1929dd46b | ||
![]() |
a441986786 | ||
e00c967274 | |||
d7c9d8994e | |||
806d63a4fd | |||
27828625b1 | |||
e1f4433705 | |||
7bf65448d7 | |||
28151c4e2d | |||
d4b99aae41 | |||
18ea7f0938 | |||
1148353c9c | |||
b3969ddad3 | |||
824946e6a0 | |||
![]() |
290ad1d3a9 | ||
![]() |
a689047c23 | ||
1764a3439b | |||
2afd9f05c4 | |||
62fcdd55c7 | |||
![]() |
f1cdd79565 | ||
![]() |
f1607a74f4 | ||
![]() |
4213859932 | ||
999476cdd5 | |||
32486235f0 | |||
63659cdc02 | |||
6254856b6b | |||
5b1564beb6 | |||
fecefb843b | |||
543fe1cb94 | |||
b4868009ad | |||
58935df630 | |||
193aea1587 | |||
86c0df290d | |||
![]() |
494736140d | ||
c41d1835aa | |||
8160e1b6ac | |||
b44f29bfbf | |||
8b1c7d0d3f | |||
41295484a7 | |||
0486904e88 | |||
c36c00a344 | |||
2428e40904 | |||
82b7281125 | |||
![]() |
b4d5a92117 | ||
![]() |
3f047ffbbf | ||
8e0ff70d47 | |||
![]() |
ab3871f032 |
19
.woodpecker/maintenance.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
when:
|
||||||
|
- event: cron
|
||||||
|
cron: update browserlist
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: update browserlist
|
||||||
|
image: node:20-slim
|
||||||
|
commands:
|
||||||
|
- npm ci
|
||||||
|
- npx update-browserslist-db@latest
|
||||||
|
- npm run test
|
||||||
|
- name: push commit
|
||||||
|
image: appleboy/drone-git-push
|
||||||
|
settings:
|
||||||
|
branch: master
|
||||||
|
remote: git@forge.adm.ink:adamas/curriculum.git
|
||||||
|
force: false
|
||||||
|
commit: true
|
||||||
|
commit_message: "dep: updatebrowserslist"
|
28
.woodpecker/workflow.yaml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
when:
|
||||||
|
- event: push
|
||||||
|
branch: master
|
||||||
|
- event: manual
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: test
|
||||||
|
image: node:20-slim
|
||||||
|
commands:
|
||||||
|
- npm ci
|
||||||
|
- npm run test
|
||||||
|
|
||||||
|
- name: build
|
||||||
|
image: node:20-slim
|
||||||
|
commands:
|
||||||
|
- npm run build
|
||||||
|
|
||||||
|
- name: publish
|
||||||
|
image: woodpeckerci/plugin-docker-buildx:5.2.2
|
||||||
|
settings:
|
||||||
|
username: adamas
|
||||||
|
registry: https://forge.adm.ink
|
||||||
|
password:
|
||||||
|
from_secret: DOCKER_PASSWORD
|
||||||
|
repo: forge.adm.ink/adamas/curriculum
|
||||||
|
purge: true
|
||||||
|
compress: true
|
||||||
|
tags: ${CI_COMMIT_TAG}
|
1
CODEOWNERS
Normal file
@ -0,0 +1 @@
|
|||||||
|
* @AdamasFR
|
14
Dockerfile
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
FROM node:20-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
ENV PATH /app/node_modules/.bin:$PATH
|
||||||
|
COPY package.json ./
|
||||||
|
COPY package-lock.json ./
|
||||||
|
RUN npm install --silent
|
||||||
|
RUN npm install react-scripts@5.0.1 -g --silent
|
||||||
|
|
||||||
|
# add app
|
||||||
|
COPY . ./
|
||||||
|
|
||||||
|
# start app
|
||||||
|
CMD ["npm", "start"]
|
70
INSTRUCTIONS.md
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
# Getting Started with Create React App
|
||||||
|
|
||||||
|
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
|
||||||
|
|
||||||
|
## Available Scripts
|
||||||
|
|
||||||
|
In the project directory, you can run:
|
||||||
|
|
||||||
|
### `npm start`
|
||||||
|
|
||||||
|
Runs the app in the development mode.\
|
||||||
|
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
|
||||||
|
|
||||||
|
The page will reload if you make edits.\
|
||||||
|
You will also see any lint errors in the console.
|
||||||
|
|
||||||
|
### `npm test`
|
||||||
|
|
||||||
|
Launches the test runner in the interactive watch mode.\
|
||||||
|
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
|
||||||
|
|
||||||
|
### `npm run build`
|
||||||
|
|
||||||
|
Builds the app for production to the `build` folder.\
|
||||||
|
It correctly bundles React in production mode and optimizes the build for the best performance.
|
||||||
|
|
||||||
|
The build is minified and the filenames include the hashes.\
|
||||||
|
Your app is ready to be deployed!
|
||||||
|
|
||||||
|
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
|
||||||
|
|
||||||
|
### `npm run eject`
|
||||||
|
|
||||||
|
**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
|
||||||
|
|
||||||
|
If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
|
||||||
|
|
||||||
|
Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
|
||||||
|
|
||||||
|
You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
|
||||||
|
|
||||||
|
## Learn More
|
||||||
|
|
||||||
|
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
|
||||||
|
|
||||||
|
To learn React, check out the [React documentation](https://reactjs.org/).
|
||||||
|
|
||||||
|
### Code Splitting
|
||||||
|
|
||||||
|
This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
|
||||||
|
|
||||||
|
### Analyzing the Bundle Size
|
||||||
|
|
||||||
|
This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
|
||||||
|
|
||||||
|
### Making a Progressive Web App
|
||||||
|
|
||||||
|
This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
|
||||||
|
|
||||||
|
### Advanced Configuration
|
||||||
|
|
||||||
|
This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
|
||||||
|
|
||||||
|
### Deployment
|
||||||
|
|
||||||
|
This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
|
||||||
|
|
||||||
|
### `npm run build` fails to minify
|
||||||
|
|
||||||
|
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
|
71
README.md
@ -1,70 +1,11 @@
|
|||||||
# Getting Started with Create React App
|
# anthony-dumas.fr
|
||||||
|
|
||||||
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
|
Bonjour,
|
||||||
|
|
||||||
## Available Scripts
|
Vous trouverez ci-joint le code source de mon portefolio en ligne.
|
||||||
|
|
||||||
In the project directory, you can run:
|
Je vous souhaite une excellente journée,
|
||||||
|
|
||||||
### `npm start`
|
**Anthony Yvon Dumas**
|
||||||
|
|
||||||
Runs the app in the development mode.\
|
Senior Engineer @ Sopra Steria
|
||||||
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
|
|
||||||
|
|
||||||
The page will reload if you make edits.\
|
|
||||||
You will also see any lint errors in the console.
|
|
||||||
|
|
||||||
### `npm test`
|
|
||||||
|
|
||||||
Launches the test runner in the interactive watch mode.\
|
|
||||||
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
|
|
||||||
|
|
||||||
### `npm run build`
|
|
||||||
|
|
||||||
Builds the app for production to the `build` folder.\
|
|
||||||
It correctly bundles React in production mode and optimizes the build for the best performance.
|
|
||||||
|
|
||||||
The build is minified and the filenames include the hashes.\
|
|
||||||
Your app is ready to be deployed!
|
|
||||||
|
|
||||||
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
|
|
||||||
|
|
||||||
### `npm run eject`
|
|
||||||
|
|
||||||
**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
|
|
||||||
|
|
||||||
If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
|
|
||||||
|
|
||||||
Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
|
|
||||||
|
|
||||||
You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
|
|
||||||
|
|
||||||
## Learn More
|
|
||||||
|
|
||||||
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
|
|
||||||
|
|
||||||
To learn React, check out the [React documentation](https://reactjs.org/).
|
|
||||||
|
|
||||||
### Code Splitting
|
|
||||||
|
|
||||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
|
|
||||||
|
|
||||||
### Analyzing the Bundle Size
|
|
||||||
|
|
||||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
|
|
||||||
|
|
||||||
### Making a Progressive Web App
|
|
||||||
|
|
||||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
|
|
||||||
|
|
||||||
### Advanced Configuration
|
|
||||||
|
|
||||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
|
|
||||||
|
|
||||||
### Deployment
|
|
||||||
|
|
||||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
|
|
||||||
|
|
||||||
### `npm run build` fails to minify
|
|
||||||
|
|
||||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
|
|
30
docker-compose.yml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
server:
|
||||||
|
image: forge.adm.ink/adamas/curriculum:latest
|
||||||
|
container_name: anthony-dumas.fr-server
|
||||||
|
networks:
|
||||||
|
- traefik_default
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.portfolio.rule=Host(`anthony-dumas.fr`)"
|
||||||
|
- "traefik.http.routers.portfolio.entrypoints=websecure"
|
||||||
|
- "traefik.http.routers.portfolio.tls.certresolver=myresolver"
|
||||||
|
- "traefik.http.services.portfolio.loadbalancer.server.port=3000"
|
||||||
|
- "traefik.http.middlewares.redirect-to-non-www.redirectregex.regex=^https?://www.anthony-dumas.fr/(.*)"
|
||||||
|
- "traefik.http.middlewares.redirect-to-non-www.redirectregex.replacement=https://anthony-dumas.fr/$${1}"
|
||||||
|
- "traefik.http.middlewares.redirect-to-non-www.redirectregex.permanent=true"
|
||||||
|
- "traefik.http.routers.portfolio.rule=Host(`anthony-dumas.fr`) || Host(`www.anthony-dumas.fr`)"
|
||||||
|
- "traefik.http.routers.portfolio.middlewares=redirect-to-non-www"
|
||||||
|
|
||||||
|
watchtower:
|
||||||
|
image: containrrr/watchtower
|
||||||
|
container_name: watchtower-anthony-dumas.fr
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
command: --interval 30 anthony-dumas.fr-server
|
||||||
|
|
||||||
|
networks:
|
||||||
|
traefik_default:
|
||||||
|
external: true
|
||||||
|
|
14
generate-react-cli.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"usesTypeScript": false,
|
||||||
|
"usesStyledComponents": true,
|
||||||
|
"testLibrary": "None",
|
||||||
|
"component": {
|
||||||
|
"default": {
|
||||||
|
"path": "src/components",
|
||||||
|
"withStyle": true,
|
||||||
|
"withTest": false,
|
||||||
|
"withStory": false,
|
||||||
|
"withLazy": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
28898
package-lock.json
generated
@ -1,17 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "anthony-dumas.fr",
|
"name": "anthony-dumas.fr",
|
||||||
"version": "2022.1.001",
|
"version": "2023.1.001",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@testing-library/jest-dom": "^5.11.6",
|
"@testing-library/jest-dom": "^5.11.6",
|
||||||
"@testing-library/react": "^11.2.2",
|
"@testing-library/react": "^11.2.2",
|
||||||
"@testing-library/user-event": "^12.5.0",
|
"@testing-library/user-event": "^12.5.0",
|
||||||
"bulma": "^0.9.4",
|
"bulma": "^1.0.0",
|
||||||
|
"powerglitch": "^2.3.2",
|
||||||
"react": "^17.0.1",
|
"react": "^17.0.1",
|
||||||
"react-dom": "^17.0.1",
|
"react-dom": "^17.0.1",
|
||||||
"react-intl": "^5.10.9",
|
"react-intl": "^5.10.9",
|
||||||
"react-scripts": "4.0.1",
|
"react-scripts": "^5.0.1",
|
||||||
"sass": "^1.30.0",
|
"sass": "^1.71.1",
|
||||||
"web-vitals": "^0.2.4"
|
"web-vitals": "^0.2.4"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
BIN
public/images/logos/ingroupe.webp
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/images/logos/laclameur.org.webp
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
public/images/logos/soprasteria.co.uk.webp
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
public/images/portfolio/blog.webp
Normal file
After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 12 KiB |
@ -7,7 +7,7 @@
|
|||||||
<meta name="theme-color" content="#326273" />
|
<meta name="theme-color" content="#326273" />
|
||||||
<meta
|
<meta
|
||||||
name="description"
|
name="description"
|
||||||
content="Web site created using create-react-app"
|
content="Anthony Dumas - Programmeur de les Internet."
|
||||||
/>
|
/>
|
||||||
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
||||||
<!--
|
<!--
|
||||||
@ -24,7 +24,7 @@
|
|||||||
work correctly both with client-side routing and a non-root public URL.
|
work correctly both with client-side routing and a non-root public URL.
|
||||||
Learn how to configure a non-root public URL by running `npm run build`.
|
Learn how to configure a non-root public URL by running `npm run build`.
|
||||||
-->
|
-->
|
||||||
<title>Anthony Dumas</title>
|
<title>Anthony Dumas - Portfolio</title>
|
||||||
<!-- Matomo -->
|
<!-- Matomo -->
|
||||||
<script>
|
<script>
|
||||||
var _paq = (window._paq = window._paq || []);
|
var _paq = (window._paq = window._paq || []);
|
||||||
@ -49,15 +49,18 @@
|
|||||||
<noscript>
|
<noscript>
|
||||||
<h1>Ce site requiert Javascript (désolé !)</h1>
|
<h1>Ce site requiert Javascript (désolé !)</h1>
|
||||||
Dirigez vous vers
|
Dirigez vous vers
|
||||||
<a href="https://files.adm.ink/anthony-dumas-cv.pdf"
|
<a
|
||||||
>https://files.adm.ink/anthony-dumas-cv.pdf</a
|
href="https://adamas-cdn.s3.fr-par.scw.cloud/portfolio/anthony-dumas-cv.pdf"
|
||||||
|
>ce lien</a
|
||||||
>
|
>
|
||||||
pour une version PDF.
|
pour une version PDF. Pour me parler directement, n'hésitez pas à
|
||||||
|
m'envoyer un message sur
|
||||||
Pour me parler directement, n'hésitez pas à m'envoyer un message sur <a rel="me" href="https://imaginair.es/@adamas">Mastodon</a>!
|
<a rel="me" href="https://social.adm.ink/@adamas">Mastodon</a>!
|
||||||
</noscript>
|
</noscript>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<script src="https://unpkg.com/ionicons@latest/dist/ionicons.js"></script>
|
<script src="https://unpkg.com/ionicons@7.4.0/dist/ionicons.js"></script>
|
||||||
<a style="display:none" rel="me" href="https://imaginair.es/@adamas">Mastodon</a>
|
<a style="display: none" rel="me" href="https://social.adm.ink/@adamas"
|
||||||
|
>Mastodon</a
|
||||||
|
>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
5
robots.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
User-agent: GPTBot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: ClaudeBot
|
||||||
|
Disallow: /
|
37
src/App.sass
@ -1,37 +0,0 @@
|
|||||||
@charset "utf-8"
|
|
||||||
|
|
||||||
// Import a Google Font
|
|
||||||
@import url('https://fonts.googleapis.com/css?family=Nunito:400,700')
|
|
||||||
|
|
||||||
// Set your brand colors
|
|
||||||
$purple: #8a4d76
|
|
||||||
$pink: #fa7c91
|
|
||||||
$brown: #757763
|
|
||||||
$beige-light: #d0d1cd
|
|
||||||
$beige-lighter: #eff0eb
|
|
||||||
|
|
||||||
// Update Bulma's global variables
|
|
||||||
$family-sans-serif: 'Nunito', sans-serif
|
|
||||||
$grey-dark: $brown
|
|
||||||
$grey-light: $beige-light
|
|
||||||
$primary: $purple
|
|
||||||
$link: $pink
|
|
||||||
$widescreen-enabled: false
|
|
||||||
$fullhd-enabled: false
|
|
||||||
|
|
||||||
// Update some of Bulma's component variables
|
|
||||||
$body-background-color: $beige-lighter
|
|
||||||
$control-border-width: 2px
|
|
||||||
$input-border-color: transparent
|
|
||||||
$input-shadow: none
|
|
||||||
|
|
||||||
// Import only what you need from Bulma
|
|
||||||
@import '../node_modules/bulma/sass/utilities/_all.sass'
|
|
||||||
@import '../node_modules/bulma/sass/base/_all.sass'
|
|
||||||
@import '../node_modules/bulma/sass/elements/button.sass'
|
|
||||||
@import '../node_modules/bulma/sass/elements/container.sass'
|
|
||||||
@import '../node_modules/bulma/sass/elements/form.sass'
|
|
||||||
@import '../node_modules/bulma/sass/elements/title.sass'
|
|
||||||
@import '../node_modules/bulma/sass/components/navbar.sass'
|
|
||||||
@import '../node_modules/bulma/sass/layout/hero.sass'
|
|
||||||
@import '../node_modules/bulma/sass/layout/section.sass'
|
|
@ -1,8 +1,18 @@
|
|||||||
import { render, screen } from '@testing-library/react';
|
import React from 'react';
|
||||||
import App from './App';
|
import { IntlProvider } from 'react-intl';
|
||||||
|
|
||||||
test('renders learn react link', () => {
|
import { render, screen } from '@testing-library/react';
|
||||||
render(<App />);
|
|
||||||
const linkElement = screen.getByText(/learn react/i);
|
import MenuComponent from './App';
|
||||||
expect(linkElement).toBeInTheDocument();
|
import { getTexts } from './services/message.service';
|
||||||
|
|
||||||
|
|
||||||
|
test('renders Anthony Yvon Dumas', async () => {
|
||||||
|
render(<IntlProvider locale={"fr"}
|
||||||
|
defaultLocale={"fr"}
|
||||||
|
messages={getTexts("fr")}>
|
||||||
|
<MenuComponent />
|
||||||
|
</IntlProvider>);
|
||||||
|
expect(await screen.findByText("Anthony Yvon Dumas")).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
@import "main.scss";
|
@use "main.scss";
|
||||||
|
@ -7,40 +7,29 @@ $deep-koamaru: #152528;
|
|||||||
$myrtle-green: #1d353a;
|
$myrtle-green: #1d353a;
|
||||||
$cadet-blue: #25444b;
|
$cadet-blue: #25444b;
|
||||||
$neon-carrot: #142225;
|
$neon-carrot: #142225;
|
||||||
$white: #ffffff;
|
$admink-brand: #f38d68;
|
||||||
|
|
||||||
/**
|
@use "bulma/sass" with (
|
||||||
Variables Bulma
|
$primary: $cadet-blue,
|
||||||
**/
|
$info: $myrtle-green,
|
||||||
$primary: $cadet-blue;
|
$footer-color: $deep-koamaru,
|
||||||
$primary-invert: #fff;
|
$success: $deep-koamaru,
|
||||||
$info: $myrtle-green;
|
$link: $neon-carrot
|
||||||
$info-invert: #fff;
|
);
|
||||||
$footer-color: $deep-koamaru;
|
|
||||||
$success: $deep-koamaru;
|
|
||||||
$link: $neon-carrot;
|
|
||||||
$link-hover: "";
|
|
||||||
|
|
||||||
html {
|
html {
|
||||||
background-color: $primary;
|
background-color: $myrtle-green;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
@import "../../node_modules/bulma/bulma";
|
|
||||||
|
|
||||||
#idCard {
|
#idCard {
|
||||||
.hero-body {
|
.hero-body {
|
||||||
padding-bottom: 2rem;
|
padding-bottom: 2rem;
|
||||||
padding-top: 2rem;
|
padding-top: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
// permet de re-aligner les tags avec les subtitles
|
|
||||||
.tags {
|
|
||||||
margin-top: -1.25rem;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// retire les barres de scroll des panneaux experience/education
|
// retire les barres de scroll des panneaux experience/education
|
||||||
@ -49,7 +38,7 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
footer {
|
footer {
|
||||||
background-color: $footer-color !important;
|
background-color: $deep-koamaru !important;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,12 +77,12 @@ section#contact .button {
|
|||||||
|
|
||||||
//
|
//
|
||||||
footer small {
|
footer small {
|
||||||
color: $white;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Photo de Profil
|
// Photo de Profil
|
||||||
#photoProfil {
|
#photoProfil {
|
||||||
background-color: $primary;
|
background-color: $myrtle-green;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tile.is-vertical {
|
.tile.is-vertical {
|
||||||
@ -111,3 +100,7 @@ footer small {
|
|||||||
text-align: left;
|
text-align: left;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.title a {
|
||||||
|
color: $admink-brand !important;
|
||||||
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import './ButtonIcon.scss';
|
import './ButtonIcon.scss';
|
||||||
|
|
||||||
import React, { Component } from '../../../node_modules/react';
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
|
||||||
export default class ButtonIcon extends Component {
|
export default class ButtonIcon extends Component {
|
||||||
@ -11,7 +11,7 @@ export default class ButtonIcon extends Component {
|
|||||||
render() {
|
render() {
|
||||||
return <a rel="noopener noreferrer me" href={this.props.lien} target="_blank">
|
return <a rel="noopener noreferrer me" href={this.props.lien} target="_blank">
|
||||||
<button className="button" aria-label="Bouton {this.props.aria-label}">
|
<button className="button" aria-label="Bouton {this.props.aria-label}">
|
||||||
<span class="icon">
|
<span className="icon">
|
||||||
<ion-icon name={this.props.icon}></ion-icon>
|
<ion-icon name={this.props.icon}></ion-icon>
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import './ContactButton.scss';
|
import './ContactButton.scss';
|
||||||
|
|
||||||
import React, { Component } from '../../../node_modules/react';
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
|
||||||
// import { connect } from "react-redux";
|
// import { connect } from "react-redux";
|
||||||
@ -13,10 +13,10 @@ export default class ContactButton extends Component {
|
|||||||
// }
|
// }
|
||||||
render() {
|
render() {
|
||||||
const data = this.props.data;
|
const data = this.props.data;
|
||||||
return <div class="column is-3">
|
return <div className="column is-3">
|
||||||
<a target="_blank" rel="noreferrer noopener" href={data.url} class="hide button is-large is-fullw-mobile"
|
<a target="_blank" rel="noreferrer noopener" href={data.url} className="hide button is-large is-fullw-mobile"
|
||||||
title={`Go to ${data.title}`}>
|
title={`Go to ${data.title}`}>
|
||||||
<span class="icon">
|
<span className="icon">
|
||||||
<ion-icon name={data.icon}></ion-icon>
|
<ion-icon name={data.icon}></ion-icon>
|
||||||
</span>
|
</span>
|
||||||
<span>{data.title}</span>
|
<span>{data.title}</span>
|
||||||
|
@ -1,39 +1,40 @@
|
|||||||
import React, {Component} from '../../../node_modules/react';
|
import './ContactCard.scss';
|
||||||
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
import { injectIntl } from 'react-intl';
|
import { injectIntl } from 'react-intl';
|
||||||
|
|
||||||
import './ContactCard.scss'
|
|
||||||
|
|
||||||
import ContactButton from '../ContactButton/index';
|
import ContactButton from '../ContactButton/index';
|
||||||
|
|
||||||
|
|
||||||
// import { connect } from "react-redux";
|
// import { connect } from "react-redux";
|
||||||
// import { bindActionCreators } from "redux";
|
// import { bindActionCreators } from "redux";
|
||||||
// import * as contactCardActions from "../../store/contactCard/actions";
|
// import * as contactCardActions from "../../store/contactCard/actions";
|
||||||
class ContactCard extends Component {
|
class ContactCard extends Component {
|
||||||
// constructor(props) {
|
// constructor(props) {
|
||||||
// super(props);
|
// super(props);
|
||||||
// this.state = {};
|
// this.state = {};
|
||||||
// }
|
// }
|
||||||
render() {
|
render() {
|
||||||
const contactCardMessage = this.props.intl.messages.contactCard;
|
const contactCardMessage = this.props.intl.messages.contactCard;
|
||||||
return <section class="hero is-info dontPrint" id="contact">
|
return <section className="hero is-info dontPrint" id="contact">
|
||||||
<div class="hero-body">
|
<div className="hero-body">
|
||||||
<div class="container">
|
<div className="container">
|
||||||
<h1 class="title">
|
<h1 className="title">
|
||||||
{contactCardMessage.title}
|
{contactCardMessage.title}
|
||||||
</h1>
|
</h1>
|
||||||
<h2 class="subtitle">
|
<h2 className="subtitle">
|
||||||
{contactCardMessage.subtitle}
|
{contactCardMessage.subtitle}
|
||||||
</h2>
|
</h2>
|
||||||
<div class="columns">
|
<div className="columns">
|
||||||
{contactCardMessage.ways.map(function(button, index){
|
{contactCardMessage.ways.map(function (button, index) {
|
||||||
return <ContactButton
|
return <ContactButton key={index}
|
||||||
data={button}/>;
|
data={button} />;
|
||||||
})}
|
})}
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>;
|
</section>;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export default injectIntl(ContactCard)
|
export default injectIntl(ContactCard)
|
@ -1,9 +1,9 @@
|
|||||||
import React, {Component} from '../../../node_modules/react';
|
import './ExperienceCard.scss';
|
||||||
import './ExperienceCard.scss'
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import ExperienceSlimSpanWrapper from '../ExperienceSlimSpan/ExperienceSlimSpan';
|
||||||
|
|
||||||
// import { connect } from "react-redux";
|
|
||||||
// import { bindActionCreators } from "redux";
|
|
||||||
// import * as MenuComponentActions from "../../store/MenuComponent/actions";
|
|
||||||
|
|
||||||
export default class ExperienceCard extends Component {
|
export default class ExperienceCard extends Component {
|
||||||
// constructor(props) {
|
// constructor(props) {
|
||||||
@ -13,36 +13,39 @@ export default class ExperienceCard extends Component {
|
|||||||
render() {
|
render() {
|
||||||
var data = this.props.data;
|
var data = this.props.data;
|
||||||
var imgSrc = data.logo;
|
var imgSrc = data.logo;
|
||||||
return <div class="card-content">
|
return <div className="card-content">
|
||||||
<div class="media">
|
<div className="media">
|
||||||
<div class="media-left">
|
<div className="media-left">
|
||||||
<a href={data.url} target="_blank" rel="noreferrer">
|
<a href={data.url} target="_blank" rel="noreferrer">
|
||||||
<figure class="image is-48x48">
|
<figure className="image is-48x48">
|
||||||
<img src={imgSrc} alt="Logo Entreprise"/>
|
<img src={imgSrc} alt="Logo Entreprise" />
|
||||||
</figure>
|
</figure>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="media-content">
|
<div className="media-content">
|
||||||
<p class="title is-4">{data.occupation}</p>
|
<p className="title is-4">{data.occupation}</p>
|
||||||
<p class="subtitle is-6">{data.entreprise} - {data.location} - {data.duration}</p>
|
<p className="subtitle is-6"><strong>{data.entreprise}</strong> - {data.location} - {data.duration}</p>
|
||||||
<div class="tags">
|
<div className="tags">
|
||||||
{data.tags.map(function(name, index){
|
{data.tags.map(function (name, index) {
|
||||||
return <span key={ index } class="tag">{name}</span>;
|
return <span key={index} className="tag">{name}</span>;
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div className='description content'>
|
||||||
</div>
|
<div dangerouslySetInnerHTML={{ __html: data.description }} />
|
||||||
<div class="content">
|
</div>
|
||||||
{data.description}
|
{data.missions ?
|
||||||
</div>
|
data.missions.map(function (mission, index) {
|
||||||
{data.commentaire ? <div class="comment">
|
return <ExperienceSlimSpanWrapper key={index}
|
||||||
{data.commentaire}
|
data={mission} />;
|
||||||
</div> : ''}
|
}) : ''
|
||||||
|
|
||||||
</div>
|
}
|
||||||
|
{data.commentaire ? <div className="comment">
|
||||||
|
{data.commentaire}
|
||||||
|
</div> : ''}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// export default connect(
|
|
||||||
// ({ MenuComponent }) => ({ ...MenuComponent }),
|
|
||||||
// dispatch => bindActionCreators({ ...MenuComponentActions }, dispatch)
|
|
||||||
// )( MenuComponent );
|
|
@ -1,4 +1,28 @@
|
|||||||
.comment{
|
.comment {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
margin-top: -25px;
|
margin-top: -25px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// permet de re-aligner les tags avec les subtitles
|
||||||
|
.tags,
|
||||||
|
.description,
|
||||||
|
.comment {
|
||||||
|
margin-top: -1.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-content {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mission.card-content {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mission .media {
|
||||||
|
border-top-style: none;
|
||||||
|
align-items: self-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mission div.media {
|
||||||
|
padding-top: 2px;
|
||||||
|
}
|
||||||
|
23
src/components/ExperienceSlimSpan/ExperienceSlimSpan.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
|
||||||
|
export default class ExperienceSlimSpan extends Component {
|
||||||
|
render() {
|
||||||
|
var data = this.props.data;
|
||||||
|
var imgSrc = data.logo;
|
||||||
|
return <div className="mission card-content">
|
||||||
|
<div className="media">
|
||||||
|
<div className="media-left">
|
||||||
|
<a href={data.url} target="_blank" rel="noreferrer">
|
||||||
|
<figure className="image is-24x24">
|
||||||
|
<img src={imgSrc} alt="Logo Entreprise" />
|
||||||
|
</figure>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div className="media-content">
|
||||||
|
<p className="subtitle is-6">{data.occupation} {data.situation} <strong>{data.entreprise}</strong> - {data.duration}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
};
|
@ -1,9 +1,10 @@
|
|||||||
import './FooterCard.scss';
|
import './FooterCard.scss';
|
||||||
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
import { injectIntl } from 'react-intl';
|
import { injectIntl } from 'react-intl';
|
||||||
|
|
||||||
import React, { Component } from '../../../node_modules/react';
|
|
||||||
import bulmaLogo from '../../images/made-with-bulma.webp';
|
import bulmaLogo from '../../images/made-with-bulma.webp';
|
||||||
|
import scalewayLogo from '../../images/scaleway_logo.webp';
|
||||||
|
|
||||||
|
|
||||||
// import { connect } from "react-redux";
|
// import { connect } from "react-redux";
|
||||||
@ -16,17 +17,17 @@ class FooterCard extends Component {
|
|||||||
// }
|
// }
|
||||||
render() {
|
render() {
|
||||||
const footerMessage = this.props.intl.messages.footer;
|
const footerMessage = this.props.intl.messages.footer;
|
||||||
return <footer class="footer has-text-centered dontPrint">
|
return <footer className="footer has-text-centered dontPrint">
|
||||||
<div class="container">
|
<div className="container">
|
||||||
<div class="columns">
|
<div className="columns">
|
||||||
<div class="column is-8-desktop is-offset-2-desktop">
|
<div className="column is-8-desktop is-offset-2-desktop">
|
||||||
<p>
|
<p>
|
||||||
<strong class="has-text-weight-semibold">
|
<strong className="has-text-weight-semibold">
|
||||||
anthony-dumas.fr
|
anthony-dumas.fr
|
||||||
</strong>
|
</strong>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<small class="sosumi">
|
<small className="sosumi">
|
||||||
{footerMessage.legalNotice}
|
{footerMessage.legalNotice}
|
||||||
</small>
|
</small>
|
||||||
</p>
|
</p>
|
||||||
@ -37,8 +38,8 @@ class FooterCard extends Component {
|
|||||||
<img src={bulmaLogo} alt="Made with Bulma" width="128" height="24" />
|
<img src={bulmaLogo} alt="Made with Bulma" width="128" height="24" />
|
||||||
</a>
|
</a>
|
||||||
<br />
|
<br />
|
||||||
<a rel="noopener noreferrer" href="https://www.linode.com/" aria-label="Link to Linode.com" id="linode-logo" target="_blank">
|
<a rel="noopener noreferrer" href="https://www.scaleway.com/fr/" aria-label="Link to scaleway.com" id="scaleway-logo" target="_blank">
|
||||||
<svg viewBox="0 0 230 90" width="115" height="30"><g fill="#FFF"><path d="M93.8 27.8l5.8-1.4v28c0 3.1.9 4.9 2.7 5.5-.9 1.7-2.4 2.6-4.6 2.6-2.6 0-4-1.8-4-5.5V27.8zM108.4 62V41.8h-3.2V37h9.1v25h-5.9zm3-34.6c.9 0 1.7.3 2.4 1s1 1.5 1 2.4c0 .9-.3 1.7-1 2.4s-1.5 1-2.4 1c-.9 0-1.7-.3-2.4-1s-1-1.5-1-2.4c0-.9.3-1.7 1-2.4s1.5-1 2.4-1zM137.1 62V47.6c0-2.1-.4-3.7-1.2-4.6-.8-1-2.1-1.5-4-1.5-.9 0-1.8.2-2.7.7-1 .5-1.7 1.1-2.3 1.8v18h-5.8V37.1h4.2l1.1 2.3c1.6-1.9 3.9-2.8 7-2.8 3 0 5.3.9 7 2.7 1.7 1.8 2.6 4.3 2.6 7.4V62h-5.9zM147.5 49.5c0-3.8 1.1-6.9 3.3-9.3 2.2-2.4 5.1-3.6 8.7-3.6 3.8 0 6.7 1.1 8.8 3.4 2.1 2.3 3.1 5.4 3.1 9.4s-1.1 7.1-3.2 9.5c-2.1 2.3-5 3.5-8.8 3.5-3.8 0-6.7-1.2-8.8-3.5-2-2.4-3.1-5.5-3.1-9.4zm6.1 0c0 5.5 2 8.2 5.9 8.2 1.8 0 3.2-.7 4.3-2.1 1.1-1.4 1.6-3.5 1.6-6.1 0-5.4-2-8.1-5.9-8.1-1.8 0-3.3.7-4.3 2.1-1.1 1.4-1.6 3.4-1.6 6zM192.1 62v-1.5c-.5.5-1.3 1-2.4 1.4-1.1.4-2.3.6-3.6.6-3.5 0-6.2-1.1-8.2-3.3-2-2.2-3-5.3-3-9.2 0-3.9 1.1-7.1 3.4-9.6s5.1-3.7 8.6-3.7c1.9 0 3.6.4 5.2 1.2v-10l5.8-1.4V62h-5.8zm0-19c-1.2-1-2.5-1.5-3.9-1.5-2.3 0-4.1.7-5.4 2.1-1.3 1.4-1.9 3.5-1.9 6.1 0 5.2 2.5 7.8 7.5 7.8.6 0 1.2-.2 2.1-.5.8-.3 1.3-.7 1.6-1V43zM226 51.3h-17.8c.1 2 .8 3.5 2 4.6 1.3 1.1 2.9 1.7 5.1 1.7 2.6 0 4.7-.7 6-2.1l2.3 4.4c-2 1.7-5.1 2.5-9.2 2.5-3.8 0-6.8-1.1-9-3.3-2.2-2.2-3.3-5.3-3.3-9.3 0-3.9 1.2-7.1 3.6-9.5 2.4-2.4 5.3-3.6 8.7-3.6 3.6 0 6.5 1.1 8.7 3.2 2.2 2.2 3.3 4.9 3.3 8.2.1.7-.1 1.7-.4 3.2zm-17.6-4.4h12.2c-.4-3.6-2.4-5.5-6-5.5-3.3.1-5.4 1.9-6.2 5.5z"></path></g><path fill="#004712" d="M65.9 47.4l-1 11.5-3.3-2.3.4-5.8v-.1-.1l-.1-.1-.1-.1-7.1-4.7.1-5.1 11.1 6.8zM48.5 59.9L43.4 56v.9c0 .2-.1.4-.2.5L39.4 60l4.2 3.4.1.1v.2l.2 4 4.7 3.9-.1-11.7zm-32.1 5l2.4 11.5 9.9 10.5L27 75.3 16.4 64.9zm9.3 1.7l-2.4-16.1-12-10 3.2 15.6 11.2 10.5zm-3.8-26l-3.3-22.8L4.8 9.2l4.5 21.5 12.6 9.9z"></path><path fill="#00B259" d="M75.7 41.2l-1.5 10.9-8.2 6.6 1-11.2 8.7-6.3zM49.6 59.9l.1 11.8 10.5-8.4.7-11.5-11.3 8.1zm-6.8 4.8L28 75.3l1.8 12.2 13.4-10.7-.4-12.1zm-.4-8l-.7-16-17.3 9.9 2.4 16.6 15.6-10.5zm-1.1-25.3l-.9-21.6-20.8 8L23 41l18.3-9.6z"></path><path d="M76.9 40c0-.1 0-.1 0 0v-.2s0-.1-.1-.1c0 0-.1 0-.1-.1l-12-6.7c-.2-.1-.4-.1-.5 0L54 39.1h-.1v.6l-.1 5.4-4.1-2.7c-.2-.1-.4-.1-.6 0L43 45.8l-.3-6v-.1-.1-.1-.1-.1h-.1l-6.2-4.1 5.8-3c.2-.1.3-.3.3-.5L41.4 9v-.1s0-.1-.1-.1c0 0 0-.1-.1-.1L25.5 1.1c-.1-.1-.2-.1-.3-.1L3.9 7.6s-.1 0-.1.1c0 0-.1 0-.1.1v.6l4.7 22.9c0 .1.1.2.2.3l6.4 5-4.7 2.2s-.1 0-.1.1c0 0 0 .1-.1.1v.2l3.6 17.2c0 .1.1.2.2.3l4.5 4.2-3 1.8-.1.1s0 .1-.1.1V63.2L18 76.5c0 .1.1.2.1.3l10.9 12h.1s.1 0 .1.1h.5l14.4-11.5c.1-.1.2-.3.2-.4l-.3-7.9 4.8 4s.1 0 .1.1h.5L61 64c.1-.1.2-.2.2-.4l.4-5.8 3.5 2.4h.4s.1 0 .1-.1l9.4-7.5c.1-.1.2-.2.2-.3L76.9 40c0 .1 0 .1 0 0zM66 58.7l1-11.2 8.8-6.3-1.5 10.9-8.3 6.6zm-4.4-2.1l.4-5.8v-.1-.1l-.1-.1-.1-.1-7.1-4.7.1-5.1 11.1 6.9-1 11.5-3.3-2.4zm-1.5 6.7l-10.5 8.4-.1-11.8 11.3-8.1-.7 11.5zM43.3 76.8L29.8 87.5 28 75.3l14.7-10.5.6 12zm-24.6-.4l-2.4-11.5L27 75.3l1.7 11.6-10-10.5zm-.2-58.6l3.3 22.8-12.5-9.9L4.8 9.2l13.7 8.6zm21.9-8l.9 21.6L23 41l-3.4-23.2 20.8-8zm2 46.9L26.8 67.1l-2.4-16.6 17.3-9.9.7 16.1zm-19.1-6.1l2.4 16.1-11.2-10.6-3.2-15.6 12 10.1zm20.5 13.1v-.1-.1l-.1-.1-4.2-3.4 3.8-2.6c.2-.1.2-.3.2-.5V56l5.1 3.9.1 11.8-4.7-3.9-.2-4.1z"></path></svg>
|
<img src={scalewayLogo} alt="Powered by Scaleway" width="128" height="24" />
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import './MainCard.scss';
|
import './MainCard.scss';
|
||||||
|
|
||||||
|
import { PowerGlitch } from 'powerglitch';
|
||||||
|
import React, { Component } from 'react';
|
||||||
import { FormattedMessage, injectIntl } from 'react-intl';
|
import { FormattedMessage, injectIntl } from 'react-intl';
|
||||||
|
|
||||||
import React, { Component } from '../../../node_modules/react';
|
|
||||||
import headshotFond from '../../images/headshot_fond.webp';
|
import headshotFond from '../../images/headshot_fond.webp';
|
||||||
import headshotMain from '../../images/headshot_main.webp';
|
import headshotMain from '../../images/headshot_main.webp';
|
||||||
import ButtonIcon from '../ButtonIcon/index';
|
import ButtonIcon from '../ButtonIcon/index';
|
||||||
@ -10,51 +11,84 @@ import ExperienceCard from '../ExperienceCard/index';
|
|||||||
|
|
||||||
|
|
||||||
class MainCard extends Component {
|
class MainCard extends Component {
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
PowerGlitch.glitch('#photoProfil img',
|
||||||
|
{
|
||||||
|
playMode: 'hover',
|
||||||
|
hideOverflow: true,
|
||||||
|
timing: {
|
||||||
|
duration: 1000,
|
||||||
|
iterations: 15,
|
||||||
|
easing: 'ease-in-out',
|
||||||
|
},
|
||||||
|
glitchTimeSpan: {
|
||||||
|
start: 0.0,
|
||||||
|
end: 0.7,
|
||||||
|
},
|
||||||
|
shake: {
|
||||||
|
velocity: 10,
|
||||||
|
amplitudeX: 0.4,
|
||||||
|
amplitudeY: 0.4,
|
||||||
|
},
|
||||||
|
slice: {
|
||||||
|
count: 4,
|
||||||
|
velocity: 10,
|
||||||
|
minHeight: 0.02,
|
||||||
|
maxHeight: 0.40,
|
||||||
|
hueRotate: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
render() {
|
render() {
|
||||||
var metaThemeColor = document.querySelector("meta[name=theme-color]");
|
var metaThemeColor = document.querySelector("meta[name=theme-color]");
|
||||||
metaThemeColor.setAttribute("content", window.matchMedia('(prefers-color-scheme: dark)').matches ? "#25444b" : "#5c9ead");
|
if (metaThemeColor !== null) {
|
||||||
|
metaThemeColor.setAttribute("content", window.matchMedia('(prefers-color-scheme: dark)').matches ? "#25444b" : "#5c9ead");
|
||||||
|
}
|
||||||
const experienceCardMessage = this.props.intl.messages.experienceCard;
|
const experienceCardMessage = this.props.intl.messages.experienceCard;
|
||||||
return <section id="idCard" class="hero is-medium is-info">
|
|
||||||
<div class="hero-body">
|
return <section id="idCard" className="hero is-medium is-info">
|
||||||
<div class="container">
|
<div className="hero-body">
|
||||||
<div class="columns">
|
<div className="container">
|
||||||
<div class="column is-2 is-hidden-touch is-hidden-desktop-only dontPrint"></div>
|
<div className="columns">
|
||||||
<div id="photosAndButtons" class="column is-3-widescreen is-4-tablet is-success">
|
<div className="column is-1 is-hidden-touch is-hidden-desktop-only dontPrint"></div>
|
||||||
<div class="card">
|
<div id="photosAndButtons" className="column is-3-widescreen is-4-tablet is-success">
|
||||||
<div class="card-image">
|
<div className="card">
|
||||||
<figure id="photoProfil" class="image">
|
<div className="card-image">
|
||||||
<img fetchpriority="high" class="background" src={headshotFond} alt="Anthony Dumas" />
|
<figure id="photoProfil" className="image" onMouseOver={this.glitching} >
|
||||||
<img fetchpriority="high" class="actor" src={headshotMain} alt="Anthony Dumas" />
|
<img fetchpriority="high" className="background" src={headshotFond} alt="Anthony Dumas" />
|
||||||
|
<img fetchpriority="high" className="actor" src={headshotMain} alt="Anthony Dumas" />
|
||||||
</figure>
|
</figure>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-content">
|
<div className="card-content">
|
||||||
<div class="media">
|
<div className="media">
|
||||||
<div class="media-content">
|
<div className="media-content">
|
||||||
<p id="buttonsUnderPhoto" class="field is-grouped">
|
<div id="buttonsUnderPhoto" className="field is-grouped">
|
||||||
<p class="control">
|
<p className="control">
|
||||||
<ButtonIcon
|
<ButtonIcon
|
||||||
icon="logo-github"
|
icon="logo-github"
|
||||||
aria-label="Github"
|
aria-label="Github"
|
||||||
lien="https://github.com/AdamasFR" />
|
lien="https://github.com/AdamasFR" />
|
||||||
</p>
|
</p>
|
||||||
<p class="control">
|
<p className="control">
|
||||||
<ButtonIcon
|
<ButtonIcon
|
||||||
icon="logo-linkedin"
|
icon="logo-linkedin"
|
||||||
aria-label="Linkedin"
|
aria-label="Linkedin"
|
||||||
lien="https://www.linkedin.com/in/anthonyyvondumas/" />
|
lien="https://www.linkedin.com/in/anthonyyvondumas/" />
|
||||||
</p>
|
</p>
|
||||||
<p class="control">
|
<p className="control">
|
||||||
<ButtonIcon
|
<ButtonIcon
|
||||||
icon="logo-mastodon"
|
icon="logo-mastodon"
|
||||||
aria-label="Mastodon"
|
aria-label="Mastodon"
|
||||||
lien="https://imaginair.es/@adamas" />
|
lien="https://social.adm.ink/@adamas" />
|
||||||
</p>
|
</p>
|
||||||
</p>
|
</div>
|
||||||
<p id="boutonCV" class="field">
|
<p id="boutonCV" className="field">
|
||||||
<a rel="noreferrer noopener" target="_blank"
|
<a rel="noreferrer noopener" target="_blank"
|
||||||
href="https://files.adm.ink/anthony-dumas-cv.pdf" >
|
href="https://adamas-cdn.s3.fr-par.scw.cloud/portfolio/anthony-dumas-cv.pdf" >
|
||||||
<button class="button is-fullwidth" aria-label="Bouton Curriculum Vitæ">
|
<button className="button is-fullwidth" aria-label="Bouton Curriculum Vitæ">
|
||||||
<span class="icon">
|
<span className="icon">
|
||||||
<ion-icon name="document-attach-outline"></ion-icon>
|
<ion-icon name="document-attach-outline"></ion-icon>
|
||||||
</span>
|
</span>
|
||||||
<span><FormattedMessage id="curriculumVitaeLink" /></span>
|
<span><FormattedMessage id="curriculumVitaeLink" /></span>
|
||||||
@ -64,22 +98,22 @@ class MainCard extends Component {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="content">
|
<div className="content">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-9-tablet is-7-widescreen" id="experiences">
|
<div className="column is-9-tablet is-7-widescreen" id="experiences">
|
||||||
<span class="title">{experienceCardMessage.title.experience}</span>
|
<span className="title">{experienceCardMessage.title.experience}</span>
|
||||||
{experienceCardMessage.experiences.map(function (experience, index) {
|
{experienceCardMessage.experiences.map(function (experience, index) {
|
||||||
return <ExperienceCard
|
return <ExperienceCard key={index}
|
||||||
data={experience} />;
|
data={experience} />;
|
||||||
})}
|
})}
|
||||||
<span class="title">{experienceCardMessage.title.education}</span>
|
<span className="title">{experienceCardMessage.title.education}</span>
|
||||||
{experienceCardMessage.education.map(function (education, index) {
|
{experienceCardMessage.education.map(function (education, index) {
|
||||||
return <ExperienceCard
|
return <ExperienceCard key={index}
|
||||||
data={education} />;
|
data={education} />;
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
@import "../../_sass/main.scss";
|
|
||||||
|
|
||||||
#photoProfil {
|
#photoProfil {
|
||||||
overflow: clip;
|
overflow: clip;
|
||||||
border: 1px solid #3c3c3c;
|
border: 1px solid #3c3c3c;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import './MenuComponent.scss';
|
import './MenuComponent.scss';
|
||||||
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
import { FormattedMessage, injectIntl } from 'react-intl';
|
import { FormattedMessage, injectIntl } from 'react-intl';
|
||||||
|
|
||||||
import React, { Component } from '../../../node_modules/react';
|
|
||||||
import { URL_add_parameter } from '../../services/parameters.service';
|
import { URL_add_parameter } from '../../services/parameters.service';
|
||||||
|
|
||||||
|
|
||||||
@ -22,21 +22,22 @@ class MenuComponent extends Component {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
const buttonsLanguagesMessage = this.props.intl.messages.global.buttons.languages;
|
const buttonsLanguagesMessage = this.props.intl.messages.global.buttons.languages;
|
||||||
return <section id="menu" class="hero is-primary dontPrint">
|
const currentJob = this.props.intl.messages.experienceCard.experiences[0];
|
||||||
<div class="hero-body">
|
return <section id="menu" className="hero is-primary dontPrint">
|
||||||
<div class="container">
|
<div className="hero-body">
|
||||||
<div class="columns">
|
<div className="container">
|
||||||
<div class="column">
|
<div className="columns">
|
||||||
<h1 class="title">
|
<div className="column">
|
||||||
|
<h1 className="title">
|
||||||
<FormattedMessage id="title" />
|
<FormattedMessage id="title" />
|
||||||
</h1>
|
</h1>
|
||||||
<h2 class="subtitle">
|
<h2 className="subtitle">
|
||||||
<FormattedMessage id="subtitle" />
|
{currentJob.occupation} @ {currentJob.entreprise}
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-hidden-touch">
|
<div className="column is-hidden-touch">
|
||||||
<div id="langButtons">
|
<div id="langButtons">
|
||||||
<div class="buttons">
|
<div className="buttons">
|
||||||
<span className="button is-light" onClick={this.honhonhon} aria-label="Visiter le site en Français">
|
<span className="button is-light" onClick={this.honhonhon} aria-label="Visiter le site en Français">
|
||||||
{buttonsLanguagesMessage.fr}
|
{buttonsLanguagesMessage.fr}
|
||||||
</span>
|
</span>
|
||||||
|
@ -1,25 +1,29 @@
|
|||||||
import React, {Component} from 'react';
|
import './ProjectCard.scss';
|
||||||
import './ProjectCard.scss'
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
|
||||||
export default class ProjectCard extends Component {
|
export default class ProjectCard extends Component {
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const data = this.props.data;
|
const data = this.props.data;
|
||||||
return <div class="tile is-vertical is-4">
|
return <div className="tile is-vertical is-4">
|
||||||
<div class="tile">
|
<div className="tile">
|
||||||
<div class="tile is-parent">
|
<div className="cell">
|
||||||
<article class="tile is-child notification is-info">
|
<article className="box notification is-info">
|
||||||
<p class="title">{data.title}</p>
|
<p className="title">
|
||||||
<a href={data.url} rel="noopener noreferrer" target="_blank">
|
<a href={data.url} rel="noopener noreferrer" target="_blank">{data.title}</a>
|
||||||
<figure class="image is-4by3">
|
</p>
|
||||||
<img src={data.image}
|
<a href={data.url} rel="noopener noreferrer" target="_blank">
|
||||||
alt={data.imgAlt}
|
<figure className="image is-4by3">
|
||||||
title={data.imgTitle} />
|
<img src={data.image}
|
||||||
</figure>
|
alt={data.imgAlt}
|
||||||
</a>
|
title={data.imgTitle} />
|
||||||
</article>
|
</figure>
|
||||||
</div>
|
</a>
|
||||||
</div>
|
</article>
|
||||||
</div>;
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,20 +1,20 @@
|
|||||||
import './ProjectsCard.scss';
|
import './ProjectsCard.scss';
|
||||||
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
import { injectIntl } from 'react-intl';
|
import { injectIntl } from 'react-intl';
|
||||||
|
|
||||||
import React, { Component } from '../../../node_modules/react';
|
|
||||||
import ProjectCard from '../ProjectCard/index';
|
import ProjectCard from '../ProjectCard/index';
|
||||||
|
|
||||||
|
|
||||||
class ProjectsCard extends Component {
|
class ProjectsCard extends Component {
|
||||||
render() {
|
render() {
|
||||||
const projectCardsMessage = this.props.intl.messages.projectCard;
|
const projectCardsMessage = this.props.intl.messages.projectCard;
|
||||||
return <section id="projets" class="hero is-success">
|
return <section id="projets" className="hero is-success">
|
||||||
<div class="hero-body">
|
<div className="hero-body">
|
||||||
<div class="container">
|
<div className="container">
|
||||||
<div class="tile is-ancestor">
|
<div className="grid">
|
||||||
{projectCardsMessage.projects.map(function (projects, index) {
|
{projectCardsMessage.projects.map(function (projects, index) {
|
||||||
return <ProjectCard
|
return <ProjectCard key={index}
|
||||||
data={projects}
|
data={projects}
|
||||||
/>;
|
/>;
|
||||||
})}
|
})}
|
||||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 120 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 347 KiB |
BIN
src/images/scaleway_logo.webp
Normal file
After Width: | Height: | Size: 4.5 KiB |
@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"title": "Anthony Yvon Dumas",
|
"title": "Anthony Yvon Dumas",
|
||||||
"subtitle": "Software Developer @ Harvest",
|
|
||||||
"curriculumVitaeLink": "CV (in .pdf)",
|
"curriculumVitaeLink": "CV (in .pdf)",
|
||||||
"experienceCard": {
|
"experienceCard": {
|
||||||
"title": {
|
"title": {
|
||||||
@ -8,16 +7,36 @@
|
|||||||
"education": "Education"
|
"education": "Education"
|
||||||
},
|
},
|
||||||
"experiences": [
|
"experiences": [
|
||||||
|
{
|
||||||
|
"occupation": "Senior Engineer",
|
||||||
|
"logo": "../../images/logos/soprasteria.co.uk.webp",
|
||||||
|
"url": "https://www.soprasteria.com/",
|
||||||
|
"duration": "since June 2023",
|
||||||
|
"entreprise": "Sopra Steria Group",
|
||||||
|
"location": "Clermont-Ferrand",
|
||||||
|
"description": "Fullstack Developer @ Michelin [since 02/24]<br/>Developer for Imprimerie Nationale [06/23 - 02/24]",
|
||||||
|
"tags": ["Java", "Angular", "Spring", "DevOps", "Linux", "Azure", "Scrum"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"occupation": "Distribution Coordinator",
|
||||||
|
"logo": "../../images/logos/laclameur.org.webp",
|
||||||
|
"url": "https://www.laclameur.org",
|
||||||
|
"duration": "since 2021",
|
||||||
|
"entreprise": "La Clameur (Non-Profit Law 1901)",
|
||||||
|
"location": "remote",
|
||||||
|
"description": "",
|
||||||
|
"tags": ["Notion", "CPanel", "Wordpress", "RSS", "Podcast Distribution"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"occupation": "Software Developer",
|
"occupation": "Software Developer",
|
||||||
"logo": "../../images/logos/harvest.fr.webp",
|
"logo": "../../images/logos/harvest.fr.webp",
|
||||||
"url": "https://www.harvest.fr",
|
"url": "https://www.harvest.fr",
|
||||||
"duration": "(since 2016)",
|
"duration": "July 2016 - June 2023",
|
||||||
"entreprise": "Harvest",
|
"entreprise": "Harvest Group",
|
||||||
"location": "Clermont-Ferrand",
|
"location": "Clermont-Ferrand",
|
||||||
"description": "Development of responsive websites and APIs for wealth management and finance professionals.",
|
"description": "Development of responsive websites and APIs for wealth management and finance professionals.",
|
||||||
"tags": [
|
"tags": [
|
||||||
"Java EE",
|
"Java",
|
||||||
"Angular",
|
"Angular",
|
||||||
"OpenAPI",
|
"OpenAPI",
|
||||||
"jQuery",
|
"jQuery",
|
||||||
@ -65,6 +84,13 @@
|
|||||||
"image": "../../images/portfolio/admPhotos.webp",
|
"image": "../../images/portfolio/admPhotos.webp",
|
||||||
"imgAlt": "A picture of a beautiful town.",
|
"imgAlt": "A picture of a beautiful town.",
|
||||||
"imgTitle": "A picture of a beautiful town."
|
"imgTitle": "A picture of a beautiful town."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Blog",
|
||||||
|
"url": "https://blog.adm.ink/?referer=portfolio",
|
||||||
|
"image": "../../images/portfolio/blog.webp",
|
||||||
|
"imgAlt": "Screenshot of blog.adm.ink, you can see the title of the blog and various links. You can also see a plate of food, I think it was hummous.",
|
||||||
|
"imgTitle": "Screenshot of blog.adm.ink, you can see the title of the blog and various links. You can also see a plate of food, I think it was hummous."
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -85,20 +111,20 @@
|
|||||||
"aria-label": "LinkedIn"
|
"aria-label": "LinkedIn"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Telegram",
|
"title": "Signal",
|
||||||
"url": "https://t.me/adamas_FR",
|
"url": "https://signal.me/#eu/cpQOzblF-DM6sltmP6s58NYmnxMUEQHE-IxRnLPHXXaE7oQJc_JHGrIlVulPwGgu",
|
||||||
"icon": "call-outline",
|
"icon": "call-outline",
|
||||||
"aria-label": "Telegram"
|
"aria-label": "Signal"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Mastodon",
|
"title": "Mastodon",
|
||||||
"url": "https://imaginair.es/@adamas",
|
"url": "https://social.adm.ink/@adamas",
|
||||||
"icon": "logo-mastodon",
|
"icon": "logo-mastodon",
|
||||||
"aria-label": "Mastodon"
|
"aria-label": "Mastodon"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"legalNotice": "© 2014 - 2023 Anthony Dumas."
|
"legalNotice": "© 2014 - 2024 Anthony Dumas."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"title": "Anthony Yvon Dumas",
|
"title": "Anthony Yvon Dumas",
|
||||||
"subtitle": "Software Developer @ Harvest",
|
|
||||||
"curriculumVitaeLink": "CV (.pdf)",
|
"curriculumVitaeLink": "CV (.pdf)",
|
||||||
"experienceCard": {
|
"experienceCard": {
|
||||||
"title": {
|
"title": {
|
||||||
@ -8,22 +7,72 @@
|
|||||||
"education": "Études et diplômes"
|
"education": "Études et diplômes"
|
||||||
},
|
},
|
||||||
"experiences": [
|
"experiences": [
|
||||||
|
{
|
||||||
|
"occupation": "Senior Engineer",
|
||||||
|
"logo": "../../images/logos/soprasteria.co.uk.webp",
|
||||||
|
"url": "https://www.soprasteria.com/",
|
||||||
|
"duration": "depuis 06/2023",
|
||||||
|
"entreprise": "Sopra Steria Group",
|
||||||
|
"location": "Clermont-Ferrand",
|
||||||
|
"tags": [
|
||||||
|
"Java",
|
||||||
|
"Angular",
|
||||||
|
"Spring",
|
||||||
|
"DevOps",
|
||||||
|
"Linux",
|
||||||
|
"Azure",
|
||||||
|
"Scrum"
|
||||||
|
],
|
||||||
|
"missions": [
|
||||||
|
{
|
||||||
|
"entreprise": "Sprint Break",
|
||||||
|
"logo": "../../images/logos/soprasteria.co.uk.webp",
|
||||||
|
"url": "https://www.michelin.fr",
|
||||||
|
"occupation": "Trésorier",
|
||||||
|
"duration": "depuis 03/2025",
|
||||||
|
"situation": "@"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"entreprise": "Michelin",
|
||||||
|
"logo": "../../images/logos/michelin.webp",
|
||||||
|
"url": "https://www.michelin.fr",
|
||||||
|
"occupation": "Fullstack Developer",
|
||||||
|
"duration": "depuis 02/2024",
|
||||||
|
"situation": "@"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"entreprise": "IN Groupe",
|
||||||
|
"logo": "../../images/logos/ingroupe.webp",
|
||||||
|
"url": "https://ingroupe.com/fr/",
|
||||||
|
"occupation": "Maintenance Applicative",
|
||||||
|
"duration": "06/2023 - 02/2024",
|
||||||
|
"situation": "pour"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"occupation": "Responsable Distribution",
|
||||||
|
"logo": "../../images/logos/laclameur.org.webp",
|
||||||
|
"url": "https://www.laclameur.org",
|
||||||
|
"duration": "depuis 2021",
|
||||||
|
"entreprise": "La Clameur (Association Loi 1901)",
|
||||||
|
"location": "en distanciel",
|
||||||
|
"description": "Maintenance du site Internet et des fluxs RSS, communication interne.",
|
||||||
|
"tags": [
|
||||||
|
"CPanel",
|
||||||
|
"Wordpress",
|
||||||
|
"Distribution de Podcast"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"occupation": "Software Developer",
|
"occupation": "Software Developer",
|
||||||
"logo": "../../images/logos/harvest.fr.webp",
|
"logo": "../../images/logos/harvest.fr.webp",
|
||||||
"url": "https://www.harvest.fr",
|
"url": "https://www.harvest.fr",
|
||||||
"duration": "depuis 2016",
|
"duration": "2016 - 2023",
|
||||||
"entreprise": "Harvest",
|
"entreprise": "Harvest Groupe",
|
||||||
"location": "Clermont-Ferrand",
|
"location": "Clermont-Ferrand",
|
||||||
"description": "Développement de simulateurs dédiés au conseil et à la vente de produits bancaires.",
|
"description": "Développement de simulateurs Web dédiés au conseil et à la vente de produits bancaires.",
|
||||||
"tags": [
|
"tags": ["Java", "Angular", "OpenAPI", "Accessibilité", "jQuery", "Spring", "Scrum"]
|
||||||
"Java EE",
|
|
||||||
"Angular",
|
|
||||||
"OpenAPI",
|
|
||||||
"jQuery",
|
|
||||||
"Spring",
|
|
||||||
"Environnement Scrum"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"occupation": "Stagiaire Développeur Internet des Objets",
|
"occupation": "Stagiaire Développeur Internet des Objets",
|
||||||
@ -51,28 +100,18 @@
|
|||||||
"entreprise": "Université d'Auvergne",
|
"entreprise": "Université d'Auvergne",
|
||||||
"location": "Le Puy-en-Velay",
|
"location": "Le Puy-en-Velay",
|
||||||
"description": "Programmation 3D temps réel, Web, infographie 3D, retouche d'image.",
|
"description": "Programmation 3D temps réel, Web, infographie 3D, retouche d'image.",
|
||||||
"tags": ["Unity", "3DSMax", "Photoshop", "C++", "Python", "Web Design"]
|
"tags": ["Web Design", "Unity", "3DSMax", "Photoshop", "C++", "Python", "Gestion de Projet"]
|
||||||
},
|
|
||||||
{
|
|
||||||
"occupation": "L2 Informatique",
|
|
||||||
"logo": "../../images/logos/www.uca.fr.webp",
|
|
||||||
"url": "https://www.uca.fr",
|
|
||||||
"duration": "2016",
|
|
||||||
"entreprise": "Université Clermont-Auvergne",
|
|
||||||
"location": "Clermont-Ferrand",
|
|
||||||
"description": "",
|
|
||||||
"tags": ["Python", "Linux"]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"projectCard": {
|
"projectCard": {
|
||||||
"projects": [
|
"projects": [
|
||||||
{
|
{
|
||||||
"title": "IOT@Michelin",
|
"title": "adamas.dev",
|
||||||
"url": "https://prezi.com/m/o8ey8mmpnkvp/",
|
"url": "https://adamas.dev/?referer=portfolio",
|
||||||
"image": "../../images/portfolio/computerNonSense.webp",
|
"image": "../../images/portfolio/blog.webp",
|
||||||
"imgAlt": "Une photo d'un micro ordinateur dans ma main",
|
"imgAlt": "Capture d'écran de adamas.dev. On peut y voir le logo du blog, ainsi que quelques liens de navigations, ainsi que la photo accompagnant un article, une assiete de houmous.",
|
||||||
"imgTitle": "Une photo d'un micro ordinateur dans ma main"
|
"imgTitle": "Capture d'écran de adamas.dev. On peut y voir le logo du blog, ainsi que quelques liens de navigations, ainsi que la photo accompagnant un article, une assiete de houmous"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "ADM Photographie",
|
"title": "ADM Photographie",
|
||||||
@ -80,6 +119,13 @@
|
|||||||
"image": "../../images/portfolio/admPhotos.webp",
|
"image": "../../images/portfolio/admPhotos.webp",
|
||||||
"imgAlt": "Une photo du village de mon enfance",
|
"imgAlt": "Une photo du village de mon enfance",
|
||||||
"imgTitle": "Une photo du village de mon enfance"
|
"imgTitle": "Une photo du village de mon enfance"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "IOT@Michelin",
|
||||||
|
"url": "https://prezi.com/m/o8ey8mmpnkvp/",
|
||||||
|
"image": "../../images/portfolio/computerNonSense.webp",
|
||||||
|
"imgAlt": "Une photo d'un micro ordinateur dans ma main",
|
||||||
|
"imgTitle": "Une photo d'un micro ordinateur dans ma main"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -100,20 +146,20 @@
|
|||||||
"aria-label": "LinkedIn"
|
"aria-label": "LinkedIn"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Telegram",
|
"title": "Signal",
|
||||||
"url": "https://t.me/adamas_FR",
|
"url": "https://signal.me/#eu/cpQOzblF-DM6sltmP6s58NYmnxMUEQHE-IxRnLPHXXaE7oQJc_JHGrIlVulPwGgu",
|
||||||
"icon": "call-outline",
|
"icon": "call-outline",
|
||||||
"aria-label": "Telegram"
|
"aria-label": "Signal"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Mastodon",
|
"title": "Mastodon",
|
||||||
"url": "https://imaginair.es/@adamas",
|
"url": "https://social.adm.ink/@adamas",
|
||||||
"icon": "logo-mastodon",
|
"icon": "logo-mastodon",
|
||||||
"aria-label": "Mastodon"
|
"aria-label": "Mastodon"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"legalNotice": "© 2014 - 2023 Anthony Dumas."
|
"legalNotice": "© 2014 - 2025 Anthony Yvon Dumas."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
138
src/messages/test.json
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
{
|
||||||
|
"title": "Anthony Yvon Dumas",
|
||||||
|
"curriculumVitaeLink": "CV (.pdf)",
|
||||||
|
"experienceCard": {
|
||||||
|
"title": {
|
||||||
|
"experience": "Expériences professionnelles",
|
||||||
|
"education": "Études et diplômes"
|
||||||
|
},
|
||||||
|
"experiences": [
|
||||||
|
{
|
||||||
|
"occupation": "Ingénieur Logiciel",
|
||||||
|
"logo": "../../images/logos/soprasteria.co.uk.webp",
|
||||||
|
"url": "https://www.soprasteria.com/",
|
||||||
|
"duration": "depuis Juin 2023",
|
||||||
|
"entreprise": "Sopra Steria",
|
||||||
|
"location": "Clermont-Ferrand",
|
||||||
|
"description": "",
|
||||||
|
"tags": ["Java EE"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"occupation": "Software Developer",
|
||||||
|
"logo": "../../images/logos/harvest.fr.webp",
|
||||||
|
"url": "https://www.harvest.fr",
|
||||||
|
"duration": "Juillet 2016 - Juin 2023",
|
||||||
|
"entreprise": "Harvest Groupe",
|
||||||
|
"location": "Clermont-Ferrand",
|
||||||
|
"description": "Développement de simulateurs dédiés au conseil et à la vente de produits bancaires.",
|
||||||
|
"tags": [
|
||||||
|
"Java EE",
|
||||||
|
"Angular",
|
||||||
|
"OpenAPI",
|
||||||
|
"jQuery",
|
||||||
|
"Spring",
|
||||||
|
"Environnement Scrum"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"occupation": "Coordinateur événementiel",
|
||||||
|
"logo": "../../images/logos/laclameur.org.webp",
|
||||||
|
"url": "https://www.laclameur.org",
|
||||||
|
"duration": "depuis 2021",
|
||||||
|
"entreprise": "La Clameur (Association Loi 1901)",
|
||||||
|
"location": "en distanciel",
|
||||||
|
"description": "Coordination des événements de l'association, maintenance du site Internet et des fluxs RSS.",
|
||||||
|
"tags": ["Notion", "CPanel", "Wordpress", "RSS"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"occupation": "Stagiaire Développeur Internet des Objets",
|
||||||
|
"logo": "../../images/logos/michelin.webp",
|
||||||
|
"url": "https://www.michelin.fr",
|
||||||
|
"duration": "2015",
|
||||||
|
"entreprise": "Michelin",
|
||||||
|
"location": "Clermont-Ferrand",
|
||||||
|
"description": "Stage de fin d'étude DUT, etude du marché des objets connectés, création d'un prototype embarqué.",
|
||||||
|
"tags": [
|
||||||
|
"MongoDB",
|
||||||
|
"Node.js",
|
||||||
|
"Word",
|
||||||
|
"Powerpoint",
|
||||||
|
"Environnement Scrum"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"education": [
|
||||||
|
{
|
||||||
|
"occupation": "DUT Informatique - Imagerie Numérique",
|
||||||
|
"logo": "../../images/logos/www.iut-clermont.webp",
|
||||||
|
"url": "https://www.iut-clermont.fr/",
|
||||||
|
"duration": "Promotion 2015",
|
||||||
|
"entreprise": "Université d'Auvergne",
|
||||||
|
"location": "Le Puy-en-Velay",
|
||||||
|
"description": "Programmation 3D temps réel, Web, infographie 3D, retouche d'image.",
|
||||||
|
"tags": ["Unity", "3DSMax", "Photoshop", "C++", "Python", "Web Design"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"occupation": "L2 Informatique",
|
||||||
|
"logo": "../../images/logos/www.uca.fr.webp",
|
||||||
|
"url": "https://www.uca.fr",
|
||||||
|
"duration": "2016",
|
||||||
|
"entreprise": "Université Clermont-Auvergne",
|
||||||
|
"location": "Clermont-Ferrand",
|
||||||
|
"description": "",
|
||||||
|
"tags": ["Python", "Linux"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"projectCard": {
|
||||||
|
"projects": [
|
||||||
|
{
|
||||||
|
"title": "IOT@Michelin",
|
||||||
|
"url": "https://prezi.com/m/o8ey8mmpnkvp/",
|
||||||
|
"image": "../../images/portfolio/computerNonSense.webp",
|
||||||
|
"imgAlt": "Une photo d'un micro ordinateur dans ma main",
|
||||||
|
"imgTitle": "Une photo d'un micro ordinateur dans ma main"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "ADM Photographie",
|
||||||
|
"url": "https://photos.adm.ink/",
|
||||||
|
"image": "../../images/portfolio/admPhotos.webp",
|
||||||
|
"imgAlt": "Une photo du village de mon enfance",
|
||||||
|
"imgTitle": "Une photo du village de mon enfance"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"contactCard": {
|
||||||
|
"title": "Contact",
|
||||||
|
"subtitle": "Vous pouvez me contacter de nombreuses façons !",
|
||||||
|
"ways": [
|
||||||
|
{
|
||||||
|
"title": "Courriel",
|
||||||
|
"url": "mailto:anthony@dumas.cc",
|
||||||
|
"icon": "mail-outline",
|
||||||
|
"aria-label": "Email"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "LinkedIn",
|
||||||
|
"url": "https://www.linkedin.com/in/anthonyyvondumas/",
|
||||||
|
"icon": "logo-linkedin",
|
||||||
|
"aria-label": "LinkedIn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Telegram",
|
||||||
|
"url": "https://t.me/adamas_FR",
|
||||||
|
"icon": "call-outline",
|
||||||
|
"aria-label": "Telegram"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Mastodon",
|
||||||
|
"url": "https://imaginair.es/@adamas",
|
||||||
|
"icon": "logo-mastodon",
|
||||||
|
"aria-label": "Mastodon"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"footer": {
|
||||||
|
"legalNotice": "© 2014 - 2023 Anthony Dumas."
|
||||||
|
}
|
||||||
|
}
|
@ -23,7 +23,11 @@ export const language = function () {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const langJson = function () {
|
export const langJson = function () {
|
||||||
const messageLocalized = i18nConfig.messages[language()];
|
return getTexts(language());
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getTexts = function (lang) {
|
||||||
|
const messageLocalized = i18nConfig.messages[lang];
|
||||||
const messageGlobal = i18nConfig.messages[GLOBAL_MESSAGE_KEY];
|
const messageGlobal = i18nConfig.messages[GLOBAL_MESSAGE_KEY];
|
||||||
const messageMerged = {
|
const messageMerged = {
|
||||||
...messageLocalized,
|
...messageLocalized,
|
||||||
|