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

Compare commits

...

29 Commits

Author SHA1 Message Date
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
37 changed files with 3473 additions and 2223 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,11 @@
.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

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:
@ -35,7 +34,7 @@ jobs:
- name: 'Use Node.js' - name: 'Use Node.js'
uses: 'actions/setup-node@v2.1.5' uses: 'actions/setup-node@v2.1.5'
with: with:
node-version: '14.x' node-version: '16.x'
- name: 'Cache dependencies' - name: 'Cache dependencies'
uses: 'actions/cache@v2.1.6' uses: 'actions/cache@v2.1.6'
@ -60,7 +59,7 @@ jobs:
- name: 'Use Node.js' - name: 'Use Node.js'
uses: 'actions/setup-node@v2.1.5' uses: 'actions/setup-node@v2.1.5'
with: with:
node-version: '14.x' node-version: '16.x'
- name: 'Cache dependencies' - name: 'Cache dependencies'
uses: 'actions/cache@v2.1.6' uses: 'actions/cache@v2.1.6'
@ -76,6 +75,8 @@ jobs:
- 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'
@ -85,7 +86,7 @@ jobs:
- name: 'Use Node.js' - name: 'Use Node.js'
uses: 'actions/setup-node@v2.1.5' uses: 'actions/setup-node@v2.1.5'
with: with:
node-version: '14.x' node-version: '16.x'
- name: 'Cache dependencies' - name: 'Cache dependencies'
uses: 'actions/cache@v2.1.6' uses: 'actions/cache@v2.1.6'
@ -109,7 +110,7 @@ jobs:
- name: 'Use Node.js' - name: 'Use Node.js'
uses: 'actions/setup-node@v2.1.5' uses: 'actions/setup-node@v2.1.5'
with: with:
node-version: '14.x' node-version: '16.x'
- name: 'Cache dependencies' - name: 'Cache dependencies'
uses: 'actions/cache@v2.1.6' uses: 'actions/cache@v2.1.6'

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

@ -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
- [npm](https://www.npmjs.com/) >= 7
### 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.3.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.3.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.3.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

@ -31,9 +31,9 @@ export interface Divlo {
'Open-Source enthusiast' 'Open-Source enthusiast'
] ]
skills: { skills: {
languages: ['JavaScript', 'TypeScript', 'Python', 'Dart'] languages: ['JavaScript', 'TypeScript', 'Python', 'C/C++']
frontEnd: ['HTML', 'CSS', 'SASS', 'React.js (+ Next.js)', 'Flutter'] frontEnd: ['HTML', 'CSS', 'Tailwind CSS', 'React.js (+ Next.js)']
backEnd: ['Node.js', 'Strapi', 'MySQL'] backEnd: ['Node.js', 'Fastify', 'Prisma', 'PostgreSQL', 'MySQL']
tools: ['Ubuntu', 'Hyper Terminal', 'VSCode', 'Git', 'Docker'] tools: ['Ubuntu', 'Hyper Terminal', 'VSCode', 'Git', 'Docker']
} }
} }

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,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

@ -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,33 @@ 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' /> <SkillComponent skill='C/C++' />
</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

@ -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-7'>
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,6 +42,12 @@
"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"
} }
] ]
} }

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,6 +42,12 @@
"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"
} }
] ]
} }

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" />

5299
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,10 @@
"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,8 +18,8 @@
"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",
@ -29,8 +33,8 @@
"@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.21",
"next-themes": "0.0.14", "next-themes": "0.0.14",
"next-translate": "1.0.7", "next-translate": "1.0.7",
@ -42,18 +46,19 @@
"@commitlint/cli": "12.1.4", "@commitlint/cli": "12.1.4",
"@commitlint/config-conventional": "12.1.4", "@commitlint/config-conventional": "12.1.4",
"@lhci/cli": "0.8.0", "@lhci/cli": "0.8.0",
"@testing-library/jest-dom": "5.13.0", "@testing-library/jest-dom": "5.14.1",
"@testing-library/react": "11.2.7", "@testing-library/react": "12.0.0",
"@types/jest": "26.0.23", "@types/jest": "26.0.23",
"@types/node": "15.12.2", "@types/node": "15.12.4",
"@types/react": "17.0.11", "@types/react": "17.0.11",
"@types/styled-jsx": "2.2.8", "@types/styled-jsx": "2.2.8",
"@typescript-eslint/eslint-plugin": "4.26.1", "@typescript-eslint/eslint-plugin": "4.28.0",
"autoprefixer": "10.2.6", "autoprefixer": "10.2.6",
"babel-jest": "27.0.2", "babel-jest": "27.0.5",
"dockerfilelint": "1.8.0", "dockerfilelint": "1.8.0",
"editorconfig-checker": "4.0.2", "editorconfig-checker": "4.0.2",
"eslint": "7.28.0", "eslint": "7.29.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",
@ -61,13 +66,13 @@
"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": "6.0.0",
"jest": "27.0.4", "jest": "27.0.5",
"lint-staged": "11.0.0", "lint-staged": "11.0.0",
"markdownlint-cli": "0.27.1", "markdownlint-cli": "0.27.1",
"postcss": "8.3.0", "postcss": "8.3.5",
"prettier": "2.3.1", "prettier": "2.3.1",
"semantic-release": "17.4.3", "semantic-release": "17.4.4",
"tailwindcss": "2.1.4", "tailwindcss": "2.2.4",
"typescript": "4.3.2" "typescript": "4.3.4"
} }
} }

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