Initial Commit
|
@ -0,0 +1,14 @@
|
||||||
|
module.exports = {
|
||||||
|
env: { browser: true, es2020: true },
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
'plugin:react-hooks/recommended',
|
||||||
|
],
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
|
||||||
|
plugins: ['react-refresh'],
|
||||||
|
rules: {
|
||||||
|
'react-refresh/only-export-components': 'warn',
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
|
@ -0,0 +1,115 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>امیر حسین مقیسه</title>
|
||||||
|
|
||||||
|
<link
|
||||||
|
rel="apple-touch-icon"
|
||||||
|
sizes="57x57"
|
||||||
|
href="favicon/apple-icon-57x57.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="apple-touch-icon"
|
||||||
|
sizes="60x60"
|
||||||
|
href="favicon/apple-icon-60x60.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="apple-touch-icon"
|
||||||
|
sizes="72x72"
|
||||||
|
href="favicon/apple-icon-72x72.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="apple-touch-icon"
|
||||||
|
sizes="76x76"
|
||||||
|
href="favicon/apple-icon-76x76.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="apple-touch-icon"
|
||||||
|
sizes="114x114"
|
||||||
|
href="favicon/apple-icon-114x114.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="apple-touch-icon"
|
||||||
|
sizes="120x120"
|
||||||
|
href="favicon/apple-icon-120x120.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="apple-touch-icon"
|
||||||
|
sizes="144x144"
|
||||||
|
href="favicon/apple-icon-144x144.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="apple-touch-icon"
|
||||||
|
sizes="152x152"
|
||||||
|
href="favicon/apple-icon-152x152.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="apple-touch-icon"
|
||||||
|
sizes="180x180"
|
||||||
|
href="favicon/apple-icon-180x180.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="icon"
|
||||||
|
type="image/png"
|
||||||
|
sizes="192x192"
|
||||||
|
href="favicon/android-icon-192x192.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="icon"
|
||||||
|
type="image/png"
|
||||||
|
sizes="32x32"
|
||||||
|
href="favicon/favicon-32x32.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="icon"
|
||||||
|
type="image/png"
|
||||||
|
sizes="96x96"
|
||||||
|
href="favicon/favicon-96x96.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="icon"
|
||||||
|
type="image/png"
|
||||||
|
sizes="16x16"
|
||||||
|
href="favicon/favicon-16x16.png"
|
||||||
|
/>
|
||||||
|
<link rel="manifest" href="favicon/manifest.json" />
|
||||||
|
<meta name="msapplication-TileColor" content="#26232A" />
|
||||||
|
<meta
|
||||||
|
name="msapplication-TileImage"
|
||||||
|
content="favicon/ms-icon-144x144.png"
|
||||||
|
/>
|
||||||
|
<meta name="theme-color" content="#26232A" />
|
||||||
|
<link rel="icon" href="favicon/favicon.ico" />
|
||||||
|
<link rel="manifest" href="favicon/manifest.json" />
|
||||||
|
<!-- Google Tag Manager -->
|
||||||
|
<script>
|
||||||
|
(function (w, d, s, l, i) {
|
||||||
|
w[l] = w[l] || [];
|
||||||
|
w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" });
|
||||||
|
var f = d.getElementsByTagName(s)[0],
|
||||||
|
j = d.createElement(s),
|
||||||
|
dl = l != "dataLayer" ? "&l=" + l : "";
|
||||||
|
j.async = true;
|
||||||
|
j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl;
|
||||||
|
f.parentNode.insertBefore(j, f);
|
||||||
|
})(window, document, "script", "dataLayer", "GTM-5VXB54X");
|
||||||
|
</script>
|
||||||
|
<!-- End Google Tag Manager -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- Google Tag Manager (noscript) -->
|
||||||
|
<noscript
|
||||||
|
><iframe
|
||||||
|
src="https://www.googletagmanager.com/ns.html?id=GTM-5VXB54X"
|
||||||
|
height="0"
|
||||||
|
width="0"
|
||||||
|
style="display: none; visibility: hidden"
|
||||||
|
></iframe
|
||||||
|
></noscript>
|
||||||
|
<!-- End Google Tag Manager (noscript) -->
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"name": "amirmoghi3",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "tsc && vite build",
|
||||||
|
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@material-ui/core": "^4.12.4",
|
||||||
|
"@material-ui/icons": "^4.11.3",
|
||||||
|
"lottie-web": "^5.11.0",
|
||||||
|
"react": "^18.2.0",
|
||||||
|
"react-dom": "^18.2.0",
|
||||||
|
"react-gravatar": "^2.6.3",
|
||||||
|
"react-helmet": "^6.1.0",
|
||||||
|
"react-lottie": "^1.2.3",
|
||||||
|
"react-router-dom": "^6.10.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/react": "^18.0.28",
|
||||||
|
"@types/react-dom": "^18.0.11",
|
||||||
|
"@types/react-gravatar": "^2.6.10",
|
||||||
|
"@types/react-helmet": "^6.1.6",
|
||||||
|
"@types/react-lottie": "^1.2.6",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.57.1",
|
||||||
|
"@typescript-eslint/parser": "^5.57.1",
|
||||||
|
"@vitejs/plugin-react-swc": "^3.0.0",
|
||||||
|
"autoprefixer": "^10.4.14",
|
||||||
|
"eslint": "^8.38.0",
|
||||||
|
"eslint-plugin-react-hooks": "^4.6.0",
|
||||||
|
"eslint-plugin-react-refresh": "^0.3.4",
|
||||||
|
"postcss": "^8.4.23",
|
||||||
|
"tailwindcss": "^3.3.1",
|
||||||
|
"typescript": "^5.0.2",
|
||||||
|
"vite": "^4.3.0",
|
||||||
|
"vite-tsconfig-paths": "^4.2.0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<browserconfig><msapplication><tile><square70x70logo src="/ms-icon-70x70.png"/><square150x150logo src="/ms-icon-150x150.png"/><square310x310logo src="/ms-icon-310x310.png"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>
|
After Width: | Height: | Size: 823 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
|
@ -0,0 +1,41 @@
|
||||||
|
{
|
||||||
|
"name": "App",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "\/android-icon-36x36.png",
|
||||||
|
"sizes": "36x36",
|
||||||
|
"type": "image\/png",
|
||||||
|
"density": "0.75"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "\/android-icon-48x48.png",
|
||||||
|
"sizes": "48x48",
|
||||||
|
"type": "image\/png",
|
||||||
|
"density": "1.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "\/android-icon-72x72.png",
|
||||||
|
"sizes": "72x72",
|
||||||
|
"type": "image\/png",
|
||||||
|
"density": "1.5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "\/android-icon-96x96.png",
|
||||||
|
"sizes": "96x96",
|
||||||
|
"type": "image\/png",
|
||||||
|
"density": "2.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "\/android-icon-144x144.png",
|
||||||
|
"sizes": "144x144",
|
||||||
|
"type": "image\/png",
|
||||||
|
"density": "3.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "\/android-icon-192x192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image\/png",
|
||||||
|
"density": "4.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
|
<url>
|
||||||
|
<loc>https://amirmoghi3.ir</loc>
|
||||||
|
<lastmod>2023-04-20</lastmod>
|
||||||
|
<priority>1</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://amirmoghi3.ir/resume</loc>
|
||||||
|
<priority>1</priority>
|
||||||
|
</url>
|
||||||
|
</urlset>
|
|
@ -0,0 +1,25 @@
|
||||||
|
import MainLayout from "layouts/mainLayout";
|
||||||
|
import PageLayout from "layouts/pageLayout";
|
||||||
|
import Home from "pages";
|
||||||
|
import NotFound from "pages/notFound";
|
||||||
|
import Resume from "pages/resume";
|
||||||
|
import { Routes, Route } from "react-router-dom";
|
||||||
|
|
||||||
|
function App() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Routes>
|
||||||
|
<Route element={<MainLayout />}>
|
||||||
|
<Route path="/" element={<Home />} />
|
||||||
|
</Route>
|
||||||
|
|
||||||
|
<Route element={<PageLayout />}>
|
||||||
|
<Route path="/resume" element={<Resume />} />
|
||||||
|
<Route path="*" element={<NotFound />} />
|
||||||
|
</Route>
|
||||||
|
</Routes>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 1.2 KiB |
|
@ -0,0 +1,117 @@
|
||||||
|
import Lottie from "react-lottie";
|
||||||
|
import { useRef } from "react";
|
||||||
|
import github from "assets/json/github.json";
|
||||||
|
import linkedin from "assets/json/linkedin.json";
|
||||||
|
import instagram from "assets/json/instagram.json";
|
||||||
|
import discord from "assets/json/discord.json";
|
||||||
|
import email from "assets/images/email.png";
|
||||||
|
import twitter from "assets/json/twitter.json";
|
||||||
|
|
||||||
|
const Footer = () => {
|
||||||
|
const playAnimation = (ref: any) => {
|
||||||
|
if (ref?.current) {
|
||||||
|
ref.current.play();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const contactLinks = [
|
||||||
|
{
|
||||||
|
href: "https://github.com/amirmoghi3",
|
||||||
|
label: "Github",
|
||||||
|
icon: github,
|
||||||
|
path: "assets/json/github.json",
|
||||||
|
ref: useRef(null),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "https://www.linkedin.com/in/amirmoghi3/",
|
||||||
|
label: "LinkedIn",
|
||||||
|
icon: linkedin,
|
||||||
|
path: "assets/json/linkedin.json",
|
||||||
|
ref: useRef(null),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "https://www.instagram.com/amirmoghi3/",
|
||||||
|
label: "Instagram",
|
||||||
|
icon: instagram,
|
||||||
|
path: "assets/json/instagram.json",
|
||||||
|
ref: useRef(null),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "https://twitter.com/amirmoghi3",
|
||||||
|
label: "Twitter",
|
||||||
|
icon: twitter,
|
||||||
|
path: "assets/json/twitter.json",
|
||||||
|
ref: useRef(null),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// email
|
||||||
|
href: "mailto:siramirmoghi3@gmail.com",
|
||||||
|
label: "Email",
|
||||||
|
icon: email,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
//discord
|
||||||
|
href: "https://discord.gg/FeECbW766J",
|
||||||
|
label: "Discord",
|
||||||
|
icon: discord,
|
||||||
|
path: "assets/json/discord.json",
|
||||||
|
ref: useRef(null),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="fixed bottom-5 md:px-5 py-3 w-full">
|
||||||
|
<div className="flex flex-col md:flex-row-reverse justify-between w-full">
|
||||||
|
<div className="flex flex-row">
|
||||||
|
{contactLinks.map((contactLink) => (
|
||||||
|
<a
|
||||||
|
onMouseEnter={() => playAnimation(contactLink.ref)}
|
||||||
|
href={contactLink.href}
|
||||||
|
target="_blank"
|
||||||
|
key={contactLink.href}
|
||||||
|
className="px-2 cursor-pointer"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
{contactLink.path ? (
|
||||||
|
<div className="bg-secondary w-7 h-7 hover:bg-gold">
|
||||||
|
<div className="relative -top-2 -right-2">
|
||||||
|
<Lottie
|
||||||
|
ref={contactLink.ref}
|
||||||
|
options={{
|
||||||
|
animationData: contactLink.icon,
|
||||||
|
loop: false,
|
||||||
|
autoplay: true,
|
||||||
|
}}
|
||||||
|
height={20}
|
||||||
|
width={20}
|
||||||
|
title={contactLink.label}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div className="bg-secondary w-7 h-7 hover:bg-gold">
|
||||||
|
<div className="relative -top-2 -right-3">
|
||||||
|
<img
|
||||||
|
src={contactLink.icon as string}
|
||||||
|
width={20}
|
||||||
|
height={20}
|
||||||
|
alt={contactLink.label}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
<div className="px-2 cursor-pointer w-[20px] h-[20px]"></div>
|
||||||
|
</div>
|
||||||
|
<div className="container">
|
||||||
|
<p className="text-secondary text-xs opacity-30 pl-1 md:pl-0 break-all">
|
||||||
|
@2020 Amir Hossein Moghiseh - Version{" 0.2-beta"}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Footer;
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { ArrowBack } from "@material-ui/icons";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
|
||||||
|
const GoBack = () => {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
className="text-left p-3 border-0 "
|
||||||
|
onClick={() => {
|
||||||
|
navigate("/");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ArrowBack className="text-secondary" />
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default GoBack;
|
|
@ -0,0 +1,70 @@
|
||||||
|
import { Launch } from "@material-ui/icons";
|
||||||
|
type Props = {
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
tags: string[];
|
||||||
|
year?: string | number;
|
||||||
|
url?: string;
|
||||||
|
isLunched?: boolean;
|
||||||
|
development: boolean;
|
||||||
|
image?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const Journey = ({
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
tags,
|
||||||
|
year,
|
||||||
|
url,
|
||||||
|
isLunched,
|
||||||
|
development,
|
||||||
|
image,
|
||||||
|
}: Props) => {
|
||||||
|
return (
|
||||||
|
<div className="bg-dark-primary rounded-md flex flex-col p-3 mx-3 relative">
|
||||||
|
<div className="flex justify-between">
|
||||||
|
<h3 className="text-2xl font-bold text-gold rounded-lg px-1 py-2">
|
||||||
|
{title}
|
||||||
|
{isLunched && (
|
||||||
|
<a href={url} target="_blank" rel="noreferrer" className="relative">
|
||||||
|
<Launch fontSize="small" />
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
</h3>
|
||||||
|
<div className="bg-white rounded-full w-16 h-16 flex flex-col justify-center items-center">
|
||||||
|
<img src={image} width={30} height={30} alt={title} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-between">
|
||||||
|
<p className="text-secondary opacity-80 text-sm text-left px-1 my-2">
|
||||||
|
{description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex flex-row flex-wrap ">
|
||||||
|
{tags.map((tag, i) => (
|
||||||
|
<p
|
||||||
|
key={i}
|
||||||
|
className="text-dark-primary bg-secondary rounded-md p-1 opacity-80 text-xs m-1"
|
||||||
|
>
|
||||||
|
{`#${tag}`}
|
||||||
|
</p>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
{development && (
|
||||||
|
<p className="text-secondary opacity-60 text-xs text-left px-1 mt-1 mb-0">
|
||||||
|
Start From <strong className="opacity-80 text-sm">{year}</strong> To
|
||||||
|
Now
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
{!development && (
|
||||||
|
<p className="text-secondary opacity-60 text-xs text-left px-1 mt-1 mb-0">
|
||||||
|
Built And Designed At{" "}
|
||||||
|
<strong className="opacity-80 text-sm">{year}</strong>
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Journey;
|
|
@ -0,0 +1,99 @@
|
||||||
|
import { useState } from "react";
|
||||||
|
import { Link, NavLink, useLocation } from "react-router-dom";
|
||||||
|
|
||||||
|
const MenuIcon = () => (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
width="50"
|
||||||
|
height="50"
|
||||||
|
viewBox="0 0 50 50"
|
||||||
|
style={{ fill: "#C2C2CA" }}
|
||||||
|
>
|
||||||
|
<path d="M 2 9 L 2 11 L 48 11 L 48 9 L 2 9 z M 2 24 L 2 26 L 48 26 L 48 24 L 2 24 z M 2 39 L 2 41 L 48 41 L 48 39 L 2 39 z"></path>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
const CloseIcon = () => (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
width="50"
|
||||||
|
height="50"
|
||||||
|
viewBox="0 0 50 50"
|
||||||
|
style={{ fill: "#C2C2CA" }}
|
||||||
|
>
|
||||||
|
<path d="M 7.71875 6.28125 L 6.28125 7.71875 L 23.5625 25 L 6.28125 42.28125 L 7.71875 43.71875 L 25 26.4375 L 42.28125 43.71875 L 43.71875 42.28125 L 26.4375 25 L 43.71875 7.71875 L 42.28125 6.28125 L 25 23.5625 Z"></path>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
|
||||||
|
const Navbar = () => {
|
||||||
|
const location = useLocation();
|
||||||
|
const [isNavbarOpened, setIsNavbarOpened] = useState(false);
|
||||||
|
|
||||||
|
const showNavbar = () => {
|
||||||
|
setIsNavbarOpened(!isNavbarOpened);
|
||||||
|
};
|
||||||
|
const links = [
|
||||||
|
{
|
||||||
|
href: "/",
|
||||||
|
label: "Amirmoghi3",
|
||||||
|
isActive: location.pathname === "/",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/resume",
|
||||||
|
label: "Who I Am",
|
||||||
|
isActive: location.pathname === "/resume",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
return (
|
||||||
|
<div className="p-5">
|
||||||
|
<nav className="flex justify-between flex-wrap items-start">
|
||||||
|
<div className="hidden md:flex">
|
||||||
|
{links.map(({ href, label, isActive }) => (
|
||||||
|
<NavLink
|
||||||
|
className={`${
|
||||||
|
isActive ? "border-secondary" : "border-light-primary"
|
||||||
|
} mx-2 text-secondary border-2 hover:border-secondary p-2`}
|
||||||
|
to={href}
|
||||||
|
key={href}
|
||||||
|
>
|
||||||
|
{label}
|
||||||
|
</NavLink>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col md:hidden w-full">
|
||||||
|
<div className="flex flex-row justify-between">
|
||||||
|
<button onClick={showNavbar}>
|
||||||
|
{isNavbarOpened ? <CloseIcon /> : <MenuIcon />}
|
||||||
|
</button>
|
||||||
|
<div className="border-b-2 border-b-secondary p-2">
|
||||||
|
<Link to={links[0].href}>
|
||||||
|
<a className="text-secondary text-sm md:text-xl">
|
||||||
|
{links[0].label}
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col border-secondary ">
|
||||||
|
{isNavbarOpened &&
|
||||||
|
links.slice(1).map(({ href, label, isActive }) => (
|
||||||
|
<Link to={href} key={href}>
|
||||||
|
<a
|
||||||
|
className={`${
|
||||||
|
isActive ? "border-secondary" : "border-light-primary"
|
||||||
|
} my-2 text-secondary border-2 hover:border-secondary p-2`}
|
||||||
|
>
|
||||||
|
{label}
|
||||||
|
</a>
|
||||||
|
</Link>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Navbar;
|
|
@ -0,0 +1,17 @@
|
||||||
|
type Props = {
|
||||||
|
title: string;
|
||||||
|
percent: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const LinearSpeacialistBar = ({ title, percent }: Props) => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<span className="text-secondary text-sm opacity-75">{title}</span>
|
||||||
|
<div className="h-2 w-full bg-dark-primary rounded-md z-0"></div>
|
||||||
|
<div
|
||||||
|
className={`relative -top-[8px] h-2 rounded-md bg-gold z-10`}
|
||||||
|
style={{ width: percent + "%" }}
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -0,0 +1,11 @@
|
||||||
|
type props = {
|
||||||
|
title: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function Tag({ title }: props) {
|
||||||
|
return (
|
||||||
|
<div className="text-dark-primary bg-secondary rounded-md p-1 opacity-80 text-xs m-1">
|
||||||
|
<p>#{title}</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
|
@ -0,0 +1,17 @@
|
||||||
|
import Footer from "@/Footer";
|
||||||
|
import Navbar from "@/Navbar";
|
||||||
|
import { Outlet } from "react-router-dom"
|
||||||
|
|
||||||
|
const MainLayout = () => {
|
||||||
|
return (
|
||||||
|
<div className="w-screen h-screen bg-dark-primary p-5 ">
|
||||||
|
<main className="bg-light-primary w-full h-full">
|
||||||
|
<Navbar />
|
||||||
|
<Outlet />
|
||||||
|
<Footer />
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default MainLayout;
|
|
@ -0,0 +1,16 @@
|
||||||
|
import GoBack from "@/GoBack";
|
||||||
|
import { Outlet } from "react-router-dom";
|
||||||
|
|
||||||
|
const PageLayout = () => {
|
||||||
|
return (
|
||||||
|
<div className="bg-dark-primary p-5">
|
||||||
|
<main className="bg-light-primary w-full">
|
||||||
|
<GoBack />
|
||||||
|
<Outlet />
|
||||||
|
{/* <Footer /> */}
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PageLayout;
|
|
@ -0,0 +1,13 @@
|
||||||
|
import React from 'react'
|
||||||
|
import ReactDOM from 'react-dom/client'
|
||||||
|
import App from './App.tsx'
|
||||||
|
import './index.css'
|
||||||
|
import { BrowserRouter } from 'react-router-dom'
|
||||||
|
|
||||||
|
ReactDOM.createRoot(document.getElementById('app') as HTMLElement).render(
|
||||||
|
<React.StrictMode>
|
||||||
|
<BrowserRouter>
|
||||||
|
<App />
|
||||||
|
</BrowserRouter>
|
||||||
|
</React.StrictMode>,
|
||||||
|
)
|
|
@ -0,0 +1,26 @@
|
||||||
|
import { Helmet } from "react-helmet";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
|
||||||
|
const Home = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Helmet>
|
||||||
|
<title>امیرحسین مقیسه</title>
|
||||||
|
<meta name="description" content="وبسایت شخصی مهندس امیرحسین مقیسه به جهت آشنایی بیشتر با توانایی و سوابق امیرحسین مقیسه" />
|
||||||
|
</Helmet>
|
||||||
|
<div className="text-center text-secondary relative top-[30%] px-2">
|
||||||
|
{/* <h1 className='text-3xl'> <Image alt="amirmoghi3" src={amirmoghi3Glitch} /></h1> */}
|
||||||
|
<p className="opacity-60 text-sm">
|
||||||
|
PM4D | Web3 Developer | Software Engineer
|
||||||
|
</p>
|
||||||
|
<Link to={"resume"}>
|
||||||
|
<button className="py-4 px-8 border w-fit border-secondary m-4 rounded-lg hover:bg-secondary hover:text-dark-primary">
|
||||||
|
Resume
|
||||||
|
</button>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Home;
|
|
@ -0,0 +1,8 @@
|
||||||
|
export default function NotFound() {
|
||||||
|
return (
|
||||||
|
<div className="flex h-screen justify-center flex-col items-center">
|
||||||
|
<p className="text-5xl text-white">404</p>
|
||||||
|
<p className="text-secondary text-xl">مسیرت و عوض کن</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,654 @@
|
||||||
|
import Journey from "@/Journey";
|
||||||
|
import Tag from "@/Tag";
|
||||||
|
import { useState } from "react";
|
||||||
|
import Gravatar from "react-gravatar";
|
||||||
|
import { Helmet } from "react-helmet";
|
||||||
|
const positions = [
|
||||||
|
{
|
||||||
|
from: "2018",
|
||||||
|
to: "2019",
|
||||||
|
position: "Full-Stack Developer Self-Employee",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: "2019",
|
||||||
|
to: "2020",
|
||||||
|
position: "Software Enginer At Vira Nasir Fanavar",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: "2020",
|
||||||
|
to: "2023",
|
||||||
|
position: "CTO At Holding ToseE Tejerat Sarafraz",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: "2020",
|
||||||
|
to: "2023",
|
||||||
|
position: "CTO At Sahand",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: "2020",
|
||||||
|
to: "2023",
|
||||||
|
position: "CTO At Vira Nasir Fanavar",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const thoseWhatIknowAndFamiliarAndSpecialistAt = [
|
||||||
|
{
|
||||||
|
title: "HTML",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "vault",
|
||||||
|
percent: 30,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "vault",
|
||||||
|
percent: 30,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "CSS",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Web3",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Javascript",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Typescript",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Reactjs",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Nextjs / app directory",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Vuejs",
|
||||||
|
percent: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Rust",
|
||||||
|
percent: 70,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Nuxtjs",
|
||||||
|
percent: 40,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Go",
|
||||||
|
percent: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "MongoDB",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Docker",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "K8s",
|
||||||
|
percent: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "WebRTC",
|
||||||
|
percent: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Kafka",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Elastic search",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Java",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Python",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Tailwindcss",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Unity",
|
||||||
|
percent: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Linux",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Bash",
|
||||||
|
percent: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Postgresql",
|
||||||
|
percent: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Express",
|
||||||
|
percent: 95,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "NodeJs",
|
||||||
|
percent: 95,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Solidity",
|
||||||
|
percent: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "ERC20",
|
||||||
|
percent: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "GA4",
|
||||||
|
percent: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "GoogleTagManager",
|
||||||
|
percent: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "YAML",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Redis",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "RabbitMQ",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "SEO",
|
||||||
|
percent: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Laravel",
|
||||||
|
percent: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "PHP",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "MySQL",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Sqlite",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Nginx",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "gRPC",
|
||||||
|
percent: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Rest",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "oAuth",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Googling",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "GraphQL",
|
||||||
|
percent: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Moralis",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "actix",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "WebSocket",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Kibana",
|
||||||
|
percent: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "jQuery",
|
||||||
|
percent: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "NodeRed",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Bootstrap",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "SysAdmin",
|
||||||
|
percent: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "SpringBoot",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Jira",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Bamboo",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Git",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Gitlab CI",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "STOMP",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "PWA",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Docker Swarm",
|
||||||
|
percent: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "PaaS",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "json",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "ETH",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Microservices",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "jenkins",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "envoy",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "echo",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "jettool",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "appsmith",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "faas",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "paas",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "DesignSystem",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "storybook",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "cva",
|
||||||
|
percent: 90,
|
||||||
|
},
|
||||||
|
|
||||||
|
].sort((a, b) => a.title.localeCompare(b.title));
|
||||||
|
|
||||||
|
const projects = [
|
||||||
|
{
|
||||||
|
order:5,
|
||||||
|
title: "Baladam",
|
||||||
|
tags: [
|
||||||
|
"nuxtjs",
|
||||||
|
"java",
|
||||||
|
"springboot",
|
||||||
|
"mongodb",
|
||||||
|
"elastic",
|
||||||
|
"redis",
|
||||||
|
"rust",
|
||||||
|
"rabbitmq",
|
||||||
|
],
|
||||||
|
description: "Hire the freelancers, online.",
|
||||||
|
year: 2019,
|
||||||
|
isLunched: false,
|
||||||
|
development: false,
|
||||||
|
image: "https://avatars.githubusercontent.com/u/43704900?s=200&v=4",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:2,
|
||||||
|
title: "Mucut",
|
||||||
|
tags: ["nuxtjs", "python", "mysql", "nginx", "pm2"],
|
||||||
|
description:
|
||||||
|
"Find & book beauty services like hairdressing, manicure, spa or massage.",
|
||||||
|
year: 2020,
|
||||||
|
url: "https://mucut.ir",
|
||||||
|
isLunched: true,
|
||||||
|
development: true,
|
||||||
|
image: "https://mucut.ir/images/mucut.logo.svg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:3,
|
||||||
|
title: "!mixsome",
|
||||||
|
tags: ["reactjs", "web3", "moralis"],
|
||||||
|
description: "Approval manager dashboard and revoking approvals ",
|
||||||
|
year: 2022,
|
||||||
|
url: "https://mixsome.cash",
|
||||||
|
development: false,
|
||||||
|
isLunched: true,
|
||||||
|
image: "https://mixsome.cash/images/logo-white500px.gif",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:4,
|
||||||
|
title: "MPCP (mutant penguins club project)",
|
||||||
|
tags: [
|
||||||
|
"reactjs",
|
||||||
|
"web3",
|
||||||
|
"moralis",
|
||||||
|
"solidity",
|
||||||
|
"ganache",
|
||||||
|
"remixIDE",
|
||||||
|
"ethers.js",
|
||||||
|
"nft",
|
||||||
|
],
|
||||||
|
description: "P2E platform",
|
||||||
|
year: 2021,
|
||||||
|
url: "https://mpcp.amirmoghi3.ir",
|
||||||
|
isLunched: false,
|
||||||
|
development: false,
|
||||||
|
image: "https://docs.soliditylang.org/en/v0.8.20/_static/logo.svg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:6,
|
||||||
|
title: "instagram-scr.ap.per",
|
||||||
|
tags: ["python", "proxy", "selenium"],
|
||||||
|
description: "Scrapping public data from Instagram",
|
||||||
|
year: 2020,
|
||||||
|
url: "",
|
||||||
|
isLunched: false,
|
||||||
|
development: false,
|
||||||
|
image:
|
||||||
|
"https://upload.wikimedia.org/wikipedia/commons/9/95/Instagram_logo_2022.svg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:7,
|
||||||
|
title: "Yaus",
|
||||||
|
tags: ["rust", "actix", "mongodb"],
|
||||||
|
description: "Free URL shortener and link services with less than 10MB RAM",
|
||||||
|
year: 2021,
|
||||||
|
url: "https://yaus.ir",
|
||||||
|
isLunched: true,
|
||||||
|
development: false,
|
||||||
|
image: "https://yaus.ir/favicon.png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:12,
|
||||||
|
title: "Mafia Game",
|
||||||
|
tags: ["nodejs", "redis", "reactjs", "sqlite", "socketjs"],
|
||||||
|
description: "Mafia Game (werewolf)",
|
||||||
|
year: 2021,
|
||||||
|
url: "https://mafia.game.igarson.app",
|
||||||
|
isLunched: true,
|
||||||
|
development: false,
|
||||||
|
image:
|
||||||
|
"https://mafia-game.igarson.app/static/media/mafia-logo.a06d547a1d64327fdfc0.png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:1,
|
||||||
|
title: "iGarson.app",
|
||||||
|
tags: [
|
||||||
|
"paas",
|
||||||
|
"springboot",
|
||||||
|
"stomp",
|
||||||
|
"reactjs",
|
||||||
|
"nextjs",
|
||||||
|
"mongodb",
|
||||||
|
"pg",
|
||||||
|
".net",
|
||||||
|
"pwa",
|
||||||
|
"rabbitmq",
|
||||||
|
"elastic",
|
||||||
|
"redis",
|
||||||
|
"microservises",
|
||||||
|
"rust",
|
||||||
|
"go",
|
||||||
|
],
|
||||||
|
description: "smart resturant assistance infestracture",
|
||||||
|
year: 2019,
|
||||||
|
url: "https://igarson.app",
|
||||||
|
isLunched: true,
|
||||||
|
development: true,
|
||||||
|
image: "https://igarson.app/_next/static/media/G.c7e22450.svg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:9,
|
||||||
|
title: "ftsco.co",
|
||||||
|
tags: ["nextjs", "docker", "swarm", "nginx", "let's encrypt"],
|
||||||
|
description: "introducing herbal products for export.",
|
||||||
|
year: 2021,
|
||||||
|
url: "https://ftsco.co",
|
||||||
|
isLunched: true,
|
||||||
|
development: false,
|
||||||
|
image:
|
||||||
|
"https://ftsco.co/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flogo.ec591a4f.png&w=1920&q=75",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:10,
|
||||||
|
title: "imedapp",
|
||||||
|
tags: ["nextjs", "pg", "swarm", "docker"],
|
||||||
|
description: "selling medical content",
|
||||||
|
year: 2022,
|
||||||
|
url: "https://admin.imedapp.ir",
|
||||||
|
isLunched: true,
|
||||||
|
development: false,
|
||||||
|
image:
|
||||||
|
"https://admin.imedapp.ir/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flogo.3c212134.png&w=640&q=75",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:15,
|
||||||
|
title: "Chemiboard",
|
||||||
|
tags: ["nextjs", "designsystem", "tailwindcss", "storybook","mysql","nodejs"],
|
||||||
|
description: "Wholesale sale of chemicals",
|
||||||
|
year: 2022,
|
||||||
|
url: "https://chemiboard.com",
|
||||||
|
isLunched: true,
|
||||||
|
development: false,
|
||||||
|
// image:
|
||||||
|
// "https://admin.imedapp.ir/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flogo.3c212134.png&w=640&q=75",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
order:7,
|
||||||
|
title: "menuva",
|
||||||
|
tags: ["react-ts", "vite", "signalR"],
|
||||||
|
description: "digital jukebox",
|
||||||
|
year: 2023,
|
||||||
|
url: "https://menuva.ir",
|
||||||
|
isLunched: false,
|
||||||
|
development: true,
|
||||||
|
// image:
|
||||||
|
// "https://admin.imedapp.ir/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flogo.3c212134.png&w=640&q=75",
|
||||||
|
},
|
||||||
|
].sort((a, b) => a.order - b.order);
|
||||||
|
// const specialistPageSize = 12;
|
||||||
|
const Resume = () => {
|
||||||
|
// const [specialistLimitSize, setSpecialistLimitSize] = useState(
|
||||||
|
// specialistPageSize
|
||||||
|
// );
|
||||||
|
|
||||||
|
const [searchQuery, setSearchQuery] = useState("");
|
||||||
|
|
||||||
|
// const loadMore = () => {
|
||||||
|
// if (
|
||||||
|
// thoseWhatIknowAndFamiliarAndSpecialistAt.length - specialistPageSize >
|
||||||
|
// specialistLimitSize
|
||||||
|
// )
|
||||||
|
// setSpecialistLimitSize(specialistLimitSize + specialistPageSize);
|
||||||
|
// else
|
||||||
|
// setSpecialistLimitSize(thoseWhatIknowAndFamiliarAndSpecialistAt.length);
|
||||||
|
// };
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Helmet>
|
||||||
|
<title> سوابق امیرحسین مقیسه</title>
|
||||||
|
</Helmet>
|
||||||
|
|
||||||
|
<div className="flex flex-col lg:grid lg:grid-flow-row lg:grid-cols-5 p-2 text-secondary">
|
||||||
|
<div className="col-span-1 h-full bg-light-primary">
|
||||||
|
<div className="flex flex-col w-full">
|
||||||
|
<div className="flex flex-col p-3 bg-dark-primary rounded-xl">
|
||||||
|
<div className="text-center mx-auto">
|
||||||
|
<Gravatar
|
||||||
|
email="siramirmoghi3@gmail.com"
|
||||||
|
className="rounded-full"
|
||||||
|
title="amirmoghi3"
|
||||||
|
size={300}
|
||||||
|
height={"85px"}
|
||||||
|
width={"85px"}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<h1 className="text-3xl text-white text-center mt-2">
|
||||||
|
Amirmoghi3
|
||||||
|
</h1>
|
||||||
|
<h2 className="text-xl opacity-80 text-white text-center mt-3">
|
||||||
|
Amir Hossein Moghiseh
|
||||||
|
</h2>
|
||||||
|
<h3 className="text-xs text-secondary text-center opacity-60">
|
||||||
|
PM4D | Software Enginer | Web3 ;)
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col bg-light-primary p-3 text-xs">
|
||||||
|
<div className="flex flex-row justify-between py-2 text-center">
|
||||||
|
<span className="text-white text-ellipsis ">Residence :</span>
|
||||||
|
<span className="text-white opacity-60">Iran</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-row justify-between py-2 text-center">
|
||||||
|
<span className="text-white ">City :</span>
|
||||||
|
<span className="text-white opacity-60">Tehran</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-row justify-between py-2 text-center">
|
||||||
|
<span className="text-white text-ellipsis">Birthday :</span>
|
||||||
|
<span className="text-white text-ellipsis opacity-60">
|
||||||
|
Aug/26/1998
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-row justify-between py-2 text-center">
|
||||||
|
<span className="text-white text-ellipsis">Experiance :</span>
|
||||||
|
<span className="text-white text-ellipsis opacity-60">
|
||||||
|
2016
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-row justify-between py-2 text-center">
|
||||||
|
<span className="text-white text-ellipsis">Positions :</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-row justify-between py-2 text-center">
|
||||||
|
<div className="flex flex-col gap-1 text-left">
|
||||||
|
{positions.map((position) => (
|
||||||
|
<span className="text-white text-xs text-ellipsis opacity-60">
|
||||||
|
{position.position}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="px-3">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Search ..."
|
||||||
|
className="bg-dark-primary text-secondary px-2 py-1 rounded-md w-full"
|
||||||
|
onChange={(e) => setSearchQuery(e.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-wrap p-3">
|
||||||
|
{searchQuery &&
|
||||||
|
thoseWhatIknowAndFamiliarAndSpecialistAt
|
||||||
|
.filter((o) => new RegExp(searchQuery, "gi").test(o.title))
|
||||||
|
// .slice(1, specialistLimitSize)
|
||||||
|
.map((occupation) => (
|
||||||
|
<Tag
|
||||||
|
key={occupation.title}
|
||||||
|
// percent={occupation.percent}
|
||||||
|
title={occupation.title}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
{!searchQuery &&
|
||||||
|
thoseWhatIknowAndFamiliarAndSpecialistAt
|
||||||
|
// .slice(1, specialistLimitSize)
|
||||||
|
.map((occupation) => (
|
||||||
|
<Tag
|
||||||
|
key={occupation.title}
|
||||||
|
// percent={occupation.percent}
|
||||||
|
title={occupation.title}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
{/* {thoseWhatIknowAndFamiliarAndSpecialistAt.length >
|
||||||
|
specialistLimitSize && (
|
||||||
|
<span
|
||||||
|
onClick={loadMore}
|
||||||
|
className="mt-5 text-white text-sm opacity-50 hover:opacity-80 text-left cursor-pointer"
|
||||||
|
>
|
||||||
|
Load More ...
|
||||||
|
</span>
|
||||||
|
)} */}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="lg:col-span-4 h-full flex flex-col lg:px-5 text-center w-full bg-light-primary">
|
||||||
|
<div className="flex flex-row flex-wrap">
|
||||||
|
{projects.map((project) => (
|
||||||
|
<div key={project.title} className=" w-full lg:w-1/2 mb-4">
|
||||||
|
<Journey {...project} />
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Resume;
|
|
@ -0,0 +1 @@
|
||||||
|
/// <reference types="vite/client" />
|
|
@ -0,0 +1,24 @@
|
||||||
|
/** @type {import('tailwindcss').Config} */
|
||||||
|
export default {
|
||||||
|
content: ["./index.html", "./src/**/*.{js,jsx,ts,tsx}"],
|
||||||
|
theme: {
|
||||||
|
extends: {},
|
||||||
|
colors: {
|
||||||
|
"dark-primary": "#26232A",
|
||||||
|
"light-primary": "#313039",
|
||||||
|
secondary: "#C2C2CA",
|
||||||
|
white: "white",
|
||||||
|
gold: "#F5C346",
|
||||||
|
},
|
||||||
|
sans: ["DM Sans", "sans-serif"],
|
||||||
|
mono: ["DM Mono", "monospace"],
|
||||||
|
},
|
||||||
|
fontWeight: {
|
||||||
|
regular: 400,
|
||||||
|
medium: 500,
|
||||||
|
bold: 700,
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ESNext",
|
||||||
|
"lib": ["DOM", "DOM.Iterable", "ESNext"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
/* Bundler mode */
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
|
||||||
|
"baseUrl": "src",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["components/*"],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": ["src"],
|
||||||
|
"references": [{ "path": "./tsconfig.node.json" }]
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowSyntheticDefaultImports": true
|
||||||
|
},
|
||||||
|
"include": ["vite.config.ts"]
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import react from '@vitejs/plugin-react-swc'
|
||||||
|
import tsconfigPaths from 'vite-tsconfig-paths'
|
||||||
|
// https://vitejs.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [tsconfigPaths(),react()],
|
||||||
|
})
|