1
1
mirror of https://github.com/theoludwig/theoludwig.git synced 2025-05-29 22:37:44 +02:00

Compare commits

...

87 Commits

Author SHA1 Message Date
5c343395df chore(release): 1.3.3 [skip ci] 2021-07-27 19:06:15 +00:00
028815a7b6 fix: sign release commit and backmerge to develop 2021-07-27 21:01:33 +02:00
a2ad591d6d chore(release): 1.3.2 [skip ci] 2021-07-27 18:04:31 +00:00
7087911756 ci(release): add GH_TOKEN 2021-07-27 20:01:21 +02:00
35b1c4169f ci(release): persist-credentials: false 2021-07-27 19:52:24 +02:00
4c351b8179 chore: update message of release commit 2021-07-27 19:35:08 +02:00
701dccc018 fix: include version in release 2021-07-27 19:26:08 +02:00
5133765f94 chore: add Vercel CLI 2021-07-27 19:00:21 +02:00
3b208c6614 fix: disable hover:underline on link of Respository (open source) 2021-07-27 18:31:41 +02:00
52870fd6a4 fix: replace facebook/jest to vercel/styled-jsx 2021-07-27 11:44:44 +00:00
3a278fec10 feat: add version number in footer 2021-07-27 11:36:35 +00:00
669f592a9f build(deps-dev): bump @typescript-eslint/eslint-plugin (#135) 2021-07-27 11:02:51 +02:00
9c0a3ea1af build(deps-dev): bump @types/react from 17.0.14 to 17.0.15 (#134) 2021-07-26 06:50:08 +02:00
fa8d70bf82 build(deps-dev): bump @commitlint/cli from 12.1.4 to 13.1.0 (#129) 2021-07-26 06:49:55 +02:00
3293fd488e build(deps-dev): bump lint-staged from 11.1.0 to 11.1.1 (#130) 2021-07-26 06:49:39 +02:00
426bee09da build(deps-dev): bump tailwindcss from 2.2.6 to 2.2.7 (#133) 2021-07-26 06:49:16 +02:00
dbc6c84895 build(deps-dev): bump @commitlint/config-conventional to 13.1.0 (#128) 2021-07-26 06:48:57 +02:00
fab539c9d7 build(deps-dev): bump @types/node from 16.4.1 to 16.4.3 (#132) 2021-07-26 06:48:32 +02:00
176ab64a37 build(deps-dev): bump markdownlint-cli from 0.27.1 to 0.28.1 (#131) 2021-07-26 06:48:10 +02:00
1b56bbc694 build(deps-dev): bump @types/node from 16.4.0 to 16.4.1 (#126) 2021-07-23 08:11:04 +02:00
0f9a968081 build(deps-dev): bump lint-staged from 11.0.1 to 11.1.0 (#127) 2021-07-23 08:10:52 +02:00
6b9ff4100d build(deps-dev): bump tailwindcss from 2.2.4 to 2.2.6 (#124) 2021-07-22 07:57:57 +02:00
870bc3d26b build(deps-dev): bump postcss from 8.3.5 to 8.3.6 (#125) 2021-07-22 07:55:45 +02:00
41e4b93427 build(deps-dev): bump @typescript-eslint/eslint-plugin (#120) 2021-07-21 12:57:31 +02:00
72ae4ef01d build(deps): bump next-pwa from 5.2.23 to 5.2.24 (#121) 2021-07-21 12:57:20 +02:00
748259b57c build(deps): bump actions/setup-node from 2.2.0 to 2.3.0 (#122) 2021-07-21 12:57:09 +02:00
fafd606c18 build(deps-dev): bump @types/node from 16.3.3 to 16.4.0 (#123) 2021-07-21 12:56:56 +02:00
b8c3022532 build(deps-dev): bump @types/node from 16.3.2 to 16.3.3 (#119) 2021-07-19 11:32:26 +02:00
46adaee53f build(deps-dev): bump eslint from 7.30.0 to 7.31.0 (#118) 2021-07-19 11:32:04 +02:00
508114152c build(deps-dev): bump @types/node from 16.3.1 to 16.3.2 (#116) 2021-07-15 17:19:26 +02:00
b2852d172c build(deps-dev): bump lint-staged from 11.0.0 to 11.0.1 (#115) 2021-07-15 17:19:13 +02:00
16e3b1e465 build(deps): bump node from 16.4.2 to 16.5.0 (#117) 2021-07-15 17:19:01 +02:00
ae610ff816 build(deps-dev): bump @typescript-eslint/eslint-plugin to 4.28.3 (#114) 2021-07-13 23:24:17 +02:00
7c001f3c30 build(deps-dev): bump autoprefixer from 10.3.0 to 10.3.1 (#113) 2021-07-13 23:18:52 +02:00
7eada755e1 build(deps-dev): bump autoprefixer from 10.2.6 to 10.3.0 (#112) 2021-07-12 13:28:27 +02:00
6909304f15 build(deps-dev): bump @types/node from 16.0.3 to 16.3.1 (#111) 2021-07-10 19:07:50 +02:00
25b2f05170 build(deps-dev): bump @types/react from 17.0.13 to 17.0.14 (#107) 2021-07-10 19:06:30 +02:00
0cc83a811c build(deps): bump node from 16.4.0 to 16.4.2 (#106) 2021-07-10 19:06:10 +02:00
78b14c2620 build(deps-dev): bump @types/node from 16.0.0 to 16.0.3 (#110) 2021-07-10 19:05:51 +02:00
eebdf0edd2 build(deps): bump @fontsource/montserrat from 4.4.5 to 4.5.0 (#109) 2021-07-10 19:05:40 +02:00
62e8005081 build(deps-dev): bump @types/jest from 26.0.23 to 26.0.24 (#105) 2021-07-07 19:04:04 +02:00
6473e9da7d build(deps-dev): bump husky from 7.0.0 to 7.0.1 (#104) 2021-07-07 19:03:52 +02:00
1805997f59 build(deps): bump node from 16.3.0 to 16.4.0 (#103) 2021-07-07 19:03:39 +02:00
fb25c12883 build(deps-dev): bump @typescript-eslint/eslint-plugin to 4.28.2 (#102) 2021-07-06 09:02:07 +02:00
849b758fab build(deps): bump next-pwa to 5.2.23 (#101) 2021-07-06 09:01:44 +02:00
ccf5d42c19 feat: add Open source section 2021-07-04 19:56:05 +02:00
2d68ce59ca docs(readme): usage of json instead of TypeScript (About) 2021-07-04 15:42:52 +02:00
4e6531e341 build(deps-dev): bump @types/react from 17.0.11 to 17.0.13 (#98) 2021-07-02 10:39:07 +02:00
8f2d0817ce build(deps-dev): bump husky from 6.0.0 to 7.0.0 (#99) 2021-07-02 10:38:56 +02:00
7674401e7c build(deps-dev): bump @types/node from 15.12.5 to 15.14.0 (#100) 2021-07-02 10:37:50 +02:00
61983dfc4a build(deps): bump actions/setup-node from 2.1.5 to 2.2.0 (#96) 2021-07-01 09:14:38 +02:00
ed47407b7d build(deps-dev): bump typescript from 4.3.4 to 4.3.5 (#97) 2021-07-01 09:00:18 +02:00
0a79754978 build(deps-dev): bump babel-jest to 27.0.6 (#94) 2021-06-29 11:40:39 +02:00
725afecbf3 build(deps-dev): bump jest to 27.0.6 (#95) 2021-06-29 11:39:23 +02:00
1bf79e55e1 build(deps-dev): bump @typescript-eslint/eslint-plugin to 4.28.1 (#93) 2021-06-29 11:38:57 +02:00
3a369c49fa build(deps-dev): bump prettier from 2.3.1 to 2.3.2 (#90) 2021-06-28 12:03:12 +02:00
e78ccf3db4 build(deps-dev): bump @types/node from 15.12.4 to 15.12.5 (#91) 2021-06-28 12:02:52 +02:00
acafe71f31 build(deps): bump next-themes from 0.0.14 to 0.0.15 (#92) 2021-06-28 12:02:15 +02:00
3ef876b737 feat: add GitLab and npm social medias like README 2021-06-24 20:10:53 +02:00
b30bbc99e9 feat: add new Leon portfolio 2021-06-24 19:57:06 +02:00
235c072c21 feat: add new skills 2021-06-24 19:46:44 +02:00
f5bdd85b73 fix: set Divlo in Header in yellow 2021-06-24 18:39:08 +02:00
b81ae5a9a6 fix: replace "My section" to "Section", delete "My" 2021-06-24 18:32:13 +02:00
1ea5e3f323 build(deps-dev): bump tailwindcss to 2.2.4 (#89) 2021-06-24 09:26:46 +02:00
f6eaef54b9 build(deps-dev): bump @testing-library/react to 12.0.0 (#88) 2021-06-24 09:26:31 +02:00
5b14361d74 build(deps-dev): bump eslint-config-next to 11.0.1 (#84) 2021-06-23 13:28:18 +02:00
d1f9c0eb2f build(deps-dev): bump @typescript-eslint/eslint-plugin to 4.28.0 (#83) 2021-06-23 13:28:02 +02:00
95b27abec1 build(deps-dev): bump babel-jest to 27.0.5 (#85) 2021-06-23 13:27:45 +02:00
228e987d8b build(deps): bump next to 11.0.1 (#86) 2021-06-23 13:27:29 +02:00
7c44102afd build(deps-dev): bump jest to 27.0.5 (#87) 2021-06-23 13:27:14 +02:00
b8410e5628 build(deps-dev): bump tailwindcss to 2.2.2 (#81) 2021-06-21 07:05:31 +02:00
d6f0b12b17 build(deps-dev): bump @types/node to 15.12.4 (#80) 2021-06-21 07:04:50 +02:00
b02e31c373 build(deps-dev): bump eslint to 7.29.0 (#82) 2021-06-21 07:04:09 +02:00
e012d41929 build(deps): bump html-react-parser to 1.2.7 (#79) 2021-06-21 07:03:36 +02:00
4bd77b45e4 build(deps-dev): bump tailwindcss to 2.2.0 (#77) 2021-06-18 11:19:52 +02:00
e43f572588 build(deps-dev): bump postcss to 8.3.5 (#78) 2021-06-18 11:18:44 +02:00
9aecb3cab9 build(deps-dev): bump typescript to 4.3.4 (#76) 2021-06-18 11:18:21 +02:00
f1256ab23f build(deps-dev): bump typescript to 4.3.3 (#75) 2021-06-17 12:21:16 +02:00
892bf0e87a build(deps): bump next to 11.0.0 2021-06-15 20:35:52 +02:00
61ef6c5525 build(deps-dev): bump postcss from 8.3.3 to 8.3.4 (#73) 2021-06-15 11:54:11 +02:00
38405d658e build(deps-dev): bump @typescript-eslint/eslint-plugin to 4.27.0 (#72) 2021-06-15 11:54:01 +02:00
f3b7c315f0 build(deps-dev): bump postcss from 8.3.2 to 8.3.3 (#71) 2021-06-14 10:20:21 +02:00
6950286eec chore: fix some imperfections 2021-06-13 01:53:13 +02:00
60f966c493 chore: usage of node >= 14.0.0 2021-06-12 22:31:34 +00:00
7af4d3c512 chore: add devcontainer 2021-06-12 22:30:02 +00:00
d9b53480be build(deps-dev): bump postcss from 8.3.1 to 8.3.2 (#70) 2021-06-11 09:02:51 +02:00
a574a8ffd1 build(deps-dev): bump postcss from 8.3.0 to 8.3.1 (#69) 2021-06-10 08:48:34 +02:00
52 changed files with 6363 additions and 4403 deletions

7
.devcontainer/Dockerfile Normal file
View File

@ -0,0 +1,7 @@
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.163.1/containers/javascript-node/.devcontainer/base.Dockerfile
ARG VARIANT="14-buster"
FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-${VARIANT}
ARG EXTRA_NODE_VERSION=16
RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}"

View File

@ -0,0 +1,24 @@
{
"name": "divlo",
"dockerComposeFile": "./docker-compose.yml",
"service": "workspace",
"workspaceFolder": "/workspace",
"settings": {
"remote.autoForwardPorts": false
},
"extensions": [
"editorconfig.editorconfig",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"divlo.vscode-styled-jsx-syntax",
"divlo.vscode-styled-jsx-languageserver",
"bradlc.vscode-tailwindcss",
"mikestead.dotenv",
"coenraads.bracket-pair-colorizer",
"davidanson.vscode-markdownlint",
"ms-azuretools.vscode-docker"
],
"forwardPorts": [3000],
"postAttachCommand": ["npm", "clean-install"],
"remoteUser": "node"
}

View File

@ -0,0 +1,10 @@
version: '3.0'
services:
workspace:
build:
context: './'
dockerfile: './Dockerfile'
volumes:
- '..:/workspace:cached'
command: 'sleep infinity'

View File

@ -1,11 +1,12 @@
.vscode .vscode
.git .git
.next .env
build build
.next
coverage coverage
dist
node_modules node_modules
out tmp
**/workbox-*.js temp
**/sw.js .DS_Store
**/__test__/** .lighthouseci
.vercel

View File

@ -4,3 +4,4 @@ node_modules
next-env.d.ts next-env.d.ts
**/workbox-*.js **/workbox-*.js
**/sw.js **/sw.js
.vercel

View File

@ -1,6 +1,11 @@
{ {
"extends": ["standard-with-typescript", "eslint-config-prettier"], "extends": [
"plugins": ["eslint-plugin-prettier"], "standard-with-typescript",
"next",
"next/core-web-vitals",
"prettier"
],
"plugins": ["prettier"],
"parserOptions": { "parserOptions": {
"project": "./tsconfig.json" "project": "./tsconfig.json"
}, },

View File

@ -1,11 +1,4 @@
<!-- <!-- Please first discuss the change you wish to make via issue before making a change. It might avoid a waste of your time. -->
Please first discuss the change you wish to make via issue before making a change. It might avoid a waste of your time.
Before submitting your contribution, please take a moment to review this document:
https://github.com/Divlo/Divlo/blob/master/.github/CONTRIBUTING.md
-->
## What changes this PR introduce? ## What changes this PR introduce?

View File

@ -2,13 +2,12 @@ name: 'Divlo'
on: on:
push: push:
branches: [master] branches: [master, develop]
pull_request: pull_request:
branches: [master] branches: [master, develop]
jobs: jobs:
analyze: analyze:
name: 'Analyze'
runs-on: 'ubuntu-latest' runs-on: 'ubuntu-latest'
strategy: strategy:
@ -33,18 +32,13 @@ jobs:
- uses: 'actions/checkout@v2.3.4' - uses: 'actions/checkout@v2.3.4'
- name: 'Use Node.js' - name: 'Use Node.js'
uses: 'actions/setup-node@v2.1.5' uses: 'actions/setup-node@v2.3.0'
with: with:
node-version: '14.x' node-version: '16.x'
cache: 'npm'
- name: 'Cache dependencies'
uses: 'actions/cache@v2.1.6'
with:
path: '.npm'
key: ${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
- name: 'Install' - name: 'Install'
run: 'npm ci --cache .npm --prefer-offline' run: 'npm install'
- run: 'npm run lint:commit -- --to "${{ github.sha }}"' - run: 'npm run lint:commit -- --to "${{ github.sha }}"'
- run: 'npm run lint:docker' - run: 'npm run lint:docker'
@ -58,24 +52,21 @@ jobs:
- uses: 'actions/checkout@v2.3.4' - uses: 'actions/checkout@v2.3.4'
- name: 'Use Node.js' - name: 'Use Node.js'
uses: 'actions/setup-node@v2.1.5' uses: 'actions/setup-node@v2.3.0'
with: with:
node-version: '14.x' node-version: '16.x'
cache: 'npm'
- name: 'Cache dependencies'
uses: 'actions/cache@v2.1.6'
with:
path: '.npm'
key: ${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
- name: 'Install' - name: 'Install'
run: 'npm ci --cache .npm --prefer-offline' run: 'npm install'
- name: 'Build' - name: 'Build'
run: 'npm run build' run: 'npm run build'
- name: 'Lighthouse' - name: 'Lighthouse'
run: 'npm run lighthouse' run: 'npm run lighthouse'
env:
LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}
test: test:
runs-on: 'ubuntu-latest' runs-on: 'ubuntu-latest'
@ -83,18 +74,13 @@ jobs:
- uses: 'actions/checkout@v2.3.4' - uses: 'actions/checkout@v2.3.4'
- name: 'Use Node.js' - name: 'Use Node.js'
uses: 'actions/setup-node@v2.1.5' uses: 'actions/setup-node@v2.3.0'
with: with:
node-version: '14.x' node-version: '16.x'
cache: 'npm'
- name: 'Cache dependencies'
uses: 'actions/cache@v2.1.6'
with:
path: '.npm'
key: ${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
- name: 'Install' - name: 'Install'
run: 'npm ci --cache .npm --prefer-offline' run: 'npm install'
- name: 'Test' - name: 'Test'
run: 'npm run test' run: 'npm run test'
@ -105,22 +91,39 @@ jobs:
runs-on: 'ubuntu-latest' runs-on: 'ubuntu-latest'
steps: steps:
- uses: 'actions/checkout@v2.3.4' - uses: 'actions/checkout@v2.3.4'
with:
fetch-depth: 0
persist-credentials: false
- name: 'Import GPG key'
uses: 'crazy-max/ghaction-import-gpg@v3.1.0'
with:
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
git-user-signingkey: true
git-commit-gpgsign: true
- name: 'Use Node.js' - name: 'Use Node.js'
uses: 'actions/setup-node@v2.1.5' uses: 'actions/setup-node@v2.3.0'
with: with:
node-version: '14.x' node-version: '16.x'
cache: 'npm'
- name: 'Cache dependencies'
uses: 'actions/cache@v2.1.6'
with:
path: '.npm'
key: ${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
- name: 'Install' - name: 'Install'
run: 'npm ci --cache .npm --prefer-offline' run: 'npm install'
- name: 'Release' - name: 'Release'
run: 'npm run release' run: 'npm run release'
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
GIT_AUTHOR_NAME: ${{ secrets.GIT_NAME }}
GIT_AUTHOR_EMAIL: ${{ secrets.GIT_EMAIL }}
GIT_COMMITTER_NAME: ${{ secrets.GIT_NAME }}
GIT_COMMITTER_EMAIL: ${{ secrets.GIT_EMAIL }}
- name: 'Deploy to Vercel'
run: 'npm run deploy -- --token="${VERCEL_TOKEN}" --prod'
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}

1
.gitignore vendored
View File

@ -45,3 +45,4 @@ npm-debug.log*
# misc # misc
.DS_Store .DS_Store
.lighthouseci .lighthouseci
.vercel

1
.husky/.gitignore vendored
View File

@ -1 +0,0 @@
_

View File

@ -10,16 +10,9 @@
"assert": { "assert": {
"preset": "lighthouse:recommended", "preset": "lighthouse:recommended",
"assertions": { "assertions": {
"legacy-javascript": "off", "csp-xss": "warning",
"unused-javascript": "off", "non-composited-animations": "warning",
"uses-rel-preload": "off", "uses-responsive-images": "warning"
"csp-xss": "off",
"canonical": "off",
"unsized-images": "off",
"uses-responsive-images": "off",
"bypass": "warning",
"color-contrast": "warning",
"preload-lcp-image": "warning"
} }
}, },
"upload": { "upload": {

View File

@ -6,3 +6,4 @@ package.json
package-lock.json package-lock.json
**/workbox-*.js **/workbox-*.js
**/sw.js **/sw.js
.vercel

View File

@ -13,6 +13,20 @@
"preset": "conventionalcommits" "preset": "conventionalcommits"
} }
], ],
"@semantic-release/github" "@semantic-release/npm",
[
"@semantic-release/git",
{
"assets": ["package.json", "package-lock.json"],
"message": "chore(release): ${nextRelease.version} [skip ci]"
}
],
"@semantic-release/github",
[
"@saithodev/semantic-release-backmerge",
{
"backmergeStrategy": "merge"
}
]
] ]
} }

View File

@ -8,6 +8,7 @@
"bradlc.vscode-tailwindcss", "bradlc.vscode-tailwindcss",
"mikestead.dotenv", "mikestead.dotenv",
"coenraads.bracket-pair-colorizer", "coenraads.bracket-pair-colorizer",
"davidanson.vscode-markdownlint" "davidanson.vscode-markdownlint",
"ms-azuretools.vscode-docker"
] ]
} }

View File

@ -49,6 +49,11 @@ Scopes define what part of the code changed.
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/Divlo/Divlo) [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/Divlo/Divlo)
### Prerequisites
- [Node.js](https://nodejs.org/) >= 14.0.0
- [npm](https://www.npmjs.com/) >= 7.0.0
### Installation ### Installation
```sh ```sh
@ -60,9 +65,19 @@ cd Divlo
# Configure environment variables # Configure environment variables
cp .env.example .env cp .env.example .env
# Install
npm install
``` ```
### Development environment with [Docker](https://www.docker.com/) ### Local Development environment
```sh
# Run website
npm run dev
```
### Production environment with [Docker](https://www.docker.com/)
```sh ```sh
# Setup and run all the services for you # Setup and run all the services for you

View File

@ -1,11 +1,23 @@
FROM node:16.3.0 FROM node:16.5.0 AS dependencies
WORKDIR /usr/src/app WORKDIR /usr/src/app
RUN chown --recursive node:node /usr/src/app COPY ./package*.json ./
COPY --chown=node:node ./package*.json ./ RUN npm clean-install
RUN npm install
COPY --chown=node:node ./ ./
USER node FROM node:16.5.0 AS builder
WORKDIR /usr/src/app
COPY ./ ./
COPY --from=dependencies /usr/src/app/node_modules ./node_modules
RUN npm run build RUN npm run build
CMD ["npm", "run", "start", "--", "--port", "${PORT}"]
FROM node:16.5.0 AS runner
WORKDIR /usr/src/app
ENV NODE_ENV=production
COPY --from=builder /usr/src/app/next.config.js ./next.config.js
COPY --from=builder /usr/src/app/public ./public
COPY --from=builder /usr/src/app/.next ./.next
COPY --from=builder /usr/src/app/i18n.json ./i18n.json
COPY --from=builder /usr/src/app/locales ./locales
COPY --from=builder /usr/src/app/pages ./pages
COPY --from=builder /usr/src/app/node_modules ./node_modules
RUN npx next telemetry disable
CMD ["node_modules/.bin/next", "start", "--port", "${PORT}"]

View File

@ -5,7 +5,7 @@
</p> </p>
<p align="center"> <p align="center">
<a href="https://github.com/Divlo/Divlo/actions?query=workflow%3A%22Divlo%22"><img src="https://github.com/Divlo/Divlo/actions/workflows/Divlo.yml/badge.svg?branch=master" alt="Divlo's CI" /></a> <a href="https://github.com/Divlo/Divlo/actions/workflows/Divlo.yml"><img src="https://github.com/Divlo/Divlo/actions/workflows/Divlo.yml/badge.svg?branch=master" alt="Divlo's CI" /></a>
<a href="https://github.com/Divlo"><img alt="GitHub" src="https://img.shields.io/badge/-GitHub-5A5A5A?style=flat&labelColor=5A5A5A&logo=github&logoColor=white"/></a> <a href="https://github.com/Divlo"><img alt="GitHub" src="https://img.shields.io/badge/-GitHub-5A5A5A?style=flat&labelColor=5A5A5A&logo=github&logoColor=white"/></a>
<a href="https://gitlab.com/Divlo"><img alt="GitLab" src="https://img.shields.io/badge/-GitLab-303030?style=flat&labelColor=303030&logo=gitlab&logoColor=white"/></a> <a href="https://gitlab.com/Divlo"><img alt="GitLab" src="https://img.shields.io/badge/-GitLab-303030?style=flat&labelColor=303030&logo=gitlab&logoColor=white"/></a>
<a href="https://www.npmjs.com/~divlo"><img alt="npm" src="https://img.shields.io/badge/-npm-c4302b?style=flat&labelColor=c4302b&logo=npm&logoColor=white"/></a> <a href="https://www.npmjs.com/~divlo"><img alt="npm" src="https://img.shields.io/badge/-npm-c4302b?style=flat&labelColor=c4302b&logo=npm&logoColor=white"/></a>
@ -20,21 +20,22 @@
## 📜 About ## 📜 About
```typescript ```json
export interface Divlo { {
pronouns: 'He' | 'Him' "name": "Divlo",
birthDate: '31/03/2003' "pronouns": "He' | 'Him",
nationality: 'Alsace, France' "birthDate": "31/03/2003",
interests: [ "nationality": "Alsace, France",
'Developer Full Stack Junior', "interests": [
'Passionate about High-Tech', "Developer Full Stack Junior",
'Open-Source enthusiast' "Passionate about High-Tech",
] "Open-Source enthusiast"
skills: { ],
languages: ['JavaScript', 'TypeScript', 'Python', 'Dart'] "skills": {
frontEnd: ['HTML', 'CSS', 'SASS', 'React.js (+ Next.js)', 'Flutter'] "programmingLanguages": ["JavaScript", "TypeScript", "Python"],
backEnd: ['Node.js', 'Strapi', 'MySQL'] "frontEnd": ["HTML", "CSS", "Tailwind CSS", "React.js (+ Next.js)"],
tools: ['Ubuntu', 'Hyper Terminal', 'VSCode', 'Git', 'Docker'] "backEnd": ["Node.js", "Fastify", "Prisma", "PostgreSQL", "MySQL"],
"tools": ["Ubuntu", "Hyper Terminal", "VSCode", "Git", "Docker"]
} }
} }
``` ```
@ -45,5 +46,5 @@ export interface Divlo {
<p align=center> <p align=center>
<img height=175 align="center" src="https://github-readme-stats.vercel.app/api?username=Divlo&show_icons=true&theme=dark" /> <img height=175 align="center" src="https://github-readme-stats.vercel.app/api?username=Divlo&show_icons=true&theme=dark" />
<img height=175 align="center" src="https://github-readme-stats.vercel.app/api/top-langs/?username=Divlo&hide=html,css&langs_count=8&layout=compact&theme=dark" /> <img height=175 align="center" src="https://github-readme-stats.vercel.app/api/top-langs/?username=Divlo&hide=html,css,javascript&langs_count=8&layout=compact&theme=dark" />
</p> </p>

View File

@ -1,13 +1,39 @@
import { useMemo } from 'react'
import Link from 'next/link'
import useTranslation from 'next-translate/useTranslation' import useTranslation from 'next-translate/useTranslation'
export const Footer: React.FC = () => { export interface FooterProps {
version: string
}
export const Footer: React.FC<FooterProps> = (props) => {
const { t } = useTranslation() const { t } = useTranslation()
const { version } = props
const versionLink = useMemo(() => {
return `https://github.com/Divlo/Divlo/releases/tag/v${version}`
}, [version])
return ( return (
<footer className='bg-white flex justify-center py-6 text-lg border-t-2 border-gray-600 dark:border-gray-400 dark:bg-black'> <footer className='bg-white flex flex-col items-center justify-center py-6 text-lg border-t-2 border-gray-600 dark:border-gray-400 dark:bg-black'>
<p> <p>
<span className='text-yellow dark:text-yellow-dark'>Divlo</span> |{' '} <Link href='/'>
{t('common:allRightsReserved')} <a className='hover:underline text-yellow dark:text-yellow-dark'>
Divlo
</a>
</Link>{' '}
| {t('common:allRightsReserved')}
</p>
<p className='mt-1'>
Version{' '}
<a
className='hover:underline text-yellow dark:text-yellow-dark'
href={versionLink}
target='_blank'
rel='noopener noreferrer'
>
{version}
</a>
</p> </p>
</footer> </footer>
) )

View File

@ -1,15 +1,19 @@
import { useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import useTranslation from 'next-translate/useTranslation' import useTranslation from 'next-translate/useTranslation'
import setLanguage from 'next-translate/setLanguage' import setLanguage from 'next-translate/setLanguage'
import { Arrow } from './Arrow' import { Arrow } from './Arrow'
import { LanguageFlag } from './LanguageFlag' import { LanguageFlag } from './LanguageFlag'
import { locales } from 'i18n.json' import i18n from 'i18n.json'
export const Language: React.FC = () => { export const Language: React.FC = () => {
const { lang: currentLanguage } = useTranslation() const { lang: currentLanguage } = useTranslation()
const [hiddenMenu, setHiddenMenu] = useState(true) const [hiddenMenu, setHiddenMenu] = useState(true)
const handleHiddenMenu = useCallback(() => {
setHiddenMenu(!hiddenMenu)
}, [hiddenMenu])
useEffect(() => { useEffect(() => {
if (!hiddenMenu) { if (!hiddenMenu) {
window.document.addEventListener('click', handleHiddenMenu) window.document.addEventListener('click', handleHiddenMenu)
@ -20,17 +24,13 @@ export const Language: React.FC = () => {
return () => { return () => {
window.document.removeEventListener('click', handleHiddenMenu) window.document.removeEventListener('click', handleHiddenMenu)
} }
}, [hiddenMenu]) }, [hiddenMenu, handleHiddenMenu])
const handleLanguage = async (language: string): Promise<void> => { const handleLanguage = async (language: string): Promise<void> => {
await setLanguage(language) await setLanguage(language)
handleHiddenMenu() handleHiddenMenu()
} }
const handleHiddenMenu = (): void => {
setHiddenMenu(!hiddenMenu)
}
return ( return (
<div className='flex flex-col justify-center items-center cursor-pointer'> <div className='flex flex-col justify-center items-center cursor-pointer'>
<div className='flex items-center mr-5' onClick={handleHiddenMenu}> <div className='flex items-center mr-5' onClick={handleHiddenMenu}>
@ -39,7 +39,7 @@ export const Language: React.FC = () => {
</div> </div>
{!hiddenMenu && ( {!hiddenMenu && (
<ul className='flex flex-col justify-center items-center absolute p-0 top-14 z-10 w-24 mt-3 mr-4 rounded-lg list-none shadow-light dark:shadow-dark bg-white dark:bg-black'> <ul className='flex flex-col justify-center items-center absolute p-0 top-14 z-10 w-24 mt-3 mr-4 rounded-lg list-none shadow-light dark:shadow-dark bg-white dark:bg-black'>
{locales.map((language, index) => { {i18n.locales.map((language, index) => {
if (language === currentLanguage) { if (language === currentLanguage) {
return null return null
} }

View File

@ -16,7 +16,7 @@ export const Header: React.FC = () => {
src='/images/divlo_icon_small.png' src='/images/divlo_icon_small.png'
alt='Divlo' alt='Divlo'
/> />
<strong className='ml-1 font-headline font-semibold hidden xs:block'> <strong className='ml-1 font-headline font-semibold hidden xs:block text-yellow dark:text-yellow-dark'>
Divlo Divlo
</strong> </strong>
</div> </div>

View File

@ -0,0 +1,24 @@
import { ShadowContainer } from 'components/design/ShadowContainer'
import { GitHubIcon } from 'components/Profile/SocialMediaList/SocialMediaIcons/GitHubIcon'
export interface RepositoryProps {
name: string
description: string
href: string
}
export const Repository: React.FC<RepositoryProps> = (props) => {
const { name, description, href } = props
return (
<ShadowContainer className='cursor-pointer relative p-6 !mb-4 max-h-32 transition-transform duration-200 ease-in-out hover:-translate-y-2'>
<a href={href} target='_blank' rel='noopener noreferrer'>
<div className='flex'>
<GitHubIcon className='h-6 mr-2' />
<span className='text-yellow dark:text-yellow-dark'>{name}</span>
</div>
<p className='my-4'>{description}</p>
</a>
</ShadowContainer>
)
}

View File

@ -0,0 +1,47 @@
import useTranslation from 'next-translate/useTranslation'
import { Repository } from './Repository'
export const OpenSource: React.FC = () => {
const { t } = useTranslation()
return (
<>
<div className='max-w-full mt-0 flex flex-col items-center'>
<p className='text-center'>{t('home:open-source.description')}</p>
<div className='grid grid-cols-1 md:w-10/12 md:grid-cols-2 gap-6 my-6'>
<Repository
name='nodejs/node'
description='Node.js JavaScript runtime ✨️🐢🚀✨️'
href='https://github.com/nodejs/node/commits?author=Divlo'
/>
<Repository
name='standard/standard'
description='🌟 JavaScript Style Guide, with linter & automatic code fixer'
href='https://github.com/standard/standard/commits?author=Divlo'
/>
<Repository
name='nrwl/nx'
description='Smart, Extensible Build Framework'
href='https://github.com/nrwl/nx/commits?author=Divlo'
/>
<Repository
name='vercel/styled-jsx'
description='Full CSS support for JSX without compromises'
href='https://github.com/vercel/styled-jsx/commits?author=Divlo'
/>
</div>
</div>
<style jsx global>{`
.animation-custom {
position: relative;
transition: all 0.3s ease 0s;
}
.animation-custom:hover {
transform: translateY(-7px);
}
`}</style>
</>
)
}

View File

@ -0,0 +1,10 @@
import { Icon } from './Icon'
export const GitLabIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {
return (
<Icon {...props}>
<title>GitLab</title>
<path d='M4.845.904c-.435 0-.82.28-.955.692C2.639 5.449 1.246 9.728.07 13.335a1.437 1.437 0 00.522 1.607l11.071 8.045c.2.145.472.144.67-.004l11.073-8.04a1.436 1.436 0 00.522-1.61c-1.285-3.942-2.683-8.256-3.817-11.746a1.004 1.004 0 00-.957-.684.987.987 0 00-.949.69l-2.405 7.408H8.203l-2.41-7.408a.987.987 0 00-.942-.69h-.006zm-.006 1.42l2.173 6.678H2.675zm14.326 0l2.168 6.678h-4.341zm-10.593 7.81h6.862c-1.142 3.52-2.288 7.04-3.434 10.559L8.572 10.135zm-5.514.005h4.321l3.086 9.5zm13.567 0h4.325c-2.467 3.17-4.95 6.328-7.411 9.502 1.028-3.167 2.059-6.334 3.086-9.502zM2.1 10.762l6.977 8.947-7.817-5.682a.305.305 0 01-.112-.341zm19.798 0l.952 2.922a.305.305 0 01-.11.341v.002l-7.82 5.68.026-.035z' />
</Icon>
)
}

View File

@ -1,11 +1,16 @@
import classNames from 'classnames'
export const Icon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => { export const Icon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {
const { children, ...rest } = props const { children, className, ...rest } = props
return ( return (
<svg <svg
xmlns='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg'
viewBox='0 0 24 24' viewBox='0 0 24 24'
className='dark:text-white text-black w-8 h-8 fill-current' className={classNames(
'dark:text-white text-black w-8 h-8 fill-current',
className
)}
{...rest} {...rest}
> >
{children} {children}

View File

@ -0,0 +1,10 @@
import { Icon } from './Icon'
export const NPMIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {
return (
<Icon {...props}>
<title>npm</title>
<path d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z' />
</Icon>
)
}

View File

@ -1,19 +1,27 @@
import { SocialMediaItem } from './SocialMediaItem' import { SocialMediaItem } from './SocialMediaItem'
import { TwitterIcon } from './SocialMediaIcons/TwitterIcon' import { TwitterIcon } from './SocialMediaIcons/TwitterIcon'
import { GitHubIcon } from './SocialMediaIcons/GitHubIcon' import { GitHubIcon } from './SocialMediaIcons/GitHubIcon'
import { GitLabIcon } from './SocialMediaIcons/GitLabIcon'
import { YouTubeIcon } from './SocialMediaIcons/YouTubeIcon' import { YouTubeIcon } from './SocialMediaIcons/YouTubeIcon'
import { TwitchIcon } from './SocialMediaIcons/TwitchIcon' import { TwitchIcon } from './SocialMediaIcons/TwitchIcon'
import { EmailIcon } from './SocialMediaIcons/EmailIcon' import { EmailIcon } from './SocialMediaIcons/EmailIcon'
import { NPMIcon } from './SocialMediaIcons/NPMIcon'
export const SocialMediaList: React.FC = () => { export const SocialMediaList: React.FC = () => {
return ( return (
<ul className='social-media-list m-0 mt-2 py-4 list-none text-center'> <ul className='social-media-list m-0 mt-2 py-4 list-none text-center'>
<SocialMediaItem link='https://twitter.com/Divlo_FR' ariaLabel='Twitter'>
<TwitterIcon />
</SocialMediaItem>
<SocialMediaItem link='https://github.com/Divlo' ariaLabel='GitHub'> <SocialMediaItem link='https://github.com/Divlo' ariaLabel='GitHub'>
<GitHubIcon /> <GitHubIcon />
</SocialMediaItem> </SocialMediaItem>
<SocialMediaItem link='https://gitlab.com/Divlo' ariaLabel='GitLab'>
<GitLabIcon />
</SocialMediaItem>
<SocialMediaItem link='https://www.npmjs.com/~divlo' ariaLabel='NPM'>
<NPMIcon />
</SocialMediaItem>
<SocialMediaItem link='https://twitter.com/Divlo_FR' ariaLabel='Twitter'>
<TwitterIcon />
</SocialMediaItem>
<SocialMediaItem <SocialMediaItem
link='https://www.youtube.com/c/Divlo' link='https://www.youtube.com/c/Divlo'
ariaLabel='YouTube' ariaLabel='YouTube'

View File

@ -1,14 +1,24 @@
import { useTheme } from 'next-themes'
import Image from 'next/image' import Image from 'next/image'
import { useMemo } from 'react'
import { skills } from './skills' import { skills } from './skills'
export interface SkillProps { export interface SkillComponentProps {
skill: keyof typeof skills skill: string
} }
export const Skill: React.FC<SkillProps> = (props) => { export const SkillComponent: React.FC<SkillComponentProps> = (props) => {
const { skill } = props const { skill } = props
const skillProperties = skills[skill] const skillProperties = skills[skill]
const { theme } = useTheme()
const image = useMemo(() => {
if (typeof skillProperties.image !== 'string') {
return skillProperties.image[theme ?? 'light']
}
return skillProperties.image
}, [skillProperties, theme])
return ( return (
<a <a
@ -18,7 +28,7 @@ export const Skill: React.FC<SkillProps> = (props) => {
rel='noopener noreferrer' rel='noopener noreferrer'
> >
<div className='text-center'> <div className='text-center'>
<Image width={60} height={60} alt={skill} src={skillProperties.image} /> <Image width={60} height={60} alt={skill} src={image} />
<p className='mt-1'>{skill}</p> <p className='mt-1'>{skill}</p>
</div> </div>
</a> </a>

View File

@ -1,6 +1,6 @@
import useTranslation from 'next-translate/useTranslation' import useTranslation from 'next-translate/useTranslation'
import { Skill } from './Skill' import { SkillComponent } from './Skill'
import { SkillsSection } from './SkillsSection' import { SkillsSection } from './SkillsSection'
export const Skills: React.FC = () => { export const Skills: React.FC = () => {
@ -9,32 +9,32 @@ export const Skills: React.FC = () => {
return ( return (
<> <>
<SkillsSection title={t('home:skills.languages')}> <SkillsSection title={t('home:skills.languages')}>
<Skill skill='JavaScript' /> <SkillComponent skill='JavaScript' />
<Skill skill='TypeScript' /> <SkillComponent skill='TypeScript' />
<Skill skill='Python' /> <SkillComponent skill='Python' />
<Skill skill='Dart' />
</SkillsSection> </SkillsSection>
<SkillsSection title='Front-end'> <SkillsSection title='Front-end'>
<Skill skill='HTML' /> <SkillComponent skill='HTML' />
<Skill skill='CSS' /> <SkillComponent skill='CSS' />
<Skill skill='SASS' /> <SkillComponent skill='Tailwind CSS' />
<Skill skill='React.js (+ Next.js)' /> <SkillComponent skill='React.js (+ Next.js)' />
<Skill skill='Flutter' />
</SkillsSection> </SkillsSection>
<SkillsSection title='Back-end'> <SkillsSection title='Back-end'>
<Skill skill='Node.js' /> <SkillComponent skill='Node.js' />
<Skill skill='Strapi' /> <SkillComponent skill='Fastify' />
<Skill skill='MySQL' /> <SkillComponent skill='Prisma' />
<SkillComponent skill='PostgreSQL' />
<SkillComponent skill='MySQL' />
</SkillsSection> </SkillsSection>
<SkillsSection title={t('home:skills.softwareTools')}> <SkillsSection title={t('home:skills.softwareTools')}>
<Skill skill='Ubuntu' /> <SkillComponent skill='Ubuntu' />
<Skill skill='Hyper' /> <SkillComponent skill='Hyper' />
<Skill skill='Visual Studio Code' /> <SkillComponent skill='Visual Studio Code' />
<Skill skill='Git' /> <SkillComponent skill='Git' />
<Skill skill='Docker' /> <SkillComponent skill='Docker' />
</SkillsSection> </SkillsSection>
</> </>
) )

View File

@ -1,4 +1,13 @@
export const skills = { export interface Skill {
link: string
image: string | { [key: string]: string }
}
export interface Skills {
[key: string]: Skill
}
export const skills: Skills = {
JavaScript: { JavaScript: {
link: 'https://developer.mozilla.org/docs/Web/JavaScript', link: 'https://developer.mozilla.org/docs/Web/JavaScript',
image: '/images/skills/JavaScript.png' image: '/images/skills/JavaScript.png'
@ -11,6 +20,10 @@ export const skills = {
link: 'https://www.python.org/', link: 'https://www.python.org/',
image: '/images/skills/Python.png' image: '/images/skills/Python.png'
}, },
'C/C++': {
link: 'https://isocpp.org/',
image: '/images/skills/C-Cpp.png'
},
Dart: { Dart: {
link: 'https://dart.dev/', link: 'https://dart.dev/',
image: '/images/skills/Dart.png' image: '/images/skills/Dart.png'
@ -27,6 +40,10 @@ export const skills = {
link: 'https://developer.mozilla.org/docs/Web/CSS', link: 'https://developer.mozilla.org/docs/Web/CSS',
image: '/images/skills/CSS.png' image: '/images/skills/CSS.png'
}, },
'Tailwind CSS': {
link: 'https://tailwindcss.com/',
image: '/images/skills/TailwindCSS.png'
},
SASS: { SASS: {
link: 'https://sass-lang.com/', link: 'https://sass-lang.com/',
image: '/images/skills/SASS.svg' image: '/images/skills/SASS.svg'
@ -39,6 +56,24 @@ export const skills = {
link: 'https://nodejs.org/', link: 'https://nodejs.org/',
image: '/images/skills/NodeJS.png' image: '/images/skills/NodeJS.png'
}, },
Fastify: {
link: 'https://www.fastify.io/',
image: {
light: '/images/skills/Fastify-light.png',
dark: '/images/skills/Fastify-dark.png'
}
},
Prisma: {
link: 'https://www.prisma.io/',
image: {
light: '/images/skills/Prisma-light.png',
dark: '/images/skills/Prisma-dark.png'
}
},
PostgreSQL: {
link: 'https://www.postgresql.org/',
image: '/images/skills/PostgreSQL.png'
},
MySQL: { MySQL: {
link: 'https://www.mysql.com/', link: 'https://www.mysql.com/',
image: '/images/skills/MySQL.png' image: '/images/skills/MySQL.png'

View File

@ -4,7 +4,9 @@ import { Footer } from '../Footer'
describe('<Footer />', () => { describe('<Footer />', () => {
it('should render', async () => { it('should render', async () => {
const { getByText } = render(<Footer />) const version = '1.0.0'
const { getByText } = render(<Footer version={version} />)
expect(getByText('Divlo')).toBeInTheDocument() expect(getByText('Divlo')).toBeInTheDocument()
expect(getByText(version)).toBeInTheDocument()
}) })
}) })

View File

@ -1,20 +1,11 @@
import { forwardRef } from 'react'
type SectionHeadingProps = React.ComponentPropsWithRef<'h2'> type SectionHeadingProps = React.ComponentPropsWithRef<'h2'>
export const SectionHeading = forwardRef< export const SectionHeading: React.FC<SectionHeadingProps> = (props) => {
HTMLHeadingElement,
SectionHeadingProps
>((props, ref) => {
const { children, ...rest } = props const { children, ...rest } = props
return ( return (
<h2 <h2 {...rest} className='text-4xl font-semibold text-center mt-1 mb-3'>
ref={ref}
{...rest}
className='text-4xl font-semibold text-center mt-1 mb-7'
>
{children} {children}
</h2> </h2>
) )
}) }

View File

@ -1,5 +1,3 @@
import { forwardRef } from 'react'
import { ShadowContainer } from '../ShadowContainer' import { ShadowContainer } from '../ShadowContainer'
import { SectionHeading } from './SectionHeading' import { SectionHeading } from './SectionHeading'
@ -10,7 +8,7 @@ type SectionProps = React.ComponentPropsWithRef<'section'> & {
withoutShadowContainer?: boolean withoutShadowContainer?: boolean
} }
export const Section = forwardRef<HTMLElement, SectionProps>((props, ref) => { export const Section: React.FC<SectionProps> = (props) => {
const { const {
children, children,
heading, heading,
@ -24,7 +22,7 @@ export const Section = forwardRef<HTMLElement, SectionProps>((props, ref) => {
return ( return (
<div className='px-3 w-full'> <div className='px-3 w-full'>
<ShadowContainer style={{ marginTop: 50 }}> <ShadowContainer style={{ marginTop: 50 }}>
<section ref={ref} {...rest}> <section {...rest}>
{heading != null && <SectionHeading>{heading}</SectionHeading>} {heading != null && <SectionHeading>{heading}</SectionHeading>}
<div className='px-3 w-full'>{children}</div> <div className='px-3 w-full'>{children}</div>
</section> </section>
@ -35,7 +33,7 @@ export const Section = forwardRef<HTMLElement, SectionProps>((props, ref) => {
if (withoutShadowContainer) { if (withoutShadowContainer) {
return ( return (
<section ref={ref} {...rest}> <section {...rest}>
{heading != null && <SectionHeading>{heading}</SectionHeading>} {heading != null && <SectionHeading>{heading}</SectionHeading>}
<div className='px-3 w-full'>{children}</div> <div className='px-3 w-full'>{children}</div>
</section> </section>
@ -43,7 +41,7 @@ export const Section = forwardRef<HTMLElement, SectionProps>((props, ref) => {
} }
return ( return (
<section ref={ref} {...rest}> <section {...rest}>
{heading != null && ( {heading != null && (
<SectionHeading style={{ ...(description != null && { margin: 0 }) }}> <SectionHeading style={{ ...(description != null && { margin: 0 }) }}>
{heading} {heading}
@ -61,4 +59,4 @@ export const Section = forwardRef<HTMLElement, SectionProps>((props, ref) => {
</div> </div>
</section> </section>
) )
}) }

View File

@ -9,3 +9,4 @@ services:
- '${PORT}:${PORT}' - '${PORT}:${PORT}'
environment: environment:
PORT: ${PORT} PORT: ${PORT}
env_file: './.env'

View File

@ -11,18 +11,6 @@ module.exports = {
'@testing-library/react' '@testing-library/react'
], ],
collectCoverage: true, collectCoverage: true,
collectCoverageFrom: [
'**/*.{js,jsx,ts,tsx}',
'!**/*.d.ts',
'!**/.next/**',
'!**/node_modules/**',
'!**/next.config.js',
'!**/postcss.config.js',
'!**/tailwind.config.js',
'!**/workbox-*.js',
'!**/sw.js',
'!**/jest.config.js'
],
coverageDirectory: './coverage', coverageDirectory: './coverage',
coverageReporters: ['text', 'cobertura'] coverageReporters: ['text', 'cobertura']
} }

View File

@ -7,7 +7,7 @@
"descriptionBottom": "I am self-taught in Computer Science by following online trainings. <0/> <0/> I put into practice everything I learn and make many projects." "descriptionBottom": "I am self-taught in Computer Science by following online trainings. <0/> <0/> I put into practice everything I learn and make many projects."
}, },
"interests": { "interests": {
"title": "My Interests", "title": "Interests",
"paragraphs": [ "paragraphs": [
{ {
"title": "Developer Full Stack Junior :", "title": "Developer Full Stack Junior :",
@ -24,12 +24,12 @@
] ]
}, },
"skills": { "skills": {
"title": "My skills", "title": "Skills",
"languages": "Programming languages", "languages": "Programming languages",
"softwareTools": "Software and tools" "softwareTools": "Software and tools"
}, },
"portfolio": { "portfolio": {
"title": "My Portfolio", "title": "Portfolio",
"items": [ "items": [
{ {
"title": "function.divlo.fr", "title": "function.divlo.fr",
@ -42,7 +42,16 @@
"description": "Your open source platform to stay close with your friends and communities, talk, chat, collaborate, share and have fun.", "description": "Your open source platform to stay close with your friends and communities, talk, chat, collaborate, share and have fun.",
"link": "https://thream.divlo.fr/", "link": "https://thream.divlo.fr/",
"image": "/images/portfolio/threamdivlofr.png" "image": "/images/portfolio/threamdivlofr.png"
},
{
"title": "Leon",
"description": "Leon is your open-source personal assistant.",
"link": "https://getleon.ai/",
"image": "/images/portfolio/leon.png"
} }
] ]
},
"open-source": {
"description": "List of most famous open source projects I contributed to."
} }
} }

View File

@ -7,7 +7,7 @@
"descriptionBottom": "Je me forme en autodidacte dans l'informatique en suivant des formations en ligne. <0/> <0/> Je mets en pratique tout ce que j'apprends et réalise de nombreux projets." "descriptionBottom": "Je me forme en autodidacte dans l'informatique en suivant des formations en ligne. <0/> <0/> Je mets en pratique tout ce que j'apprends et réalise de nombreux projets."
}, },
"interests": { "interests": {
"title": "Mes intérêts", "title": "Intérêts",
"paragraphs": [ "paragraphs": [
{ {
"title": "Développeur Full Stack Junior :", "title": "Développeur Full Stack Junior :",
@ -24,12 +24,12 @@
] ]
}, },
"skills": { "skills": {
"title": "Mes compétences", "title": "Compétences",
"languages": "Langages de programmation", "languages": "Langages de programmation",
"softwareTools": "Logiciels et outils" "softwareTools": "Logiciels et outils"
}, },
"portfolio": { "portfolio": {
"title": "Mon Portfolio", "title": "Portfolio",
"items": [ "items": [
{ {
"title": "function.divlo.fr", "title": "function.divlo.fr",
@ -42,7 +42,16 @@
"description": "Votre plateforme open source pour rester proche de vos amis et communautés, parler, discuter, collaborer, partager et vous amuser.", "description": "Votre plateforme open source pour rester proche de vos amis et communautés, parler, discuter, collaborer, partager et vous amuser.",
"link": "https://thream.divlo.fr/", "link": "https://thream.divlo.fr/",
"image": "/images/portfolio/threamdivlofr.png" "image": "/images/portfolio/threamdivlofr.png"
},
{
"title": "Leon",
"description": "Leon est votre assistant personnel open source.",
"link": "https://getleon.ai/",
"image": "/images/portfolio/leon.png"
} }
] ]
},
"open-source": {
"description": "Liste des projets open source les plus célèbres auxquels j'ai contribué."
} }
} }

1
next-env.d.ts vendored
View File

@ -1,2 +1,3 @@
/// <reference types="next" /> /// <reference types="next" />
/// <reference types="next/types/global" /> /// <reference types="next/types/global" />
/// <reference types="next/image-types/global" />

9966
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,15 @@
{ {
"name": "divlo", "name": "divlo",
"version": "0.0.0-development", "version": "1.3.3",
"private": true, "private": true,
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/Divlo/Divlo" "url": "https://github.com/Divlo/Divlo"
}, },
"engines": {
"node": ">=14.0.0",
"npm": ">=7.0.0"
},
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
"start": "next start", "start": "next start",
@ -14,60 +18,66 @@
"lint:commit": "commitlint", "lint:commit": "commitlint",
"lint:docker": "dockerfilelint './Dockerfile'", "lint:docker": "dockerfilelint './Dockerfile'",
"lint:editorconfig": "editorconfig-checker", "lint:editorconfig": "editorconfig-checker",
"lint:markdown": "markdownlint '*.md' --dot --ignore node_modules", "lint:markdown": "markdownlint '**/*.md' --dot --ignore node_modules",
"lint:typescript": "eslint '*.{js,ts,jsx,tsx}'", "lint:typescript": "eslint '**/*.{js,ts,jsx,tsx}'",
"lint:staged": "lint-staged", "lint:staged": "lint-staged",
"lighthouse": "lhci autorun", "lighthouse": "lhci autorun",
"test": "jest", "test": "jest",
"release": "semantic-release", "release": "semantic-release",
"deploy": "vercel",
"postinstall": "husky install" "postinstall": "husky install"
}, },
"dependencies": { "dependencies": {
"@fontsource/montserrat": "4.4.5", "@fontsource/montserrat": "4.5.0",
"@fortawesome/fontawesome-svg-core": "1.2.35", "@fortawesome/fontawesome-svg-core": "1.2.35",
"@fortawesome/free-brands-svg-icons": "5.15.3", "@fortawesome/free-brands-svg-icons": "5.15.3",
"@fortawesome/free-solid-svg-icons": "5.15.3", "@fortawesome/free-solid-svg-icons": "5.15.3",
"@fortawesome/react-fontawesome": "0.1.14", "@fortawesome/react-fontawesome": "0.1.14",
"classnames": "2.3.1", "classnames": "2.3.1",
"html-react-parser": "1.2.6", "html-react-parser": "1.2.7",
"next": "10.2.3", "next": "11.0.1",
"next-pwa": "5.2.21", "next-pwa": "5.2.24",
"next-themes": "0.0.14", "next-themes": "0.0.15",
"next-translate": "1.0.7", "next-translate": "1.0.7",
"react": "17.0.2", "react": "17.0.2",
"react-dom": "17.0.2", "react-dom": "17.0.2",
"read-pkg": "5.2.0",
"universal-cookie": "4.0.4" "universal-cookie": "4.0.4"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "12.1.4", "@commitlint/cli": "13.1.0",
"@commitlint/config-conventional": "12.1.4", "@commitlint/config-conventional": "13.1.0",
"@lhci/cli": "0.8.0", "@lhci/cli": "0.8.0",
"@testing-library/jest-dom": "5.13.0", "@saithodev/semantic-release-backmerge": "1.5.3",
"@testing-library/react": "11.2.7", "@semantic-release/git": "9.0.0",
"@types/jest": "26.0.23", "@testing-library/jest-dom": "5.14.1",
"@types/node": "15.12.2", "@testing-library/react": "12.0.0",
"@types/react": "17.0.11", "@types/jest": "26.0.24",
"@types/styled-jsx": "2.2.8", "@types/node": "16.4.3",
"@typescript-eslint/eslint-plugin": "4.26.1", "@types/react": "17.0.15",
"autoprefixer": "10.2.6", "@types/styled-jsx": "2.2.9",
"babel-jest": "27.0.2", "@typescript-eslint/eslint-plugin": "4.28.5",
"autoprefixer": "10.3.1",
"babel-jest": "27.0.6",
"dockerfilelint": "1.8.0", "dockerfilelint": "1.8.0",
"editorconfig-checker": "4.0.2", "editorconfig-checker": "4.0.2",
"eslint": "7.28.0", "eslint": "7.31.0",
"eslint-config-next": "11.0.1",
"eslint-config-prettier": "8.3.0", "eslint-config-prettier": "8.3.0",
"eslint-config-standard-with-typescript": "20.0.0", "eslint-config-standard-with-typescript": "20.0.0",
"eslint-plugin-import": "2.23.4", "eslint-plugin-import": "2.23.4",
"eslint-plugin-node": "11.1.0", "eslint-plugin-node": "11.1.0",
"eslint-plugin-prettier": "3.4.0", "eslint-plugin-prettier": "3.4.0",
"eslint-plugin-promise": "5.1.0", "eslint-plugin-promise": "5.1.0",
"husky": "6.0.0", "husky": "7.0.1",
"jest": "27.0.4", "jest": "27.0.6",
"lint-staged": "11.0.0", "lint-staged": "11.1.1",
"markdownlint-cli": "0.27.1", "markdownlint-cli": "0.28.1",
"postcss": "8.3.0", "postcss": "8.3.6",
"prettier": "2.3.1", "prettier": "2.3.2",
"semantic-release": "17.4.3", "semantic-release": "17.4.4",
"tailwindcss": "2.1.4", "tailwindcss": "2.2.7",
"typescript": "4.3.2" "typescript": "4.3.5",
"vercel": "23.0.1"
} }
} }

View File

@ -1,22 +1,32 @@
import { GetStaticProps } from 'next' import { GetStaticProps } from 'next'
import useTranslation from 'next-translate/useTranslation' import useTranslation from 'next-translate/useTranslation'
import readPackageJSON from 'read-pkg'
import { ErrorPage } from 'components/ErrorPage' import { ErrorPage } from 'components/ErrorPage'
import { Head } from 'components/Head' import { Head } from 'components/Head'
import { Header } from 'components/Header'
import { Footer, FooterProps } from 'components/Footer'
const Error404: React.FC = () => { const Error404: React.FC<FooterProps> = (props) => {
const { t } = useTranslation() const { t } = useTranslation()
const { version } = props
return ( return (
<> <>
<Head title='Divlo - 404' /> <Head title='Divlo - 404' />
<Header />
<main className='flex flex-col md:mx-auto md:max-w-4xl lg:max-w-7xl'>
<ErrorPage statusCode={404} message={t('errors:notFound')} /> <ErrorPage statusCode={404} message={t('errors:notFound')} />
</main>
<Footer version={version} />
</> </>
) )
} }
export const getStaticProps: GetStaticProps = async () => { export const getStaticProps: GetStaticProps<FooterProps> = async () => {
return { props: {} } const { version } = await readPackageJSON()
return { props: { version } }
} }
export default Error404 export default Error404

View File

@ -1,22 +1,32 @@
import { GetStaticProps } from 'next' import { GetStaticProps } from 'next'
import useTranslation from 'next-translate/useTranslation' import useTranslation from 'next-translate/useTranslation'
import readPackageJSON from 'read-pkg'
import { ErrorPage } from 'components/ErrorPage' import { ErrorPage } from 'components/ErrorPage'
import { Head } from 'components/Head' import { Head } from 'components/Head'
import { Header } from 'components/Header'
import { Footer, FooterProps } from 'components/Footer'
const Error500: React.FC = () => { const Error500: React.FC<FooterProps> = (props) => {
const { t } = useTranslation() const { t } = useTranslation()
const { version } = props
return ( return (
<> <>
<Head title='Divlo - 500' /> <Head title='Divlo - 500' />
<Header />
<main className='flex flex-col md:mx-auto md:max-w-4xl lg:max-w-7xl'>
<ErrorPage statusCode={500} message={t('errors:serverError')} /> <ErrorPage statusCode={500} message={t('errors:serverError')} />
</main>
<Footer version={version} />
</> </>
) )
} }
export const getStaticProps: GetStaticProps = async () => { export const getStaticProps: GetStaticProps<FooterProps> = async () => {
return { props: {} } const { version } = await readPackageJSON()
return { props: { version } }
} }
export default Error500 export default Error500

View File

@ -10,9 +10,6 @@ import '@fontsource/montserrat/500.css'
import '@fontsource/montserrat/600.css' import '@fontsource/montserrat/600.css'
import '@fontsource/montserrat/700.css' import '@fontsource/montserrat/700.css'
import { Header } from 'components/Header'
import { Footer } from 'components/Footer'
const universalCookie = new UniversalCookie() const universalCookie = new UniversalCookie()
/** how long in seconds, until the cookie expires (10 years) */ /** how long in seconds, until the cookie expires (10 years) */
@ -30,11 +27,7 @@ const MyApp = ({ Component, pageProps }: AppProps): JSX.Element => {
return ( return (
<ThemeProvider attribute='class' defaultTheme='dark'> <ThemeProvider attribute='class' defaultTheme='dark'>
<Header />
<main className='flex flex-col md:mx-auto md:max-w-4xl lg:max-w-7xl'>
<Component {...pageProps} /> <Component {...pageProps} />
</main>
<Footer />
</ThemeProvider> </ThemeProvider>
) )
} }

View File

@ -1,5 +1,6 @@
import { GetStaticProps } from 'next' import { GetStaticProps } from 'next'
import useTranslation from 'next-translate/useTranslation' import useTranslation from 'next-translate/useTranslation'
import readPackageJSON from 'read-pkg'
import { RevealFade } from 'components/design/RevealFade' import { RevealFade } from 'components/design/RevealFade'
import { Section } from 'components/design/Section' import { Section } from 'components/design/Section'
@ -9,14 +10,20 @@ import { Portfolio } from 'components/Portfolio'
import { Profile } from 'components/Profile' import { Profile } from 'components/Profile'
import { SocialMediaList } from 'components/Profile/SocialMediaList' import { SocialMediaList } from 'components/Profile/SocialMediaList'
import { Skills } from 'components/Skills' import { Skills } from 'components/Skills'
import { OpenSource } from 'components/OpenSource'
import { Header } from 'components/Header'
import { Footer, FooterProps } from 'components/Footer'
const Home: React.FC = () => { const Home: React.FC<FooterProps> = (props) => {
const { t } = useTranslation() const { t } = useTranslation()
const { version } = props
return ( return (
<> <>
<Head /> <Head />
<Header />
<main className='flex flex-col md:mx-auto md:max-w-4xl lg:max-w-7xl'>
<Section isMain id='about'> <Section isMain id='about'>
<Profile /> <Profile />
<SocialMediaList /> <SocialMediaList />
@ -47,12 +54,25 @@ const Home: React.FC = () => {
<Portfolio /> <Portfolio />
</Section> </Section>
</RevealFade> </RevealFade>
<RevealFade>
<Section
id='open-source'
heading='Open source'
withoutShadowContainer
>
<OpenSource />
</Section>
</RevealFade>
</main>
<Footer version={version} />
</> </>
) )
} }
export const getStaticProps: GetStaticProps = async () => { export const getStaticProps: GetStaticProps<FooterProps> = async () => {
return { props: {} } const { version } = await readPackageJSON()
return { props: { version } }
} }
export default Home export default Home

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

6
vercel.json Normal file
View File

@ -0,0 +1,6 @@
{
"github": {
"enabled": false,
"silent": true
}
}