Initial Commit

master
Amir Hossein Moghiseh 2023-07-15 14:42:40 +03:30
commit 523fb5a7d4
60 changed files with 3467 additions and 0 deletions

14
.eslintrc.cjs 100644
View File

@ -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',
},
}

24
.gitignore vendored 100644
View File

@ -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?

115
index.html 100644
View File

@ -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>

42
package.json 100644
View File

@ -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"
}
}

View File

@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -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"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

12
public/sitemap.xml 100644
View File

@ -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>

25
src/App.tsx 100644
View File

@ -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;

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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>
);
};

View File

@ -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>
);
}

3
src/index.css 100644
View File

@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@ -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;

View File

@ -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;

13
src/main.tsx 100644
View File

@ -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>,
)

View File

@ -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;

View File

@ -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>
);
}

View File

@ -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;

1
src/vite-env.d.ts vendored 100644
View File

@ -0,0 +1 @@
/// <reference types="vite/client" />

24
tailwind.config.js 100644
View File

@ -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: [],
}

29
tsconfig.json 100644
View File

@ -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" }]
}

10
tsconfig.node.json 100644
View File

@ -0,0 +1,10 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts"]
}

7
vite.config.ts 100644
View File

@ -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()],
})

2041
yarn.lock 100644

File diff suppressed because it is too large Load Diff