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