mirror of
https://github.com/theoludwig/theoludwig.git
synced 2025-09-11 23:09:22 +02:00
chore: clean up
This commit is contained in:
20
.github/ISSUE_TEMPLATE/BUG.md
vendored
20
.github/ISSUE_TEMPLATE/BUG.md
vendored
@@ -1,20 +0,0 @@
|
||||
---
|
||||
name: "🐛 Bug Report"
|
||||
about: "Report an unexpected problem or unintended behavior."
|
||||
title: "[Bug]"
|
||||
labels: "bug"
|
||||
---
|
||||
|
||||
<!--
|
||||
Please provide a clear and concise description of what the bug is. Include
|
||||
screenshots if needed. Please make sure your issue has not already been fixed.
|
||||
-->
|
||||
|
||||
## Steps To Reproduce
|
||||
|
||||
1. Step 1
|
||||
2. Step 2
|
||||
|
||||
## The current behavior
|
||||
|
||||
## The expected behavior
|
18
.github/ISSUE_TEMPLATE/DOCUMENTATION.md
vendored
18
.github/ISSUE_TEMPLATE/DOCUMENTATION.md
vendored
@@ -1,18 +0,0 @@
|
||||
---
|
||||
name: "📜 Documentation"
|
||||
about: "Correct spelling errors, improvements or additions to documentation files (README, CONTRIBUTING...)."
|
||||
title: "[Documentation]"
|
||||
labels: "documentation"
|
||||
---
|
||||
|
||||
<!-- Please make sure your issue has not already been fixed. -->
|
||||
|
||||
## Documentation
|
||||
|
||||
<!-- Please uncomment the type of documentation problem this issue address -->
|
||||
|
||||
<!-- Documentation is Missing -->
|
||||
<!-- Documentation is Confusing -->
|
||||
<!-- Documentation has Typo errors -->
|
||||
|
||||
## Proposal
|
20
.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
vendored
20
.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
vendored
@@ -1,20 +0,0 @@
|
||||
---
|
||||
name: "✨ Feature Request"
|
||||
about: "Suggest a new feature idea."
|
||||
title: "[Feature]"
|
||||
labels: "feature request"
|
||||
---
|
||||
|
||||
<!-- Please make sure your issue has not already been fixed. -->
|
||||
|
||||
## Description
|
||||
|
||||
<!-- A clear and concise description of the problem or missing capability... -->
|
||||
|
||||
## Describe the solution you'd like
|
||||
|
||||
<!-- If you have a solution in mind, please describe it. -->
|
||||
|
||||
## Describe alternatives you've considered
|
||||
|
||||
<!-- Have you considered any alternative solutions or workarounds? -->
|
20
.github/ISSUE_TEMPLATE/IMPROVEMENT.md
vendored
20
.github/ISSUE_TEMPLATE/IMPROVEMENT.md
vendored
@@ -1,20 +0,0 @@
|
||||
---
|
||||
name: "🔧 Improvement"
|
||||
about: "Improve structure/format/performance/refactor/tests of the code."
|
||||
title: "[Improvement]"
|
||||
labels: "improvement"
|
||||
---
|
||||
|
||||
<!-- Please make sure your issue has not already been fixed. -->
|
||||
|
||||
## Type of Improvement
|
||||
|
||||
<!-- Please uncomment the type of improvements this issue address -->
|
||||
|
||||
<!-- Files and Folders Structure -->
|
||||
<!-- Performance -->
|
||||
<!-- Refactoring code -->
|
||||
<!-- Tests -->
|
||||
<!-- Not Sure? -->
|
||||
|
||||
## Proposal
|
8
.github/ISSUE_TEMPLATE/QUESTION.md
vendored
8
.github/ISSUE_TEMPLATE/QUESTION.md
vendored
@@ -1,8 +0,0 @@
|
||||
---
|
||||
name: "🙋 Question"
|
||||
about: "Further information is requested."
|
||||
title: "[Question]"
|
||||
labels: "question"
|
||||
---
|
||||
|
||||
### Question
|
7
.github/PULL_REQUEST_TEMPLATE.md
vendored
7
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,7 +0,0 @@
|
||||
<!-- Please first discuss the change you wish to make via issue before making a change. It might avoid a waste of your time. -->
|
||||
|
||||
# What changes this PR introduce?
|
||||
|
||||
## List any relevant issue numbers
|
||||
|
||||
## Is there anything you'd like reviewers to focus on?
|
5
.github/workflows/chromatic.yml
vendored
5
.github/workflows/chromatic.yml
vendored
@@ -11,11 +11,14 @@ jobs:
|
||||
timeout-minutes: 30
|
||||
runs-on: "ubuntu-latest"
|
||||
env:
|
||||
CI: "1"
|
||||
TZ: "Europe/Paris"
|
||||
DO_NOT_TRACK: "1"
|
||||
TURBO_TELEMETRY_DISABLED: "1"
|
||||
NEXT_TELEMETRY_DISABLED: "1"
|
||||
STORYBOOK_DISABLE_TELEMETRY: "1"
|
||||
steps:
|
||||
- uses: "actions/checkout@v4.2.2"
|
||||
- uses: "actions/checkout@v5.0.0"
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
10
.github/workflows/ci.yml
vendored
10
.github/workflows/ci.yml
vendored
@@ -16,8 +16,9 @@ jobs:
|
||||
DO_NOT_TRACK: "1"
|
||||
TURBO_TELEMETRY_DISABLED: "1"
|
||||
NEXT_TELEMETRY_DISABLED: "1"
|
||||
STORYBOOK_DISABLE_TELEMETRY: "1"
|
||||
steps:
|
||||
- uses: "actions/checkout@v4.2.2"
|
||||
- uses: "actions/checkout@v5.0.0"
|
||||
|
||||
- uses: "pnpm/action-setup@v4.1.0"
|
||||
|
||||
@@ -40,10 +41,3 @@ jobs:
|
||||
- run: "node --run lint:prettier"
|
||||
- run: "node --run test"
|
||||
- run: "node --run build"
|
||||
|
||||
commitlint:
|
||||
runs-on: "ubuntu-latest"
|
||||
steps:
|
||||
- uses: "actions/checkout@v4.2.2"
|
||||
|
||||
- uses: "wagoid/commitlint-github-action@v6.1.2"
|
||||
|
11
.gitignore
vendored
11
.gitignore
vendored
@@ -1,8 +1,10 @@
|
||||
# dependencies
|
||||
node_modules
|
||||
.npm
|
||||
.cache
|
||||
package-lock.json
|
||||
.pnpm-store
|
||||
.apt
|
||||
.pnp
|
||||
.pnp.js
|
||||
.yarn/install-state.gz
|
||||
@@ -15,12 +17,16 @@ coverage
|
||||
out/
|
||||
dist/
|
||||
build/
|
||||
.swc/
|
||||
.react-email/
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
*.bak
|
||||
.turbo
|
||||
bin/
|
||||
dump_*
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
@@ -30,6 +36,7 @@ yarn-error.log*
|
||||
# Storybook
|
||||
*storybook.log
|
||||
storybook-static
|
||||
/public
|
||||
|
||||
# IDEs and editors
|
||||
.idea
|
||||
@@ -42,6 +49,7 @@ storybook-static
|
||||
|
||||
# local env files
|
||||
.env
|
||||
.env.dev
|
||||
.env.production
|
||||
.env*.local
|
||||
|
||||
@@ -50,4 +58,5 @@ storybook-static
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
# next-env.d.ts
|
||||
next-env.d.ts
|
||||
packages/i18n/src/translations/*.d.json.ts
|
||||
|
1
.vscode/extensions.json
vendored
1
.vscode/extensions.json
vendored
@@ -5,7 +5,6 @@
|
||||
"dbaeumer.vscode-eslint",
|
||||
"davidanson.vscode-markdownlint",
|
||||
"bradlc.vscode-tailwindcss",
|
||||
"mikestead.dotenv",
|
||||
"antfu.pnpm-catalog-lens",
|
||||
"Lokalise.i18n-ally"
|
||||
]
|
||||
|
16
.vscode/settings.json
vendored
16
.vscode/settings.json
vendored
@@ -9,11 +9,19 @@
|
||||
"source.fixAll": "explicit",
|
||||
"source.organizeImports": "never"
|
||||
},
|
||||
"tailwindCSS.experimental.configFile": "./configs/config-tailwind/styles.css",
|
||||
"tailwindCSS.experimental.classRegex": [
|
||||
["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"],
|
||||
["cx\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"]
|
||||
"eslint.workingDirectories": [
|
||||
{
|
||||
"mode": "auto"
|
||||
}
|
||||
],
|
||||
"files.associations": {
|
||||
"*.css": "tailwindcss"
|
||||
},
|
||||
"editor.quickSuggestions": {
|
||||
"strings": "on"
|
||||
},
|
||||
"tailwindCSS.classFunctions": ["classNames", "cva"],
|
||||
"tailwindCSS.experimental.configFile": "./configs/config-tailwind/styles.css",
|
||||
"i18n-ally.localesPaths": ["./packages/i18n/src/translations/"],
|
||||
"i18n-ally.keystyle": "nested",
|
||||
"i18n-ally.sortKeys": false,
|
||||
|
@@ -1,127 +0,0 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
- Demonstrating empathy and kindness toward other people
|
||||
- Being respectful of differing opinions, viewpoints, and experiences
|
||||
- Giving and gracefully accepting constructive feedback
|
||||
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
|
||||
- Focusing on what is best not just for us as individuals, but for the overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
- The use of sexualized language or imagery, and sexual attention or advances of any kind
|
||||
- Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
- Public or private harassment
|
||||
- Publishing others' private information, such as a physical or email address, without their explicit permission
|
||||
- Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
<contact@theoludwig.fr>.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
|
||||
|
||||
Community Impact Guidelines were inspired by
|
||||
[Mozilla's code of conduct enforcement ladder][mozilla coc].
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
[https://www.contributor-covenant.org/faq][faq]. Translations are available
|
||||
at [https://www.contributor-covenant.org/translations][translations].
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
|
||||
[mozilla coc]: https://github.com/mozilla/diversity
|
||||
[faq]: https://www.contributor-covenant.org/faq
|
||||
[translations]: https://www.contributor-covenant.org/translations
|
@@ -1,10 +1,6 @@
|
||||
# 💡 Contributing
|
||||
# Contributing
|
||||
|
||||
Thanks a lot for your interest in contributing to **theoludwig.fr**! 🎉
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
**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.
|
||||
Thanks a lot for your interest in contributing to **theoludwig.fr**!
|
||||
|
||||
## Types of contributions
|
||||
|
||||
@@ -32,7 +28,7 @@ The commit message guidelines adheres to [Conventional Commits](https://www.conv
|
||||
### Prerequisites
|
||||
|
||||
- [Node.js](https://nodejs.org/) >= v24.0.0 [(`nvm install 24`)](https://nvm.sh)
|
||||
- [pnpm](https://pnpm.io/) v10.11.0 [(`npm install --global corepack@0.32.0 && corepack enable`)](https://github.com/nodejs/corepack)
|
||||
- [pnpm](https://pnpm.io/) v10.15.0 [(`npm install --global corepack@0.34.0 && corepack enable`)](https://github.com/nodejs/corepack)
|
||||
- [Docker](https://www.docker.com/)
|
||||
|
||||
### Installation
|
||||
|
21
LICENSE
21
LICENSE
@@ -1,21 +0,0 @@
|
||||
# MIT License
|
||||
|
||||
Copyright (c) Théo LUDWIG <contact@theoludwig.fr>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@@ -17,7 +17,7 @@
|
||||
|
||||
<hr />
|
||||
|
||||
## 📜 About
|
||||
## About
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
<hr />
|
||||
|
||||
## 📈 Statistics
|
||||
## Statistics
|
||||
|
||||
<p align=center>
|
||||
<img height=175 align="center" src="https://github-readme-stats.vercel.app/api?username=theoludwig&show_icons=true&theme=dark" alt="Théo LUDWIG's GitHub Stats" />
|
||||
|
@@ -5,7 +5,6 @@ import { LOCALE_DEFAULT, TIMEZONE } from "@repo/utils/constants"
|
||||
import type { Preview } from "@storybook/nextjs"
|
||||
import { NextIntlClientProvider } from "next-intl"
|
||||
import { ThemeProvider as NextThemeProvider } from "next-themes"
|
||||
import React from "react"
|
||||
|
||||
const preview: Preview = {
|
||||
initialGlobals: {
|
||||
@@ -14,6 +13,9 @@ const preview: Preview = {
|
||||
},
|
||||
},
|
||||
parameters: {
|
||||
a11y: {
|
||||
test: "error",
|
||||
},
|
||||
docs: {
|
||||
codePanel: true,
|
||||
},
|
||||
|
@@ -1,35 +0,0 @@
|
||||
import type { TestRunnerConfig } from "@storybook/test-runner"
|
||||
import { getStoryContext } from "@storybook/test-runner"
|
||||
|
||||
import { checkA11y, configureAxe, injectAxe } from "axe-playwright"
|
||||
|
||||
/*
|
||||
* See https://storybook.js.org/docs/writing-tests/test-runner#test-hook-api
|
||||
*/
|
||||
const config: TestRunnerConfig = {
|
||||
async preVisit(page) {
|
||||
await injectAxe(page)
|
||||
},
|
||||
async postVisit(page, context) {
|
||||
const storyContext = await getStoryContext(page, context)
|
||||
|
||||
const isA11yDisabled = storyContext.parameters?.a11y?.disable as boolean
|
||||
if (isA11yDisabled) {
|
||||
return
|
||||
}
|
||||
|
||||
await configureAxe(page, {
|
||||
rules: storyContext.parameters?.a11y?.config?.rules,
|
||||
})
|
||||
|
||||
await checkA11y(page, "#storybook-root", {
|
||||
verbose: false,
|
||||
detailedReport: true,
|
||||
detailedReportOptions: {
|
||||
html: true,
|
||||
},
|
||||
})
|
||||
},
|
||||
}
|
||||
|
||||
export default config
|
@@ -38,7 +38,6 @@
|
||||
"@types/node": "catalog:",
|
||||
"@types/react": "catalog:",
|
||||
"@types/react-dom": "catalog:",
|
||||
"axe-playwright": "catalog:",
|
||||
"chromatic": "catalog:",
|
||||
"eslint": "catalog:",
|
||||
"start-server-and-test": "catalog:",
|
||||
|
@@ -1,7 +1,7 @@
|
||||
FROM node:24.1.0-slim AS node-pnpm
|
||||
FROM node:24.7.0-slim AS node-pnpm
|
||||
ENV PNPM_HOME="/pnpm"
|
||||
ENV PATH="$PNPM_HOME:$PATH"
|
||||
RUN npm install --global corepack@0.32.0 && corepack enable
|
||||
RUN npm install --global corepack@0.34.0 && corepack enable
|
||||
ENV TURBO_TELEMETRY_DISABLED=1
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
ENV DO_NOT_TRACK=1
|
||||
@@ -9,7 +9,7 @@ WORKDIR /usr/src/app
|
||||
|
||||
FROM node-pnpm AS builder
|
||||
COPY ./ ./
|
||||
RUN pnpm install --global turbo@2.5.3
|
||||
RUN pnpm install --global turbo@2.5.6
|
||||
RUN turbo prune @repo/website --docker
|
||||
|
||||
FROM node-pnpm AS installer
|
||||
@@ -34,7 +34,7 @@ ENV IS_STANDALONE=true
|
||||
|
||||
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 applicationrunner
|
||||
USER applicationrunner
|
||||
COPY --from=installer /usr/src/app/apps/website/next.config.js ./
|
||||
COPY --from=installer /usr/src/app/apps/website/next.config.ts ./
|
||||
COPY --from=installer /usr/src/app/apps/website/package.json ./
|
||||
COPY --from=installer --chown=applicationrunner:nodejs /usr/src/app/apps/website/.next/standalone ./
|
||||
COPY --from=installer --chown=applicationrunner:nodejs /usr/src/app/apps/website/.next/static ./apps/website/.next/static
|
||||
|
@@ -1,19 +1,23 @@
|
||||
import "@repo/config-tailwind/styles.css"
|
||||
import type { LocaleProps } from "@repo/i18n/routing"
|
||||
import type { Locale } from "@repo/utils/constants"
|
||||
import { Footer } from "@repo/ui/Layout/Footer"
|
||||
import { Header } from "@repo/ui/Layout/Header"
|
||||
import { ThemeProvider } from "@repo/ui/Layout/Header/SwitchTheme"
|
||||
import { VERSION } from "@repo/utils/constants"
|
||||
import { setRequestLocale } from "next-intl/server"
|
||||
|
||||
interface MainLayoutProps extends React.PropsWithChildren, LocaleProps {}
|
||||
interface MainLayoutProps extends React.PropsWithChildren {
|
||||
params: Promise<{
|
||||
locale: string
|
||||
}>
|
||||
}
|
||||
|
||||
const MainLayout: React.FC<MainLayoutProps> = async (props) => {
|
||||
const { children, params } = props
|
||||
|
||||
const { locale } = await params
|
||||
// Enable static rendering
|
||||
setRequestLocale(locale)
|
||||
setRequestLocale(locale as Locale)
|
||||
|
||||
return (
|
||||
<ThemeProvider>
|
||||
|
@@ -1,11 +1,13 @@
|
||||
import "@repo/config-tailwind/styles.css"
|
||||
import type { LocaleProps } from "@repo/i18n/routing"
|
||||
import type { Locale } from "@repo/utils/constants"
|
||||
import { ThemeProvider } from "@repo/ui/Layout/Header/SwitchTheme"
|
||||
import { setRequestLocale } from "next-intl/server"
|
||||
|
||||
interface CurriculumVitaeLayoutProps
|
||||
extends React.PropsWithChildren,
|
||||
LocaleProps {}
|
||||
interface CurriculumVitaeLayoutProps extends React.PropsWithChildren {
|
||||
params: Promise<{
|
||||
locale: string
|
||||
}>
|
||||
}
|
||||
|
||||
const CurriculumVitaeLayout: React.FC<CurriculumVitaeLayoutProps> = async (
|
||||
props,
|
||||
@@ -14,7 +16,7 @@ const CurriculumVitaeLayout: React.FC<CurriculumVitaeLayoutProps> = async (
|
||||
|
||||
const { locale } = await params
|
||||
// Enable static rendering
|
||||
setRequestLocale(locale)
|
||||
setRequestLocale(locale as Locale)
|
||||
|
||||
return <ThemeProvider forcedTheme="light">{children}</ThemeProvider>
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
import "@repo/config-tailwind/styles.css"
|
||||
import type { LocaleProps } from "@repo/i18n/routing"
|
||||
import type { Locale } from "@repo/utils/constants"
|
||||
import { LOCALES } from "@repo/utils/constants"
|
||||
import type { Metadata, Viewport } from "next"
|
||||
@@ -19,9 +18,13 @@ export const viewport: Viewport = {
|
||||
|
||||
export const generateMetadata = async ({
|
||||
params,
|
||||
}: LocaleProps): Promise<Metadata> => {
|
||||
}: {
|
||||
params: Promise<{
|
||||
locale: string
|
||||
}>
|
||||
}): Promise<Metadata> => {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale })
|
||||
const t = await getTranslations({ locale: locale as Locale })
|
||||
const title = t("meta.title")
|
||||
const description = `${title} - ${t("meta.description")}`
|
||||
const image = "/images/logo.webp"
|
||||
@@ -64,14 +67,18 @@ export const generateStaticParams = (): Array<{ locale: Locale }> => {
|
||||
})
|
||||
}
|
||||
|
||||
interface LocaleLayoutProps extends React.PropsWithChildren, LocaleProps {}
|
||||
interface LocaleLayoutProps extends React.PropsWithChildren {
|
||||
params: Promise<{
|
||||
locale: string
|
||||
}>
|
||||
}
|
||||
|
||||
const LocaleLayout: React.FC<LocaleLayoutProps> = async (props) => {
|
||||
const { children, params } = props
|
||||
|
||||
const { locale } = await params
|
||||
// Enable static rendering
|
||||
setRequestLocale(locale)
|
||||
setRequestLocale(locale as Locale)
|
||||
|
||||
const messages = await getMessages()
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import typescriptESLint from "typescript-eslint"
|
||||
import configNextjs from "@repo/config-eslint/nextjs"
|
||||
import config from "@repo/config-eslint"
|
||||
|
||||
export default typescriptESLint.config(...configNextjs, {
|
||||
export default typescriptESLint.config(...config, {
|
||||
files: ["**/*.ts", "**/*.tsx"],
|
||||
languageOptions: {
|
||||
parser: typescriptESLint.parser,
|
||||
|
5
apps/website/next-env.d.ts
vendored
5
apps/website/next-env.d.ts
vendored
@@ -1,5 +0,0 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
@@ -1,21 +0,0 @@
|
||||
import createNextIntlPlugin from "next-intl/plugin"
|
||||
|
||||
const IS_STANDALONE = process.env.IS_STANDALONE === "true"
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
output: IS_STANDALONE ? "standalone" : undefined,
|
||||
images: {
|
||||
unoptimized: true,
|
||||
},
|
||||
eslint: {
|
||||
ignoreDuringBuilds: true,
|
||||
},
|
||||
typescript: {
|
||||
ignoreBuildErrors: true,
|
||||
},
|
||||
}
|
||||
|
||||
const withNextIntl = createNextIntlPlugin()
|
||||
|
||||
export default withNextIntl(nextConfig)
|
37
apps/website/next.config.ts
Normal file
37
apps/website/next.config.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { LOCALE_DEFAULT } from "@repo/utils/constants"
|
||||
import type { NextConfig } from "next"
|
||||
import createNextIntlPlugin from "next-intl/plugin"
|
||||
import path from "node:path"
|
||||
|
||||
const IS_STANDALONE = process.env.IS_STANDALONE === "true"
|
||||
|
||||
const nextConfig: NextConfig = {
|
||||
output: IS_STANDALONE ? "standalone" : undefined,
|
||||
typedRoutes: true,
|
||||
images: {
|
||||
unoptimized: true,
|
||||
},
|
||||
eslint: {
|
||||
ignoreDuringBuilds: true,
|
||||
},
|
||||
typescript: {
|
||||
ignoreBuildErrors: true,
|
||||
},
|
||||
}
|
||||
|
||||
const withNextIntl = createNextIntlPlugin({
|
||||
experimental: {
|
||||
createMessagesDeclaration: path.join(
|
||||
process.cwd(),
|
||||
"..",
|
||||
"..",
|
||||
"packages",
|
||||
"i18n",
|
||||
"src",
|
||||
"translations",
|
||||
`${LOCALE_DEFAULT}.json`,
|
||||
),
|
||||
},
|
||||
})
|
||||
|
||||
export default withNextIntl(nextConfig)
|
@@ -8,10 +8,11 @@
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "next dev --port 3000 --turbopack",
|
||||
"build": "next build",
|
||||
"build": "next build --turbopack",
|
||||
"start": "next start --port 3000",
|
||||
"typegen": "next typegen",
|
||||
"lint:eslint": "eslint . --max-warnings 0",
|
||||
"lint:typescript": "tsc --noEmit"
|
||||
"lint:typescript": "next typegen && tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@repo/blog": "workspace:*",
|
||||
|
@@ -14,5 +14,5 @@
|
||||
]
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules", ".next"]
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
@@ -1,25 +1,75 @@
|
||||
import typescriptESLint from "typescript-eslint"
|
||||
import nextPlugin from "@next/eslint-plugin-next"
|
||||
import configConventions from "eslint-config-conventions"
|
||||
import importX from "eslint-plugin-import-x"
|
||||
import importXPlugin from "eslint-plugin-import-x"
|
||||
import reactPlugin from "eslint-plugin-react"
|
||||
import reactHooksPlugin from "eslint-plugin-react-hooks"
|
||||
import typescriptESLint from "typescript-eslint"
|
||||
|
||||
export default typescriptESLint.config(
|
||||
...configConventions,
|
||||
reactHooksPlugin.configs.recommended,
|
||||
reactPlugin.configs.flat.recommended,
|
||||
{
|
||||
ignores: [
|
||||
".next",
|
||||
"**/next.config.js",
|
||||
"**/next.config.ts",
|
||||
"**/eslint.config.js",
|
||||
"**/tailwind.config.js",
|
||||
"**/postcss.config.js",
|
||||
"**/kysely.config.ts",
|
||||
],
|
||||
},
|
||||
...configConventions,
|
||||
{
|
||||
name: "config-eslint",
|
||||
settings: {
|
||||
react: {
|
||||
version: "19.1.1",
|
||||
},
|
||||
},
|
||||
plugins: {
|
||||
"import-x": importX,
|
||||
"@next/next": nextPlugin,
|
||||
"import-x": importXPlugin,
|
||||
},
|
||||
rules: {
|
||||
...nextPlugin.configs.recommended.rules,
|
||||
...nextPlugin.configs["core-web-vitals"].rules,
|
||||
"@next/next/no-html-link-for-pages": "off",
|
||||
"@next/next/no-img-element": "off",
|
||||
|
||||
"react-hooks/react-compiler": "error",
|
||||
|
||||
"react/jsx-no-target-blank": "off",
|
||||
"react/no-unknown-property": "off",
|
||||
"react/react-in-jsx-scope": "off",
|
||||
"react/prop-types": "off",
|
||||
"react/self-closing-comp": [
|
||||
"error",
|
||||
{
|
||||
component: true,
|
||||
html: true,
|
||||
},
|
||||
],
|
||||
"react/void-dom-elements-no-children": "error",
|
||||
"react/jsx-boolean-value": "error",
|
||||
"react/iframe-missing-sandbox": "off",
|
||||
|
||||
"no-restricted-imports": [
|
||||
"error",
|
||||
{
|
||||
paths: [
|
||||
{
|
||||
name: "next/navigation",
|
||||
importNames: [
|
||||
"redirect",
|
||||
"permanentRedirect",
|
||||
"useRouter",
|
||||
"usePathname",
|
||||
],
|
||||
message: "Please import from `@repo/i18n/routing` instead.",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
"import-x/extensions": [
|
||||
"error",
|
||||
"ignorePackages",
|
||||
|
@@ -1,54 +0,0 @@
|
||||
import { FlatCompat } from "@eslint/eslintrc"
|
||||
import typescriptESLint from "typescript-eslint"
|
||||
import config from "../eslint.config.js"
|
||||
|
||||
const flatCompat = new FlatCompat({
|
||||
baseDirectory: import.meta.dirname,
|
||||
})
|
||||
|
||||
export default typescriptESLint.config(
|
||||
...config,
|
||||
...flatCompat.extends("next/core-web-vitals"),
|
||||
{
|
||||
name: "config-eslint/nextjs",
|
||||
settings: {
|
||||
react: {
|
||||
version: "detect",
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
"@next/next/no-html-link-for-pages": "off",
|
||||
"@next/next/no-img-element": "off",
|
||||
"react/self-closing-comp": [
|
||||
"error",
|
||||
{
|
||||
component: true,
|
||||
html: true,
|
||||
},
|
||||
],
|
||||
"react/void-dom-elements-no-children": "error",
|
||||
"react/jsx-boolean-value": "error",
|
||||
"no-restricted-imports": [
|
||||
"error",
|
||||
{
|
||||
paths: [
|
||||
{
|
||||
name: "next/link",
|
||||
message: "Please import from `@repo/i18n/routing` instead.",
|
||||
},
|
||||
{
|
||||
name: "next/navigation",
|
||||
importNames: [
|
||||
"redirect",
|
||||
"permanentRedirect",
|
||||
"useRouter",
|
||||
"usePathname",
|
||||
],
|
||||
message: "Please import from `@repo/i18n/routing` instead.",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
)
|
@@ -9,23 +9,18 @@
|
||||
"import": "./eslint.config.js",
|
||||
"require": "./eslint.config.js",
|
||||
"default": "./eslint.config.js"
|
||||
},
|
||||
"./nextjs": {
|
||||
"types": "./index.d.ts",
|
||||
"import": "./nextjs/eslint.config.js",
|
||||
"require": "./nextjs/eslint.config.js",
|
||||
"default": "./nextjs/eslint.config.js"
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "catalog:",
|
||||
"typescript-eslint": "catalog:",
|
||||
"eslint": "catalog:",
|
||||
"eslint-config-conventions": "catalog:",
|
||||
"eslint-plugin-promise": "catalog:",
|
||||
"eslint-plugin-unicorn": "catalog:",
|
||||
"eslint-config-next": "catalog:",
|
||||
"eslint-plugin-import-x": "catalog:",
|
||||
"@next/eslint-plugin-next": "catalog:",
|
||||
"eslint-plugin-react": "catalog:",
|
||||
"eslint-plugin-react-hooks": "catalog:",
|
||||
"typescript": "catalog:",
|
||||
"globals": "catalog:"
|
||||
}
|
||||
|
@@ -19,7 +19,7 @@
|
||||
"allowImportingTsExtensions": true,
|
||||
"skipLibCheck": true,
|
||||
"jsx": "preserve",
|
||||
"incremental": true,
|
||||
"incremental": false,
|
||||
"noEmit": true,
|
||||
|
||||
"target": "ESNext",
|
||||
|
@@ -3,7 +3,7 @@
|
||||
"version": "0.0.0-develop",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977",
|
||||
"packageManager": "pnpm@10.15.0+sha512.486ebc259d3e999a4e8691ce03b5cac4a71cbeca39372a9b762cb500cfdf0873e2cb16abe3d951b1ee2cf012503f027b98b6584e4df22524e0c7450d9ec7aa7b",
|
||||
"engines": {
|
||||
"node": ">=24.0.0"
|
||||
},
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import typescriptESLint from "typescript-eslint"
|
||||
import configNextjs from "@repo/config-eslint/nextjs"
|
||||
import config from "@repo/config-eslint"
|
||||
|
||||
export default typescriptESLint.config(...configNextjs, {
|
||||
export default typescriptESLint.config(...config, {
|
||||
files: ["**/*.ts", "**/*.tsx"],
|
||||
languageOptions: {
|
||||
parser: typescriptESLint.parser,
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import typescriptESLint from "typescript-eslint"
|
||||
import configNextjs from "@repo/config-eslint/nextjs"
|
||||
import config from "@repo/config-eslint"
|
||||
|
||||
export default typescriptESLint.config(...configNextjs, {
|
||||
export default typescriptESLint.config(...config, {
|
||||
files: ["**/*.ts", "**/*.tsx"],
|
||||
languageOptions: {
|
||||
parser: typescriptESLint.parser,
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import typescriptESLint from "typescript-eslint"
|
||||
import configNextjs from "@repo/config-eslint/nextjs"
|
||||
import config from "@repo/config-eslint"
|
||||
|
||||
export default typescriptESLint.config(...configNextjs, {
|
||||
export default typescriptESLint.config(...config, {
|
||||
files: ["**/*.ts", "**/*.tsx"],
|
||||
languageOptions: {
|
||||
parser: typescriptESLint.parser,
|
||||
|
@@ -15,7 +15,7 @@ export const BirthDate: React.FC<BirthDateProps> = () => {
|
||||
}, [])
|
||||
|
||||
return t("home.about.birth-date.value", {
|
||||
age,
|
||||
age: age.toString(),
|
||||
birthDate: BIRTH_DATE_STRING,
|
||||
})
|
||||
}
|
||||
|
5037
pnpm-lock.yaml
generated
5037
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -3,29 +3,36 @@ packages:
|
||||
- "configs/*"
|
||||
- "packages/*"
|
||||
|
||||
catalogMode: "strict"
|
||||
|
||||
catalog:
|
||||
# Turborepo
|
||||
"turbo": "2.5.3"
|
||||
"turbo": "2.5.6"
|
||||
|
||||
# TypeScript
|
||||
"typescript": "5.9.2"
|
||||
"@total-typescript/ts-reset": "0.6.1"
|
||||
"@types/node": "24.3.0"
|
||||
|
||||
# Utils
|
||||
"mime": "4.0.7"
|
||||
|
||||
# React.js/Next.js
|
||||
"next": &next "15.3.2"
|
||||
"next-intl": "4.1.0"
|
||||
"next": &next "15.5.2"
|
||||
"next-intl": "4.3.5"
|
||||
"next-themes": "0.4.6"
|
||||
"react": "19.1.0"
|
||||
"react-dom": "19.1.0"
|
||||
"react": "19.1.1"
|
||||
"react-dom": "19.1.1"
|
||||
"@types/react": "19.1.12"
|
||||
"@types/react-dom": "19.1.9"
|
||||
"react-icons": "5.5.0"
|
||||
"@types/react": "19.1.6"
|
||||
"@types/react-dom": "19.1.5"
|
||||
|
||||
# Blog
|
||||
"@giscus/react": "3.1.0"
|
||||
"gray-matter": "4.0.3"
|
||||
"katex": "0.16.22"
|
||||
"next-mdx-remote": "5.0.0"
|
||||
"@mdx-js/mdx": "3.1.0"
|
||||
"@mdx-js/mdx": "3.1.1"
|
||||
"rehype-katex": "7.0.1"
|
||||
"rehype-raw": "7.0.0"
|
||||
"rehype-slug": "6.0.0"
|
||||
@@ -39,52 +46,47 @@ catalog:
|
||||
"markdownlint": "0.38.0"
|
||||
"markdownlint-rule-relative-links": "4.2.0"
|
||||
|
||||
# TypeScript
|
||||
"typescript": "5.8.3"
|
||||
"@total-typescript/ts-reset": "0.6.1"
|
||||
"@types/node": "22.15.24"
|
||||
|
||||
# ESLint
|
||||
"globals": "16.2.0"
|
||||
"typescript-eslint": "8.33.0"
|
||||
"@eslint/eslintrc": "3.3.1"
|
||||
"eslint": "9.27.0"
|
||||
"eslint-config-conventions": "19.2.0"
|
||||
"globals": "16.3.0"
|
||||
"typescript-eslint": "8.41.0"
|
||||
"eslint": "9.34.0"
|
||||
"eslint-config-conventions": "20.1.3"
|
||||
"eslint-plugin-promise": "7.2.1"
|
||||
"eslint-plugin-unicorn": "59.0.1"
|
||||
"eslint-config-next": *next
|
||||
"eslint-plugin-import-x": "4.13.3"
|
||||
"eslint-plugin-unicorn": "60.0.0"
|
||||
"eslint-plugin-import-x": "4.16.1"
|
||||
"@next/eslint-plugin-next": *next
|
||||
"eslint-plugin-react": "7.37.5"
|
||||
"eslint-plugin-react-hooks": "6.0.0-rc.1"
|
||||
|
||||
# Prettier
|
||||
"prettier": "3.5.3"
|
||||
"prettier-plugin-tailwindcss": "0.6.11"
|
||||
"editorconfig-checker": "6.0.1"
|
||||
"prettier": "3.6.2"
|
||||
"prettier-plugin-tailwindcss": "0.6.14"
|
||||
"editorconfig-checker": "6.1.0"
|
||||
|
||||
# Storybook
|
||||
"storybook": &storybook "9.0.0"
|
||||
"storybook": &storybook "9.1.3"
|
||||
"@storybook/addon-docs": *storybook
|
||||
"@storybook/addon-a11y": *storybook
|
||||
"@storybook/nextjs": *storybook
|
||||
"@storybook/addon-themes": *storybook
|
||||
"@storybook/test-runner": "0.22.0"
|
||||
"@chromatic-com/storybook": "4.0.0"
|
||||
"chromatic": "12.0.0"
|
||||
"@storybook/test-runner": "0.23.0"
|
||||
"@chromatic-com/storybook": "4.1.1"
|
||||
"chromatic": "13.1.4"
|
||||
|
||||
# Testing
|
||||
"playwright": &playwright "1.52.0"
|
||||
"playwright": &playwright "1.55.0"
|
||||
"@playwright/test": *playwright
|
||||
"axe-playwright": "2.1.0"
|
||||
"start-server-and-test": "2.0.12"
|
||||
"start-server-and-test": "2.0.13"
|
||||
|
||||
# CSS
|
||||
"postcss": "8.5.4"
|
||||
"@tailwindcss/postcss": "4.1.8"
|
||||
"postcss": "8.5.6"
|
||||
"@tailwindcss/postcss": "4.1.12"
|
||||
"@tailwindcss/typography": "0.5.16"
|
||||
"tailwindcss": "4.1.8"
|
||||
"tailwind-merge": "3.3.0"
|
||||
"tailwindcss": "4.1.12"
|
||||
"tailwind-merge": "3.3.1"
|
||||
"clsx": "2.1.1"
|
||||
"cva": "1.0.0-beta.4"
|
||||
"@fontsource/montserrat": "5.2.5"
|
||||
"@fontsource/montserrat": "5.2.6"
|
||||
|
||||
onlyBuiltDependencies:
|
||||
- "@swc/core"
|
||||
|
@@ -27,7 +27,11 @@
|
||||
"dependsOn": ["^lint:typescript-transit-node"]
|
||||
},
|
||||
"lint:typescript": {
|
||||
"dependsOn": ["lint:typescript-transit-node"]
|
||||
"dependsOn": ["typegen", "lint:typescript-transit-node"]
|
||||
},
|
||||
"typegen": {
|
||||
"dependsOn": ["^typegen"],
|
||||
"outputs": []
|
||||
},
|
||||
"dev": {
|
||||
"cache": false,
|
||||
|
Reference in New Issue
Block a user