diff --git a/app/page.tsx b/app/page.tsx
index 3be09a6..48976e3 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,6 +1,7 @@
import { About } from '@/components/about';
import { Contacts } from '@/components/contacts';
import { Person } from '@/components/person';
+import { Projects } from '@/components/projects';
import { Skills } from '@/components/skills';
import { NeonGradientCard } from '@/components/ui/neon-gradient-card';
import { Work } from '@/components/work';
@@ -32,6 +33,7 @@ export default function HomePage() {
+
diff --git a/components/projects.tsx b/components/projects.tsx
new file mode 100644
index 0000000..38abd25
--- /dev/null
+++ b/components/projects.tsx
@@ -0,0 +1,92 @@
+/* eslint-disable id-length */
+import { useTranslations } from 'next-intl';
+
+type ProjectProps = {
+ readonly description: string;
+ readonly href?: string;
+ readonly technologies: string[];
+ readonly title: string;
+};
+
+export function Projects() {
+ const t = useTranslations('Projects');
+
+ const projects: ProjectProps[] = [
+ {
+ description: t('zapishis_online_bot.description'),
+ href: 'https://t.me/zapishis_online_bot',
+ technologies: [
+ 'Next.js',
+ 'Strapi',
+ 'PostgreSQL',
+ 'Telegraf.js',
+ 'Tailwind CSS',
+ 'Telegram Mini App',
+ ],
+ title: t('zapishis_online_bot.title'),
+ },
+ {
+ description: t('portfolio.description'),
+ href: 'https://vchikalkin.dev',
+ technologies: ['Next.js', 'TypeScript', 'Tailwind CSS', 'next-intl'],
+ title: t('portfolio.title'),
+ },
+ {
+ description: t('next_downloader_bot.description'),
+ href: 'https://t.me/next_downloader_bot',
+ technologies: ['Grammy.js', 'Redis', 'TikTok API', 'FFmpeg'],
+ title: t('next_downloader_bot.title'),
+ },
+ {
+ description: t('eslint_config.description'),
+ href: 'https://github.com/vchikalkin/eslint-config-awesome',
+ technologies: ['ESLint', 'TypeScript', 'Next.js', 'React', 'Node.js'],
+ title: t('eslint_config.title'),
+ },
+ ];
+
+ return (
+
+
+
{t('title')}
+ {projects.map((project) => (
+
+ ))}
+
+
+ );
+}
+
+function Project({ description, href, technologies, title }: ProjectProps) {
+ const content = (
+
+ );
+
+ return content;
+}
diff --git a/eslint.config.mjs b/eslint.config.mjs
index b058c78..37677e0 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -9,5 +9,8 @@ export default [
...awesome['react-typescript'],
{
ignores: ['**/.next/**'],
+ rules: {
+ 'react/forbid-component-props': 'off',
+ },
},
];
diff --git a/messages/ru.json b/messages/ru.json
index 75f70b4..ffe85f9 100644
--- a/messages/ru.json
+++ b/messages/ru.json
@@ -31,6 +31,25 @@
"Skills": {
"title": "Стэк"
},
+ "Projects": {
+ "title": "Проекты",
+ "next_downloader_bot": {
+ "title": "Next Downloader Bot",
+ "description": "Telegram бот для скачивания видео с TikTok. Позволяет пользователям легко загружать видео одним сообщением."
+ },
+ "zapishis_online_bot": {
+ "title": "Запишись.online",
+ "description": "Встроенное в Telegram мобильное приложение для мастеров и клиентов. Включает запись на услуги, управление графиком работы и систему уведомлений."
+ },
+ "portfolio": {
+ "title": "Портфолио",
+ "description": "Персональный сайт-портфолио с современным дизайном, адаптивной версткой и поддержкой интернационализации."
+ },
+ "eslint_config": {
+ "title": "ESLint Config Awesome",
+ "description": "Конфигурация ESLint с профилями для Next.js, React, TypeScript и Node.js. Используется во всех проектах для обеспечения качества кода."
+ }
+ },
"Contact": {
"title": "Контакты"
}