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

Compare commits

...

12 Commits

41 changed files with 1122 additions and 922 deletions

View File

@ -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"
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -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"]

View File

@ -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"
]
} }

View File

@ -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"],
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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>{" "}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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")}
/> />
<ProfileItem {isMounted ? (
title={i18n.translate("home.about.birth-date")} <ProfileItem
value={`${BIRTH_DATE_STRING} (${age} ${i18n.translate( title={i18n.translate("home.about.birth-date")}
"home.about.years-old", value={`${BIRTH_DATE_STRING} (${age} ${i18n.translate(
)})`} "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"

View File

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

View File

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

View File

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

View File

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

View File

@ -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": {

View File

@ -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
View 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 }
}

View File

@ -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"
} }
] ]

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -14,7 +14,7 @@ const tailwindConfig = {
DEFAULT: "#333333", DEFAULT: "#333333",
dark: "#b7c0c9", dark: "#b7c0c9",
}, },
yellow: { primary: {
DEFAULT: "#006cff", DEFAULT: "#006cff",
dark: "#00aeff", dark: "#00aeff",
}, },

View File

@ -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
View 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
}