On branch master
Changes to be committed: modified: app/(root)/page.jsx modified: app/about/components/about/about.jsx deleted: app/about/components/about/spotify/animation.jsx deleted: app/about/components/about/spotify/card.jsx deleted: app/about/components/about/spotify/fetch.js modified: app/about/components/education.jsx modified: app/about/layout.jsx modified: app/about/loading.jsx modified: app/about/page.jsx modified: app/layout.jsx modified: app/not-found.jsx modified: app/projects/[slug]/page.jsx modified: app/projects/archive/page.jsx modified: app/projects/layout.jsx modified: app/projects/loading.jsx modified: app/projects/page.jsx deleted: components/Chat.jsx modified: components/Footer.jsx modified: components/Navbar.jsx modified: json/data.json modified: pnpm-lock.yaml new file: public/image/me.jpeg deleted: public/image/me.jpg new file: public/image/me1.jpeg deleted: public/image/me1.jpg new file: public/image/me2.jpeg new file: public/image/me3.jpeg deleted: public/image/me3.jpg deleted: public/image/me4.jpeg new file: public/image/me4.jpg new file: public/image/me7.jpg deleted: vite-to_VS/README.md
This commit is contained in:
parent
4542735373
commit
55249b5aa6
32 changed files with 298 additions and 582 deletions
|
|
@ -7,18 +7,17 @@ import Link from "next/link";
|
|||
|
||||
// Компоненты
|
||||
import Button from "@/components/Button";
|
||||
import Me from "@/public/image/me.jpg";
|
||||
import MeAbout from "@/public/image/me2.jpg";
|
||||
import Me from "@/public/image/me.jpeg";
|
||||
import MeAbout from "@/public/image/me7.jpg";
|
||||
import Setup from "@/public/image/setup.jpg";
|
||||
import ProjectAll from "@/public/image/projects.png";
|
||||
import Hr from "@/components/Hr";
|
||||
// Значки
|
||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||
import { faGithub } from "@fortawesome/free-brands-svg-icons";
|
||||
import { faInstagram } from "@fortawesome/free-brands-svg-icons";
|
||||
import { faLinkedin } from "@fortawesome/free-brands-svg-icons";
|
||||
import { faDiscord } from "@fortawesome/free-brands-svg-icons";
|
||||
import { faEnvelope } from "@fortawesome/free-solid-svg-icons";
|
||||
import { faVk } from "@fortawesome/free-brands-svg-icons";
|
||||
import { faTelegram } from "@fortawesome/free-brands-svg-icons";
|
||||
|
||||
const MyPage = () => {
|
||||
const fullpageOptions = {
|
||||
|
|
@ -43,14 +42,14 @@ const MyPage = () => {
|
|||
transition={{
|
||||
type: "spring",
|
||||
}}>
|
||||
<div className="block md:hidden col-span-1 mx-auto my-10">
|
||||
<div className="bg-slate-500 rounded-full h-60 w-60 grayscale hover:grayscale-0 transition-all ease duration-300">
|
||||
<div className="block md:hidden col-span-1 mx-auto my-5">
|
||||
<div className="bg-slate-500 rounded h-40 w-40 grayscale hover:grayscale-0 transition-all ease duration-300">
|
||||
<Image
|
||||
src={Me}
|
||||
width={500}
|
||||
height={500}
|
||||
className="rounded-full w-full h-full object-cover "
|
||||
alt="Korobtsev"
|
||||
className="rounded w-half h-half object-cover "
|
||||
alt="V.Korobtsev"
|
||||
placeholder="blur"
|
||||
/>
|
||||
</div>
|
||||
|
|
@ -73,7 +72,7 @@ const MyPage = () => {
|
|||
delay: 0.3,
|
||||
type: "spring",
|
||||
}}>
|
||||
Разработчик, Инженер, Архитектор
|
||||
Главное
|
||||
</motion.h1>
|
||||
<motion.p
|
||||
className="title text-md 2xl:text-xl mt-4 tracking-wider text-gray-500 leading-[1.7rem]"
|
||||
|
|
@ -83,7 +82,7 @@ const MyPage = () => {
|
|||
delay: 0.4,
|
||||
type: "spring",
|
||||
}}>
|
||||
Привет! Я Виталий Коробцев. Создатель "Гибридной Офисной Системы". Под моим руководством или с моим участием создано множество крупных проектов. На данном сайте я решил собрать некоторые из них и рассказать о себе и своих проектах - завершенных, текущих, планируемых.
|
||||
Привет! Я Виталий Коробцев. Создатель "Гибридной Офисной Системы". Под моим руководством (или с моим участием) создано множество крупных проектов. На данном сайте я решил собрать некоторые из них и рассказать о себе и своих проектах - завершенных, текущих, планируемых.
|
||||
|
||||
</motion.p>
|
||||
<motion.div
|
||||
|
|
@ -95,16 +94,10 @@ const MyPage = () => {
|
|||
type: "spring",
|
||||
}}>
|
||||
<Button variation="primary">
|
||||
<Link
|
||||
href={"/docs/cv.pdf"}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
download>
|
||||
Download CV
|
||||
</Link>
|
||||
<a href="#projects">Проекты</a>
|
||||
</Button>
|
||||
<Button variation="secondary">
|
||||
<a href="#contact">Contact Me</a>
|
||||
<a href="#contact">Связаться</a>
|
||||
</Button>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
|
|
@ -168,7 +161,7 @@ const MyPage = () => {
|
|||
delay: 0.1,
|
||||
type: "spring",
|
||||
}}>
|
||||
About Me
|
||||
Обо мне
|
||||
</motion.h1>
|
||||
<Hr />
|
||||
<motion.p
|
||||
|
|
@ -179,7 +172,7 @@ const MyPage = () => {
|
|||
delay: 0.2,
|
||||
type: "spring",
|
||||
}}>
|
||||
A brief introduction about me and my interest.
|
||||
Немного обо мне и моих интересах.
|
||||
</motion.p>
|
||||
<motion.div
|
||||
initial={{ y: 40, opacity: 0 }}
|
||||
|
|
@ -189,7 +182,7 @@ const MyPage = () => {
|
|||
type: "spring",
|
||||
}}>
|
||||
<Button variation="primary">
|
||||
<Link href="/about">Learn More</Link>
|
||||
<Link href="/about">Читать</Link>
|
||||
</Button>
|
||||
</motion.div>
|
||||
</div>
|
||||
|
|
@ -220,7 +213,7 @@ const MyPage = () => {
|
|||
src={ProjectAll}
|
||||
layout="fill"
|
||||
className="object-cover"
|
||||
alt="Korobtsev Setup"
|
||||
alt="Рабочее место"
|
||||
placeholder="blur"
|
||||
/>
|
||||
</motion.div>
|
||||
|
|
@ -234,7 +227,7 @@ const MyPage = () => {
|
|||
delay: 0.1,
|
||||
type: "spring",
|
||||
}}>
|
||||
My Projects
|
||||
Проекты
|
||||
</motion.h1>
|
||||
<Hr />
|
||||
<motion.p
|
||||
|
|
@ -245,10 +238,10 @@ const MyPage = () => {
|
|||
delay: 0.2,
|
||||
type: "spring",
|
||||
}}>
|
||||
This is some of my projects that I have done{" "}
|
||||
Некоторые из проектов с моим учаcтием {" "}
|
||||
<span className="bg-transparent md:bg-gray-100 bg-opacity-50 xl:bg-transparent">
|
||||
{" "}
|
||||
and currently working on.
|
||||
или под моим руководством.
|
||||
</span>
|
||||
</motion.p>
|
||||
<motion.div
|
||||
|
|
@ -259,7 +252,7 @@ const MyPage = () => {
|
|||
type: "spring",
|
||||
}}>
|
||||
<Button variation="primary">
|
||||
<Link href="/projects">Learn More</Link>
|
||||
<Link href="/projects">Просмотреть</Link>
|
||||
</Button>
|
||||
</motion.div>
|
||||
</div>
|
||||
|
|
@ -290,7 +283,7 @@ const MyPage = () => {
|
|||
src={Setup}
|
||||
layout="fill"
|
||||
className="object-cover"
|
||||
alt="Korobtsev Setup"
|
||||
alt="Рабочее место"
|
||||
placeholder="blur"
|
||||
/>
|
||||
</motion.div>
|
||||
|
|
@ -304,7 +297,7 @@ const MyPage = () => {
|
|||
delay: 0.1,
|
||||
type: "spring",
|
||||
}}>
|
||||
Get In Touch
|
||||
Связаться
|
||||
</motion.h1>
|
||||
<Hr />
|
||||
<motion.p
|
||||
|
|
@ -315,9 +308,9 @@ const MyPage = () => {
|
|||
delay: 0.2,
|
||||
type: "spring",
|
||||
}}>
|
||||
Feel free to contact me if you have any{" "}
|
||||
Не стесняйтесь связаться со мной,{" "}
|
||||
<span className="bg-transparent md:bg-gray-100 bg-opacity-50 xl:bg-transparent">
|
||||
questions or just want to say hi.
|
||||
можем посотрудничать и реализовать Ваш проект.
|
||||
</span>
|
||||
</motion.p>
|
||||
<motion.p
|
||||
|
|
@ -328,14 +321,14 @@ const MyPage = () => {
|
|||
delay: 0.3,
|
||||
type: "spring",
|
||||
}}>
|
||||
<a href="mailto:Alvalen.shafel04@gmail.com?subject=Hello&body=Hello Korobtsev,">
|
||||
alvalen.shafel04@gmail.com
|
||||
<a href="mailto:vk@gossys.dev?subject=Я с сайта Korobtsev.ru&body=Приветствую Виталий!">
|
||||
vk@gossys.dev
|
||||
</a>
|
||||
</motion.p>
|
||||
{/* icons */}
|
||||
<div className="flex justify-center items-center space-x-4">
|
||||
<motion.a
|
||||
href="mailto:Alvalen.shafel04@gmail.com?subject=Hello&body=Hello Korobtsev,"
|
||||
href="mailto:vk@gossys.dev?subject=Я с сайта Korobtsev.ru&body=Приветствую Виталий!"
|
||||
className="flex justify-center items-center bg-gray-700 w-14 h-14 rounded-full text-gray-100 hover:bg-gray-400 transition-all ease-in-out duration-300"
|
||||
initial={{ y: 40, opacity: 0 }}
|
||||
whileInView={{ y: 0, opacity: 1 }}
|
||||
|
|
@ -347,7 +340,7 @@ const MyPage = () => {
|
|||
</motion.a>
|
||||
|
||||
<motion.a
|
||||
href="https://github.com/Korobtsev"
|
||||
href="https://dev.gossys.dev/v.korobtsev/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex justify-center items-center bg-gray-700 w-14 h-14 rounded-full text-gray-100 hover:bg-gray-400 transition-all ease-in-out duration-300"
|
||||
|
|
@ -360,7 +353,7 @@ const MyPage = () => {
|
|||
<FontAwesomeIcon icon={faGithub} className="text-3xl" />
|
||||
</motion.a>
|
||||
<motion.a
|
||||
href="https://www.instagram.com/Korobtsev_/"
|
||||
href="https://vk.ru/Miguelle74/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex justify-center items-center bg-gray-700 w-14 h-14 rounded-full text-gray-100 hover:bg-gray-400 transition-all ease-in-out duration-300"
|
||||
|
|
@ -371,12 +364,12 @@ const MyPage = () => {
|
|||
opacity: { delay: 0.4 },
|
||||
}}>
|
||||
<FontAwesomeIcon
|
||||
icon={faInstagram}
|
||||
icon={faVk}
|
||||
className="text-3xl"
|
||||
/>
|
||||
</motion.a>
|
||||
<motion.a
|
||||
href="https://www.linkedin.com/in/alvalen-shafel-8a081a254/"
|
||||
href="https://t.me/Gosys_Maestro/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex justify-center items-center bg-gray-700 w-14 h-14 rounded-full text-gray-100 hover:bg-gray-400 transition-all ease-in-out duration-300"
|
||||
|
|
@ -386,20 +379,8 @@ const MyPage = () => {
|
|||
y: { delay: 0.4 },
|
||||
opacity: { delay: 0.5 },
|
||||
}}>
|
||||
<FontAwesomeIcon icon={faLinkedin} className="text-3xl" />
|
||||
</motion.a>
|
||||
<motion.a
|
||||
href="https://discordapp.com/users/bloody#6118"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex justify-center items-center bg-gray-700 w-14 h-14 rounded-full text-gray-100 hover:bg-gray-400 transition-all ease-in-out duration-300"
|
||||
initial={{ opacity: 0, y: 40 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
transition={{
|
||||
y: { delay: 0.5 },
|
||||
opacity: { delay: 0.6 },
|
||||
}}>
|
||||
<FontAwesomeIcon icon={faDiscord} className="text-3xl" />
|
||||
<FontAwesomeIcon icon={faTelegram}
|
||||
className="text-3xl" />
|
||||
</motion.a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
import Image from "next/image";
|
||||
import Card from "./spotify/card";
|
||||
import { motion } from "framer-motion";
|
||||
import Me1 from "@/public/image/me1.jpg";
|
||||
import Me2 from "@/public/image/me2.jpg";
|
||||
import Me3 from "@/public/image/me3.jpg";
|
||||
import Me1 from "@/public/image/me1.jpeg";
|
||||
import Me2 from "@/public/image/me2.jpeg";
|
||||
import Me3 from "@/public/image/me4.jpg";
|
||||
import Hr from "@/components/Hr";
|
||||
|
||||
function Title() {
|
||||
|
|
@ -11,7 +10,7 @@ function Title() {
|
|||
<div className="mt-10 flex flex-col justify-start items-center w-full pl-10 md:pl-32">
|
||||
<div className="flex justify-center items-center flex-col my-5 self-start ">
|
||||
<Hr variant="long"></Hr>
|
||||
<h1 className="text-3xl font-bold mt-3">Who Am I?</h1>
|
||||
<h1 className="text-3xl font-bold mt-3">Обо мне</h1>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
@ -35,7 +34,7 @@ export default function About() {
|
|||
className="w-full h-full">
|
||||
<Image
|
||||
src={Me1}
|
||||
alt="Korobtsev"
|
||||
alt="Korobtsev.ru"
|
||||
layout="fill"
|
||||
objectFit="cover"
|
||||
placeholder="blur"
|
||||
|
|
@ -108,13 +107,13 @@ export default function About() {
|
|||
type: "spring",
|
||||
}}>
|
||||
<h2 className="text-2xl font-bold tracking-wider mb-3">
|
||||
Alvalen Shafelbilyunazra
|
||||
Виталий Коробцев
|
||||
</h2>
|
||||
<p className="text-gray-600 text-justify title text-lg">
|
||||
Hey there, I’m Alvalen Shafelbilyunazra, a
|
||||
Привет! Я Виталий Коробцев,
|
||||
<span className="text-black font-medium">
|
||||
{" "}
|
||||
passionate Web Developer
|
||||
разработчик, архитектор,
|
||||
</span>{" "}
|
||||
with a growing expertise in
|
||||
<span className="text-black font-medium">
|
||||
|
|
@ -139,7 +138,6 @@ export default function About() {
|
|||
essential. Let’s connect and explore the evolving intersection
|
||||
of web and AI together!
|
||||
</p>
|
||||
<Card />
|
||||
</motion.div>
|
||||
</div>
|
||||
</>
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
import { motion } from "framer-motion";
|
||||
|
||||
const PlayingAnimation = () => {
|
||||
return (
|
||||
<div className="relative flex justify-between w-4 h-8 space-x-1">
|
||||
<motion.span
|
||||
className="w-1 h-full bg-gray-500 rounded-full"
|
||||
animate={{ scaleY: [0.3, 1, 0.5, 0.75, 0.5] }}
|
||||
transition={{ duration: 2.2, repeat: Infinity }}
|
||||
/>
|
||||
<motion.span
|
||||
className="w-1 h-full bg-gray-500 rounded-full"
|
||||
animate={{ scaleY: [0.3, 1, 0.5, 0.75, 0.5] }}
|
||||
transition={{ duration: 2.2, repeat: Infinity, delay: -2 }}
|
||||
/>
|
||||
<motion.span
|
||||
className="w-1 h-full bg-gray-500 rounded-full"
|
||||
animate={{ scaleY: [0.3, 1, 0.5, 0.75, 0.5] }}
|
||||
transition={{ duration: 2.2, repeat: Infinity, delay: -3.7 }}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default PlayingAnimation;
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
import React, { useEffect, useState } from "react";
|
||||
import getNowPlayingItem from "./fetch";
|
||||
import PlayingAnimation from "./animation";
|
||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||
import { faSpotify } from "@fortawesome/free-brands-svg-icons";
|
||||
import Image from "next/image";
|
||||
|
||||
const Card = () => {
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [result, setResult] = useState({});
|
||||
|
||||
useEffect(() => {
|
||||
const fetchData = async () => {
|
||||
const results = await Promise.all([getNowPlayingItem()]);
|
||||
console.log(results);
|
||||
setResult(results[0]);
|
||||
setLoading(false);
|
||||
};
|
||||
fetchData(); // Fetch data immediately on component mount
|
||||
|
||||
const intervalId = setInterval(fetchData, 60 * 1000); // ! Fetch data every minute: temporary
|
||||
|
||||
return () => clearInterval(intervalId);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className="mt-3 flex justify-center w-full">
|
||||
{loading ? (
|
||||
<div className="flex justify-center mb-8">
|
||||
{/* Replace this with your own loading spinner */}
|
||||
<div className="loader ease-linear rounded-full border-4 border-t-4 border-black h-12 w-12 mb-4"></div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="relative w-full mb-8 grid grid-cols-2 gap-2 border-2 border-gray-500 p-4 rounded-lg backdrop-filter backdrop-blur-lg bg-white bg-opacity-30">
|
||||
{result.isPlaying && (
|
||||
<Image
|
||||
src={result.albumImageUrl}
|
||||
alt="backgroundImage"
|
||||
layout="fill"
|
||||
objectFit="cover"
|
||||
className="z-0 opacity-20 absolute"
|
||||
/>
|
||||
)}
|
||||
<div className="z-10 flex items-center">
|
||||
<FontAwesomeIcon
|
||||
icon={faSpotify}
|
||||
className="text-black text-5xl me-5 md:me-1 xl:me-8"
|
||||
/>
|
||||
<p className="font-semibold me-5 md:me-1 xl:me-7">
|
||||
{result.isPlaying
|
||||
? "Now playing"
|
||||
: "Currently offline"}
|
||||
</p>
|
||||
{result.isPlaying && <PlayingAnimation />}
|
||||
</div>
|
||||
{result.isPlaying && (
|
||||
<div className="z-10 rounded-lg ms-5">
|
||||
<div className="flex items-center space-x-4">
|
||||
<div className="overflow-hidden">
|
||||
<a
|
||||
href={result.songUrl ? encodeURI(result.songUrl) : "#"}
|
||||
target="_blank"
|
||||
className="block font-semibold w-full truncate text-blue-500">
|
||||
{result.title}
|
||||
</a>
|
||||
<p className="truncate text-gray-500">
|
||||
{result.artist}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Card;
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
import querystring from "querystring";
|
||||
const TOKEN_ENDPOINT = `https://accounts.spotify.com/api/token`;
|
||||
const NOW_PLAYING_ENDPOINT = `https://api.spotify.com/v1/me/player/currently-playing`;
|
||||
const client_id = process.env.NEXT_PUBLIC_SPOTIFY_CLIENT_ID;
|
||||
const client_secret = process.env.NEXT_PUBLIC_SPOTIFY_CLIENT_SECRET;
|
||||
const refresh_token = process.env.NEXT_PUBLIC_SPOTIFY_REFRESH_TOKEN;
|
||||
|
||||
const basic = Buffer.from(`${client_id}:${client_secret}`).toString("base64");
|
||||
const getAccessToken = async () => {
|
||||
const response = await fetch(TOKEN_ENDPOINT, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
Authorization: `Basic ${basic}`,
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
},
|
||||
body: querystring.stringify({
|
||||
grant_type: "refresh_token",
|
||||
refresh_token,
|
||||
}),
|
||||
});
|
||||
|
||||
return response.json();
|
||||
};
|
||||
|
||||
export const getNowPlaying = async () => {
|
||||
const { access_token } = await getAccessToken();
|
||||
return fetch(NOW_PLAYING_ENDPOINT, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${access_token}`,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export default async function getNowPlayingItem() {
|
||||
const response = await getNowPlaying();
|
||||
if (response.status === 204 || response.status > 400) {
|
||||
return false;
|
||||
}
|
||||
const song = await response.json();
|
||||
const albumImageUrl = song.item.album.images[0].url;
|
||||
const artist = song.item.artists.map((_artist) => _artist.name).join(", ");
|
||||
const isPlaying = song.is_playing;
|
||||
const songUrl = song.item.external_urls.spotify;
|
||||
const title = song.item.name;
|
||||
|
||||
return {
|
||||
albumImageUrl,
|
||||
artist,
|
||||
isPlaying,
|
||||
songUrl,
|
||||
title,
|
||||
};
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ import {
|
|||
} from "@fortawesome/free-solid-svg-icons";
|
||||
import { motion, AnimatePresence } from "framer-motion";
|
||||
import { useState } from "react";
|
||||
import Me4 from "@/public/image/me4.jpeg";
|
||||
import Me4 from "@/public/image/me4.jpg";
|
||||
import Me5 from "@/public/image/me5.jpg";
|
||||
import Me6 from "@/public/image/me6.jpg";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import Footer from "@/components/Footer";
|
||||
|
||||
export const metadata = {
|
||||
title: "Korobtsev | About"
|
||||
title: "Korobtsev.ru | Обо мне"
|
||||
};
|
||||
export default function Layout({ children }) {
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
export default function Loading() {
|
||||
return (
|
||||
<div className="fixed top-0 left-0 flex justify-center items-center h-screen w-screen bg-gray-300 z-[999]">
|
||||
<h1 className="text-4xl text-gray-900">Loading...</h1>
|
||||
<h1 className="text-4xl text-gray-900">Загрузка...</h1>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import Experience from "./components/experience.jsx";
|
|||
import Education from "./components/education.jsx";
|
||||
|
||||
// images
|
||||
import Hero from "@/public/image/me2.jpg";
|
||||
import Hero from "@/public/image/me2.jpeg";
|
||||
|
||||
import Hr from "@/components/Hr";
|
||||
import About from "./components/about/about.jsx";
|
||||
|
|
@ -42,7 +42,7 @@ export default function Page() {
|
|||
className="bg-slate-300 rounded-sm h-[400px] md:h-[600px] w-[80vw] md:w-[30vw] grayscale hover:grayscale-0 ">
|
||||
<Image
|
||||
src={Hero}
|
||||
alt="Alvalen Shafel"
|
||||
alt="Виталий Коробцев"
|
||||
layout="fill"
|
||||
objectFit="cover"
|
||||
placeholder="blur"
|
||||
|
|
@ -55,10 +55,10 @@ export default function Page() {
|
|||
</h1>
|
||||
<Hr />
|
||||
<p className="title text-xl mt-4 tracking-wider text-gray-900 leading-[1.7rem] mb-5 ">
|
||||
A brief introduction about me and{" "}
|
||||
Немного обо мне и{" "}
|
||||
<span className="bg-transparent md:bg-gray-100 bg-opacity-50 xl:bg-transparent">
|
||||
{" "}
|
||||
my interest.
|
||||
моих интересах.
|
||||
</span>
|
||||
</p>
|
||||
<motion.div
|
||||
|
|
@ -72,7 +72,7 @@ export default function Page() {
|
|||
});
|
||||
}}
|
||||
className="mb-3">
|
||||
<Button variation="primary">Scroll Down</Button>
|
||||
<Button variation="primary">Прокрути</Button>
|
||||
</motion.div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,46 +5,45 @@ import "@fortawesome/fontawesome-svg-core/styles.css";
|
|||
config.autoAddCss = false;
|
||||
import "./nprogress.css";
|
||||
import { Analytics } from "@vercel/analytics/react";
|
||||
import Chat from "@/components/Chat";
|
||||
import ClientTopProgressBar from "@/components/ClientTopProgressBar";
|
||||
|
||||
export const metadata = {
|
||||
title: "Korobtsev | Portofolio",
|
||||
title: "Korobtsev.ru | Личный сайт",
|
||||
|
||||
description:
|
||||
"My name is Korobtsev, I'm a web developer and I'm passionate about it. I'm currently studying at Universitas Negeri Malang.",
|
||||
"Всем привет! Я Виталий Коробцев и это мой личный сайт! Я хочу рассказать Вам о себе и своих проектах.",
|
||||
|
||||
author: "Alvalen Shafelbilyunazra",
|
||||
author: "Виталий Коробцев",
|
||||
siteUrl: "https://www.korobtsev.ru",
|
||||
applicationName: "Korobtsev",
|
||||
applicationName: "Korobtsev.ru",
|
||||
|
||||
keywords: [
|
||||
"Korobtsev",
|
||||
"alvalen",
|
||||
"alvalen shafel",
|
||||
"shafel",
|
||||
"alvalen shafelbilyunazra",
|
||||
"alvalen shafel bilyunazra",
|
||||
"bloodfallen",
|
||||
"alvalen porto",
|
||||
"alvalen um",
|
||||
"Коробцев",
|
||||
"Виталий Коробцев",
|
||||
"Miguelle74",
|
||||
"Госис",
|
||||
"Гибридная Офисная Система",
|
||||
"ОСГОС",
|
||||
"Новый Крым",
|
||||
"Технико",
|
||||
],
|
||||
|
||||
openGraph: {
|
||||
type: "website",
|
||||
url: "https://www.korobtsev.ru",
|
||||
title: "Korobtsev | Portofolio",
|
||||
site_name: "Korobtsev | Portofolio",
|
||||
description: "My name is Korobtsev, This is my portofolio website.",
|
||||
title: "Korobtsev.ru | Личный сайт",
|
||||
site_name: "Korobtsev.ru | Личный сайт",
|
||||
description: "My name is Vitaliy Korobtsev, This is my website.",
|
||||
width: 1200,
|
||||
height: 630,
|
||||
images: [
|
||||
{
|
||||
url: "/og-image-rev.png",
|
||||
alt: "Korobtsev Portofolio",
|
||||
alt: "Korobtsev ",
|
||||
},
|
||||
],
|
||||
site_name: "Korobtsev | Portofolio",
|
||||
site_name: "Korobtsev.ru | Личный сайт",
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -55,7 +54,6 @@ export default function RootLayout({ children }) {
|
|||
<ClientTopProgressBar />
|
||||
<Navbar />
|
||||
{children}
|
||||
<Chat />
|
||||
<Analytics />
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ const NotFound = () => (
|
|||
<div className="flex justify-center items-center flex-col mb-5 space-y-10">
|
||||
<div>
|
||||
<h2 className="uppercase font-normal text-lg tracking-[8px] text-neutral-400 text-center">
|
||||
Page not found
|
||||
А тут совсем ничего нет...
|
||||
</h2>
|
||||
<h1 className="text-4xl font-medium text-neutral-900 text-center">
|
||||
404
|
||||
|
|
@ -20,7 +20,7 @@ const NotFound = () => (
|
|||
<button
|
||||
onClick={() => window.history.back()}
|
||||
className="text-lg text-neutral-900 hover:text-neutral-800 text-center border-2 border-gray-800 rounded-xl p-3 py-2 mt-2">
|
||||
Go Back
|
||||
Назад
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ function Page(props) {
|
|||
<div className="min-h-screen sm:min-h-0 flex justify-center items-start flex-col mb-5 space-y-10 mx-auto">
|
||||
<div>
|
||||
<h2 className="uppercase font-normal text-lg tracking-[8px] text-neutral-400">
|
||||
Project
|
||||
Проект
|
||||
</h2>
|
||||
<h1 className="text-4xl font-medium text-neutral-900">
|
||||
{data.title}
|
||||
|
|
@ -122,7 +122,7 @@ function Page(props) {
|
|||
</div>
|
||||
<div>
|
||||
<h2 className="uppercase font-normal text-lg tracking-[8px] text-neutral-400">
|
||||
Technology
|
||||
Технологии
|
||||
</h2>
|
||||
<p className="text-2xl font-normal text-neutral-900">
|
||||
{data.tech.join(", ")}
|
||||
|
|
@ -130,7 +130,7 @@ function Page(props) {
|
|||
</div>
|
||||
<div>
|
||||
<h2 className="uppercase font-normal text-lg tracking-[8px] text-neutral-400">
|
||||
Year
|
||||
Год(ы)
|
||||
</h2>
|
||||
<p className="text-2xl font-normal text-neutral-900">
|
||||
{data.year}
|
||||
|
|
@ -139,14 +139,14 @@ function Page(props) {
|
|||
{data.preview && (
|
||||
<div>
|
||||
<h2 className="uppercase font-normal text-lg tracking-[8px] text-neutral-400">
|
||||
Preview
|
||||
Посмотреть
|
||||
</h2>
|
||||
<p className="text-2xl font-normal text-neutral-900">
|
||||
<a
|
||||
href={data.preview}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer">
|
||||
Preview{" "}
|
||||
Перейти{" "}
|
||||
<FontAwesomeIcon
|
||||
icon={faArrowUpRightFromSquare}
|
||||
className="ml-3"
|
||||
|
|
@ -158,7 +158,7 @@ function Page(props) {
|
|||
{data.code && (
|
||||
<div>
|
||||
<h2 className="uppercase font-normal text-lg tracking-[8px] text-neutral-400">
|
||||
Source Code
|
||||
Код (для Open Source)
|
||||
</h2>
|
||||
<p className="text-2xl font-normal text-neutral-900">
|
||||
<a
|
||||
|
|
@ -177,7 +177,7 @@ function Page(props) {
|
|||
</div>
|
||||
<div className="flex justify-start items-start flex-col mb-5 ">
|
||||
<h2 className="uppercase font-normal text-lg tracking-[8px] text-neutral-400">
|
||||
Description
|
||||
Описание
|
||||
</h2>
|
||||
{data.desc.map((desc, index) => (
|
||||
<p
|
||||
|
|
|
|||
|
|
@ -73,10 +73,10 @@ export default function Page() {
|
|||
<table className="space-y-3">
|
||||
<thead>
|
||||
<tr className=" hover:shadow-md transition-all ease duration-500">
|
||||
<th className="text-start">Year</th>
|
||||
<th className="text-start">Title</th>
|
||||
<th className="text-start">Technology</th>
|
||||
<th className="text-start">Link</th>
|
||||
<th className="text-start">Год создания</th>
|
||||
<th className="text-start">Название</th>
|
||||
<th className="text-start">Технологии</th>
|
||||
<th className="text-start">Ссылки</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
import Footer from "@/components/Footer";
|
||||
|
||||
export const metadata = {
|
||||
title: "Korobtsev | Projects"
|
||||
title: "Korobtsev.ru | Проекты"
|
||||
};
|
||||
export default function Layout({ children }) {
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
export default function Loading() {
|
||||
return (
|
||||
<div className="fixed top-0 left-0 flex justify-center items-center h-screen w-screen bg-gray-300 z-[999]">
|
||||
<h1 className="text-4xl text-gray-900">Loading...</h1>
|
||||
<h1 className="text-4xl text-gray-900">Загрузка...</h1>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,9 +19,9 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|||
import { faChevronLeft } from "@fortawesome/free-solid-svg-icons";
|
||||
|
||||
const category = {
|
||||
1: "Web Development",
|
||||
2: "AI & Machine Learning",
|
||||
9: "Other",
|
||||
1: "WEB разработка",
|
||||
2: "Linux и ПО",
|
||||
9: "Другие",
|
||||
};
|
||||
|
||||
export default function Page() {
|
||||
|
|
@ -55,14 +55,14 @@ export default function Page() {
|
|||
</div>
|
||||
<div className="z-10 w-full absolute md:w-auto md:left-[10%] top-[60%] md:top-1/3 col-span-2 flex flex-col justify-center items-start md:items-start text-start px-10 pt-4 backdrop-filter backdrop-blur-sm md:backdrop-blur-none md:backdrop-filter-none bg-gray-100 bg-opacity-50 md:bg-transparent md:pt-0">
|
||||
<h1 className="md:bg-white bg-transparent lg:bg-transparent bg-opacity-50 md-px-0 text-black text-5xl md:text-8xl font-bold">
|
||||
My Projects
|
||||
Проекты
|
||||
</h1>
|
||||
<Hr />
|
||||
<p className="title text-xl mt-4 tracking-wider text-gray-900 leading-[1.7rem] mb-5">
|
||||
List of my projects that I have done and{" "}
|
||||
Некоторые из проектов с моим учаcтием{" "}
|
||||
<span className="bg-transparent md:bg-gray-100 bg-opacity-50 xl:bg-transparent">
|
||||
{" "}
|
||||
currently working on.
|
||||
или под моим руководством.
|
||||
</span>
|
||||
</p>
|
||||
<motion.div
|
||||
|
|
@ -76,14 +76,14 @@ export default function Page() {
|
|||
});
|
||||
}}
|
||||
className="mb-3">
|
||||
<Button variation="primary">Scroll Down</Button>
|
||||
<Button variation="primary">Прокрутить</Button>
|
||||
</motion.div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mt-10 flex flex-col justify-start items-center w-full pl-10 md:pl-32">
|
||||
<div className="flex justify-center items-center flex-col my-5 self-start ">
|
||||
<Hr variant="long"></Hr>
|
||||
<h1 className="text-3xl font-bold mt-3">Hightlight</h1>
|
||||
<h1 className="text-3xl font-bold mt-3">Основное</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative w-screen mx-auto container gap-4 px-10 grid grid-cols-1 md:grid-cols-2 mb-10">
|
||||
|
|
@ -174,28 +174,28 @@ export default function Page() {
|
|||
type: "spring",
|
||||
}}>
|
||||
<h2 className="text-2xl font-bold tracking-wider mb-3">
|
||||
Intervyou AI
|
||||
ОС ОСГОС
|
||||
</h2>
|
||||
<p className="text-gray-600 text-justify title text-lg">
|
||||
AI Based interview Preparation Website created to help fresh
|
||||
graduates and job seekers prepare for interviews and optimize
|
||||
their CV through AI-powered features. The website is built using
|
||||
Next.js, TypeScript, Tailwind CSS, Shadcn UI, Prisma, and MySQL
|
||||
(TiDB). This website can comprehensively analyze the user's
|
||||
interview performance by providing a analysis of the user's
|
||||
answer, gesture, and material recommendation to improve the user's
|
||||
interview skills.
|
||||
Операционная система на ядре Debian linux актуальной версии.
|
||||
Изначально разрабатывалась для одного из Государственных заказчиков.
|
||||
На данный момент проект построен на Debian 13, имеет собственные репозитории
|
||||
и магазин приложений, инфраструктуру технической поддержки. Проект поддерживается
|
||||
и активно развивается, обрастая собственными сервисами и ПО, несмотря на
|
||||
высокую конкуренцию в данном серменте.
|
||||
Разработано несколько вариантов дистрибутива, в том числе и специализированные версии.
|
||||
Серверное направление выделено в отдельный продукт.
|
||||
</p>{" "}
|
||||
<div className="mt-3">
|
||||
<Button variation="primary">
|
||||
<Link href="projects/intervyou">More</Link>
|
||||
<Link href="projects/intervyou">Больше</Link>
|
||||
</Button>
|
||||
<Button variation="secondary">
|
||||
<a
|
||||
href="https://www.intervyou.me"
|
||||
href="https://www.osgos.ru"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer">
|
||||
Preview
|
||||
Просмотреть
|
||||
</a>
|
||||
</Button>
|
||||
</div>
|
||||
|
|
@ -218,7 +218,7 @@ export default function Page() {
|
|||
delay: 0.7,
|
||||
type: "spring",
|
||||
}}>
|
||||
Other Note Worthy Projects
|
||||
Другие ключевые проекты
|
||||
</motion.h1>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -272,7 +272,7 @@ export default function Page() {
|
|||
}}
|
||||
className="flex justify-center items-center flex-col my-5 self-start ">
|
||||
<Button variation="primary">
|
||||
<Link href="projects/archive">View In Archive</Link>
|
||||
<Link href="projects/archive">Посмотреть все</Link>
|
||||
</Button>
|
||||
</motion.div>
|
||||
</main>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue