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": "Контакты" }