mirror of
https://github.com/theoludwig/theoludwig.git
synced 2025-05-29 22:37:44 +02:00
Compare commits
12 Commits
v3.2.1
...
0eb780485c
Author | SHA1 | Date | |
---|---|---|---|
0eb780485c
|
|||
cd5e92b64a
|
|||
982b148329
|
|||
0febee5b51
|
|||
3502f51735
|
|||
493df4e2f2
|
|||
c2c9b59c7a
|
|||
f6e3008ab9
|
|||
15e94cec64
|
|||
5185c6758b
|
|||
b633eef833
|
|||
d2e627ff13
|
@ -7,8 +7,8 @@
|
|||||||
"vscode": {
|
"vscode": {
|
||||||
"settings": {
|
"settings": {
|
||||||
"remote.autoForwardPorts": false,
|
"remote.autoForwardPorts": false,
|
||||||
"remote.localPortHost": "allInterfaces",
|
"remote.localPortHost": "allInterfaces"
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
"extensions": [
|
"extensions": [
|
||||||
"editorconfig.editorconfig",
|
"editorconfig.editorconfig",
|
||||||
@ -17,8 +17,8 @@
|
|||||||
"davidanson.vscode-markdownlint",
|
"davidanson.vscode-markdownlint",
|
||||||
"bradlc.vscode-tailwindcss",
|
"bradlc.vscode-tailwindcss",
|
||||||
"mikestead.dotenv",
|
"mikestead.dotenv",
|
||||||
"ms-azuretools.vscode-docker",
|
"ms-azuretools.vscode-docker"
|
||||||
],
|
]
|
||||||
},
|
},
|
||||||
"remoteUser": "node",
|
"remoteUser": "node"
|
||||||
}
|
}
|
||||||
|
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
- uses: "actions/checkout@v4.1.1"
|
- uses: "actions/checkout@v4.1.1"
|
||||||
|
|
||||||
- name: "Setup Node.js"
|
- name: "Setup Node.js"
|
||||||
uses: "actions/setup-node@v4.0.1"
|
uses: "actions/setup-node@v4.0.2"
|
||||||
with:
|
with:
|
||||||
node-version: "20.x"
|
node-version: "20.x"
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
|
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
- uses: "actions/checkout@v4.1.1"
|
- uses: "actions/checkout@v4.1.1"
|
||||||
|
|
||||||
- name: "Setup Node.js"
|
- name: "Setup Node.js"
|
||||||
uses: "actions/setup-node@v4.0.1"
|
uses: "actions/setup-node@v4.0.2"
|
||||||
with:
|
with:
|
||||||
node-version: "20.x"
|
node-version: "20.x"
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
|
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@ -21,7 +21,7 @@ jobs:
|
|||||||
git_commit_gpgsign: true
|
git_commit_gpgsign: true
|
||||||
|
|
||||||
- name: "Setup Node.js"
|
- name: "Setup Node.js"
|
||||||
uses: "actions/setup-node@v4.0.1"
|
uses: "actions/setup-node@v4.0.2"
|
||||||
with:
|
with:
|
||||||
node-version: "20.x"
|
node-version: "20.x"
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
|
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
- uses: "actions/checkout@v4.1.1"
|
- uses: "actions/checkout@v4.1.1"
|
||||||
|
|
||||||
- name: "Setup Node.js"
|
- name: "Setup Node.js"
|
||||||
uses: "actions/setup-node@v4.0.1"
|
uses: "actions/setup-node@v4.0.2"
|
||||||
with:
|
with:
|
||||||
node-version: "20.x"
|
node-version: "20.x"
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
@ -30,7 +30,7 @@ jobs:
|
|||||||
- uses: "actions/checkout@v4.1.1"
|
- uses: "actions/checkout@v4.1.1"
|
||||||
|
|
||||||
- name: "Setup Node.js"
|
- name: "Setup Node.js"
|
||||||
uses: "actions/setup-node@v4.0.1"
|
uses: "actions/setup-node@v4.0.2"
|
||||||
with:
|
with:
|
||||||
node-version: "20.x"
|
node-version: "20.x"
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"$schema": "https://raw.githubusercontent.com/theoludwig/html-w3c-validator/master/schema/html-w3c-validatorrc-schema.json",
|
||||||
"urls": ["http://127.0.0.1:3000/", "http://127.0.0.1:3000/blog"],
|
"urls": ["http://127.0.0.1:3000/", "http://127.0.0.1:3000/blog"],
|
||||||
"files": ["./public/curriculum-vitae/index.html"],
|
"files": ["./public/curriculum-vitae/index.html"],
|
||||||
"severities": ["error"]
|
"severities": ["error"]
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
{
|
{
|
||||||
"**/*": ["prettier --write --ignore-unknown", "editorconfig-checker"],
|
"**/*": ["editorconfig-checker", "prettier --write --ignore-unknown"],
|
||||||
"**/*.{md,mdx}": ["markdownlint-cli2 --fix --no-globs"]
|
"**/*.md": ["markdownlint-cli2 --fix --no-globs"],
|
||||||
|
"**/*.{js,jsx,ts,tsx}": [
|
||||||
|
"eslint --fix --max-warnings 0 --report-unused-disable-directives"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
"no-duplicate-heading": false,
|
"no-duplicate-heading": false,
|
||||||
"no-inline-html": false,
|
"no-inline-html": false,
|
||||||
},
|
},
|
||||||
"globs": ["**/*.{md,mdx}"],
|
"globs": ["**/*.md"],
|
||||||
"ignores": ["**/node_modules"],
|
"ignores": ["**/node_modules"],
|
||||||
"customRules": ["markdownlint-rule-relative-links"],
|
"customRules": ["markdownlint-rule-relative-links"],
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
FROM node:20.11.0 AS builder-dependencies
|
FROM node:20.11.1 AS builder-dependencies
|
||||||
WORKDIR /usr/src/application
|
WORKDIR /usr/src/application
|
||||||
COPY ./package*.json ./
|
COPY ./package*.json ./
|
||||||
RUN npm clean-install
|
RUN npm clean-install
|
||||||
|
|
||||||
FROM node:20.11.0 AS builder
|
FROM node:20.11.1 AS builder
|
||||||
ENV NEXT_TELEMETRY_DISABLED=1
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
ENV IS_STANDALONE=true
|
ENV IS_STANDALONE=true
|
||||||
WORKDIR /usr/src/application
|
WORKDIR /usr/src/application
|
||||||
@ -11,7 +11,7 @@ COPY --from=builder-dependencies /usr/src/application/node_modules ./node_module
|
|||||||
COPY ./ ./
|
COPY ./ ./
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
FROM node:20.11.0-slim AS runner
|
FROM node:20.11.1-slim AS runner
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
ENV HOSTNAME=0.0.0.0
|
ENV HOSTNAME=0.0.0.0
|
||||||
ENV NEXT_TELEMETRY_DISABLED=1
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
|
@ -25,7 +25,7 @@ const BlogPage = async (): Promise<JSX.Element> => {
|
|||||||
return (
|
return (
|
||||||
<main className="flex flex-1 flex-col flex-wrap items-center">
|
<main className="flex flex-1 flex-col flex-wrap items-center">
|
||||||
<div className="mt-10 flex flex-col items-center">
|
<div className="mt-10 flex flex-col items-center">
|
||||||
<h1 className="text-4xl font-semibold text-yellow dark:text-yellow-dark">
|
<h1 className="text-4xl font-semibold text-primary dark:text-primary-dark">
|
||||||
Blog
|
Blog
|
||||||
</h1>
|
</h1>
|
||||||
<p className="mt-6 text-center" data-cy="blog-post-date">
|
<p className="mt-6 text-center" data-cy="blog-post-date">
|
||||||
|
@ -18,7 +18,7 @@ const ErrorHandling = (props: ErrorHandlingProps): JSX.Element => {
|
|||||||
<h1 className="my-6 text-4xl font-semibold">
|
<h1 className="my-6 text-4xl font-semibold">
|
||||||
Error{" "}
|
Error{" "}
|
||||||
<span
|
<span
|
||||||
className="text-yellow dark:text-yellow-dark"
|
className="text-primary dark:text-primary-dark"
|
||||||
data-cy="status-code"
|
data-cy="status-code"
|
||||||
>
|
>
|
||||||
500
|
500
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
.prose a,
|
.prose a,
|
||||||
.prose strong {
|
.prose strong {
|
||||||
@apply !font-semibold text-yellow dark:text-yellow-dark;
|
@apply !font-semibold text-primary dark:text-primary-dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
strong,
|
strong,
|
||||||
|
@ -10,7 +10,7 @@ const NotFound = (): JSX.Element => {
|
|||||||
<h1 className="my-6 text-4xl font-semibold">
|
<h1 className="my-6 text-4xl font-semibold">
|
||||||
{i18n.translate("errors.error")}{" "}
|
{i18n.translate("errors.error")}{" "}
|
||||||
<span
|
<span
|
||||||
className="text-yellow dark:text-yellow-dark"
|
className="text-primary dark:text-primary-dark"
|
||||||
data-cy="status-code"
|
data-cy="status-code"
|
||||||
>
|
>
|
||||||
404
|
404
|
||||||
@ -20,7 +20,7 @@ const NotFound = (): JSX.Element => {
|
|||||||
{i18n.translate("errors.not-found")}{" "}
|
{i18n.translate("errors.not-found")}{" "}
|
||||||
<Link
|
<Link
|
||||||
href="/"
|
href="/"
|
||||||
className="text-yellow hover:underline dark:text-yellow-dark"
|
className="text-primary hover:underline dark:text-primary-dark"
|
||||||
>
|
>
|
||||||
{i18n.translate("errors.return-to-home-page")}
|
{i18n.translate("errors.return-to-home-page")}
|
||||||
</Link>
|
</Link>
|
||||||
|
@ -21,7 +21,7 @@ export const BlogPost = async (props: BlogPostProps): Promise<JSX.Element> => {
|
|||||||
return (
|
return (
|
||||||
<main className="break-wrap-words flex flex-1 flex-col flex-wrap items-center justify-center">
|
<main className="break-wrap-words flex flex-1 flex-col flex-wrap items-center justify-center">
|
||||||
<div className="my-10 flex flex-col items-center text-center">
|
<div className="my-10 flex flex-col items-center text-center">
|
||||||
<h1 className="text-3xl font-semibold text-yellow dark:text-yellow-dark">
|
<h1 className="text-3xl font-semibold text-primary dark:text-primary-dark">
|
||||||
{blogPost.frontmatter.title}
|
{blogPost.frontmatter.title}
|
||||||
</h1>
|
</h1>
|
||||||
<p className="mt-2" data-cy="blog-post-date">
|
<p className="mt-2" data-cy="blog-post-date">
|
||||||
|
@ -25,7 +25,7 @@ export const BlogPosts = async (): Promise<JSX.Element> => {
|
|||||||
<ShadowContainer className="cursor-pointer p-6 transition duration-200 ease-in-out hover:-translate-y-2">
|
<ShadowContainer className="cursor-pointer p-6 transition duration-200 ease-in-out hover:-translate-y-2">
|
||||||
<h2
|
<h2
|
||||||
data-cy="blog-post-title"
|
data-cy="blog-post-title"
|
||||||
className="text-xl font-semibold text-yellow dark:text-yellow-dark"
|
className="text-xl font-semibold text-primary dark:text-primary-dark"
|
||||||
>
|
>
|
||||||
{post.frontmatter.title}
|
{post.frontmatter.title}
|
||||||
</h2>
|
</h2>
|
||||||
|
@ -84,7 +84,10 @@ git add .
|
|||||||
git add <file>
|
git add <file>
|
||||||
|
|
||||||
# Commit changes
|
# Commit changes
|
||||||
git commit -m "chore: initial commit"
|
git commit -m "Commit message"
|
||||||
|
|
||||||
|
# Commit changes in the past
|
||||||
|
git commit --date "10 day ago" -m "Commit message"
|
||||||
|
|
||||||
# Add remote repository
|
# Add remote repository
|
||||||
git remote add <remote> <url>
|
git remote add <remote> <url>
|
||||||
|
@ -9,7 +9,7 @@ export const FooterText = (): JSX.Element => {
|
|||||||
<p>
|
<p>
|
||||||
<Link
|
<Link
|
||||||
href="/"
|
href="/"
|
||||||
className="font-semibold text-yellow hover:underline dark:text-yellow-dark"
|
className="font-semibold text-primary hover:underline dark:text-primary-dark"
|
||||||
>
|
>
|
||||||
Théo LUDWIG
|
Théo LUDWIG
|
||||||
</Link>{" "}
|
</Link>{" "}
|
||||||
|
@ -16,7 +16,7 @@ export const FooterVersion = (props: FooterVersionProps): JSX.Element => {
|
|||||||
Version{" "}
|
Version{" "}
|
||||||
<a
|
<a
|
||||||
data-cy="version-link"
|
data-cy="version-link"
|
||||||
className="font-semibold text-yellow hover:underline dark:text-yellow-dark"
|
className="font-semibold text-primary hover:underline dark:text-primary-dark"
|
||||||
href={versionLink}
|
href={versionLink}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
|
import { getVersion } from "@/utils/getVersion"
|
||||||
|
|
||||||
import { FooterText } from "./FooterText"
|
import { FooterText } from "./FooterText"
|
||||||
import { FooterVersion } from "./FooterVersion"
|
import { FooterVersion } from "./FooterVersion"
|
||||||
|
|
||||||
export const Footer = async (): Promise<JSX.Element> => {
|
export const Footer = async (): Promise<JSX.Element> => {
|
||||||
const { readPackage } = await import("read-pkg")
|
const version = await getVersion()
|
||||||
const { version } = await readPackage()
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<footer className="flex flex-col items-center justify-center border-t-2 border-gray-600 bg-white py-6 text-lg dark:border-gray-400 dark:bg-black">
|
<footer className="flex flex-col items-center justify-center border-t-2 border-gray-600 bg-white py-6 text-lg dark:border-gray-400 dark:bg-black">
|
||||||
|
@ -23,7 +23,7 @@ export const Header = (): JSX.Element => {
|
|||||||
alt="Théo LUDWIG"
|
alt="Théo LUDWIG"
|
||||||
priority
|
priority
|
||||||
/>
|
/>
|
||||||
<strong className="ml-1 hidden font-headline font-semibold text-yellow dark:text-yellow-dark sm:block sm:text-xl">
|
<strong className="ml-1 hidden font-headline font-semibold text-primary dark:text-primary-dark sm:block sm:text-xl">
|
||||||
Théo LUDWIG
|
Théo LUDWIG
|
||||||
</strong>
|
</strong>
|
||||||
</h1>
|
</h1>
|
||||||
@ -33,7 +33,7 @@ export const Header = (): JSX.Element => {
|
|||||||
<Link
|
<Link
|
||||||
href="/blog"
|
href="/blog"
|
||||||
data-cy="header-blog-link"
|
data-cy="header-blog-link"
|
||||||
className="font-semibold text-yellow hover:underline dark:text-yellow-dark"
|
className="font-semibold text-primary hover:underline dark:text-primary-dark"
|
||||||
>
|
>
|
||||||
Blog
|
Blog
|
||||||
</Link>
|
</Link>
|
||||||
|
@ -22,7 +22,7 @@ export const InterestParagraph = (
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<p className="my-6 text-center text-gray dark:text-gray-dark">
|
<p className="my-6 text-center text-gray dark:text-gray-dark">
|
||||||
<strong className="text-lg font-semibold text-yellow dark:text-yellow-dark">
|
<strong className="text-lg font-semibold text-primary dark:text-primary-dark">
|
||||||
{title}
|
{title}
|
||||||
</strong>
|
</strong>
|
||||||
<br />
|
<br />
|
||||||
|
@ -12,7 +12,7 @@ export const InterestItem = (props: InterestItemProps): JSX.Element => {
|
|||||||
return (
|
return (
|
||||||
<li className="m-2 size-8" title={title}>
|
<li className="m-2 size-8" title={title}>
|
||||||
<FontAwesomeIcon
|
<FontAwesomeIcon
|
||||||
className="block size-full text-yellow dark:text-yellow-dark"
|
className="block size-full text-primary dark:text-primary-dark"
|
||||||
icon={fontAwesomeIcon}
|
icon={fontAwesomeIcon}
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
|
@ -15,7 +15,7 @@ export const Repository = (props: RepositoryProps): JSX.Element => {
|
|||||||
<a href={href} target="_blank" rel="noopener noreferrer">
|
<a href={href} target="_blank" rel="noopener noreferrer">
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<GitHubIcon className="mr-2 h-6" />
|
<GitHubIcon className="mr-2 h-6" />
|
||||||
<span className="font-semibold text-yellow dark:text-yellow-dark">
|
<span className="font-semibold text-primary dark:text-primary-dark">
|
||||||
{name}
|
{name}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -32,7 +32,7 @@ export const PortfolioItem = (props: PortfolioItemProps): JSX.Element => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="absolute bottom-0 h-auto overflow-hidden text-center opacity-0 transition-opacity duration-500 group-hover:opacity-100">
|
<div className="absolute bottom-0 h-auto overflow-hidden text-center opacity-0 transition-opacity duration-500 group-hover:opacity-100">
|
||||||
<h3 className="my-6 text-2xl font-semibold text-yellow dark:text-yellow-dark">
|
<h3 className="my-6 text-2xl font-semibold text-primary dark:text-primary-dark">
|
||||||
{title}
|
{title}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mx-4 my-6 font-semibold">{description}</p>
|
<p className="mx-4 my-6 font-semibold">{description}</p>
|
||||||
|
@ -12,7 +12,7 @@ export const ProfileDescriptionBottom = (): JSX.Element => {
|
|||||||
<br />
|
<br />
|
||||||
<a
|
<a
|
||||||
href="/curriculum-vitae/index.html"
|
href="/curriculum-vitae/index.html"
|
||||||
className="font-semibold text-yellow hover:underline dark:text-yellow-dark"
|
className="font-semibold text-primary hover:underline dark:text-primary-dark"
|
||||||
>
|
>
|
||||||
Curriculum vitæ ({i18n.translate("common.fr-FR")})
|
Curriculum vitæ ({i18n.translate("common.fr-FR")})
|
||||||
</a>
|
</a>
|
||||||
|
@ -5,7 +5,7 @@ export const ProfileInformation = (): JSX.Element => {
|
|||||||
|
|
||||||
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-primary dark:text-primary-dark">
|
||||||
Théo LUDWIG
|
Théo LUDWIG
|
||||||
</h1>
|
</h1>
|
||||||
<h2 className="mb-3 text-base">
|
<h2 className="mb-3 text-base">
|
||||||
|
@ -5,6 +5,7 @@ import { useMemo } from "react"
|
|||||||
import { useI18n } from "@/i18n/i18n.client"
|
import { useI18n } from "@/i18n/i18n.client"
|
||||||
import { BIRTH_DATE, BIRTH_DATE_STRING, getAge } from "@/utils/getAge"
|
import { BIRTH_DATE, BIRTH_DATE_STRING, getAge } from "@/utils/getAge"
|
||||||
import type { CookiesStore } from "@/utils/constants"
|
import type { CookiesStore } from "@/utils/constants"
|
||||||
|
import { useIsMounted } from "@/hooks/useIsMounted"
|
||||||
|
|
||||||
import { ProfileItem } from "./ProfileItem"
|
import { ProfileItem } from "./ProfileItem"
|
||||||
|
|
||||||
@ -21,18 +22,22 @@ export const ProfileList = (props: ProfileListProps): JSX.Element => {
|
|||||||
return getAge(BIRTH_DATE)
|
return getAge(BIRTH_DATE)
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
const { isMounted } = useIsMounted()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ul className="m-0 list-none p-0">
|
<ul className="m-0 list-none p-0">
|
||||||
<ProfileItem
|
<ProfileItem
|
||||||
title={i18n.translate("home.about.pronouns")}
|
title={i18n.translate("home.about.pronouns")}
|
||||||
value={i18n.translate("home.about.pronouns-value")}
|
value={i18n.translate("home.about.pronouns-value")}
|
||||||
/>
|
/>
|
||||||
|
{isMounted ? (
|
||||||
<ProfileItem
|
<ProfileItem
|
||||||
title={i18n.translate("home.about.birth-date")}
|
title={i18n.translate("home.about.birth-date")}
|
||||||
value={`${BIRTH_DATE_STRING} (${age} ${i18n.translate(
|
value={`${BIRTH_DATE_STRING} (${age} ${i18n.translate(
|
||||||
"home.about.years-old",
|
"home.about.years-old",
|
||||||
)})`}
|
)})`}
|
||||||
/>
|
/>
|
||||||
|
) : null}
|
||||||
<ProfileItem
|
<ProfileItem
|
||||||
title={i18n.translate("home.about.nationality")}
|
title={i18n.translate("home.about.nationality")}
|
||||||
value="Alsace, France"
|
value="Alsace, France"
|
||||||
|
@ -29,7 +29,7 @@ export const SkillComponent = (props: SkillComponentProps): JSX.Element => {
|
|||||||
return (
|
return (
|
||||||
<a
|
<a
|
||||||
href={skillProperties.link}
|
href={skillProperties.link}
|
||||||
className="mx-2 max-w-xl text-yellow hover:underline dark:text-yellow-dark"
|
className="mx-2 max-w-xl text-primary hover:underline dark:text-primary-dark"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
|
@ -14,7 +14,7 @@ export const SkillsSection = (props: SkillsSectionProps): JSX.Element => {
|
|||||||
<div className="flex flex-wrap px-4 py-6">
|
<div className="flex flex-wrap px-4 py-6">
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<div className="mb-8 border-b border-gray-600 dark:border-white/10">
|
<div className="mb-8 border-b border-gray-600 dark:border-white/10">
|
||||||
<h3 className="my-3 text-xl font-semibold text-yellow dark:text-yellow-dark">
|
<h3 className="my-3 text-xl font-semibold text-primary dark:text-primary-dark">
|
||||||
{title}
|
{title}
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
|
@ -16,7 +16,7 @@ export const Loader = (props: LoaderProps): JSX.Element => {
|
|||||||
height,
|
height,
|
||||||
}}
|
}}
|
||||||
className={classNames(
|
className={classNames(
|
||||||
"inline-block animate-spin rounded-full border-[3px] border-current border-t-transparent text-yellow dark:text-yellow-dark",
|
"inline-block animate-spin rounded-full border-[3px] border-current border-t-transparent text-primary dark:text-primary-dark",
|
||||||
className,
|
className,
|
||||||
)}
|
)}
|
||||||
role="status"
|
role="status"
|
||||||
|
@ -6,7 +6,7 @@ export const SectionHeading = (props: SectionHeadingProps): JSX.Element => {
|
|||||||
return (
|
return (
|
||||||
<h2
|
<h2
|
||||||
{...rest}
|
{...rest}
|
||||||
className="mb-3 mt-1 text-center text-4xl font-semibold text-yellow dark:text-yellow-dark"
|
className="mb-3 mt-1 text-center text-4xl font-semibold text-primary dark:text-primary-dark"
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</h2>
|
</h2>
|
||||||
|
154
curriculum-vitae/package-lock.json
generated
154
curriculum-vitae/package-lock.json
generated
@ -12,9 +12,9 @@
|
|||||||
"modern-normalize": "2.0.0"
|
"modern-normalize": "2.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "20.11.8",
|
"@types/node": "20.11.17",
|
||||||
"date-and-time": "3.1.1",
|
"date-and-time": "3.1.1",
|
||||||
"vite": "5.0.12",
|
"vite": "5.1.2",
|
||||||
"vite-plugin-html": "3.2.2"
|
"vite-plugin-html": "3.2.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -401,9 +401,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/resolve-uri": {
|
"node_modules/@jridgewell/resolve-uri": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||||
"integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
|
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.0.0"
|
"node": ">=6.0.0"
|
||||||
@ -493,9 +493,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.11.0.tgz",
|
||||||
"integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==",
|
"integrity": "sha512-BV+u2QSfK3i1o6FucqJh5IK9cjAU6icjFFhvknzFgu472jzl0bBojfDAkJLBEsHFMo+YZg6rthBvBBt8z12IBQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@ -506,9 +506,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm64": {
|
"node_modules/@rollup/rollup-android-arm64": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.11.0.tgz",
|
||||||
"integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==",
|
"integrity": "sha512-0ij3iw7sT5jbcdXofWO2NqDNjSVVsf6itcAkV2I6Xsq4+6wjW1A8rViVB67TfBEan7PV2kbLzT8rhOVWLI2YXw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@ -519,9 +519,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.11.0.tgz",
|
||||||
"integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==",
|
"integrity": "sha512-yPLs6RbbBMupArf6qv1UDk6dzZvlH66z6NLYEwqTU0VHtss1wkI4UYeeMS7TVj5QRVvaNAWYKP0TD/MOeZ76Zg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@ -532,9 +532,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-x64": {
|
"node_modules/@rollup/rollup-darwin-x64": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.11.0.tgz",
|
||||||
"integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==",
|
"integrity": "sha512-OvqIgwaGAwnASzXaZEeoJY3RltOFg+WUbdkdfoluh2iqatd090UeOG3A/h0wNZmE93dDew9tAtXgm3/+U/B6bw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@ -545,9 +545,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.11.0.tgz",
|
||||||
"integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==",
|
"integrity": "sha512-X17s4hZK3QbRmdAuLd2EE+qwwxL8JxyVupEqAkxKPa/IgX49ZO+vf0ka69gIKsaYeo6c1CuwY3k8trfDtZ9dFg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@ -558,9 +558,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.11.0.tgz",
|
||||||
"integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==",
|
"integrity": "sha512-673Lu9EJwxVB9NfYeA4AdNu0FOHz7g9t6N1DmT7bZPn1u6bTF+oZjj+fuxUcrfxWXE0r2jxl5QYMa9cUOj9NFg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@ -571,9 +571,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.11.0.tgz",
|
||||||
"integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==",
|
"integrity": "sha512-yFW2msTAQNpPJaMmh2NpRalr1KXI7ZUjlN6dY/FhWlOclMrZezm5GIhy3cP4Ts2rIAC+IPLAjNibjp1BsxCVGg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@ -584,9 +584,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.11.0.tgz",
|
||||||
"integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==",
|
"integrity": "sha512-kKT9XIuhbvYgiA3cPAGntvrBgzhWkGpBMzuk1V12Xuoqg7CI41chye4HU0vLJnGf9MiZzfNh4I7StPeOzOWJfA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
@ -597,9 +597,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.11.0.tgz",
|
||||||
"integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==",
|
"integrity": "sha512-6q4ESWlyTO+erp1PSCmASac+ixaDv11dBk1fqyIuvIUc/CmRAX2Zk+2qK1FGo5q7kyDcjHCFVwgGFCGIZGVwCA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@ -610,9 +610,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.11.0.tgz",
|
||||||
"integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==",
|
"integrity": "sha512-vIAQUmXeMLmaDN78HSE4Kh6xqof2e3TJUKr+LPqXWU4NYNON0MDN9h2+t4KHrPAQNmU3w1GxBQ/n01PaWFwa5w==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@ -623,9 +623,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.11.0.tgz",
|
||||||
"integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==",
|
"integrity": "sha512-LVXo9dDTGPr0nezMdqa1hK4JeoMZ02nstUxGYY/sMIDtTYlli1ZxTXBYAz3vzuuvKO4X6NBETciIh7N9+abT1g==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@ -636,9 +636,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.11.0.tgz",
|
||||||
"integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==",
|
"integrity": "sha512-xZVt6K70Gr3I7nUhug2dN6VRR1ibot3rXqXS3wo+8JP64t7djc3lBFyqO4GiVrhNaAIhUCJtwQ/20dr0h0thmQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
@ -649,9 +649,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.11.0.tgz",
|
||||||
"integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==",
|
"integrity": "sha512-f3I7h9oTg79UitEco9/2bzwdciYkWr8pITs3meSDSlr1TdvQ7IxkQaaYN2YqZXX5uZhiYL+VuYDmHwNzhx+HOg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@ -668,9 +668,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "20.11.8",
|
"version": "20.11.17",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.8.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz",
|
||||||
"integrity": "sha512-i7omyekpPTNdv4Jb/Rgqg0RU8YqLcNsI12quKSDkRXNfx7Wxdm6HhK1awT3xTgEkgxPn3bvnSpiEAc7a7Lpyow==",
|
"integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~5.26.4"
|
"undici-types": "~5.26.4"
|
||||||
@ -941,15 +941,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/dotenv": {
|
"node_modules/dotenv": {
|
||||||
"version": "16.4.1",
|
"version": "16.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.4.tgz",
|
||||||
"integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==",
|
"integrity": "sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/motdotla/dotenv?sponsor=1"
|
"url": "https://dotenvx.com"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/dotenv-expand": {
|
"node_modules/dotenv-expand": {
|
||||||
@ -1046,9 +1046,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fastq": {
|
"node_modules/fastq": {
|
||||||
"version": "1.17.0",
|
"version": "1.17.1",
|
||||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
|
||||||
"integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==",
|
"integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"reusify": "^1.0.4"
|
"reusify": "^1.0.4"
|
||||||
@ -1395,9 +1395,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.4.33",
|
"version": "8.4.35",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
|
||||||
"integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==",
|
"integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -1462,9 +1462,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rollup": {
|
"node_modules/rollup": {
|
||||||
"version": "4.9.6",
|
"version": "4.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.11.0.tgz",
|
||||||
"integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==",
|
"integrity": "sha512-2xIbaXDXjf3u2tajvA5xROpib7eegJ9Y/uPlSFhXLNpK9ampCczXAhLEb5yLzJyG3LAdI1NWtNjDXiLyniNdjQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/estree": "1.0.5"
|
"@types/estree": "1.0.5"
|
||||||
@ -1477,19 +1477,19 @@
|
|||||||
"npm": ">=8.0.0"
|
"npm": ">=8.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@rollup/rollup-android-arm-eabi": "4.9.6",
|
"@rollup/rollup-android-arm-eabi": "4.11.0",
|
||||||
"@rollup/rollup-android-arm64": "4.9.6",
|
"@rollup/rollup-android-arm64": "4.11.0",
|
||||||
"@rollup/rollup-darwin-arm64": "4.9.6",
|
"@rollup/rollup-darwin-arm64": "4.11.0",
|
||||||
"@rollup/rollup-darwin-x64": "4.9.6",
|
"@rollup/rollup-darwin-x64": "4.11.0",
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.9.6",
|
"@rollup/rollup-linux-arm-gnueabihf": "4.11.0",
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.9.6",
|
"@rollup/rollup-linux-arm64-gnu": "4.11.0",
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.9.6",
|
"@rollup/rollup-linux-arm64-musl": "4.11.0",
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.9.6",
|
"@rollup/rollup-linux-riscv64-gnu": "4.11.0",
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.9.6",
|
"@rollup/rollup-linux-x64-gnu": "4.11.0",
|
||||||
"@rollup/rollup-linux-x64-musl": "4.9.6",
|
"@rollup/rollup-linux-x64-musl": "4.11.0",
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.9.6",
|
"@rollup/rollup-win32-arm64-msvc": "4.11.0",
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.9.6",
|
"@rollup/rollup-win32-ia32-msvc": "4.11.0",
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.9.6",
|
"@rollup/rollup-win32-x64-msvc": "4.11.0",
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1614,13 +1614,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "5.0.12",
|
"version": "5.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-5.1.2.tgz",
|
||||||
"integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==",
|
"integrity": "sha512-uwiFebQbTWRIGbCaTEBVAfKqgqKNKMJ2uPXsXeLIZxM8MVMjoS3j0cG8NrPxdDIadaWnPSjrkLWffLSC+uiP3Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.19.3",
|
"esbuild": "^0.19.3",
|
||||||
"postcss": "^8.4.32",
|
"postcss": "^8.4.35",
|
||||||
"rollup": "^4.2.0"
|
"rollup": "^4.2.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
|
@ -13,9 +13,9 @@
|
|||||||
"modern-normalize": "2.0.0"
|
"modern-normalize": "2.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "20.11.8",
|
"@types/node": "20.11.17",
|
||||||
"date-and-time": "3.1.1",
|
"date-and-time": "3.1.1",
|
||||||
"vite": "5.0.12",
|
"vite": "5.1.2",
|
||||||
"vite-plugin-html": "3.2.2"
|
"vite-plugin-html": "3.2.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
hooks/useIsMounted.ts
Normal file
15
hooks/useIsMounted.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { useEffect, useState } from "react"
|
||||||
|
|
||||||
|
export interface UseIsMountedResult {
|
||||||
|
isMounted: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useIsMounted = (): UseIsMountedResult => {
|
||||||
|
const [isMounted, setIsMounted] = useState(false)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setIsMounted(true)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return { isMounted }
|
||||||
|
}
|
@ -18,7 +18,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Open-Source Enthusiast",
|
"title": "Open-Source Enthusiast",
|
||||||
"description": "I value the <strong>sharing of knowledge and collaboration</strong> to collectively resolve problems. <br /> The source code of the website is available on <a class='text-yellow dark:text-yellow-dark hover:underline font-semibold' href='https://github.com/theoludwig/theoludwig' target='_blank' rel='noopener noreferrer'>GitHub</a>.",
|
"description": "I value the <strong>sharing of knowledge and collaboration</strong> to collectively resolve problems. <br /> The source code of the website is available on <a class='text-primary dark:text-primary-dark hover:underline font-semibold' href='https://github.com/theoludwig/theoludwig' target='_blank' rel='noopener noreferrer'>GitHub</a>.",
|
||||||
"id": "open-source"
|
"id": "open-source"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Enthousiaste de l'Open-Source",
|
"title": "Enthousiaste de l'Open-Source",
|
||||||
"description": "J'apprécie le <strong>partage des connaissances et la collaboration</strong> pour résoudre des défis collectivement. <br /> Le code source du site est accessible sur <a class='text-yellow dark:text-yellow-dark hover:underline font-semibold' href='https://github.com/theoludwig/theoludwig' target='_blank' rel='noopener noreferrer'>GitHub</a>.",
|
"description": "J'apprécie le <strong>partage des connaissances et la collaboration</strong> pour résoudre des défis collectivement. <br /> Le code source du site est accessible sur <a class='text-primary dark:text-primary-dark hover:underline font-semibold' href='https://github.com/theoludwig/theoludwig' target='_blank' rel='noopener noreferrer'>GitHub</a>.",
|
||||||
"id": "open-source"
|
"id": "open-source"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
1700
package-lock.json
generated
1700
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
42
package.json
42
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "theoludwig",
|
"name": "theoludwig",
|
||||||
"version": "3.2.1",
|
"version": "3.2.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -39,7 +39,7 @@
|
|||||||
"clsx": "2.1.0",
|
"clsx": "2.1.0",
|
||||||
"date-and-time": "3.1.1",
|
"date-and-time": "3.1.1",
|
||||||
"gray-matter": "4.0.3",
|
"gray-matter": "4.0.3",
|
||||||
"html-react-parser": "5.1.1",
|
"html-react-parser": "5.1.5",
|
||||||
"i18n-js": "4.3.2",
|
"i18n-js": "4.3.2",
|
||||||
"katex": "0.16.9",
|
"katex": "0.16.9",
|
||||||
"negotiator": "0.6.3",
|
"negotiator": "0.6.3",
|
||||||
@ -60,41 +60,41 @@
|
|||||||
"universal-cookie": "7.0.2"
|
"universal-cookie": "7.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "18.6.0",
|
"@commitlint/cli": "18.6.1",
|
||||||
"@commitlint/config-conventional": "18.6.0",
|
"@commitlint/config-conventional": "18.6.2",
|
||||||
"@saithodev/semantic-release-backmerge": "4.0.1",
|
"@saithodev/semantic-release-backmerge": "4.0.1",
|
||||||
"@semantic-release/git": "10.0.1",
|
"@semantic-release/git": "10.0.1",
|
||||||
"@tailwindcss/typography": "0.5.10",
|
"@tailwindcss/typography": "0.5.10",
|
||||||
"@total-typescript/ts-reset": "0.5.1",
|
"@total-typescript/ts-reset": "0.5.1",
|
||||||
"@tsconfig/strictest": "2.0.2",
|
"@tsconfig/strictest": "2.0.3",
|
||||||
"@types/negotiator": "0.6.3",
|
"@types/negotiator": "0.6.3",
|
||||||
"@types/node": "20.11.8",
|
"@types/node": "20.11.17",
|
||||||
"@types/react": "18.2.48",
|
"@types/react": "18.2.55",
|
||||||
"@types/unist": "3.0.2",
|
"@types/unist": "3.0.2",
|
||||||
"@typescript-eslint/eslint-plugin": "6.19.1",
|
"@typescript-eslint/eslint-plugin": "7.0.1",
|
||||||
"@typescript-eslint/parser": "6.19.1",
|
"@typescript-eslint/parser": "7.0.1",
|
||||||
"autoprefixer": "10.4.17",
|
"autoprefixer": "10.4.17",
|
||||||
"curriculum-vitae": "file:./curriculum-vitae",
|
"curriculum-vitae": "file:./curriculum-vitae",
|
||||||
"cypress": "13.6.3",
|
"cypress": "13.6.4",
|
||||||
"editorconfig-checker": "5.1.2",
|
"editorconfig-checker": "5.1.4",
|
||||||
"eslint": "8.56.0",
|
"eslint": "8.56.0",
|
||||||
"eslint-config-conventions": "13.1.0",
|
"eslint-config-conventions": "14.0.0",
|
||||||
"eslint-config-next": "14.1.0",
|
"eslint-config-next": "14.1.0",
|
||||||
"eslint-config-prettier": "9.1.0",
|
"eslint-config-prettier": "9.1.0",
|
||||||
"eslint-plugin-import": "2.29.1",
|
"eslint-plugin-import": "2.29.1",
|
||||||
"eslint-plugin-prettier": "5.1.3",
|
"eslint-plugin-prettier": "5.1.3",
|
||||||
"eslint-plugin-promise": "6.1.1",
|
"eslint-plugin-promise": "6.1.1",
|
||||||
"eslint-plugin-tailwindcss": "3.14.1",
|
"eslint-plugin-tailwindcss": "3.14.2",
|
||||||
"eslint-plugin-unicorn": "50.0.1",
|
"eslint-plugin-unicorn": "51.0.1",
|
||||||
"html-w3c-validator": "1.5.1",
|
"html-w3c-validator": "1.6.1",
|
||||||
"husky": "9.0.6",
|
"husky": "9.0.11",
|
||||||
"lint-staged": "15.2.0",
|
"lint-staged": "15.2.2",
|
||||||
"markdownlint-cli2": "0.12.1",
|
"markdownlint-cli2": "0.12.1",
|
||||||
"markdownlint-rule-relative-links": "2.2.0",
|
"markdownlint-rule-relative-links": "2.3.1",
|
||||||
"postcss": "8.4.33",
|
"postcss": "8.4.35",
|
||||||
"prettier": "3.2.4",
|
"prettier": "3.2.5",
|
||||||
"prettier-plugin-tailwindcss": "0.5.11",
|
"prettier-plugin-tailwindcss": "0.5.11",
|
||||||
"semantic-release": "23.0.0",
|
"semantic-release": "23.0.2",
|
||||||
"start-server-and-test": "2.0.3",
|
"start-server-and-test": "2.0.3",
|
||||||
"tailwindcss": "3.4.1",
|
"tailwindcss": "3.4.1",
|
||||||
"typescript": "5.3.3"
|
"typescript": "5.3.3"
|
||||||
|
@ -14,7 +14,7 @@ const tailwindConfig = {
|
|||||||
DEFAULT: "#333333",
|
DEFAULT: "#333333",
|
||||||
dark: "#b7c0c9",
|
dark: "#b7c0c9",
|
||||||
},
|
},
|
||||||
yellow: {
|
primary: {
|
||||||
DEFAULT: "#006cff",
|
DEFAULT: "#006cff",
|
||||||
dark: "#00aeff",
|
dark: "#00aeff",
|
||||||
},
|
},
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["./*"],
|
"@/*": ["./*"]
|
||||||
},
|
},
|
||||||
"types": ["@total-typescript/ts-reset", "cypress"],
|
"types": ["@total-typescript/ts-reset", "cypress"],
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
@ -20,10 +20,10 @@
|
|||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
"name": "next",
|
"name": "next"
|
||||||
},
|
}
|
||||||
],
|
]
|
||||||
},
|
},
|
||||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||||
"exclude": ["node_modules", ".next"],
|
"exclude": ["node_modules", ".next"]
|
||||||
}
|
}
|
||||||
|
8
utils/getVersion.ts
Normal file
8
utils/getVersion.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
export const getVersion = async (): Promise<string> => {
|
||||||
|
if (process.env.NODE_ENV === "development") {
|
||||||
|
return "0.0.0-development"
|
||||||
|
}
|
||||||
|
const { readPackage } = await import("read-pkg")
|
||||||
|
const { version } = await readPackage()
|
||||||
|
return version
|
||||||
|
}
|
Reference in New Issue
Block a user