├── components
├── index.js
├── sections
│ ├── landingSections
│ │ ├── About.jsx
│ │ ├── Hero.jsx
│ │ ├── Contact.jsx
│ │ ├── Services.jsx
│ │ ├── Portfolio.jsx
│ │ └── Skills.jsx
│ └── portfolioSections
│ │ └── Tabs.jsx
├── Layout.jsx
├── Footer.jsx
├── LeftCard.jsx
├── Menu.jsx
└── RightNav.jsx
├── public
├── favicon.ico
├── cv
│ └── resume.pdf
├── images
│ └── me.jpg
├── vercel.svg
├── thirteen.svg
├── next.svg
└── json
│ └── projects.js
├── jsconfig.json
├── next.config.js
├── src
├── pages
│ ├── api
│ │ └── hello.js
│ ├── _document.js
│ ├── _app.js
│ └── index.js
└── styles
│ └── globals.css
├── .gitignore
├── package.json
├── context
└── StateContext.jsx
└── README.md
/components/index.js:
--------------------------------------------------------------------------------
1 | export { default as Layout } from './Layout'
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebPerformer/next-new-portfolio/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/cv/resume.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebPerformer/next-new-portfolio/HEAD/public/cv/resume.pdf
--------------------------------------------------------------------------------
/public/images/me.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebPerformer/next-new-portfolio/HEAD/public/images/me.jpg
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": ".",
4 | "paths": {
5 | "@/*": ["./src/*"]
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | reactStrictMode: true,
4 | }
5 |
6 | module.exports = nextConfig
7 |
--------------------------------------------------------------------------------
/src/pages/api/hello.js:
--------------------------------------------------------------------------------
1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction
2 |
3 | export default function handler(req, res) {
4 | res.status(200).json({ name: 'John Doe' })
5 | }
6 |
--------------------------------------------------------------------------------
/src/pages/_document.js:
--------------------------------------------------------------------------------
1 | import { Html, Head, Main, NextScript } from 'next/document'
2 |
3 | export default function Document() {
4 | return (
5 |
6 |
8 |
9 |
10 |
11 |
12 | )
13 | }
14 |
--------------------------------------------------------------------------------
/src/pages/_app.js:
--------------------------------------------------------------------------------
1 | import { Layout } from 'components'
2 | import { StateContext } from 'context/StateContext'
3 |
4 | // Styles
5 | import '../styles/globals.css'
6 |
7 | export default function App({ Component, pageProps }) {
8 | return (
9 |
10 |
11 |
12 |
13 |
14 | )
15 | }
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 | .pnpm-debug.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "next-new-portfolio",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@next/font": "13.1.6",
13 | "gsap": "^3.11.4",
14 | "next": "13.1.6",
15 | "react": "18.2.0",
16 | "react-countup": "^6.4.1",
17 | "react-dom": "18.2.0",
18 | "react-icons": "^4.7.1",
19 | "react-scroll-trigger": "^0.6.14"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/components/sections/landingSections/About.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | // icons
4 | import { AiOutlineUser } from 'react-icons/ai'
5 |
6 | function About() {
7 | return (
8 |
9 |
10 |
11 |
My name is Gabriel Silva Araujo. I'm here to show you all of my projects and my evolution has a programmer.
12 |
Graduated in Computer Science from Universidade Paulista, with extensive experience in Front-End development, specializing in applications using Javascript and improving my knowledge in React.js and Next.js Frameworks.
13 |
14 |
15 | )
16 | }
17 |
18 | export default About
--------------------------------------------------------------------------------
/context/StateContext.jsx:
--------------------------------------------------------------------------------
1 | import React, { createContext, useContext, useRef, useState } from "react"
2 | import { data } from '../public/json/projects'
3 |
4 | const Context = createContext()
5 |
6 | export const StateContext = ({ children }) => {
7 |
8 | const menuRef = useRef(null)
9 | const navRef = useRef(null)
10 | const [menu, setMenu] = useState(false)
11 | const [allProjects, setAllProjects] = useState(false)
12 | const [totalProjects, setTotalProjects] = useState(data.projects.length)
13 |
14 | return (
15 |
27 | {children}
28 |
29 | )
30 | }
31 |
32 | export const useStateContext = () => useContext(Context)
--------------------------------------------------------------------------------
/public/thirteen.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/components/Layout.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useRef } from 'react'
2 | import Head from 'next/head'
3 |
4 | // components
5 | import LeftCard from './LeftCard'
6 | import RightNav from './RightNav'
7 | import Menu from './Menu'
8 | import Footer from './Footer'
9 |
10 | // Context
11 | import { useStateContext } from 'context/StateContext'
12 |
13 | function Layout({ children }) {
14 |
15 | const { allProjects } = useStateContext()
16 |
17 | const layoutRef = useRef(null)
18 |
19 | useEffect(() => {
20 | allProjects ? document.body.style.overflowY = "hidden" : document.body.style.overflowY = "auto"
21 | }, [allProjects])
22 |
23 | return (
24 |
25 |
26 |
Gabriel Silva Araujo
27 |
28 |
31 |
32 |
33 | {children}
34 |
35 |
36 |
39 |
40 | )
41 | }
42 |
43 | export default Layout
--------------------------------------------------------------------------------
/components/Footer.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Link from 'next/link'
3 |
4 | // Icons
5 | import { GrLinkedinOption } from 'react-icons/gr'
6 | import { FaGithub } from 'react-icons/fa'
7 | import { SiWhatsapp } from 'react-icons/si'
8 |
9 | function Footer() {
10 | return (
11 |
28 | )
29 | }
30 |
31 | export default Footer
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Meu novo portfolio 2023
2 |
3 | 
4 |
5 | ## Meu Portfolio Pessoal 2023
6 |
7 | **Este portfolio foi criado para mostrar a minha capacidade como desenvolvedor Front-End. Dentro do meu portfolio você poderá me conhecer melhor, então o que está esperando? Acesse o site no Link abaixo.**
8 |
9 | ## Features Usadas
10 | **Next.js** - **Compontents** - **Hooks** - **HTML** - **CSS** - **Javascript** - **Figma**
11 |
12 | ## Como Instalar
13 | **1.** Baixe o Visual Studio Code
14 |
15 | **2.** Baixe o Node.js
16 |
17 | **3.** Baixe os arquivos do meu Github
18 |
19 | **4.** Abre os arquivos no seu Visual Studio Code
20 |
21 | **5.** Abra o terminal apertando ***Ctrl + `***
22 |
23 | **6.** Escreva ou copie o seguinte código ***npm install***
24 |
25 | **5.** Assim que as dependencias terminarem de instalar, execute o código ***npm run dev***
26 |
27 | **Fique a vontade para fazer alterações.**
28 |
29 | ## Site Online
30 | (https://next-new-portfolio.vercel.app/)
31 |
32 | 
33 |
--------------------------------------------------------------------------------
/public/next.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/index.js:
--------------------------------------------------------------------------------
1 | import React, { useRef, useEffect } from 'react'
2 |
3 | // sections
4 | import Hero from "components/sections/landingSections/Hero"
5 | import About from "components/sections/landingSections/About"
6 | import Services from "components/sections/landingSections/Services"
7 | import Skills from "components/sections/landingSections/Skills"
8 | import Portfolio from "components/sections/landingSections/Portfolio"
9 | import Contact from "components/sections/landingSections/Contact"
10 | import Tabs from "components/sections/portfolioSections/Tabs"
11 |
12 | // Context
13 | import { useStateContext } from 'context/StateContext'
14 |
15 | // GSAP
16 | import { gsap } from 'gsap'
17 |
18 | export default function Main() {
19 |
20 | const { allProjects } = useStateContext()
21 |
22 | let tl = useRef()
23 |
24 | useEffect(() => {
25 | tl.current = gsap.timeline({ paused: true })
26 | tl.current.fromTo('.tabs-wrapper', {
27 | duration: 0,
28 | "top": "-200%"
29 | },
30 | {
31 | duration: 1,
32 | "top": "0",
33 | ease: "power4.inOut"
34 | }
35 | )
36 | }, [])
37 |
38 | useEffect(() => {
39 | allProjects ? tl.current.play() : tl.current.reverse()
40 | }, [allProjects])
41 |
42 | return (
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | )
53 | }
--------------------------------------------------------------------------------
/components/sections/landingSections/Hero.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 | import CountUp from 'react-countup'
3 | import ScrollTrigger from 'react-scroll-trigger'
4 |
5 | // icons
6 | import { AiOutlineHome } from 'react-icons/ai'
7 |
8 | // Context
9 | import { useStateContext } from 'context/StateContext'
10 |
11 | function Hero() {
12 |
13 | const [counterOn, setCounterOn] = useState(false)
14 |
15 | const { totalProjects } = useStateContext()
16 |
17 | return (
18 |
19 |
20 |
21 |
22 |
Say Hi from Gabriel , Web Developer & UI/UX Design
23 |
24 |
25 |
I'm Front-End developer and I love what I do. Take a time and explore my works . Hope you enjoy and don't forget to give a feedback on Linkedin .
26 |
27 |
setCounterOn(true)} onExit={() => setCounterOn(false)}>
28 |
29 |
30 |
{counterOn && }+
31 |
Years Of Experience
32 |
33 |
34 |
{counterOn && }+
35 |
Projects Completed
36 |
37 |
38 |
39 |
40 |
41 | )
42 | }
43 |
44 | export default Hero
45 |
--------------------------------------------------------------------------------
/components/LeftCard.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Link from 'next/link'
3 |
4 | // icons
5 | import { FaLinkedinIn, FaGithub, FaWhatsapp } from 'react-icons/fa'
6 | import { HiOutlineArrowTopRightOnSquare } from 'react-icons/hi2'
7 |
8 | function LeftCard() {
9 | return (
10 |
11 |
12 |
13 |
Gabriel Silva Araujo
14 |
Web Developer & UI/UX Design
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | webperformerz@gmail.com
34 |
35 |
36 |
Download CV
37 |
38 |
© 2023 Gabriel . All Rights Reserved.
39 |
40 |
41 | )
42 | }
43 |
44 | export default LeftCard
45 |
--------------------------------------------------------------------------------
/components/sections/landingSections/Contact.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 |
3 | // icons
4 | import { BsEnvelope } from 'react-icons/bs'
5 | import { AiOutlineCheckCircle } from 'react-icons/ai'
6 |
7 | function Contact() {
8 |
9 | const [success, setSuccess] = useState(false)
10 |
11 | const successFunc = () => {
12 | setSuccess(true)
13 |
14 | setTimeout(() => {
15 | setSuccess(false)
16 | }, 2500)
17 | }
18 |
19 | return (
20 |
60 | )
61 | }
62 |
63 | export default Contact
--------------------------------------------------------------------------------
/components/sections/landingSections/Services.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | // icons
4 | import { AiOutlineCode } from 'react-icons/ai'
5 | import { FaReact } from 'react-icons/fa'
6 | import { HiOutlineCode } from 'react-icons/hi'
7 | import { BiVector } from 'react-icons/bi'
8 |
9 | // Projects
10 | import { data } from '../../../public/json/projects.js'
11 |
12 | function Services() {
13 | return (
14 |
15 |
16 |
17 |
My Specializations
18 |
19 |
20 |
24 |
Landing pages with full responsiveness and interactions. Here you will see beautiful websites using the latest technologies of the moment.
25 |
{data.projects.filter(front => front.type === "front").length} Projects
26 |
27 |
28 |
29 |
Full Stack
30 |
31 |
32 |
Complete and functional websites that uses a full stack development, for real cases and much more.
33 |
{data.projects.filter(full => full.type === "full").length} Projects
34 |
35 |
36 |
40 |
Some of the creative resources you can interact with. Animations of all types, dimensions and colors! Don't be shy and test every corner of it.
41 |
{data.projects.filter(creative => creative.type === "creative").length} Projects
42 |
43 |
44 |
45 |
46 | )
47 | }
48 |
49 | export default Services
--------------------------------------------------------------------------------
/components/sections/landingSections/Portfolio.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Link from 'next/link'
3 |
4 | // icons
5 | import { BsGrid3X3Gap } from 'react-icons/bs'
6 | import { HiArrowTopRightOnSquare } from 'react-icons/hi2'
7 | import { FaGithub } from 'react-icons/fa'
8 |
9 | // Projects
10 | import { data } from '../../../public/json/projects.js'
11 |
12 | // Context
13 | import { useStateContext } from 'context/StateContext'
14 |
15 | function Portfolio() {
16 |
17 | const { setAllProjects, totalProjects } = useStateContext()
18 |
19 | return (
20 |
21 | Portfolio
22 |
23 |
Featured Projects
24 |
25 | {data.projects.slice(0, 6).map((project, index) => {
26 | return (
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
{project.name}
36 |
37 | {project.categories.slice(0, 3).map((categorie, index) => {
38 | return
{categorie}
39 | })}
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | )
49 | })}
50 |
51 |
52 |
setAllProjects(true)}>All Projetcs
53 |
54 | PROJECTS COMPLETED: {totalProjects}
55 |
56 |
57 |
58 |
59 | )
60 | }
61 |
62 | export default Portfolio
--------------------------------------------------------------------------------
/components/Menu.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from 'react'
2 | import Link from 'next/link'
3 |
4 | // context
5 | import { useStateContext } from 'context/StateContext'
6 |
7 | function Menu() {
8 | const { menuRef, setMenu } = useStateContext()
9 |
10 | useEffect(() => {
11 | const sections = document.querySelectorAll('section')
12 | const navLink = document.querySelectorAll('a')
13 |
14 | window.addEventListener('scroll', () => {
15 | let current = ''
16 |
17 | sections.forEach(section => {
18 | const sectionTop = section.offsetTop
19 |
20 | if(pageYOffset >= sectionTop - 40){
21 | current = section.getAttribute('id')
22 | }
23 | })
24 |
25 | navLink.forEach(list => {
26 | list.classList.remove('active')
27 | if(list.classList.contains(current)){
28 | list.classList.add('active')
29 | }
30 | })
31 | })
32 | }, [])
33 |
34 | return (
35 |
36 |
37 |
38 |
39 |
40 | setMenu(false)}>Home
41 | setMenu(false)}>About
42 | setMenu(false)}>Services
43 | setMenu(false)}>Skills
44 | setMenu(false)}>Portfolio
45 | setMenu(false)}>Contact
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
Phone
54 |
+55 11 91565-7659
55 |
56 |
57 |
Email
58 |
webperformerz@gmail.com
59 |
60 |
61 |
Address
62 |
Brazil, São Paulo - SP
63 |
64 |
65 |
Coded by Gabriel
66 |
©Copyright 2023. All rights reserved
67 |
68 |
69 |
70 |
71 | )
72 | }
73 |
74 | export default Menu
--------------------------------------------------------------------------------
/components/RightNav.jsx:
--------------------------------------------------------------------------------
1 | import React, { useRef, useEffect } from 'react'
2 | import Link from 'next/link'
3 |
4 | // context
5 | import { useStateContext } from 'context/StateContext'
6 |
7 | // icons
8 | import { FaGripLines } from 'react-icons/fa'
9 | import { AiOutlineHome, AiOutlineUser, AiOutlineCode, AiOutlineAim } from 'react-icons/ai'
10 | import { BsBriefcase, BsGrid3X3Gap, BsEnvelope } from 'react-icons/bs'
11 | import { MdOutlineClose } from 'react-icons/md'
12 |
13 | // gsap
14 | import { gsap } from 'gsap'
15 |
16 | function RightNav() {
17 |
18 | // CIRCLE MENU
19 | const circleRef = useRef(null)
20 |
21 | // GSAP MENU ANIMATION
22 | const { menuRef, navRef, menu, setMenu } = useStateContext()
23 |
24 | let tl = useRef()
25 |
26 | useEffect(() => {
27 | tl.current = gsap.timeline({ paused: true })
28 | tl.current.fromTo('.columns', {
29 | duration: 0,
30 | "clip-path": "polygon(0 0, 0 0, 0 100%, 0% 100%)"
31 | },
32 | {
33 | duration: 2,
34 | "clip-path": "polygon(0 0, 100% 0, 100% 100%, 0 100%)",
35 | ease: "power4.inOut"
36 | }
37 | )
38 | }, [])
39 |
40 | useEffect(() => {
41 | if(!menu){
42 | setTimeout(() => {
43 | menuRef.current.style.display = "none"
44 | navRef.current.style.display = "grid"
45 | }, 2000)
46 | } else {
47 | menuRef.current.style.display = "block"
48 | navRef.current.style.display = "none"
49 | }
50 | menu ? tl.current.play() : tl.current.reverse()
51 | }, [menu])
52 |
53 | const handleCircle = () => {
54 | setMenu(!menu)
55 | circleRef.current.style.pointerEvents = "none"
56 | setTimeout(() => {
57 | circleRef.current.style.pointerEvents = "all"
58 | }, 2000)
59 | }
60 |
61 | return (
62 |
63 |
64 |
handleCircle()}>
65 | {menu ? : }
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 | )
90 | }
91 |
92 | export default RightNav
--------------------------------------------------------------------------------
/components/sections/landingSections/Skills.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 | import CountUp from 'react-countup'
3 | import ScrollTrigger from 'react-scroll-trigger'
4 |
5 | // icons
6 | import { AiOutlineAim, AiFillHtml5 } from 'react-icons/ai'
7 | import { CgFigma } from 'react-icons/cg'
8 | import { DiCss3, DiJavascript1, DiReact, DiNodejsSmall } from 'react-icons/di'
9 | import { SiNextdotjs, SiExpress, SiMongodb, SiJest } from 'react-icons/si'
10 |
11 | function Skills() {
12 |
13 | const [counterOn, setCounterOn] = useState(false)
14 |
15 | return (
16 |
17 |
18 |
19 |
My Advantages
20 |
setCounterOn(true)} onExit={() => setCounterOn(false)}>
21 |
22 |
28 |
34 |
40 |
41 |
44 |
Javascript
45 |
46 |
52 |
58 |
64 |
70 |
76 |
82 |
83 |
84 |
85 |
86 | )
87 | }
88 |
89 | export default Skills
--------------------------------------------------------------------------------
/public/json/projects.js:
--------------------------------------------------------------------------------
1 | import { FaReact } from 'react-icons/fa'
2 | import { BiVector, BiCodeAlt } from 'react-icons/bi'
3 |
4 | export const data = {
5 | "projects": [
6 | {
7 | "type": "full",
8 | "icon": ,
9 | "image": "https://i.imgur.com/200gfbW.jpg",
10 | "name": "Realtime Weather",
11 | "link": "https://github.com/WebPerformer/next-weather-app",
12 | "site": "https://next-weather-app-phi.vercel.app/",
13 | "categories": ["Next.js", "OpenWeather", "Typescript"],
14 | "date": "23/04/2023",
15 | "credits": "Tutorial-Online.com"
16 | },
17 | {
18 | "type": "creative",
19 | "icon": ,
20 | "image": "https://i.imgur.com/8O3npCx.jpg",
21 | "name": "Liquid Distortion",
22 | "link": "https://github.com/WebPerformer/next-liquid-distortion",
23 | "site": "https://next-liquid-distortion.vercel.app/",
24 | "categories": ["Next.js", "Three.js", "Greensock"],
25 | "date": "17/04/2023",
26 | "credits": "Tutorial-Online.com"
27 | },
28 | {
29 | "type": "creative",
30 | "icon": ,
31 | "image": "https://i.imgur.com/pevbaYb.jpg",
32 | "name": "Flip Animation",
33 | "link": "https://github.com/WebPerformer/next-flip-animation",
34 | "site": "https://next-flip-animation.vercel.app/",
35 | "categories": ["Next.js", "Greensock", "Frip"],
36 | "date": "15/04/2023",
37 | "credits": "Tutorial-Online.com"
38 | },
39 | {
40 | "type": "creative",
41 | "icon": ,
42 | "image": "https://i.imgur.com/onaOkXo.jpg",
43 | "name": "Horizontal Parallax",
44 | "link": "https://github.com/WebPerformer/next-horizontal-parallax",
45 | "site": "https://next-horizontal-parallax.vercel.app/",
46 | "categories": ["Next.js", "Vanilla.js", "Swiper.js"],
47 | "date": "03/04/2023",
48 | "credits": "Tutorial-Online.com"
49 | },
50 | {
51 | "type": "creative",
52 | "icon": ,
53 | "image": "https://i.imgur.com/eaDbizK.jpg",
54 | "name": "Styled Checkbox",
55 | "link": "https://github.com/WebPerformer/next-checkbox-styled",
56 | "site": "https://next-checkbox-styled.vercel.app/",
57 | "categories": ["Next.js", "CSS"],
58 | "date": "30/03/2023",
59 | "credits": "Tutorial-Online.com"
60 | },
61 | {
62 | "type": "full",
63 | "icon": ,
64 | "image": "https://i.imgur.com/4oPNEG7.jpg",
65 | "name": "MERN Dashboard",
66 | "link": "https://github.com/WebPerformer/MERN-Dashboard-Client",
67 | "site": "https://mern-dashboard-client-omega.vercel.app/",
68 | "categories": ["React.js", "MongoDB", "Express"],
69 | "date": "06/03/2023",
70 | "credits": "Tutorial-Online.com"
71 | },
72 | {
73 | "type": "creative",
74 | "icon": ,
75 | "image": "https://i.imgur.com/4HSNW0t.jpg",
76 | "name": "Magnet on Mousemove",
77 | "link": "https://github.com/WebPerformer/next-magnet-div",
78 | "site": "https://next-magnet-div.vercel.app/",
79 | "categories": ["Next.js", "Vanilla.js", "CSS"],
80 | "date": "15/02/2023",
81 | "credits": "Tutorial-Online.com"
82 | },
83 | {
84 | "type": "creative",
85 | "icon": ,
86 | "image": "https://i.imgur.com/9grKBUZ.jpg",
87 | "name": "Custom Mouse Cursor",
88 | "link": "https://github.com/WebPerformer/next-custom-mouse",
89 | "site": "https://next-custom-mouse.vercel.app/",
90 | "categories": ["Next.js", "Greensock", "CSS"],
91 | "date": "14/02/2023",
92 | "credits": "Tutorial-Online.com"
93 | },
94 | {
95 | "type": "creative",
96 | "icon": ,
97 | "image": "https://i.imgur.com/ed86VAX.jpg",
98 | "name": "Tredy Scrolldown",
99 | "link": "https://github.com/WebPerformer/next-scroll-effect-circular-text",
100 | "site": "https://next-scroll-effect-circular-text.vercel.app/",
101 | "categories": ["Next.js", "Jquery", "CSS"],
102 | "date": "13/02/2023",
103 | "credits": "Tutorial-Online.com"
104 | },
105 | {
106 | "type": "creative",
107 | "icon": ,
108 | "image": "https://i.imgur.com/pKb8yxg.jpg",
109 | "name": "Mousemove Parallax",
110 | "link": "https://github.com/WebPerformer/next-mousemove-parallax",
111 | "site": "https://next-mousemove-parallax.vercel.app/",
112 | "categories": ["Next.js", "Vanilla.js", "CSS"],
113 | "date": "13/02/2023",
114 | "credits": "Tutorial-Online.com"
115 | },
116 | {
117 | "type": "front",
118 | "icon": ,
119 | "image": "https://i.imgur.com/oqaRKoq.jpg",
120 | "name": "My Personal Portfolio",
121 | "link": "https://github.com/WebPerformer/next-new-portfolio",
122 | "site": "https://next-new-portfolio.vercel.app/",
123 | "categories": ["Next.js", "Greensock", "CSS", "Javascript"],
124 | "date": "12/01/2023",
125 | "credits": "Tutorial-Online.com"
126 | },
127 | ]
128 | }
129 |
--------------------------------------------------------------------------------
/components/sections/portfolioSections/Tabs.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 | import Link from 'next/link'
3 |
4 | // Icons
5 | import { HiArrowTopRightOnSquare } from 'react-icons/hi2'
6 | import { MdOutlineClose } from 'react-icons/md'
7 | import { FaGithub } from 'react-icons/fa'
8 |
9 | // Projects
10 | import { data } from '../../../public/json/projects.js'
11 |
12 | // Context
13 | import { useStateContext } from 'context/StateContext'
14 |
15 | function Tabs() {
16 |
17 | const { setAllProjects } = useStateContext()
18 | const [tabs, setTabs] = useState(0)
19 |
20 | return (
21 |
22 |
23 |
setTabs(0)}>Front End {data.projects.filter(front => front.type === "front").length}
24 |
setTabs(1)}>Full Stack {data.projects.filter(full => full.type === "full").length}
25 |
setTabs(2)}>Creative {data.projects.filter(creative => creative.type === "creative").length}
26 |
27 | {tabs == 0 &&
28 |
29 | {data.projects.filter(front => front.type === "front").map((project, index) => {
30 | return (
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
{project.name}
40 |
41 | {project.categories.slice(0, 3).map((categorie, index) => {
42 | return
{categorie}
43 | })}
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | )
53 | })}
54 |
55 | }
56 | {tabs == 1 &&
57 |
58 | {data.projects.filter(full => full.type === "full").map((project, index) => {
59 | return (
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
{project.name}
69 |
70 | {project.categories.slice(0, 3).map((categorie, index) => {
71 | return
{categorie}
72 | })}
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | )
82 | })}
83 |
84 | }
85 | {tabs == 2 &&
86 |
87 | {data.projects.filter(creative => creative.type === "creative").map((project, index) => {
88 | return (
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
{project.name}
98 |
99 | {project.categories.slice(0, 3).map((categorie, index) => {
100 | return
{categorie}
101 | })}
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 | )
111 | })}
112 |
113 | }
114 | setAllProjects(false)}>
115 |
116 | )
117 | }
118 |
119 | export default Tabs
--------------------------------------------------------------------------------
/src/styles/globals.css:
--------------------------------------------------------------------------------
1 | /* ------------------ FONTS ------------------ */
2 | @import url('https://fonts.googleapis.com/css2?family=Rubik:wght@300;400;500;600;700;800;900&display=swap');
3 |
4 | /* ------------------ VARIABLES ------------------ */
5 | :root{
6 | --dark-color: #1F1F21;
7 | --darkest-color: #18181b;
8 | --light-color: #FFFFFF;
9 | --primary-color: #2AE98C;
10 | --gray-color: #575658;
11 | }
12 |
13 | /* ------------------ GLOBAL ------------------ */
14 | *{
15 | font-family: 'Rubik', sans-serif;
16 | box-sizing: border-box;
17 | margin: 0;
18 | padding: 0;
19 | text-decoration: none;
20 | }
21 |
22 | html{
23 | --scroll-behavior: smooth!important;
24 | scroll-behavior: smooth!important;
25 | background-color: var(--dark-color);
26 | }
27 |
28 | .layout .main-container{
29 | position: relative;
30 | display: flex;
31 | justify-content: space-between;
32 | max-width: 1600px;
33 | padding: 40px;
34 | margin: auto;
35 | }
36 |
37 | section{
38 | scroll-margin-top: 40px;
39 | }
40 |
41 | .left-card{
42 | width: 25%;
43 | }
44 |
45 | .main-content{
46 | width: 65%;
47 | padding: 0 30px;
48 | }
49 |
50 | .section-title{
51 | display: flex;
52 | align-items: center;
53 | width: fit-content;
54 | font-size: 14px;
55 | font-weight: 100;
56 | color: var(--light-color);
57 | padding: 7px 15px;
58 | border: 1px solid var(--gray-color);
59 | border-radius: 50px;
60 | }
61 |
62 | .section-title svg{
63 | margin-right: 10px;
64 | margin-bottom: 2px;
65 | }
66 |
67 | .wrapper{
68 | margin-top: 40px;
69 | margin-bottom: 200px;
70 | }
71 |
72 | h5{
73 | font-size: 45px;
74 | font-weight: 300;
75 | color: var(--light-color);
76 | margin-bottom: 40px;
77 | }
78 |
79 | h5 span{
80 | color: var(--primary-color);
81 | }
82 |
83 | .gray-text{
84 | width: 70%;
85 | font-size: 17px;
86 | color: var(--gray-color);
87 | }
88 |
89 | .gray-text span{
90 | color: var(--primary-color);
91 | opacity: .5;
92 | }
93 |
94 | ::-webkit-scrollbar{
95 | width: 10px;
96 | }
97 |
98 | ::-webkit-scrollbar-track{
99 | background-color: var(--gray-color);
100 | }
101 |
102 | ::-webkit-scrollbar-thumb{
103 | background-color: var(--primary-color);
104 | }
105 |
106 | /* LEFT CARD */
107 | .left-card{
108 | text-align: center;
109 | }
110 |
111 | .left-card .card{
112 | position: sticky;
113 | top: 120px;
114 | padding: 30px;
115 | border: 1px solid var(--gray-color);
116 | border-radius: 30px 10px 30px 10px;
117 | margin-bottom: 20px;
118 | }
119 |
120 | .left-card .card img{
121 | width: 45%;
122 | border: 2px solid var(--primary-color);
123 | border-radius: 50%;
124 | margin-bottom: 30px;
125 | }
126 |
127 | .left-card .card .my-name{
128 | font-size: 18px;
129 | font-weight: 500;
130 | color: var(--light-color);
131 | margin-bottom: 4px;
132 | }
133 |
134 | .left-card .card .my-skills{
135 | font-size: 15px;
136 | color: var(--gray-color);
137 | margin-bottom: 25px;
138 | }
139 |
140 | .left-card .card .social-icons{
141 | width: fit-content;
142 | display: grid;
143 | grid-template-columns: repeat(3, 1fr);
144 | grid-gap: 15px;
145 | margin: auto;
146 | }
147 |
148 | .left-card .card .social-icons .social-circle{
149 | font-size: 16px;
150 | line-height: 0;
151 | padding: 10px;
152 | border: 1px solid var(--gray-color);
153 | border-radius: 50%;
154 | transition: all .5s ease;
155 | }
156 |
157 | .left-card .card .social-icons .social-circle:hover{
158 | transform: scale(1.1);
159 | border: 1px solid var(--primary-color);
160 | }
161 |
162 | .left-card .card .social-icons .social-circle svg{
163 | color: var(--gray-color);
164 | transition: all .5s ease;
165 | }
166 |
167 | .left-card .card .social-icons .social-circle:hover svg{
168 | color: var(--primary-color);
169 | }
170 |
171 | .left-card .card .email-link{
172 | margin: 30px 0;
173 | }
174 |
175 | .left-card .card .email-link a{
176 | font-size: 16px;
177 | font-weight: 400;
178 | color: var(--light-color);
179 | }
180 |
181 | .left-card .card .email-link a:hover{
182 | opacity: .7;
183 | }
184 |
185 | .left-card .card .email-link a svg{
186 | color: var(--primary-color);
187 | margin-left: 0;
188 | transition: all .5s ease;
189 | }
190 |
191 | .left-card .card .email-link a:hover svg{
192 | transform: scale(1.2);
193 | margin-left: 5px;
194 | }
195 |
196 | .left-card .card .cv-download{
197 | width: 100%;
198 | padding: 15px;
199 | border: 1px solid var(--primary-color);
200 | border-radius: 50px;
201 | font-size: 16px;
202 | font-weight: 400;
203 | color: var(--light-color);
204 | background-color: var(--dark-color);
205 | cursor: pointer;
206 | opacity: .5;
207 | transition: all .5s ease;
208 | }
209 |
210 | .left-card .card .cv-download:hover{
211 | transform: translate(3px, -3px);
212 | box-shadow: -3px 3px 0 var(--primary-color);
213 | opacity: 1;
214 | }
215 |
216 | .left-card .card-copyright{
217 | width: 100%;
218 | position: absolute;
219 | left: 50%;
220 | bottom: -40px;
221 | transform: translateX(-50%);
222 | font-size: 16px;
223 | color: var(--gray-color);
224 | }
225 |
226 | .left-card .card-copyright span{
227 | color: var(--primary-color);
228 | opacity: .5;
229 | }
230 |
231 | .left-card .card-copyright span:hover{
232 | opacity: 1;
233 | }
234 |
235 | /* RIGHT NAVIGATION */
236 | .right-nav{
237 | position: relative;
238 | margin-right: 40px;
239 | z-index: 2;
240 | }
241 |
242 | .right-nav .wrapper-menu .menu-circle{
243 | position: fixed;
244 | width: fit-content;
245 | font-size: 16px;
246 | line-height: 0;
247 | padding: 10px;
248 | border: 1px solid var(--gray-color);
249 | border-radius: 50%;
250 | background-color: var(--dark-color);
251 | cursor: pointer;
252 | transition: all .3s linear;
253 | }
254 |
255 | .right-nav .wrapper-menu .menu-circle:hover{
256 | border: 1px solid var(--primary-color);
257 | }
258 |
259 | .right-nav .wrapper-menu .menu-circle svg{
260 | color: var(--light-color);
261 | transition: all .3s linear;
262 | }
263 |
264 | .right-nav .wrapper-menu .menu-circle:hover svg{
265 | color: var(--gray-color);
266 | }
267 |
268 | .right-nav .float-nav{
269 | position: fixed;
270 | top: 50%;
271 | display: grid;
272 | grid-gap: 20px;
273 | padding: 10px;
274 | font-size: 16px;
275 | line-height: 0;
276 | border: 1px solid var(--gray-color);
277 | border-radius: 50px;
278 | background-color: var(--dark-color);
279 | transform: translateY(-50%);
280 | }
281 |
282 | .right-nav .float-nav a.active{
283 | color: var(--primary-color);
284 | }
285 |
286 | .right-nav .float-nav a{
287 | color: var(--gray-color);
288 | transition: all .5s ease;
289 | }
290 |
291 | .right-nav .float-nav a:hover{
292 | color: var(--primary-color);
293 | }
294 |
295 | /* MENU */
296 | .menu{
297 | position: fixed;
298 | width: 100%;
299 | height: 100vh;
300 | display: none;
301 | z-index: 2;
302 | }
303 |
304 | .menu .columns{
305 | position: absolute;
306 | width: 25%;
307 | height: 100vh;
308 | border-left: 2px solid var(--primary-color);
309 | background-color: var(--darkest-color);
310 | }
311 |
312 | .menu .column-1{
313 | left: 0;
314 | }
315 |
316 | .menu .column-2{
317 | left: 25%;
318 | }
319 |
320 | .menu .column-3{
321 | left: 50%;
322 | }
323 |
324 | .menu .column-4{
325 | left: 75%;
326 | }
327 |
328 | .menu .column-2{
329 | display: flex;
330 | align-items: center;
331 | justify-content: center;
332 | text-align: center;
333 | }
334 |
335 | .menu .column-2 .links{
336 | display: grid;
337 | grid-gap: 20px;
338 | }
339 |
340 | .menu .column-2 .links a{
341 | font-size: 35px;
342 | font-weight: 900;
343 | color: transparent;
344 | -webkit-text-stroke-width: 1px;
345 | -webkit-text-stroke-color: var(--gray-color);
346 | }
347 |
348 | .menu .column-2 .links a.active{
349 | color: var(--primary-color);
350 | -webkit-text-stroke-width: 0;
351 | -webkit-text-stroke-color: transparent;
352 | border: none;
353 | }
354 |
355 | .menu .column-2 .links a:hover{
356 | color: var(--primary-color);
357 | -webkit-text-stroke-width: 0;
358 | -webkit-text-stroke-color: transparent;
359 | }
360 |
361 | .menu .column-3{
362 | background-repeat: no-repeat;
363 | background-position: center;
364 | background-size: cover;
365 | }
366 |
367 | .menu .column-4{
368 | display: flex;
369 | align-items: center;
370 | justify-content: center;
371 | text-align: center;
372 | }
373 |
374 | .menu .column-4 .my-infos .info-container{
375 | margin-bottom: 20px;
376 | }
377 |
378 | .menu .column-4 .my-infos h3{
379 | font-size: 15px;
380 | font-weight: 500;
381 | color: var(--primary-color);
382 | margin-bottom: 5px;
383 | }
384 |
385 | .menu .column-4 .my-infos p{
386 | font-size: 16px;
387 | font-weight: 300;
388 | color: var(--gray-color);
389 | }
390 |
391 | .menu .column-4 .my-infos .info-container:nth-last-child(1){
392 | margin-bottom: 0;
393 | }
394 |
395 | .menu .column-4 .my-infos .info-container:nth-last-child(1) h5{
396 | font-size: 13px;
397 | font-weight: 300;
398 | }
399 |
400 | .menu .column-4 .my-infos .info-container:nth-last-child(1) p{
401 | font-size: 11px;
402 | font-weight: 300;
403 | color: var(--gray-color);
404 | }
405 |
406 | /* HERO */
407 | .hero-wrapper .big-text{
408 | margin-bottom: 60px;
409 | }
410 |
411 | .hero-wrapper .big-text p{
412 | font-size: 90px;
413 | font-weight: 500;
414 | color: var(--light-color);
415 | }
416 |
417 | .hero-wrapper .big-text p span{
418 | color: var(--primary-color);
419 | }
420 |
421 | .hero-wrapper .small-text{
422 | margin-bottom: 60px;
423 | }
424 |
425 | .hero-wrapper .number-counter{
426 | display: flex;
427 | align-items: center;
428 | grid-gap: 100px;
429 | }
430 |
431 | .hero-wrapper .number-counter .number-container .num{
432 | font-size: 60px;
433 | color: var(--primary-color);
434 | }
435 |
436 | .hero-wrapper .number-counter .number-container p{
437 | font-size: 15px;
438 | text-transform: uppercase;
439 | color: var(--gray-color);
440 | }
441 |
442 | /* SERVICES */
443 | .services-wrapper .services-cards{
444 | display: grid;
445 | grid-gap: 30px;
446 | }
447 |
448 | .services-wrapper .services-cards .card{
449 | padding: 40px;
450 | border: 1px solid var(--gray-color);
451 | border-radius: 20px;
452 | cursor: default;
453 | transition: all .3s ease;
454 | }
455 |
456 | .services-wrapper .services-cards .card:hover{
457 | border: 1px solid var(--primary-color);
458 | transform: translate(3px, -3px);
459 | box-shadow: -3px 3px 0 var(--primary-color);
460 | }
461 |
462 | .services-wrapper .services-cards .card .service-header{
463 | display: flex;
464 | align-items: center;
465 | justify-content: space-between;
466 | margin-bottom: 20px;
467 | }
468 |
469 | .services-wrapper .services-cards .card .service-header .service-name{
470 | font-size: 35px;
471 | font-weight: 500;
472 | color: var(--light-color);
473 | transition: all .3s ease;
474 | }
475 |
476 | .services-wrapper .services-cards .card:hover .service-header .service-name{
477 | color: var(--primary-color);
478 | }
479 |
480 | .services-wrapper .services-cards .card .service-header .service-icon{
481 | font-size: 35px;
482 | color: var(--primary-color);
483 | }
484 |
485 | .services-wrapper .services-cards .card .service-desc{
486 | font-size: 18px;
487 | color: var(--gray-color);
488 | margin-bottom: 50px;
489 | }
490 |
491 | .services-wrapper .services-cards .card .service-qty{
492 | font-size: 16px;
493 | font-weight: 300;
494 | color: var(--light-color);
495 | }
496 |
497 | .services-wrapper .services-cards .card:hover .service-qty{
498 | text-decoration: underline;
499 | }
500 |
501 | /* SKILLS */
502 | .skills-wrapper .skills-cards{
503 | display: grid;
504 | grid-template-columns: repeat(5, 1fr);
505 | grid-gap: 40px;
506 | }
507 |
508 | .skills-wrapper .skills-cards .skills-card{
509 | text-align: center;
510 | color: var(--light-color);
511 | cursor: default;
512 | }
513 |
514 | .skills-wrapper .skills-cards .skills-card .circle{
515 | opacity: .5;
516 | border: 1px solid var(--gray-color);
517 | border-radius: 20px;
518 | margin-bottom: 15px;
519 | padding: 10px;
520 | transition: all .3s ease;
521 | }
522 |
523 | .skills-wrapper .skills-cards .skills-card:hover .circle{
524 | border: 1px solid var(--primary-color);
525 | transform: translate(3px, -3px);
526 | box-shadow: -3px 3px 0 var(--primary-color);
527 | opacity: 1;
528 | }
529 |
530 | .skills-wrapper .skills-cards .skills-card .circle .icon{
531 | font-size: 100px;
532 | line-height: 0;
533 | color: var(--gray-color);
534 | transition: all .3s ease;
535 | }
536 |
537 | .skills-wrapper .skills-cards .skills-card:hover .circle .icon{
538 | color: var(--light-color);
539 | }
540 |
541 | .skills-wrapper .skills-cards .skills-card .circle .icon svg{
542 | padding: 10px;
543 | }
544 |
545 | .skills-wrapper .skills-cards .skills-card .circle .percent{
546 | font-size: 25px;
547 | }
548 |
549 | .skills-wrapper .skills-cards .skills-card .name{
550 | font-size: 15px;
551 | font-weight: 300;
552 | }
553 |
554 | /* PORTFOLIO */
555 | .portfolio-wrapper .portfolio-grid{
556 | display: grid;
557 | grid-template-columns: repeat(2, 1fr);
558 | grid-gap: 30px;
559 | }
560 |
561 | .portfolio-wrapper .portfolio-grid .portfolio-card{
562 | position: relative;
563 | padding: 15px;
564 | border: 1px solid var(--gray-color);
565 | border-radius: 20px;
566 | }
567 |
568 | .portfolio-wrapper .portfolio-grid .portfolio-card .view-site{
569 | position: absolute;
570 | top: 30px;
571 | right: 30px;
572 | font-size: 20px;
573 | color: var(--primary-color);
574 | opacity: 0;
575 | cursor: pointer;
576 | transition: all .6s ease;
577 | }
578 |
579 | .portfolio-wrapper .portfolio-grid .portfolio-card:hover .view-site{
580 | opacity: 1;
581 | }
582 |
583 | .portfolio-wrapper .portfolio-grid .portfolio-card img{
584 | display: block;
585 | width: 100%;
586 | border-radius: 20px;
587 | }
588 |
589 | .portfolio-wrapper .portfolio-grid .portfolio-card .project-infos{
590 | position: absolute;
591 | bottom: 0;
592 | left: 0;
593 | right: 0;
594 | padding: 0 25px;
595 | opacity: 0;
596 | transition: all .3s ease;
597 | }
598 |
599 | .portfolio-wrapper .portfolio-grid .portfolio-card:hover .project-infos{
600 | padding: 25px;
601 | opacity: 1;
602 | }
603 |
604 | .portfolio-wrapper .portfolio-grid .portfolio-card .project-infos .info{
605 | width: 100%;
606 | display: flex;
607 | align-items: center;
608 | justify-content: space-between;
609 | padding: 20px;
610 | border: 1px solid var(--primary-color);
611 | border-radius: 10px;
612 | background-color: var(--dark-color);
613 | }
614 |
615 | .portfolio-wrapper .portfolio-grid .portfolio-card .project-infos .info .left{
616 | max-width: 85%;
617 | }
618 |
619 | .portfolio-wrapper .portfolio-grid .portfolio-card .project-infos .info .project-name{
620 | font-size: 17px;
621 | font-weight: 500;
622 | color: var(--light-color);
623 | white-space: nowrap;
624 | overflow: hidden;
625 | text-overflow: ellipsis;
626 | margin-bottom: 15px;
627 | }
628 |
629 | .portfolio-wrapper .portfolio-grid .portfolio-card .project-infos .info .project-categories{
630 | display: flex;
631 | align-items: center;
632 | font-size: 13px;
633 | font-weight: 500;
634 | color: var(--dark-color);
635 | }
636 |
637 | .portfolio-wrapper .portfolio-grid .portfolio-card .project-infos .info .project-categories p{
638 | padding: 2px 10px;
639 | background-color: var(--primary-color);
640 | margin-right: 10px;
641 | border-radius: 5px;
642 | }
643 |
644 | .portfolio-wrapper .portfolio-grid .portfolio-card .project-infos .info svg{
645 | font-size: 18px;
646 | color: var(--primary-color);
647 | }
648 |
649 | .portfolio-wrapper .portfolio-footer{
650 | display: flex;
651 | align-items: center;
652 | justify-content: space-between;
653 | margin-top: 30px;
654 | }
655 |
656 | .portfolio-wrapper .portfolio-footer .total{
657 | font-size: 15px;
658 | font-weight: 400;
659 | color: var(--light-color);
660 | }
661 |
662 | .portfolio-wrapper .portfolio-footer .total span{
663 | color: var(--primary-color);
664 | }
665 |
666 | .portfolio-wrapper .portfolio-footer .portfolio-button{
667 | padding: 13px 45px;
668 | border: 1px solid var(--primary-color);
669 | border-radius: 50px;
670 | font-size: 14px;
671 | font-weight: 400;
672 | color: var(--light-color);
673 | background-color: transparent;
674 | opacity: .5;
675 | cursor: pointer;
676 | transition: all .3s ease;
677 | }
678 |
679 | .portfolio-wrapper .portfolio-footer .portfolio-button:hover{
680 | transform: translate(3px, -3px);
681 | box-shadow: -3px 3px 0 var(--primary-color);
682 | opacity: 1;
683 | }
684 |
685 | /* CONTACT */
686 | .contact-wrapper .contact-email{
687 | font-size: 20px;
688 | color: var(--light-color);
689 | margin-bottom: 40px;
690 | }
691 |
692 | .contact-wrapper .success-modal{
693 | position: fixed;
694 | top: 50%;
695 | left: 50%;
696 | transform: translate(-50%, -50%);
697 | padding: 40px 60px;
698 | border: 1px solid var(--gray-color);
699 | border-radius: 30px;
700 | background-color: var(--dark-color);
701 | text-align: center;
702 | z-index: 2;
703 | }
704 |
705 | .contact-wrapper .success-modal .success-icon{
706 | font-size: 80px;
707 | color: var(--primary-color);
708 | line-height: 0;
709 | margin-bottom: 20px;
710 | }
711 |
712 | .contact-wrapper .success-modal .success-message{
713 | font-size: 20px;
714 | font-weight: 600;
715 | color: var(--light-color);
716 | margin-bottom: 40px;
717 | }
718 |
719 | .contact-wrapper .success-modal .success-btn{
720 | padding: 10px 25px;
721 | border: 1px solid var(--primary-color);
722 | border-radius: 50px;
723 | color: var(--light-color);
724 | background-color: var(--dark-color);
725 | cursor: pointer;
726 | transition: all .3s ease;
727 | }
728 |
729 | .contact-wrapper .success-modal .success-btn:hover{
730 | transform: translate(3px, -3px);
731 | box-shadow: -3px 3px 0 var(--primary-color);
732 | opacity: 1;
733 | }
734 |
735 | .contact-wrapper form .input-header{
736 | display: grid;
737 | grid-template-columns: repeat(2, 1fr);
738 | grid-gap: 40px;
739 | }
740 |
741 | .contact-wrapper form .input-box{
742 | position: relative;
743 | width: 100%;
744 | padding: 20px 0;
745 | }
746 |
747 | .contact-wrapper form .input-box input{
748 | width: 100%;
749 | padding: 10px;
750 | border: none;
751 | border-bottom: 1px solid var(--gray-color);
752 | font-size: 15px;
753 | font-weight: 400;
754 | color: var(--light-color);
755 | background-color: transparent;
756 | outline: none;
757 | }
758 |
759 | .contact-wrapper form .input-box span{
760 | position: absolute;
761 | left: 0;
762 | padding: 10px;
763 | pointer-events: none;
764 | font-size: 15px;
765 | color: var(--gray-color);
766 | transition: all .5s ease;
767 | }
768 |
769 | .contact-wrapper form .input-box input:valid ~ span,
770 | .contact-wrapper form .input-box input:focus ~ span{
771 | font-size: 13px;
772 | font-weight: 400;
773 | color: var(--light-color);
774 | transform: translate(0, -15px);
775 | padding: 0 10px;
776 | background-color: transparent;
777 | }
778 |
779 | .contact-wrapper form .input-box .message{
780 | width: 100%;
781 | height: 200px;
782 | padding: 10px;
783 | border: none;
784 | border-bottom: 1px solid var(--gray-color);
785 | font-size: 15px;
786 | font-weight: 400;
787 | color: var(--light-color);
788 | background-color: transparent;
789 | outline: none;
790 | resize: none;
791 | }
792 |
793 | .contact-wrapper form .input-box textarea:valid ~ span,
794 | .contact-wrapper form .input-box textarea:focus ~ span{
795 | font-size: 13px;
796 | font-weight: 400;
797 | color: var(--light-color);
798 | transform: translate(0, -15px);
799 | padding: 0 10px;
800 | background-color: transparent;
801 | }
802 |
803 | .contact-wrapper form .btn{
804 | padding: 13px 45px;
805 | border: 1px solid var(--primary-color);
806 | border-radius: 50px;
807 | font-size: 14px;
808 | font-weight: 400;
809 | color: var(--light-color);
810 | background-color: transparent;
811 | opacity: .5;
812 | cursor: pointer;
813 | transition: all .3s ease;
814 | }
815 |
816 | .contact-wrapper form .btn:hover{
817 | transform: translate(3px, -3px);
818 | box-shadow: -3px 3px 0 var(--primary-color);
819 | opacity: 1;
820 | }
821 |
822 | /* FOOTER */
823 | .footer{
824 | max-width: 1600px;
825 | padding: 40px;
826 | margin: auto;
827 | }
828 |
829 | .footer .footer-wrapper{
830 | display: flex;
831 | align-items: center;
832 | justify-content: space-between;
833 | }
834 |
835 | .footer .footer-wrapper .footer-icons svg{
836 | font-size: 20px;
837 | color: var(--gray-color);
838 | margin-right: 20px;
839 | transition: all .3s ease;
840 | }
841 |
842 | .footer .footer-wrapper .footer-icons svg:hover{
843 | color: var(--primary-color);
844 | }
845 |
846 | .footer .footer-wrapper .footer-copy{
847 | font-size: 15px;
848 | font-weight: 400;
849 | color: var(--light-color);
850 | }
851 |
852 | .footer .footer-wrapper .footer-copy span{
853 | color: var(--primary-color);
854 | }
855 |
856 | .footer .footer-wrapper .footer-dev{
857 | font-size: 15px;
858 | font-weight: 500;
859 | color: var(--gray-color);
860 | z-index: -1;
861 | }
862 |
863 | .footer .footer-wrapper .footer-dev span{
864 | color: var(--primary-color);
865 | opacity: .5;
866 | cursor: pointer;
867 | }
868 |
869 | .footer .footer-wrapper .footer-dev span:hover{
870 | opacity: 1;
871 | }
872 |
873 | /* PAGE PORTFOLIO */
874 | .tabs-wrapper{
875 | position: fixed;
876 | top: -200%;
877 | left: 0;
878 | width: 100%;
879 | height: 100vh;
880 | padding: 40px;
881 | background-color: var(--darkest-color);
882 | z-index: 3;
883 | overflow-y: auto;
884 | }
885 |
886 | .tabs-wrapper .tabs-menu{
887 | display: flex;
888 | justify-content: center;
889 | grid-gap: 30px;
890 | }
891 |
892 | .tabs-wrapper .tabs-menu .tab{
893 | position: relative;
894 | font-size: 16px;
895 | padding: 10px 25px;
896 | border: 1px solid var(--gray-color);
897 | border-radius: 50px;
898 | color: var(--light-color);
899 | opacity: .5;
900 | cursor: pointer;
901 | margin-bottom: 40px;
902 | }
903 |
904 | .tabs-wrapper .tabs-menu .tab.active{
905 | border: 1px solid var(--primary-color);
906 | opacity: 1;
907 | }
908 |
909 | .tabs-wrapper .tabs-menu .tab span{
910 | position: absolute;
911 | display: flex;
912 | align-items: center;
913 | justify-content: center;
914 | width: 20px;
915 | height: 20px;
916 | top: -5px;
917 | right: -5px;
918 | padding: 2px;
919 | border-radius: 50%;
920 | font-size: 12px;
921 | color: var(--dark-color);
922 | background-color: var(--primary-color);
923 | }
924 |
925 | .tabs-wrapper .tab-content{
926 | max-width: 1600px;
927 | margin: auto;
928 | display: grid;
929 | grid-template-columns: repeat(3, 1fr);
930 | grid-gap: 30px;
931 | }
932 |
933 | .tabs-wrapper .tab-content .portfolio-card{
934 | position: relative;
935 | padding: 15px;
936 | border: 1px solid var(--gray-color);
937 | border-radius: 20px;
938 | }
939 |
940 | .tabs-wrapper .tab-content .portfolio-card .view-site{
941 | position: absolute;
942 | top: 30px;
943 | right: 30px;
944 | font-size: 20px;
945 | color: var(--primary-color);
946 | opacity: 0;
947 | cursor: pointer;
948 | transition: all .6s ease;
949 | }
950 |
951 | .tabs-wrapper .tab-content .portfolio-card:hover .view-site{
952 | opacity: 1;
953 | }
954 |
955 | .tabs-wrapper .tab-content .portfolio-card img{
956 | display: block;
957 | width: 100%;
958 | border-radius: 20px;
959 | }
960 |
961 | .tabs-wrapper .tab-content .portfolio-card .project-infos{
962 | position: absolute;
963 | bottom: 0;
964 | left: 0;
965 | right: 0;
966 | padding: 0 25px;
967 | opacity: 0;
968 | transition: all .3s ease;
969 | }
970 |
971 | .tabs-wrapper .tab-content .portfolio-card:hover .project-infos{
972 | padding: 25px;
973 | opacity: 1;
974 | }
975 |
976 | .tabs-wrapper .tab-content .portfolio-card .project-infos .info{
977 | width: 100%;
978 | display: flex;
979 | align-items: center;
980 | justify-content: space-between;
981 | padding: 20px;
982 | border: 1px solid var(--primary-color);
983 | border-radius: 10px;
984 | background-color: var(--dark-color);
985 | }
986 |
987 | .tabs-wrapper .tab-content .portfolio-card .project-infos .info .left{
988 | max-width: 85%;
989 | }
990 |
991 | .tabs-wrapper .tab-content .portfolio-card .project-infos .info .project-name{
992 | font-size: 17px;
993 | font-weight: 500;
994 | color: var(--light-color);
995 | white-space: nowrap;
996 | overflow: hidden;
997 | text-overflow: ellipsis;
998 | margin-bottom: 15px;
999 | }
1000 |
1001 | .tabs-wrapper .tab-content .portfolio-card .project-infos .info .project-categories{
1002 | display: flex;
1003 | align-items: center;
1004 | font-size: 13px;
1005 | font-weight: 500;
1006 | color: var(--dark-color);
1007 | }
1008 |
1009 | .tabs-wrapper .tab-content .portfolio-card .project-infos .info .project-categories p{
1010 | padding: 2px 10px;
1011 | background-color: var(--primary-color);
1012 | margin-right: 10px;
1013 | border-radius: 5px;
1014 | }
1015 |
1016 | .tabs-wrapper .tab-content .portfolio-card .project-infos .info svg{
1017 | font-size: 18px;
1018 | color: var(--primary-color);
1019 | }
1020 |
1021 | .tabs-wrapper .tab-close{
1022 | position: absolute;
1023 | top: 40px;
1024 | right: 40px;
1025 | border: 1px solid var(--gray-color);
1026 | border-radius: 50%;
1027 | font-size: 20px;
1028 | color: var(--light-color);
1029 | padding: 10px;
1030 | line-height: 0;
1031 | opacity: .5;
1032 | cursor: pointer;
1033 | transition: all .3s ease;
1034 | }
1035 |
1036 | .tabs-wrapper .tab-close:hover{
1037 | color: var(--primary-color);
1038 | opacity: 1;
1039 | }
1040 |
1041 | /* RESPONSIVE */
1042 | @media(max-width: 1475px){
1043 | .hero-wrapper .big-text p{
1044 | font-size: 5.8vw;
1045 | }
1046 | }
1047 |
1048 | @media(max-width: 1225px){
1049 | .left-card{
1050 | display: none;
1051 | }
1052 | .left-card .card{
1053 | border: none;
1054 | padding: 0;
1055 | }
1056 | .left-card .card-copyright{
1057 | display: none;
1058 | }
1059 | .left-card .card .cv-download{
1060 | padding: 13px 45px;
1061 | color: var(--light-color);
1062 | }
1063 | .main-content{
1064 | width: 100%;
1065 | margin-top: 40px;
1066 | }
1067 | }
1068 |
1069 | @media(max-width: 1135px){
1070 | .gray-text{
1071 | width: 100%;
1072 | }
1073 | }
1074 |
1075 | @media(max-width: 1070px){
1076 | .hero-wrapper .number-counter .number-container .num{
1077 | font-size: 5.8vw;
1078 | }
1079 | }
1080 |
1081 | @media(max-width: 1025px){
1082 | .tabs-wrapper .tabs-menu{
1083 | grid-gap: 10px;
1084 | }
1085 | .tabs-wrapper .tab-content{
1086 | grid-template-columns: repeat(2, 1fr);
1087 | grid-gap: 20px;
1088 | }
1089 | }
1090 |
1091 | @media(max-width: 990px){
1092 | .menu .columns{
1093 | width: 50%;
1094 | }
1095 | .menu .column-1,
1096 | .menu .column-3{
1097 | display: none;
1098 | }
1099 | .menu .column-2{
1100 | left: 0%;
1101 | }
1102 | .menu .column-4{
1103 | left: 50%;
1104 | }
1105 | .home-container .big-text{
1106 | font-size: 80px;
1107 | }
1108 | }
1109 |
1110 | @media(max-width: 940px){
1111 | .skills-wrapper .skills-cards{
1112 | grid-template-columns: repeat(3, 1fr);
1113 | }
1114 | }
1115 |
1116 | @media(max-width: 845px){
1117 | h5{
1118 | font-size: 4vw;
1119 | }
1120 | .services-wrapper .services-cards .card .service-header .service-name,
1121 | .services-wrapper .services-cards .card .service-header .service-icon{
1122 | font-size: 3.4vw;
1123 | }
1124 | .portfolio-wrapper .portfolio-grid{
1125 | grid-template-columns: 1fr;
1126 | }
1127 | }
1128 |
1129 | @media(max-width: 680px){
1130 | .layout .main-container{
1131 | display: block;
1132 | padding: 30px;
1133 | }
1134 | .wrapper{
1135 | margin-bottom: 100px;
1136 | }
1137 | .main-content{
1138 | padding: 0;
1139 | }
1140 | h5{
1141 | font-size: 6.4vw;
1142 | margin-bottom: 30px;
1143 | }
1144 | .right-nav{
1145 | margin-right: 0;
1146 | }
1147 | .right-nav .wrapper-menu .menu-circle{
1148 | top: 25px;
1149 | right: 25px;
1150 | }
1151 | .right-nav .float-nav{
1152 | display: flex!important;
1153 | top: unset;
1154 | left: 50%;
1155 | bottom: 20px;
1156 | transform: translate(-50%, 0);
1157 | padding: 20px 25px;
1158 | grid-gap: 30px;
1159 | font-size: 20px;
1160 | }
1161 | .hero-wrapper .big-text{
1162 | margin-bottom: 30px;
1163 | }
1164 | .hero-wrapper .big-text p{
1165 | font-size: 8.8vw;
1166 | }
1167 | .hero-wrapper .number-counter .number-container .num{
1168 | font-size: 8.8vw;
1169 | }
1170 | .hero-wrapper .number-counter{
1171 | grid-gap: 50px;
1172 | }
1173 | .services-wrapper .services-cards .card .service-header .service-name,
1174 | .services-wrapper .services-cards .card .service-header .service-icon{
1175 | font-size: 25px;
1176 | }
1177 | }
1178 |
1179 | @media(max-width: 625px){
1180 | .tabs-wrapper .tabs-menu{
1181 | grid-gap: 10px;
1182 | }
1183 | .tabs-wrapper .tabs-menu .tab{
1184 | font-size: 2.5vw;
1185 | padding: 6px 20px;
1186 | }
1187 | .tabs-wrapper .tab-content{
1188 | grid-template-columns: 1fr;
1189 | }
1190 | .tabs-wrapper .tab-close{
1191 | top: 20px;
1192 | right: 20px;
1193 | font-size: 2.5vw;
1194 | padding: 5px;
1195 | }
1196 | }
1197 |
1198 | @media(max-width: 600px){
1199 | .footer .footer-wrapper{
1200 | flex-direction: column;
1201 | grid-gap: 20px;
1202 | }
1203 | }
1204 |
1205 | @media(max-width: 530px){
1206 | .menu .columns{
1207 | width: 100%;
1208 | }
1209 | .menu .column-2{
1210 | left: 0%;
1211 | border-left: none;
1212 | }
1213 | .menu .column-4{
1214 | display: none;
1215 | }
1216 | }
1217 |
1218 | @media(max-width: 450px){
1219 | .skills-wrapper .skills-cards{
1220 | grid-template-columns: repeat(2, 1fr);
1221 | }
1222 | }
1223 |
1224 | @media(max-width: 435px){
1225 | .portfolio-wrapper .portfolio-footer{
1226 | flex-direction: column-reverse;
1227 | grid-gap: 20px;
1228 | }
1229 | }
1230 |
1231 | @media(max-width: 410px){
1232 | .contact-wrapper .contact-email{
1233 | font-size: 16px;
1234 | }
1235 | }
--------------------------------------------------------------------------------