mirror of
				https://github.com/theoludwig/theoludwig.git
				synced 2025-11-04 00:19:01 +01:00 
			
		
		
		
	feat: migrate progressively to full name instead of nickname
This commit is contained in:
		@@ -1,5 +1,5 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "Divlo",
 | 
					  "name": "theoludwig",
 | 
				
			||||||
  "dockerComposeFile": "./docker-compose.yml",
 | 
					  "dockerComposeFile": "./docker-compose.yml",
 | 
				
			||||||
  "service": "workspace",
 | 
					  "service": "workspace",
 | 
				
			||||||
  "workspaceFolder": "/workspace",
 | 
					  "workspaceFolder": "/workspace",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,2 +1,2 @@
 | 
				
			|||||||
COMPOSE_PROJECT_NAME=divlo
 | 
					COMPOSE_PROJECT_NAME=theoludwig
 | 
				
			||||||
PORT=3000
 | 
					PORT=3000
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,7 +60,7 @@ representative at an online or offline event.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
 | 
					Instances of abusive, harassing, or otherwise unacceptable behavior may be
 | 
				
			||||||
reported to the community leaders responsible for enforcement at
 | 
					reported to the community leaders responsible for enforcement at
 | 
				
			||||||
<contact@divlo.fr>.
 | 
					<contact@theoludwig.fr>.
 | 
				
			||||||
All complaints will be reviewed and investigated promptly and fairly.
 | 
					All complaints will be reviewed and investigated promptly and fairly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
All community leaders are obligated to respect the privacy and security of the
 | 
					All community leaders are obligated to respect the privacy and security of the
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
# 💡 Contributing
 | 
					# 💡 Contributing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Thanks a lot for your interest in contributing to **divlo.fr**! 🎉
 | 
					Thanks a lot for your interest in contributing to **theoludwig.fr**! 🎉
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Code of Conduct
 | 
					## Code of Conduct
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**divlo.fr** adopted the [Contributor Covenant](https://www.contributor-covenant.org/) as its Code of Conduct, and we expect project participants to adhere to it. Please read [the full text](./CODE_OF_CONDUCT.md) so that you can understand what actions will and will not be tolerated.
 | 
					**theoludwig.fr** adopted the [Contributor Covenant](https://www.contributor-covenant.org/) as its Code of Conduct, and we expect project participants to adhere to it. Please read [the full text](./CODE_OF_CONDUCT.md) so that you can understand what actions will and will not be tolerated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Types of contributions
 | 
					## Types of contributions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -21,7 +21,7 @@ Thanks a lot for your interest in contributing to **divlo.fr**! 🎉
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
- Make sure your **code passes the tests**.
 | 
					- Make sure your **code passes the tests**.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you're adding new features to **divlo.fr**, please include tests.
 | 
					If you're adding new features to **theoludwig.fr**, please include tests.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Commits
 | 
					## Commits
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -68,4 +68,4 @@ docker compose up --build
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Services started
 | 
					### Services started
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- website: `http://127.0.0.1:3000`
 | 
					- `website`: <http://127.0.0.1:3000>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
MIT License
 | 
					MIT License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) Divlo
 | 
					Copyright (c) Théo LUDWIG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
of this software and associated documentation files (the "Software"), to deal
 | 
					of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
<h1 align="center"><a href="https://divlo.fr/">Théo LUDWIG (Divlo)</a></h1>
 | 
					<h1 align="center"><a href="https://theoludwig.fr/">Théo LUDWIG</a></h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<p align="center">
 | 
					<p align="center">
 | 
				
			||||||
  <strong>Developer Full Stack • Open-Source enthusiast</strong>
 | 
					  <strong>Developer Full Stack • Open-Source enthusiast</strong>
 | 
				
			||||||
@@ -11,8 +11,8 @@
 | 
				
			|||||||
  <a href="https://twitter.com/Divlo_FR"><img alt="Twitter" src="https://img.shields.io/badge/-Twitter-1ca0f1?style=flat&labelColor=1ca0f1&logo=twitter&logoColor=white"/></a>
 | 
					  <a href="https://twitter.com/Divlo_FR"><img alt="Twitter" src="https://img.shields.io/badge/-Twitter-1ca0f1?style=flat&labelColor=1ca0f1&logo=twitter&logoColor=white"/></a>
 | 
				
			||||||
  <a href="https://www.youtube.com/channel/UCfEKQzI3c8vmZOrsTOi5spA"><img alt="YouTube" src="https://img.shields.io/badge/-YouTube-c4302b?style=flat&labelColor=c4302b&logo=youtube&logoColor=white"/></a>
 | 
					  <a href="https://www.youtube.com/channel/UCfEKQzI3c8vmZOrsTOi5spA"><img alt="YouTube" src="https://img.shields.io/badge/-YouTube-c4302b?style=flat&labelColor=c4302b&logo=youtube&logoColor=white"/></a>
 | 
				
			||||||
  <a href="https://www.twitch.tv/divlo"><img alt="Twitch" src="https://img.shields.io/badge/-Twitch-9147FF?style=flat&labelColor=9147FF&logo=twitch&logoColor=white"/></a>
 | 
					  <a href="https://www.twitch.tv/divlo"><img alt="Twitch" src="https://img.shields.io/badge/-Twitch-9147FF?style=flat&labelColor=9147FF&logo=twitch&logoColor=white"/></a>
 | 
				
			||||||
  <a href="https://www.divlo.fr"><img alt="Website" src="https://img.shields.io/badge/-Website-181818?style=flat&labelColor=181818&logo=Google-Chrome&logoColor=white"/></a>
 | 
					  <a href="https://theoludwig.fr/"><img alt="Website" src="https://img.shields.io/badge/-Website-181818?style=flat&labelColor=181818&logo=Google-Chrome&logoColor=white"/></a>
 | 
				
			||||||
  <a href="mailto:contact@divlo.fr"><img alt="Email" src="https://img.shields.io/badge/-contact@divlo.fr-2F7EBE?style=flat&labelColor=2F7EBE&logo=minutemailer&logoColor=white"/></a>
 | 
					  <a href="mailto:contact@theoludwig.fr"><img alt="Email" src="https://img.shields.io/badge/-contact@theoludwig.fr-2F7EBE?style=flat&labelColor=2F7EBE&logo=minutemailer&logoColor=white"/></a>
 | 
				
			||||||
</p>
 | 
					</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<hr />
 | 
					<hr />
 | 
				
			||||||
@@ -21,7 +21,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```json
 | 
					```json
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  "name": "Théo LUDWIG (Divlo)",
 | 
					  "name": "Théo LUDWIG",
 | 
				
			||||||
  "pronouns": "He/Him",
 | 
					  "pronouns": "He/Him",
 | 
				
			||||||
  "birthDate": "31/03/2003",
 | 
					  "birthDate": "31/03/2003",
 | 
				
			||||||
  "nationality": "Alsace, France",
 | 
					  "nationality": "Alsace, France",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ export const Footer: React.FC<FooterProps> = (props) => {
 | 
				
			|||||||
          href='/'
 | 
					          href='/'
 | 
				
			||||||
          className='text-yellow hover:underline dark:text-yellow-dark'
 | 
					          className='text-yellow hover:underline dark:text-yellow-dark'
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          Théo LUDWIG (Divlo)
 | 
					          Théo LUDWIG
 | 
				
			||||||
        </Link>{' '}
 | 
					        </Link>{' '}
 | 
				
			||||||
        | {t('common:all-rights-reserved')}
 | 
					        | {t('common:all-rights-reserved')}
 | 
				
			||||||
      </p>
 | 
					      </p>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,10 +9,10 @@ interface HeadProps {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export const Head: React.FC<HeadProps> = (props) => {
 | 
					export const Head: React.FC<HeadProps> = (props) => {
 | 
				
			||||||
  const {
 | 
					  const {
 | 
				
			||||||
    title = 'Théo LUDWIG (Divlo)',
 | 
					    title = 'Théo LUDWIG',
 | 
				
			||||||
    image = 'https://divlo.fr/images/icon-96x96.png',
 | 
					    image = 'https://theoludwig.fr/images/icon-96x96.png',
 | 
				
			||||||
    description = 'Théo LUDWIG (Divlo) - Developer Full Stack • Passionate about High-Tech',
 | 
					    description = 'Théo LUDWIG - Developer Full Stack • Passionate about High-Tech',
 | 
				
			||||||
    url = 'https://divlo.fr/'
 | 
					    url = 'https://theoludwig.fr/'
 | 
				
			||||||
  } = props
 | 
					  } = props
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,11 +20,11 @@ export const Header: React.FC<HeaderProps> = (props) => {
 | 
				
			|||||||
            width={60}
 | 
					            width={60}
 | 
				
			||||||
            height={60}
 | 
					            height={60}
 | 
				
			||||||
            src='/images/divlo_icon_small.png'
 | 
					            src='/images/divlo_icon_small.png'
 | 
				
			||||||
            alt='Divlo'
 | 
					            alt='Théo LUDWIG'
 | 
				
			||||||
            priority
 | 
					            priority
 | 
				
			||||||
          />
 | 
					          />
 | 
				
			||||||
          <strong className='ml-1 hidden font-headline font-semibold text-yellow dark:text-yellow-dark xs:block'>
 | 
					          <strong className='ml-1 hidden font-headline font-semibold text-yellow dark:text-yellow-dark xs:block'>
 | 
				
			||||||
            Théo LUDWIG (Divlo)
 | 
					            Théo LUDWIG
 | 
				
			||||||
          </strong>
 | 
					          </strong>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </Link>
 | 
					      </Link>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@ export const ProfileInformation: React.FC = () => {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className='mb-6 border-b-2 border-gray-600 pb-2 font-headline dark:border-gray-400'>
 | 
					    <div className='mb-6 border-b-2 border-gray-600 pb-2 font-headline dark:border-gray-400'>
 | 
				
			||||||
      <h1 className='mb-2 text-4xl font-semibold text-yellow dark:text-yellow-dark'>
 | 
					      <h1 className='mb-2 text-4xl font-semibold text-yellow dark:text-yellow-dark'>
 | 
				
			||||||
        Théo LUDWIG (Divlo)
 | 
					        Théo LUDWIG
 | 
				
			||||||
      </h1>
 | 
					      </h1>
 | 
				
			||||||
      <h2 className='mb-3 text-base'>{t('home:about.description')}</h2>
 | 
					      <h2 className='mb-3 text-base'>{t('home:about.description')}</h2>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import useTranslation from 'next-translate/useTranslation'
 | 
					import useTranslation from 'next-translate/useTranslation'
 | 
				
			||||||
import { useMemo } from 'react'
 | 
					import { useMemo } from 'react'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { DIVLO_BIRTH_DATE, DIVLO_BIRTH_DATE_STRING, getAge } from 'utils/getAge'
 | 
					import { BIRTH_DATE, BIRTH_DATE_STRING, getAge } from 'utils/getAge'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { ProfileItem } from './ProfileItem'
 | 
					import { ProfileItem } from './ProfileItem'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -9,7 +9,7 @@ export const ProfileList: React.FC = () => {
 | 
				
			|||||||
  const { t } = useTranslation('home')
 | 
					  const { t } = useTranslation('home')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const age = useMemo(() => {
 | 
					  const age = useMemo(() => {
 | 
				
			||||||
    return getAge(DIVLO_BIRTH_DATE)
 | 
					    return getAge(BIRTH_DATE)
 | 
				
			||||||
  }, [])
 | 
					  }, [])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
@@ -20,15 +20,13 @@ export const ProfileList: React.FC = () => {
 | 
				
			|||||||
      />
 | 
					      />
 | 
				
			||||||
      <ProfileItem
 | 
					      <ProfileItem
 | 
				
			||||||
        title={t('home:about.birth-date')}
 | 
					        title={t('home:about.birth-date')}
 | 
				
			||||||
        value={`${DIVLO_BIRTH_DATE_STRING} (${age} ${t(
 | 
					        value={`${BIRTH_DATE_STRING} (${age} ${t('home:about.years-old')})`}
 | 
				
			||||||
          'home:about.years-old'
 | 
					 | 
				
			||||||
        )})`}
 | 
					 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
      <ProfileItem title={t('home:about.nationality')} value='Alsace, France' />
 | 
					      <ProfileItem title={t('home:about.nationality')} value='Alsace, France' />
 | 
				
			||||||
      <ProfileItem
 | 
					      <ProfileItem
 | 
				
			||||||
        title='Email'
 | 
					        title='Email'
 | 
				
			||||||
        value='contact@divlo.fr'
 | 
					        value='contact@theoludwig.fr'
 | 
				
			||||||
        link='mailto:contact@divlo.fr'
 | 
					        link='mailto:contact@theoludwig.fr'
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
    </ul>
 | 
					    </ul>
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
import Image from 'next/image'
 | 
					import Image from 'next/image'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import DivloLogo from 'public/images/divlo_logo.png'
 | 
					import Logo from 'public/images/divlo_logo.png'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const ProfileLogo: React.FC = () => {
 | 
					export const ProfileLogo: React.FC = () => {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className='max-h-[370px] max-w-[370px] px-2 py-6'>
 | 
					    <div className='max-h-[370px] max-w-[370px] px-2 py-6'>
 | 
				
			||||||
      <Image quality={100} src={DivloLogo} alt='Divlo' priority />
 | 
					      <Image quality={100} src={Logo} alt='Théo LUDWIG' priority />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,7 @@ export const SocialMediaList: React.FC = () => {
 | 
				
			|||||||
      <SocialMediaItem link='https://www.twitch.tv/divlo' ariaLabel='Twitch'>
 | 
					      <SocialMediaItem link='https://www.twitch.tv/divlo' ariaLabel='Twitch'>
 | 
				
			||||||
        <TwitchIcon />
 | 
					        <TwitchIcon />
 | 
				
			||||||
      </SocialMediaItem>
 | 
					      </SocialMediaItem>
 | 
				
			||||||
      <SocialMediaItem link='mailto:contact@divlo.fr' ariaLabel='Email'>
 | 
					      <SocialMediaItem link='mailto:contact@theoludwig.fr' ariaLabel='Email'>
 | 
				
			||||||
        <EmailIcon />
 | 
					        <EmailIcon />
 | 
				
			||||||
      </SocialMediaItem>
 | 
					      </SocialMediaItem>
 | 
				
			||||||
    </ul>
 | 
					    </ul>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,16 +88,12 @@ export const skills = {
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  'Visual Studio Code': {
 | 
					  'Visual Studio Code': {
 | 
				
			||||||
    link: 'https://code.visualstudio.com/',
 | 
					    link: 'https://code.visualstudio.com/',
 | 
				
			||||||
    image: '/images/skills/Visual_Studio_Code.png'
 | 
					    image: '/images/skills/VisualStudioCode.png'
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  Git: {
 | 
					  Git: {
 | 
				
			||||||
    link: 'https://git-scm.com/',
 | 
					    link: 'https://git-scm.com/',
 | 
				
			||||||
    image: '/images/skills/Git.png'
 | 
					    image: '/images/skills/Git.png'
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  Hyper: {
 | 
					 | 
				
			||||||
    link: 'https://hyper.is/',
 | 
					 | 
				
			||||||
    image: '/images/skills/Hyper.svg'
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  Ubuntu: {
 | 
					  Ubuntu: {
 | 
				
			||||||
    link: 'https://ubuntu.com/',
 | 
					    link: 'https://ubuntu.com/',
 | 
				
			||||||
    image: '/images/skills/Ubuntu.png'
 | 
					    image: '/images/skills/Ubuntu.png'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@ describe('<Footer />', () => {
 | 
				
			|||||||
  it('should render with appropriate link tag version', () => {
 | 
					  it('should render with appropriate link tag version', () => {
 | 
				
			||||||
    const version = '1.0.0'
 | 
					    const version = '1.0.0'
 | 
				
			||||||
    cy.mount(<Footer version={version} />)
 | 
					    cy.mount(<Footer version={version} />)
 | 
				
			||||||
    cy.contains('Divlo')
 | 
					    cy.contains('Théo LUDWIG')
 | 
				
			||||||
      .get('[data-cy=version-link]')
 | 
					      .get('[data-cy=version-link]')
 | 
				
			||||||
      .should('have.text', version)
 | 
					      .should('have.text', version)
 | 
				
			||||||
      .should(
 | 
					      .should(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,7 +38,7 @@ describe('Common > Header', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  describe('Switch Language', () => {
 | 
					  describe('Switch Language', () => {
 | 
				
			||||||
    it('should switch language from EN (default) to FR', () => {
 | 
					    it('should switch language from EN (default) to FR', () => {
 | 
				
			||||||
      cy.get('h1').contains('Divlo')
 | 
					      cy.get('h1').contains('Théo LUDWIG')
 | 
				
			||||||
      cy.get('[data-cy=language-flag-text]').contains('EN')
 | 
					      cy.get('[data-cy=language-flag-text]').contains('EN')
 | 
				
			||||||
      cy.get('[data-cy=languages-list]').should('not.be.visible')
 | 
					      cy.get('[data-cy=languages-list]').should('not.be.visible')
 | 
				
			||||||
      cy.get('[data-cy=language-click]').click()
 | 
					      cy.get('[data-cy=language-click]').click()
 | 
				
			||||||
@@ -46,7 +46,7 @@ describe('Common > Header', () => {
 | 
				
			|||||||
      cy.get('[data-cy=languages-list] > li:first-child').contains('FR').click()
 | 
					      cy.get('[data-cy=languages-list] > li:first-child').contains('FR').click()
 | 
				
			||||||
      cy.get('[data-cy=languages-list]').should('not.be.visible')
 | 
					      cy.get('[data-cy=languages-list]').should('not.be.visible')
 | 
				
			||||||
      cy.get('[data-cy=language-flag-text]').contains('FR')
 | 
					      cy.get('[data-cy=language-flag-text]').contains('FR')
 | 
				
			||||||
      cy.get('h1').contains('Divlo')
 | 
					      cy.get('h1').contains('Théo LUDWIG')
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it('should close the language list menu when clicking outside', () => {
 | 
					    it('should close the language list menu when clicking outside', () => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
services:
 | 
					services:
 | 
				
			||||||
  divlo:
 | 
					  theoludwig:
 | 
				
			||||||
    container_name: ${COMPOSE_PROJECT_NAME}
 | 
					    container_name: ${COMPOSE_PROJECT_NAME}
 | 
				
			||||||
    image: 'divlo'
 | 
					    image: 'theoludwig'
 | 
				
			||||||
    build:
 | 
					    build:
 | 
				
			||||||
      context: './'
 | 
					      context: './'
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import { DIVLO_BIRTH_DATE, getAge } from '../../utils/getAge.ts'
 | 
					import { BIRTH_DATE, getAge } from '../../utils/getAge.ts'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const yearOld = document.getElementById('year-old')
 | 
					const yearOld = document.getElementById('year-old')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
yearOld.textContent = getAge(DIVLO_BIRTH_DATE).toString()
 | 
					yearOld.textContent = getAge(BIRTH_DATE).toString()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,11 +1,11 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "divlo",
 | 
					  "name": "theoludwig",
 | 
				
			||||||
  "version": "2.7.3",
 | 
					  "version": "2.7.3",
 | 
				
			||||||
  "lockfileVersion": 3,
 | 
					  "lockfileVersion": 3,
 | 
				
			||||||
  "requires": true,
 | 
					  "requires": true,
 | 
				
			||||||
  "packages": {
 | 
					  "packages": {
 | 
				
			||||||
    "": {
 | 
					    "": {
 | 
				
			||||||
      "name": "divlo",
 | 
					      "name": "theoludwig",
 | 
				
			||||||
      "version": "2.7.3",
 | 
					      "version": "2.7.3",
 | 
				
			||||||
      "hasInstallScript": true,
 | 
					      "hasInstallScript": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "divlo",
 | 
					  "name": "theoludwig",
 | 
				
			||||||
  "version": "2.7.3",
 | 
					  "version": "2.7.3",
 | 
				
			||||||
  "private": true,
 | 
					  "private": true,
 | 
				
			||||||
  "repository": {
 | 
					  "repository": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@ const Error404: NextPage<Error404Props> = (props) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Head title='404 | Théo LUDWIG (Divlo)' />
 | 
					      <Head title='404 | Théo LUDWIG' />
 | 
				
			||||||
      <ErrorPage
 | 
					      <ErrorPage
 | 
				
			||||||
        statusCode={404}
 | 
					        statusCode={404}
 | 
				
			||||||
        message={t('errors:not-found')}
 | 
					        message={t('errors:not-found')}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@ const Error500: NextPage<Error500Props> = (props) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Head title='500 | Théo LUDWIG (Divlo)' />
 | 
					      <Head title='500 | Théo LUDWIG' />
 | 
				
			||||||
      <ErrorPage
 | 
					      <ErrorPage
 | 
				
			||||||
        statusCode={500}
 | 
					        statusCode={500}
 | 
				
			||||||
        message={t('errors:server-error')}
 | 
					        message={t('errors:server-error')}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@ const BlogPostPage: NextPage<BlogPostPageProps> = (props) => {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Head
 | 
					      <Head
 | 
				
			||||||
        title={`${post.frontmatter.title} | Théo LUDWIG (Divlo)`}
 | 
					        title={`${post.frontmatter.title} | Théo LUDWIG`}
 | 
				
			||||||
        description={post.frontmatter.description}
 | 
					        description={post.frontmatter.description}
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ const BlogPage: NextPage<BlogPageProps> = (props) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Head title='Blog | Divlo' description={blogDescription} />
 | 
					      <Head title='Blog | Théo LUDWIG' description={blogDescription} />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Header />
 | 
					      <Header />
 | 
				
			||||||
      <main className='flex flex-1 flex-col flex-wrap items-center'>
 | 
					      <main className='flex flex-1 flex-col flex-wrap items-center'>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,13 +7,13 @@ publishedOn: '2022-04-11T10:24:55.206Z'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Hello! 👋
 | 
					Hello! 👋
 | 
				
			||||||
 | 
					
 | 
				
			||||||
After months of hard work, [Thream v1.0.0](https://www.thream.divlo.fr/) has been released! 🎉
 | 
					After months of hard work, [Thream v1.0.0](https://thream.divlo.fr/) has been released! 🎉
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[**Thream**](https://www.thream.divlo.fr/) is your open-source platform to stay close with your friends and communities, talk, chat, collaborate, share and have fun.
 | 
					[**Thream**](https://thream.divlo.fr/) is your open-source platform to stay close with your friends and communities, talk, chat, collaborate, share and have fun.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Presentation
 | 
					## Presentation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[**Thream**](https://www.thream.divlo.fr/) is a social network to stay close with your friends and communities to talk, chat, collaborate and share.
 | 
					[**Thream**](https://thream.divlo.fr/) is a social network to stay close with your friends and communities to talk, chat, collaborate and share.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The project is largely inspired by [Discord](https://discord.com), a proprietary instant messaging service, but differentiates itself by its **non-profit open source philosophy** and will integrate special features.
 | 
					The project is largely inspired by [Discord](https://discord.com), a proprietary instant messaging service, but differentiates itself by its **non-profit open source philosophy** and will integrate special features.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,11 +23,11 @@ The idea is that a user can create an account to authenticate with an email addr
 | 
				
			|||||||
 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[**Thream**](https://www.thream.divlo.fr/) is a website that works on any recent browser, accessible on [thream.divlo.fr](https://www.thream.divlo.fr/).
 | 
					[**Thream**](https://thream.divlo.fr/) is a website that works on any recent browser, accessible on [thream.divlo.fr](https://thream.divlo.fr/).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## History
 | 
					## History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The idea for the project has existed since May 13, 2020, symbolized by a [publication on Twitter](https://twitter.com/Divlo_FR/status/1260638175246135296) by the creator: Divlo.
 | 
					The idea for the project has existed since May 13, 2020, symbolized by a [publication on Twitter](https://twitter.com/Divlo_FR/status/1260638175246135296) by the creator: Théo LUDWIG.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The main goal is to put into **practice knowledge in web development** and computer science in general on a concrete project that can **easily evolve over time** where you can add many features.
 | 
					The main goal is to put into **practice knowledge in web development** and computer science in general on a concrete project that can **easily evolve over time** where you can add many features.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -116,4 +116,4 @@ The other interest of the project is that it is completely **open-source**, and
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Feel free to give feebacks and suggestions to improve the project, and to report any bug you find.
 | 
					Feel free to give feebacks and suggestions to improve the project, and to report any bug you find.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Thream** is available: [**thream.divlo.fr**](https://www.thream.divlo.fr/).
 | 
					**Thream** is available: [**thream.divlo.fr**](https://thream.divlo.fr/).
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
		 Before Width: | Height: | Size: 5.7 KiB  | 
| 
		 Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB  | 
@@ -6,14 +6,14 @@
 | 
				
			|||||||
  "basics": {
 | 
					  "basics": {
 | 
				
			||||||
    "name": "Théo LUDWIG",
 | 
					    "name": "Théo LUDWIG",
 | 
				
			||||||
    "label": "Développeur Full Stack • Étudiant",
 | 
					    "label": "Développeur Full Stack • Étudiant",
 | 
				
			||||||
    "image": "https://divlo.fr/images/logo_orange.png",
 | 
					    "image": "https://theoludwig.fr/images/logo_orange.png",
 | 
				
			||||||
    "email": "contact@divlo.fr",
 | 
					    "email": "contact@theoludwig.fr",
 | 
				
			||||||
    "age": "31/03/2003",
 | 
					    "age": "31/03/2003",
 | 
				
			||||||
    "location": {
 | 
					    "location": {
 | 
				
			||||||
      "address": "Alsace, France"
 | 
					      "address": "Alsace, France"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "url": "https://divlo.fr",
 | 
					    "url": "https://theoludwig.fr",
 | 
				
			||||||
    "summary": "Je suis étudiant à l'université suivant la formation \"BUT Informatique\" et me forme en autodidacte dans l'informatique en suivant des formations en ligne. <br/> Je mets en pratique tout ce que j'apprends et réalise de nombreux projets (disponible sur <a href=\"https://divlo.fr\">divlo.fr</a>)."
 | 
					    "summary": "Je suis étudiant à l'université suivant la formation \"BUT Informatique\" et me forme en autodidacte dans l'informatique en suivant des formations en ligne. <br/> Je mets en pratique tout ce que j'apprends et réalise de nombreux projets (disponible sur <a href=\"https://theoludwig.fr\">theoludwig.fr</a>)."
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "education": [
 | 
					  "education": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
export const DIVLO_BIRTH_DATE_DAY = '31' as const
 | 
					export const BIRTH_DATE_DAY = '31' as const
 | 
				
			||||||
export const DIVLO_BIRTH_DATE_MONTH = '03' as const
 | 
					export const BIRTH_DATE_MONTH = '03' as const
 | 
				
			||||||
export const DIVLO_BIRTH_DATE_YEAR = '2003' as const
 | 
					export const BIRTH_DATE_YEAR = '2003' as const
 | 
				
			||||||
export const DIVLO_BIRTH_DATE_STRING =
 | 
					export const BIRTH_DATE_STRING =
 | 
				
			||||||
  `${DIVLO_BIRTH_DATE_DAY}/${DIVLO_BIRTH_DATE_MONTH}/${DIVLO_BIRTH_DATE_YEAR}` as const
 | 
					  `${BIRTH_DATE_DAY}/${BIRTH_DATE_MONTH}/${BIRTH_DATE_YEAR}` as const
 | 
				
			||||||
export const DIVLO_BIRTH_DATE_ISO_8601 =
 | 
					export const BIRTH_DATE_ISO_8601 =
 | 
				
			||||||
  `${DIVLO_BIRTH_DATE_YEAR}-${DIVLO_BIRTH_DATE_MONTH}-${DIVLO_BIRTH_DATE_DAY}` as const
 | 
					  `${BIRTH_DATE_YEAR}-${BIRTH_DATE_MONTH}-${BIRTH_DATE_DAY}` as const
 | 
				
			||||||
export const DIVLO_BIRTH_DATE = new Date(DIVLO_BIRTH_DATE_ISO_8601)
 | 
					export const BIRTH_DATE = new Date(BIRTH_DATE_ISO_8601)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Calculates the age of a person based on their birth date
 | 
					 * Calculates the age of a person based on their birth date
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user