initial
parent
761bb5536a
commit
cb0a978a11
|
@ -1,3 +1,7 @@
|
|||
{
|
||||
"extends": "next/core-web-vitals"
|
||||
}
|
||||
"extends": [
|
||||
"next/core-web-vitals",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"prettier" // Add "prettier" last. This will turn off eslint rules conflicting with prettier. This is not what will format our code.
|
||||
]
|
||||
}
|
|
@ -5,6 +5,7 @@
|
|||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
|
@ -36,3 +37,8 @@ yarn-error.log*
|
|||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
|
||||
.vscode
|
||||
yarn.lock
|
||||
.next
|
||||
.node_modules
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"semi": false,
|
||||
"trailingComma": "es5",
|
||||
"singleQuote": true,
|
||||
"tabWidth": 2,
|
||||
"useTabs": false
|
||||
}
|
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
|
@ -0,0 +1,120 @@
|
|||
import type { NextPage } from "next";
|
||||
import Lottie from "react-lottie";
|
||||
import Image from "next/image";
|
||||
import { MutableRefObject, useRef, useState } from "react";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const Footer: NextPage = () => {
|
||||
|
||||
const playAnimation = (ref: any) => {
|
||||
if (ref?.current) {
|
||||
ref.current.play()
|
||||
}
|
||||
}
|
||||
|
||||
const [isPause, setIsPause] = useState(true)
|
||||
const [isStopped, setIsStopped] = useState(true)
|
||||
|
||||
|
||||
const contactLinks = [
|
||||
{
|
||||
href: "https://github.com/amirmoghi3",
|
||||
label: "Github",
|
||||
icon: require("assets/json/github.json"),
|
||||
path: "assets/json/github.json",
|
||||
ref: useRef(null)
|
||||
},
|
||||
{
|
||||
href: "https://www.linkedin.com/in/amirmoghi3/",
|
||||
label: "LinkedIn",
|
||||
icon: require("assets/json/linkedin.json"),
|
||||
path: "assets/json/linkedin.json",
|
||||
ref: useRef(null)
|
||||
},
|
||||
{
|
||||
href: "https://www.instagram.com/amirmoghi3/",
|
||||
label: "Instagram",
|
||||
icon: require("assets/json/instagram.json"),
|
||||
path: "assets/json/instagram.json",
|
||||
ref: useRef(null)
|
||||
},
|
||||
{
|
||||
href: "https://twitter.com/amirmoghi3",
|
||||
label: "Twitter",
|
||||
icon: require("assets/json/twitter.json"),
|
||||
path: "assets/json/twitter.json",
|
||||
ref: useRef(null)
|
||||
},
|
||||
{
|
||||
// email
|
||||
href: "mailto:siramirmoghi3@gmail.com",
|
||||
label: "Email",
|
||||
icon: require("assets/images/email.png"),
|
||||
|
||||
},
|
||||
{
|
||||
//discord
|
||||
href: "https://discord.gg/FeECbW766J",
|
||||
label: "Discord",
|
||||
icon: require("assets/json/discord.json"),
|
||||
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 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">
|
||||
<Image src={contactLink.icon} width={20} height={20} alt={contactLink.label} />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
</a>
|
||||
))
|
||||
}
|
||||
<div className="px-2 cursor-pointer w-[20px] h-[20px]">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span className="text-secondary text-xs opacity-30 pl-1 md:pl-0 ">
|
||||
@2020 Amir Hossein Moghiseh
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
export default Footer;
|
|
@ -0,0 +1,17 @@
|
|||
import { NextComponentType } from "next";
|
||||
import { ArrowBack } from '@material-ui/icons';
|
||||
import { useRouter } from "next/router";
|
||||
|
||||
const GoBack: NextComponentType = () => {
|
||||
|
||||
const router = useRouter()
|
||||
return (
|
||||
<button className="text-left p-3 border-0 " onClick={() => {
|
||||
router.push("/")
|
||||
}} >
|
||||
<ArrowBack className="text-secondary" />
|
||||
</button>
|
||||
)
|
||||
}
|
||||
|
||||
export default GoBack;
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
|
||||
|
||||
|
||||
const Journey = ({ title, description, tags, year, url, isLunched }) => {
|
||||
|
||||
return (
|
||||
<div className="w-52 bg-dark-primary rounded-md flex flex-col p-3 my-2 mx-3">
|
||||
<h3 className="text-2xl font-bold bg-gold text-dark-primary rounded-lg px-1 py-2">{title}</h3>
|
||||
<p className="text-secondary opacity-80 text-sm text-left px-1 my-2">{description}</p>
|
||||
<div className="flex flex-row flex-wrap ">
|
||||
{tags.map(tag => (
|
||||
<p className="text-dark-primary bg-secondary rounded-md p-1 opacity-80 text-xs m-1">
|
||||
{`#${tag}`}
|
||||
</p>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default Journey;
|
|
@ -0,0 +1,72 @@
|
|||
import type { NextPage } from "next";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import { useState } from "react";
|
||||
|
||||
|
||||
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: NextPage = () => {
|
||||
|
||||
const router = useRouter();
|
||||
const [isNavbarOpened, setIsNavbarOpened] = useState(false);
|
||||
|
||||
const showNavbar = () => {
|
||||
setIsNavbarOpened(!isNavbarOpened);
|
||||
}
|
||||
const links = [
|
||||
{
|
||||
href: "/", label: "Amirmoghi3", isActive: router.pathname === "/",
|
||||
},
|
||||
{
|
||||
href: "/resume", label: "Who I Am", isActive: router.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 }) => (
|
||||
<Link href={href} key={href} >
|
||||
<a className={`${isActive ? "border-secondary" : "border-light-primary"} mx-2 text-secondary border-2 hover:border-secondary p-2`}>{label}</a>
|
||||
</Link>
|
||||
))}
|
||||
</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 href={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 href={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,23 @@
|
|||
|
||||
|
||||
|
||||
export const LinearSpeacialistBar = ({ title, percent }) => {
|
||||
|
||||
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,25 @@
|
|||
import Footer from "@/Footer";
|
||||
import Navbar from "@/Navbar";
|
||||
import type { NextPage } from "next";
|
||||
import Head from "next/head";
|
||||
|
||||
|
||||
const MainLayout: NextPage = ({ children }) => {
|
||||
return (
|
||||
<div className="w-screen h-screen bg-dark-primary p-5 ">
|
||||
<Head>
|
||||
<title>Amirmoghi3 | امیرحسین مقیسه</title>
|
||||
<meta name="description" content="amir hossein moghiseh personal page" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
<main className='bg-light-primary w-full h-full'>
|
||||
<Navbar />
|
||||
{children}
|
||||
<Footer />
|
||||
</main>
|
||||
</div>
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
export default MainLayout;
|
|
@ -0,0 +1,23 @@
|
|||
import GoBack from "@/GoBack";
|
||||
import type { NextPage } from "next";
|
||||
import Head from "next/head";
|
||||
|
||||
|
||||
const PageLayout: NextPage = ({ children }) => {
|
||||
return (
|
||||
<div className="w-screen bg-dark-primary p-5">
|
||||
<Head>
|
||||
<title>Amirmoghi3 | امیرحسین مقیسه</title>
|
||||
<meta name="description" content="amir hossein moghiseh personal page" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
<main className='bg-light-primary w-full'>
|
||||
<GoBack />
|
||||
{children}
|
||||
</main>
|
||||
</div>
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
export default PageLayout;
|
15
package.json
15
package.json
|
@ -9,15 +9,28 @@
|
|||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@material-ui/core": "^4.12.3",
|
||||
"@material-ui/icons": "^4.11.2",
|
||||
"@types/react-gravatar": "^2.6.10",
|
||||
"@types/react-lottie": "^1.2.6",
|
||||
"lottie-web": "^5.8.1",
|
||||
"next": "12.1.0",
|
||||
"react": "17.0.2",
|
||||
"react-dom": "17.0.2"
|
||||
"react-dom": "17.0.2",
|
||||
"react-gravatar": "^2.6.3",
|
||||
"react-lottie": "^1.2.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "17.0.18",
|
||||
"@types/react": "17.0.39",
|
||||
"@typescript-eslint/eslint-plugin": "^5.12.0",
|
||||
"autoprefixer": "^10.4.2",
|
||||
"eslint": "8.9.0",
|
||||
"eslint-config-next": "12.1.0",
|
||||
"eslint-config-prettier": "^8.4.0",
|
||||
"postcss": "^8.4.6",
|
||||
"prettier": "^2.5.1",
|
||||
"tailwindcss": "^3.0.23",
|
||||
"typescript": "4.5.5"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,23 @@
|
|||
import '../styles/globals.css'
|
||||
import 'styles/globals.css'
|
||||
import type { AppProps } from 'next/app'
|
||||
import MainLayout from 'layouts/mainLayout'
|
||||
import PageLayout from 'layouts/pageLayout'
|
||||
import { useRouter } from 'next/router'
|
||||
|
||||
function MyApp({ Component, pageProps }: AppProps) {
|
||||
return <Component {...pageProps} />
|
||||
const route = useRouter();
|
||||
return (
|
||||
|
||||
route.pathname === "/" ?
|
||||
<MainLayout>
|
||||
<Component {...pageProps} />
|
||||
</MainLayout>
|
||||
:
|
||||
<PageLayout>
|
||||
<Component {...pageProps} />
|
||||
</PageLayout>
|
||||
|
||||
)
|
||||
}
|
||||
|
||||
export default MyApp
|
||||
|
|
|
@ -1,70 +1,12 @@
|
|||
import type { NextPage } from 'next'
|
||||
import Head from 'next/head'
|
||||
import amirmoghi3Glitch from "assets/images/amirmoghi3.png"
|
||||
import Image from 'next/image'
|
||||
import styles from '../styles/Home.module.css'
|
||||
|
||||
const Home: NextPage = () => {
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<Head>
|
||||
<title>Create Next App</title>
|
||||
<meta name="description" content="Generated by create next app" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
|
||||
<main className={styles.main}>
|
||||
<h1 className={styles.title}>
|
||||
Welcome to <a href="https://nextjs.org">Next.js!</a>
|
||||
</h1>
|
||||
|
||||
<p className={styles.description}>
|
||||
Get started by editing{' '}
|
||||
<code className={styles.code}>pages/index.tsx</code>
|
||||
</p>
|
||||
|
||||
<div className={styles.grid}>
|
||||
<a href="https://nextjs.org/docs" className={styles.card}>
|
||||
<h2>Documentation →</h2>
|
||||
<p>Find in-depth information about Next.js features and API.</p>
|
||||
</a>
|
||||
|
||||
<a href="https://nextjs.org/learn" className={styles.card}>
|
||||
<h2>Learn →</h2>
|
||||
<p>Learn about Next.js in an interactive course with quizzes!</p>
|
||||
</a>
|
||||
|
||||
<a
|
||||
href="https://github.com/vercel/next.js/tree/canary/examples"
|
||||
className={styles.card}
|
||||
>
|
||||
<h2>Examples →</h2>
|
||||
<p>Discover and deploy boilerplate example Next.js projects.</p>
|
||||
</a>
|
||||
|
||||
<a
|
||||
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
|
||||
className={styles.card}
|
||||
>
|
||||
<h2>Deploy →</h2>
|
||||
<p>
|
||||
Instantly deploy your Next.js site to a public URL with Vercel.
|
||||
</p>
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer className={styles.footer}>
|
||||
<a
|
||||
href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Powered by{' '}
|
||||
<span className={styles.logo}>
|
||||
<Image src="/vercel.svg" alt="Vercel Logo" width={72} height={16} />
|
||||
</span>
|
||||
</a>
|
||||
</footer>
|
||||
<div className='text-center text-secondary relative top-[30%] -translate-y-2/4 px-2'>
|
||||
<h1 className='text-3xl'> <Image alt="amirmoghi3" src={amirmoghi3Glitch} /></h1>
|
||||
<p className='opacity-60 text-sm'>PM4D | Web3 Developer | Devops Specialist | Web Engineer</p>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,383 @@
|
|||
import Journey from "@/Journey";
|
||||
import { LinearSpeacialistBar } from "@/SpecialistBar";
|
||||
import type { NextPage } from "next";
|
||||
import Head from "next/head";
|
||||
import { useState } from "react";
|
||||
import Gravatar from "react-gravatar";
|
||||
|
||||
|
||||
const specialistPageSize = 12;
|
||||
const Resume: NextPage = () => {
|
||||
|
||||
const [specialistLimitSize, setSpecialistLimitSize] = useState(specialistPageSize)
|
||||
|
||||
|
||||
const loadMore = () => {
|
||||
if (thoseWhatIknowAndFamiliarAndSpecialistAt.length - specialistPageSize > specialistLimitSize)
|
||||
setSpecialistLimitSize(specialistLimitSize + specialistPageSize)
|
||||
else
|
||||
setSpecialistLimitSize(thoseWhatIknowAndFamiliarAndSpecialistAt.length)
|
||||
}
|
||||
|
||||
const thoseWhatIknowAndFamiliarAndSpecialistAt = [
|
||||
{
|
||||
title: "HTML",
|
||||
percent: 100,
|
||||
},
|
||||
{
|
||||
title: "CSS",
|
||||
percent: 60,
|
||||
},
|
||||
{
|
||||
title: "Web3",
|
||||
percent: 60,
|
||||
},
|
||||
{
|
||||
title: "Javascript",
|
||||
percent: 100,
|
||||
},
|
||||
{
|
||||
title: "Typescript",
|
||||
percent: 90,
|
||||
},
|
||||
{
|
||||
title: "Reactjs",
|
||||
percent: 100,
|
||||
},
|
||||
{
|
||||
title: "Nextjs",
|
||||
percent: 90,
|
||||
},
|
||||
{
|
||||
title: "Vuejs",
|
||||
percent: 80,
|
||||
},
|
||||
{
|
||||
title: "Rust",
|
||||
percent: 70
|
||||
},
|
||||
{
|
||||
title: "Nuxtjs",
|
||||
percent: 80,
|
||||
},
|
||||
{
|
||||
title: "Go",
|
||||
percent: 60,
|
||||
},
|
||||
{
|
||||
title: "MongoDB",
|
||||
percent: 80,
|
||||
},
|
||||
{
|
||||
title: "Docker",
|
||||
percent: 100,
|
||||
},
|
||||
{
|
||||
title: "K8s",
|
||||
percent: 60,
|
||||
},
|
||||
{
|
||||
title: "WebRTC",
|
||||
percent: 60,
|
||||
},
|
||||
{
|
||||
title: "Kafka",
|
||||
percent: 80,
|
||||
},
|
||||
{
|
||||
title: "Elastic search",
|
||||
percent: 95,
|
||||
},
|
||||
{
|
||||
title: "Java",
|
||||
percent: 100,
|
||||
},
|
||||
{
|
||||
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: "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: "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,
|
||||
},
|
||||
].sort((a, b) => a.percent === b.percent ? a.title.localeCompare(b.title) : b.percent - a.percent)
|
||||
|
||||
const projects = [
|
||||
{
|
||||
title: "Baladam",
|
||||
tags: ["nuxtjs", "java", "springboot", "mongodb", "elastic", "redis", "rust", "rabbitmq"],
|
||||
description: "Hire the freelancers for any job, online.",
|
||||
year: 2019,
|
||||
url: "https://mucut.ir",
|
||||
isLunched: false
|
||||
},
|
||||
{
|
||||
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
|
||||
},
|
||||
{
|
||||
title: "!mixsome",
|
||||
tags: ["reactjs", "web3"],
|
||||
description: "Approval manager dashboard and revoking approvals ",
|
||||
year: 2022,
|
||||
url: "https://dapp.mixsomecash.com",
|
||||
isLunched: true
|
||||
},
|
||||
{
|
||||
title: "Yaus",
|
||||
tags: ["rust", "actix", "mongodb"],
|
||||
description: "Free URL shortener and link services",
|
||||
year: 2021,
|
||||
url: "https://yaus.ir",
|
||||
isLunched: true
|
||||
},
|
||||
{
|
||||
title: "Mafia Game",
|
||||
tags: ["nodejs", "redis", "reactjs", "sqlite"],
|
||||
description: "Mafia Game (werewolf)",
|
||||
year: 2021,
|
||||
url: "https://mafia.game.igarson.app",
|
||||
isLunched: true
|
||||
},
|
||||
{
|
||||
title: "iGarson",
|
||||
tags: ["springboot", "stomp", "reactjs", "nextjs", "mongodb", "pg", ".net", "pwa", "rabbitmq", "docker swarm", "elastic", "redis"],
|
||||
description: "iGarson is a first smart resturant assistance infestracture",
|
||||
year: 2022,
|
||||
url: "https://igarson.app",
|
||||
isLunched: true
|
||||
}
|
||||
|
||||
].sort((a, b) => b.year - a.year)
|
||||
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
<title>
|
||||
رزومه امیرحسین مقیسه
|
||||
</title>
|
||||
</Head>
|
||||
<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" height={"85px"} width={"85px"} />
|
||||
</div>
|
||||
<h1 className="text-2xl text-white text-center mt-3">Amirmoghi3</h1>
|
||||
<h2 className="text-xl text-white text-center mt-3">Amir Hossein Moghiseh</h2>
|
||||
<h3 className="text-xs text-secondary text-center opacity-60">PM4D | Web3 Developer | Devops Specialist | Web Engineer</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>
|
||||
<div className="flex flex-col p-3">
|
||||
{
|
||||
thoseWhatIknowAndFamiliarAndSpecialistAt.slice(1, specialistLimitSize).map(occupation => (
|
||||
<LinearSpeacialistBar 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 px-5 text-center w-full bg-light-primary">
|
||||
{/* <div className="bg-secondary flex flex-row p-5 h-72 text-dark-primary rounded-xl ">
|
||||
<div>
|
||||
<p className="text-xl">
|
||||
Discover My Amazing Journay!
|
||||
</p>
|
||||
<p>
|
||||
{"<code>"} Look At My Amazing Journay . {"</code>"}
|
||||
</p>
|
||||
</div>
|
||||
</div> */}
|
||||
|
||||
<div className="flex flex-row flex-wrap ">
|
||||
{projects.map(project => (
|
||||
<Journey key={project.title} title={project.title} tags={project.tags} description={project.description} year={project.year} url={project.url} isLunched={project.isLunched} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
export default Resume;
|
|
@ -0,0 +1,5 @@
|
|||
module.exports = {
|
||||
plugins: [
|
||||
'tailwindcss',
|
||||
],
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
<svg width="283" height="64" viewBox="0 0 283 64" fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z" fill="#000"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
|
@ -1,116 +0,0 @@
|
|||
.container {
|
||||
padding: 0 2rem;
|
||||
}
|
||||
|
||||
.main {
|
||||
min-height: 100vh;
|
||||
padding: 4rem 0;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.footer {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
padding: 2rem 0;
|
||||
border-top: 1px solid #eaeaea;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.footer a {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.title a {
|
||||
color: #0070f3;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.title a:hover,
|
||||
.title a:focus,
|
||||
.title a:active {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.title {
|
||||
margin: 0;
|
||||
line-height: 1.15;
|
||||
font-size: 4rem;
|
||||
}
|
||||
|
||||
.title,
|
||||
.description {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.description {
|
||||
margin: 4rem 0;
|
||||
line-height: 1.5;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.code {
|
||||
background: #fafafa;
|
||||
border-radius: 5px;
|
||||
padding: 0.75rem;
|
||||
font-size: 1.1rem;
|
||||
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
|
||||
Bitstream Vera Sans Mono, Courier New, monospace;
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
max-width: 800px;
|
||||
}
|
||||
|
||||
.card {
|
||||
margin: 1rem;
|
||||
padding: 1.5rem;
|
||||
text-align: left;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
border: 1px solid #eaeaea;
|
||||
border-radius: 10px;
|
||||
transition: color 0.15s ease, border-color 0.15s ease;
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
.card:hover,
|
||||
.card:focus,
|
||||
.card:active {
|
||||
color: #0070f3;
|
||||
border-color: #0070f3;
|
||||
}
|
||||
|
||||
.card h2 {
|
||||
margin: 0 0 1rem 0;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.card p {
|
||||
margin: 0;
|
||||
font-size: 1.25rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.logo {
|
||||
height: 1em;
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.grid {
|
||||
width: 100%;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
|
@ -1,16 +1,3 @@
|
|||
html,
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
|
||||
Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
module.exports = {
|
||||
content: [
|
||||
"./pages/**/*.{js,ts,jsx,tsx}",
|
||||
"./components/**/*.{js,ts,jsx,tsx}",
|
||||
"./layouts/**/*.{js,ts,jsx,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: [],
|
||||
}
|
|
@ -1,7 +1,11 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"target": "ES2020",
|
||||
"lib": [
|
||||
"dom",
|
||||
"dom.iterable",
|
||||
"esnext"
|
||||
],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
|
@ -13,8 +17,23 @@
|
|||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"incremental": true
|
||||
"incremental": true,
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@/*": [
|
||||
"components/*"
|
||||
],
|
||||
"CTX/*": [
|
||||
"contexts/*"
|
||||
],
|
||||
}
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
"include": [
|
||||
"next-env.d.ts",
|
||||
"**/*.ts",
|
||||
"**/*.tsx"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue