├── .gitignore ├── .github └── FUNDING.yml ├── backend_sanity_portfolio ├── plugins │ └── .gitkeep ├── config │ ├── @sanity │ │ ├── data-aspects.json │ │ ├── form-builder.json │ │ ├── default-layout.json │ │ └── default-login.json │ └── .checksums ├── .eslintrc ├── static │ ├── .gitkeep │ └── favicon.ico ├── .npmignore ├── tsconfig.json ├── schemas │ ├── experiences.js │ ├── brands.js │ ├── contact.js │ ├── workExperience.js │ ├── skills.js │ ├── abouts.js │ ├── testimonials.js │ ├── schema.js │ └── works.js ├── README.md ├── sanity.json └── package.json ├── src ├── constants │ ├── index.js │ └── images.js ├── assets │ ├── nb.png │ ├── api.png │ ├── asus.png │ ├── bolt.png │ ├── cpp.png │ ├── css.png │ ├── git.png │ ├── html.png │ ├── logo.png │ ├── mu5.png │ ├── node.png │ ├── sass.png │ ├── vue.png │ ├── about01.png │ ├── about02.png │ ├── about03.png │ ├── about04.png │ ├── adidas.png │ ├── amazon.png │ ├── bgIMG.png │ ├── bgWhite.png │ ├── email.png │ ├── figma.png │ ├── flutter.png │ ├── graphql.png │ ├── mobile.png │ ├── profile.png │ ├── python.png │ ├── react.png │ ├── redux.png │ ├── skype.png │ ├── spotify.png │ ├── javascript.png │ ├── typescript.png │ ├── circle.svg │ └── logo.svg ├── wrapper │ ├── index.js │ ├── MotionWrap.js │ └── AppWrap.js ├── components │ ├── index.js │ ├── SocialMedia.jsx │ ├── NavigationDots.jsx │ └── Navbar │ │ ├── Navbar.jsx │ │ └── Navbar.scss ├── index.js ├── container │ ├── index.js │ ├── About │ │ ├── About.scss │ │ └── About.jsx │ ├── Header │ │ ├── Header.jsx │ │ └── Header.scss │ ├── Testimonial │ │ ├── Testimonial.jsx │ │ └── Testimonial.scss │ ├── Footer │ │ ├── Footer.jsx │ │ └── Footer.scss │ ├── Skills │ │ ├── Skills.jsx │ │ └── Skills.scss │ └── Work │ │ ├── Work.scss │ │ └── Work.jsx ├── App.js ├── client.js ├── index.css └── App.scss ├── public ├── robots.txt ├── favicon.ico ├── logo192.png ├── logo512.png ├── manifest.json └── index.html ├── README.md ├── package.json └── .eslintrc.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: adrianhajdin 2 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/plugins/.gitkeep: -------------------------------------------------------------------------------- 1 | User-specific packages can be placed here 2 | -------------------------------------------------------------------------------- /src/constants/index.js: -------------------------------------------------------------------------------- 1 | import images from './images'; 2 | 3 | export { images }; 4 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/config/@sanity/data-aspects.json: -------------------------------------------------------------------------------- 1 | { 2 | "listOptions": {} 3 | } 4 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@sanity/eslint-config-studio" 3 | } 4 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /src/assets/nb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/nb.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/public/logo512.png -------------------------------------------------------------------------------- /src/assets/api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/api.png -------------------------------------------------------------------------------- /src/assets/asus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/asus.png -------------------------------------------------------------------------------- /src/assets/bolt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/bolt.png -------------------------------------------------------------------------------- /src/assets/cpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/cpp.png -------------------------------------------------------------------------------- /src/assets/css.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/css.png -------------------------------------------------------------------------------- /src/assets/git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/git.png -------------------------------------------------------------------------------- /src/assets/html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/html.png -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/mu5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/mu5.png -------------------------------------------------------------------------------- /src/assets/node.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/node.png -------------------------------------------------------------------------------- /src/assets/sass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/sass.png -------------------------------------------------------------------------------- /src/assets/vue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/vue.png -------------------------------------------------------------------------------- /src/assets/about01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/about01.png -------------------------------------------------------------------------------- /src/assets/about02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/about02.png -------------------------------------------------------------------------------- /src/assets/about03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/about03.png -------------------------------------------------------------------------------- /src/assets/about04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/about04.png -------------------------------------------------------------------------------- /src/assets/adidas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/adidas.png -------------------------------------------------------------------------------- /src/assets/amazon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/amazon.png -------------------------------------------------------------------------------- /src/assets/bgIMG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/bgIMG.png -------------------------------------------------------------------------------- /src/assets/bgWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/bgWhite.png -------------------------------------------------------------------------------- /src/assets/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/email.png -------------------------------------------------------------------------------- /src/assets/figma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/figma.png -------------------------------------------------------------------------------- /src/assets/flutter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/flutter.png -------------------------------------------------------------------------------- /src/assets/graphql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/graphql.png -------------------------------------------------------------------------------- /src/assets/mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/mobile.png -------------------------------------------------------------------------------- /src/assets/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/profile.png -------------------------------------------------------------------------------- /src/assets/python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/python.png -------------------------------------------------------------------------------- /src/assets/react.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/react.png -------------------------------------------------------------------------------- /src/assets/redux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/redux.png -------------------------------------------------------------------------------- /src/assets/skype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/skype.png -------------------------------------------------------------------------------- /src/assets/spotify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/spotify.png -------------------------------------------------------------------------------- /backend_sanity_portfolio/config/@sanity/form-builder.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": { 3 | "directUploads": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/static/.gitkeep: -------------------------------------------------------------------------------- 1 | Files placed here will be served by the Sanity server under the `/static`-prefix 2 | -------------------------------------------------------------------------------- /src/assets/javascript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/javascript.png -------------------------------------------------------------------------------- /src/assets/typescript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/src/assets/typescript.png -------------------------------------------------------------------------------- /backend_sanity_portfolio/config/@sanity/default-layout.json: -------------------------------------------------------------------------------- 1 | { 2 | "toolSwitcher": { 3 | "order": [], 4 | "hidden": [] 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/wrapper/index.js: -------------------------------------------------------------------------------- 1 | import AppWrap from './AppWrap'; 2 | import MotionWrap from './MotionWrap'; 3 | 4 | export { 5 | AppWrap, 6 | MotionWrap, 7 | }; 8 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adrianhajdin/project_professional_portfolio/HEAD/backend_sanity_portfolio/static/favicon.ico -------------------------------------------------------------------------------- /backend_sanity_portfolio/config/@sanity/default-login.json: -------------------------------------------------------------------------------- 1 | { 2 | "providers": { 3 | "mode": "append", 4 | "redirectOnSingle": false, 5 | "entries": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | /logs 3 | *.log 4 | 5 | # Coverage directory used by tools like istanbul 6 | /coverage 7 | 8 | # Dependency directories 9 | node_modules 10 | 11 | # Compiled sanity studio 12 | /dist 13 | -------------------------------------------------------------------------------- /src/components/index.js: -------------------------------------------------------------------------------- 1 | import NavigationDots from './NavigationDots'; 2 | import SocialMedia from './SocialMedia'; 3 | import Navbar from './Navbar/Navbar'; 4 | 5 | export { 6 | NavigationDots, 7 | SocialMedia, 8 | Navbar, 9 | }; 10 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | 4 | import App from './App'; 5 | import './index.css'; 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById('root'), 12 | ); 13 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // Note: This config is only used to help editors like VS Code understand/resolve 3 | // parts, the actual transpilation is done by babel. Any compiler configuration in 4 | // here will be ignored. 5 | "include": ["./node_modules/@sanity/base/types/**/*.ts", "./**/*.ts", "./**/*.tsx"] 6 | } 7 | -------------------------------------------------------------------------------- /src/container/index.js: -------------------------------------------------------------------------------- 1 | import About from './About/About'; 2 | import Footer from './Footer/Footer'; 3 | import Header from './Header/Header'; 4 | import Skills from './Skills/Skills'; 5 | import Testimonial from './Testimonial/Testimonial'; 6 | import Work from './Work/Work'; 7 | 8 | export { 9 | About, 10 | Footer, 11 | Header, 12 | Skills, 13 | Testimonial, 14 | Work, 15 | }; 16 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { About, Footer, Header, Skills, Testimonial, Work } from './container'; 4 | import { Navbar } from './components'; 5 | import './App.scss'; 6 | 7 | const App = () => ( 8 |
9 | 10 |
11 | 12 | 13 | 14 | 15 |
17 | ); 18 | 19 | export default App; 20 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/schemas/experiences.js: -------------------------------------------------------------------------------- 1 | export default{ 2 | name:'experiences', 3 | title:'Experiences', 4 | type: 'document', 5 | fields:[ 6 | { 7 | name:'year', 8 | title:'Year', 9 | type:'string' 10 | }, 11 | { 12 | name:'works', 13 | title:'Works', 14 | type:'array', 15 | of:[{ type:'workExperience'}] 16 | }, 17 | ] 18 | } -------------------------------------------------------------------------------- /src/client.js: -------------------------------------------------------------------------------- 1 | import sanityClient from '@sanity/client'; 2 | import imageUrlBuilder from '@sanity/image-url'; 3 | 4 | export const client = sanityClient({ 5 | projectId: process.env.REACT_APP_SANITY_PROJECT_ID, 6 | dataset: 'production', 7 | apiVersion: '2022-02-01', 8 | useCdn: true, 9 | token: process.env.REACT_APP_SANITY_TOKEN, 10 | }); 11 | 12 | const builder = imageUrlBuilder(client); 13 | 14 | export const urlFor = (source) => builder.image(source); 15 | -------------------------------------------------------------------------------- /src/components/SocialMedia.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { BsTwitter, BsInstagram } from 'react-icons/bs'; 3 | import { FaFacebookF } from 'react-icons/fa'; 4 | 5 | const SocialMedia = () => ( 6 |
7 |
8 | 9 |
10 |
11 | 12 |
13 |
14 | 15 |
16 |
17 | ); 18 | 19 | export default SocialMedia; 20 | -------------------------------------------------------------------------------- /src/wrapper/MotionWrap.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { motion } from 'framer-motion'; 3 | 4 | const MotionWrap = (Component, classNames) => function HOC() { 5 | return ( 6 | 11 | 12 | 13 | ); 14 | }; 15 | 16 | export default MotionWrap; 17 | -------------------------------------------------------------------------------- /src/assets/circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/schemas/brands.js: -------------------------------------------------------------------------------- 1 | export default{ 2 | name:'brands', 3 | title:'Brands', 4 | type: 'document', 5 | fields:[ 6 | { 7 | name:'imgUrl', 8 | title:'ImgUrl', 9 | type: 'image', 10 | options: { 11 | hotspot: true, 12 | }, 13 | }, 14 | { 15 | name:'name', 16 | title:'Name', 17 | type:'string' 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap"); 2 | 3 | :root { 4 | --font-base: "DM Sans", sans-serif; 5 | 6 | --primary-color: #edf2f8; 7 | --secondary-color: #313bac; 8 | --black-color: #030303; 9 | --lightGray-color: #e4e4e4; 10 | --gray-color: #6b7688; 11 | --brown-color: #46364a; 12 | --white-color: #ffffff; 13 | } 14 | 15 | * { 16 | box-sizing: border-box; 17 | padding: 0; 18 | margin: 0; 19 | scroll-behavior: smooth; 20 | } 21 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/schemas/contact.js: -------------------------------------------------------------------------------- 1 | export default { 2 | name:'contact', 3 | title:'Contact', 4 | type:'document', 5 | fields:[ 6 | { 7 | name:'name', 8 | title:'Name', 9 | type:'string' 10 | }, 11 | { 12 | name:'email', 13 | title:'Email', 14 | type:'string' 15 | }, 16 | { 17 | name:'message', 18 | title:'Message', 19 | type:'text' 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /backend_sanity_portfolio/config/.checksums: -------------------------------------------------------------------------------- 1 | { 2 | "#": "Used by Sanity to keep track of configuration file checksums, do not delete or modify!", 3 | "@sanity/default-layout": "bb034f391ba508a6ca8cd971967cbedeb131c4d19b17b28a0895f32db5d568ea", 4 | "@sanity/default-login": "6fb6d3800aa71346e1b84d95bbcaa287879456f2922372bb0294e30b968cd37f", 5 | "@sanity/form-builder": "b38478227ba5e22c91981da4b53436df22e48ff25238a55a973ed620be5068aa", 6 | "@sanity/data-aspects": "d199e2c199b3e26cd28b68dc84d7fc01c9186bf5089580f2e2446994d36b3cb6" 7 | } 8 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/README.md: -------------------------------------------------------------------------------- 1 | # Sanity Clean Content Studio 2 | 3 | Congratulations, you have now installed the Sanity Content Studio, an open source real-time content editing environment connected to the Sanity backend. 4 | 5 | Now you can do the following things: 6 | 7 | - [Read “getting started” in the docs](https://www.sanity.io/docs/introduction/getting-started?utm_source=readme) 8 | - [Join the community Slack](https://slack.sanity.io/?utm_source=readme) 9 | - [Extend and build plugins](https://www.sanity.io/docs/content-studio/extending?utm_source=readme) 10 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/schemas/workExperience.js: -------------------------------------------------------------------------------- 1 | export default { 2 | name:'workExperience', 3 | title:'Work Experience', 4 | type:'document', 5 | fields:[ 6 | {name:'name', 7 | title:'name', 8 | type:'string' 9 | }, 10 | { 11 | name:'company', 12 | title:'Company', 13 | type:'string' 14 | }, 15 | { 16 | name:'desc', 17 | title:'Desc', 18 | type:'string' 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/schemas/skills.js: -------------------------------------------------------------------------------- 1 | export default{ 2 | name:'skills', 3 | title:'Skills', 4 | type: 'document', 5 | fields:[ 6 | { 7 | name:'name', 8 | title:'Name', 9 | type:'string' 10 | }, 11 | { 12 | name:'bgColor', 13 | title:'BgColor', 14 | type:'string' 15 | }, 16 | { 17 | name:'icon', 18 | title:'Icon', 19 | type: 'image', 20 | options: { 21 | hotspot: true, 22 | }, 23 | }, 24 | 25 | ] 26 | } -------------------------------------------------------------------------------- /backend_sanity_portfolio/sanity.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "project": { 4 | "name": "backend_sanity_portfolio" 5 | }, 6 | "api": { 7 | "projectId": "5aijr8b2", 8 | "dataset": "production" 9 | }, 10 | "plugins": [ 11 | "@sanity/base", 12 | "@sanity/default-layout", 13 | "@sanity/default-login", 14 | "@sanity/desk-tool" 15 | ], 16 | "env": { 17 | "development": { 18 | "plugins": [ 19 | "@sanity/vision" 20 | ] 21 | } 22 | }, 23 | "parts": [ 24 | { 25 | "name": "part:@sanity/base/schema", 26 | "path": "./schemas/schema" 27 | } 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/schemas/abouts.js: -------------------------------------------------------------------------------- 1 | export default{ 2 | name:'abouts', 3 | title:'Abouts', 4 | type: 'document', 5 | fields:[ 6 | { 7 | name:'title', 8 | title:'Title', 9 | type:'string' 10 | }, 11 | { 12 | name:'description', 13 | title:'Description', 14 | type:'string' 15 | }, 16 | { 17 | name:'imgUrl', 18 | title:'ImgUrl', 19 | type: 'image', 20 | options: { 21 | hotspot: true, 22 | }, 23 | }, 24 | 25 | ] 26 | } -------------------------------------------------------------------------------- /src/components/NavigationDots.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable jsx-a11y/control-has-associated-label */ 2 | /* eslint-disable jsx-a11y/anchor-has-content */ 3 | 4 | import React from 'react'; 5 | 6 | const NavigationDots = ({ active }) => ( 7 |
8 | {['home', 'about', 'work', 'skills', 'testimonial', 'contact'].map((item, index) => ( 9 | 15 | ))} 16 |
17 | ); 18 | 19 | export default NavigationDots; 20 | -------------------------------------------------------------------------------- /src/wrapper/AppWrap.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { NavigationDots, SocialMedia } from '../components'; 3 | 4 | const AppWrap = (Component, idName, classNames) => function HOC() { 5 | return ( 6 |
7 | 8 |
9 | 10 | 11 |
12 |

@2020 MICHAEL

13 |

All rights reserved

14 |
15 |
16 | 17 |
18 | ); 19 | }; 20 | 21 | export default AppWrap; 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Micael - The Ultimate Web Development Portfolio 2 | ![Micael](https://i.ibb.co/fHPM38q/image.png) 3 | 4 | ### [🌟 Become a top 1% Next.js 13 developer in only one course](https://jsmastery.pro/next13) 5 | ### [🚀 Land your dream programming job in 6 months](https://jsmastery.pro/masterclass) 6 | 7 | ## Introduction 8 | This is a code repository for the corresponding video tutorial. 9 | 10 | Do you know the best way to show your skills to employers or potential clients? Stand out from the crowd by presenting a well-digitalized flexible portfolio and get your dream job. 11 | 12 | ## Stay up to date with new projects 13 | New major projects coming soon, subscribe to the mailing list to stay up to date https://resource.jsmasterypro.com/newsletter 14 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/schemas/testimonials.js: -------------------------------------------------------------------------------- 1 | export default { 2 | name:'testimonials', 3 | title:'Testimonials', 4 | type: 'document', 5 | fields:[ 6 | { 7 | name:'name', 8 | title:'Name', 9 | type: 'string' 10 | }, 11 | { 12 | name:'company', 13 | title:'Company', 14 | type:'string' 15 | }, 16 | { 17 | name:'imgurl', 18 | title:'ImgUrl', 19 | type: 'image', 20 | options: { 21 | hotspot: true, 22 | }, 23 | }, 24 | { 25 | name:'feedback', 26 | title:'Feedback', 27 | type:'string' 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /src/container/About/About.scss: -------------------------------------------------------------------------------- 1 | .app__about { 2 | flex: 1; 3 | width: 100%; 4 | flex-direction: column; 5 | } 6 | 7 | .app__profiles { 8 | display: flex; 9 | justify-content: center; 10 | align-items: flex-start; 11 | flex-wrap: wrap; 12 | margin-top: 2rem; 13 | } 14 | 15 | .app__profile-item { 16 | width: 190px; 17 | display: flex; 18 | justify-content: flex-start; 19 | align-items: flex-start; 20 | flex-direction: column; 21 | margin: 2rem; 22 | 23 | img { 24 | width: 100%; 25 | height: 170px; 26 | border-radius: 15px; 27 | object-fit: cover; 28 | } 29 | 30 | @media screen and (min-width: 2000px) { 31 | width: 370px; 32 | margin: 2rem 4rem; 33 | 34 | img { 35 | height: 320px; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/schemas/schema.js: -------------------------------------------------------------------------------- 1 | // First, we must import the schema creator 2 | import createSchema from 'part:@sanity/base/schema-creator' 3 | 4 | // Then import schema types from any plugins that might expose them 5 | import schemaTypes from 'all:part:@sanity/base/schema-type' 6 | import works from './works' 7 | import testimonials from './testimonials' 8 | import brands from './brands' 9 | import abouts from './abouts' 10 | import experiences from './experiences' 11 | import skills from './skills' 12 | import workExperience from './workExperience' 13 | import contact from './contact' 14 | 15 | 16 | // Then we give our schema to the builder and provide the result to Sanity 17 | export default createSchema({ 18 | // We name our schema 19 | name: 'default', 20 | // Then proceed to concatenate our document type 21 | // to the ones provided by any plugins that are installed 22 | types: schemaTypes.concat([works, testimonials, brands, abouts, skills, workExperience, experiences, contact 23 | /* Your types here! */ 24 | ]), 25 | }) 26 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backendsanityportfolio", 3 | "private": true, 4 | "version": "1.0.0", 5 | "description": "", 6 | "main": "package.json", 7 | "author": "Mandeep Singhmar ", 8 | "license": "UNLICENSED", 9 | "scripts": { 10 | "start": "sanity start", 11 | "build": "sanity build" 12 | }, 13 | "keywords": [ 14 | "sanity" 15 | ], 16 | "dependencies": { 17 | "@sanity/base": "^2.25.4", 18 | "@sanity/core": "^2.25.0", 19 | "@sanity/default-layout": "^2.25.4", 20 | "@sanity/default-login": "^2.24.1", 21 | "@sanity/desk-tool": "^2.25.4", 22 | "@sanity/eslint-config-studio": "^2.0.0", 23 | "@sanity/vision": "^2.25.4", 24 | "eslint": "^8.6.0", 25 | "prop-types": "^15.7", 26 | "react": "^17.0", 27 | "react-dom": "^17.0", 28 | "styled-components": "^5.2.0" 29 | }, 30 | "devDependencies": {}, 31 | "repository": { 32 | "type": "git", 33 | "url": "git@github.com:adrianhajdin/project_professional_portfolio.git" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /backend_sanity_portfolio/schemas/works.js: -------------------------------------------------------------------------------- 1 | export default { 2 | name: 'works', 3 | title: 'Works', 4 | type: 'document', 5 | fields: [ 6 | { 7 | name: 'title', 8 | title: 'Title', 9 | type: 'string', 10 | }, 11 | 12 | { 13 | name: 'description', 14 | title: 'Description', 15 | type: 'string', 16 | }, 17 | { 18 | name: 'projectLink', 19 | title: 'Project Link', 20 | type: 'string', 21 | }, 22 | { 23 | name: 'codeLink', 24 | title: 'Code Link', 25 | type: 'string', 26 | }, 27 | { 28 | name: 'imgUrl', 29 | title: 'ImageUrl', 30 | type: 'image', 31 | options: { 32 | hotspot: true, 33 | }, 34 | }, 35 | 36 | { 37 | name: 'tags', 38 | title: 'Tags', 39 | type:'array', 40 | of: [ 41 | { 42 | name:'tag', 43 | title:'Tag', 44 | type:'string' 45 | } 46 | ] 47 | }, 48 | 49 | ], 50 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@sanity/client": "^2.23.2", 7 | "@sanity/image-url": "^1.0.1", 8 | "@testing-library/jest-dom": "^5.16.1", 9 | "@testing-library/react": "^12.1.2", 10 | "@testing-library/user-event": "^13.5.0", 11 | "framer-motion": "^6.2.3", 12 | "node-sass": "^7.0.1", 13 | "react": "^17.0.2", 14 | "react-dom": "^17.0.2", 15 | "react-icons": "^4.3.1", 16 | "react-scripts": "5.0.0", 17 | "react-tooltip": "^4.2.21", 18 | "web-vitals": "^2.1.4" 19 | }, 20 | "scripts": { 21 | "start": "react-scripts start", 22 | "build": "react-scripts build", 23 | "test": "react-scripts test", 24 | "eject": "react-scripts eject" 25 | }, 26 | "eslintConfig": { 27 | "extends": [ 28 | "react-app", 29 | "react-app/jest" 30 | ] 31 | }, 32 | "browserslist": { 33 | "production": [ 34 | ">0.2%", 35 | "not dead", 36 | "not op_mini all" 37 | ], 38 | "development": [ 39 | "last 1 chrome version", 40 | "last 1 firefox version", 41 | "last 1 safari version" 42 | ] 43 | }, 44 | "devDependencies": { 45 | "eslint": "^7.32.0", 46 | "eslint-config-airbnb": "^18.2.1", 47 | "eslint-plugin-import": "^2.25.2", 48 | "eslint-plugin-jsx-a11y": "^6.4.1", 49 | "eslint-plugin-react": "^7.26.1", 50 | "eslint-plugin-react-hooks": "^4.2.0" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/container/About/About.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from 'react'; 2 | import { motion } from 'framer-motion'; 3 | 4 | import { AppWrap, MotionWrap } from '../../wrapper'; 5 | import './About.scss'; 6 | import { urlFor, client } from '../../client'; 7 | 8 | const About = () => { 9 | const [abouts, setAbouts] = useState([]); 10 | 11 | useEffect(() => { 12 | const query = '*[_type == "abouts"]'; 13 | 14 | client.fetch(query).then((data) => { 15 | setAbouts(data); 16 | }); 17 | }, []); 18 | 19 | return ( 20 | <> 21 |

I Know that Good Design
means Good Business

22 | 23 |
24 | {abouts.map((about, index) => ( 25 | 32 | {about.title} 33 |

{about.title}

34 |

{about.description}

35 |
36 | ))} 37 |
38 | 39 | ); 40 | }; 41 | 42 | export default AppWrap( 43 | MotionWrap(About, 'app__about'), 44 | 'about', 45 | 'app__whitebg', 46 | ); 47 | -------------------------------------------------------------------------------- /src/components/Navbar/Navbar.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { HiMenuAlt4, HiX } from 'react-icons/hi'; 3 | import { motion } from 'framer-motion'; 4 | 5 | import { images } from '../../constants'; 6 | import './Navbar.scss'; 7 | 8 | const Navbar = () => { 9 | const [toggle, setToggle] = useState(false); 10 | 11 | return ( 12 |
47 | ); 48 | }; 49 | 50 | export default Navbar; 51 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | }, 6 | extends: [ 7 | 'plugin:react/recommended', 8 | 'airbnb', 9 | ], 10 | parserOptions: { 11 | ecmaFeatures: { 12 | jsx: true, 13 | }, 14 | ecmaVersion: 12, 15 | sourceType: 'module', 16 | }, 17 | plugins: [ 18 | 'react', 19 | ], 20 | rules: { 21 | 'react/function-component-definition': 0, 22 | 'import/extensions': 0, 23 | 'react/prop-types': 0, 24 | 'linebreak-style': 0, 25 | 'react/state-in-constructor': 0, 26 | 'import/prefer-default-export': 0, 27 | 'max-len': [ 28 | 2, 29 | 550, 30 | ], 31 | 'no-multiple-empty-lines': [ 32 | 'error', 33 | { 34 | max: 1, 35 | maxEOF: 1, 36 | }, 37 | ], 38 | 'no-underscore-dangle': [ 39 | 'error', 40 | { 41 | allow: [ 42 | '_d', 43 | '_dh', 44 | '_h', 45 | '_id', 46 | '_m', 47 | '_n', 48 | '_t', 49 | '_text', 50 | ], 51 | }, 52 | ], 53 | 'object-curly-newline': 0, 54 | 'react/jsx-filename-extension': 0, 55 | 'react/jsx-one-expression-per-line': 0, 56 | 'jsx-a11y/click-events-have-key-events': 0, 57 | 'jsx-a11y/alt-text': 0, 58 | 'jsx-a11y/no-autofocus': 0, 59 | 'jsx-a11y/no-static-element-interactions': 0, 60 | 'react/no-array-index-key': 0, 61 | 'jsx-a11y/anchor-is-valid': [ 62 | 'error', 63 | { 64 | components: [ 65 | 'Link', 66 | ], 67 | specialLink: [ 68 | 'to', 69 | 'hrefLeft', 70 | 'hrefRight', 71 | ], 72 | aspects: [ 73 | 'noHref', 74 | 'invalidHref', 75 | 'preferButton', 76 | ], 77 | }, 78 | ], 79 | }, 80 | }; 81 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | Micael 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/constants/images.js: -------------------------------------------------------------------------------- 1 | import email from '../assets/email.png'; 2 | import mobile from '../assets/mobile.png'; 3 | import api from '../assets/api.png'; 4 | import cpp from '../assets/cpp.png'; 5 | import css from '../assets/css.png'; 6 | import figma from '../assets/figma.png'; 7 | import flutter from '../assets/flutter.png'; 8 | import git from '../assets/git.png'; 9 | import graphql from '../assets/graphql.png'; 10 | import html from '../assets/html.png'; 11 | import javascript from '../assets/javascript.png'; 12 | import mu5 from '../assets/mu5.png'; 13 | import node from '../assets/node.png'; 14 | import python from '../assets/python.png'; 15 | import react from '../assets/react.png'; 16 | import redux from '../assets/redux.png'; 17 | import sass from '../assets/sass.png'; 18 | import typescript from '../assets/typescript.png'; 19 | import vue from '../assets/vue.png'; 20 | 21 | import about01 from '../assets/about01.png'; 22 | import about02 from '../assets/about02.png'; 23 | import about03 from '../assets/about03.png'; 24 | import about04 from '../assets/about04.png'; 25 | 26 | import profile from '../assets/profile.png'; 27 | import circle from '../assets/circle.svg'; 28 | import logo from '../assets/logo.png'; 29 | 30 | import adidas from '../assets/adidas.png'; 31 | import amazon from '../assets/amazon.png'; 32 | import asus from '../assets/asus.png'; 33 | import bolt from '../assets/bolt.png'; 34 | import nb from '../assets/nb.png'; 35 | import skype from '../assets/skype.png'; 36 | import spotify from '../assets/spotify.png'; 37 | 38 | export default { 39 | email, 40 | mobile, 41 | api, 42 | cpp, 43 | css, 44 | figma, 45 | flutter, 46 | git, 47 | graphql, 48 | html, 49 | javascript, 50 | mu5, 51 | node, 52 | python, 53 | react, 54 | redux, 55 | sass, 56 | typescript, 57 | vue, 58 | about01, 59 | about02, 60 | about03, 61 | about04, 62 | profile, 63 | circle, 64 | logo, 65 | adidas, 66 | amazon, 67 | asus, 68 | bolt, 69 | nb, 70 | skype, 71 | spotify, 72 | }; 73 | -------------------------------------------------------------------------------- /src/container/Header/Header.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { motion } from 'framer-motion'; 3 | 4 | import { AppWrap } from '../../wrapper'; 5 | import { images } from '../../constants'; 6 | import './Header.scss'; 7 | 8 | const scaleVariants = { 9 | whileInView: { 10 | scale: [0, 1], 11 | opacity: [0, 1], 12 | transition: { 13 | duration: 1, 14 | ease: 'easeInOut', 15 | }, 16 | }, 17 | }; 18 | 19 | const Header = () => ( 20 |
21 | 26 |
27 |
28 | 👋 29 |
30 |

Hello, I am

31 |

Micael

32 |
33 |
34 | 35 |
36 |

Web Developer

37 |

Freelancer

38 |
39 |
40 |
41 | 42 | 47 | profile_bg 48 | 55 | 56 | 57 | 62 | {[images.flutter, images.redux, images.sass].map((circle, index) => ( 63 |
64 | profile_bg 65 |
66 | ))} 67 |
68 |
69 | ); 70 | 71 | export default AppWrap(Header, 'home'); 72 | -------------------------------------------------------------------------------- /src/container/Testimonial/Testimonial.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from 'react'; 2 | import { HiChevronLeft, HiChevronRight } from 'react-icons/hi'; 3 | import { motion } from 'framer-motion'; 4 | 5 | import { AppWrap, MotionWrap } from '../../wrapper'; 6 | import { urlFor, client } from '../../client'; 7 | import './Testimonial.scss'; 8 | 9 | const Testimonial = () => { 10 | const [currentIndex, setCurrentIndex] = useState(0); 11 | const [testimonials, setTestimonials] = useState([]); 12 | const [brands, setBrands] = useState([]); 13 | 14 | const handleClick = (index) => { 15 | setCurrentIndex(index); 16 | }; 17 | 18 | useEffect(() => { 19 | const query = '*[_type == "testimonials"]'; 20 | const brandsQuery = '*[_type == "brands"]'; 21 | 22 | client.fetch(query).then((data) => { 23 | setTestimonials(data); 24 | }); 25 | 26 | client.fetch(brandsQuery).then((data) => { 27 | setBrands(data); 28 | }); 29 | }, []); 30 | 31 | return ( 32 | <> 33 | {testimonials.length && ( 34 | <> 35 |
36 | {testimonials[currentIndex].name} 37 |
38 |

{testimonials[currentIndex].feedback}

39 |
40 |

{testimonials[currentIndex].name}

41 |
{testimonials[currentIndex].company}
42 |
43 |
44 |
45 | 46 |
47 |
handleClick(currentIndex === 0 ? testimonials.length - 1 : currentIndex - 1)}> 48 | 49 |
50 | 51 |
handleClick(currentIndex === testimonials.length - 1 ? 0 : currentIndex + 1)}> 52 | 53 |
54 |
55 | 56 | )} 57 | 58 |
59 | {brands.map((brand) => ( 60 | 65 | {brand.name} 66 | 67 | ))} 68 |
69 | 70 | ); 71 | }; 72 | 73 | export default AppWrap( 74 | MotionWrap(Testimonial, 'app__testimonial'), 75 | 'testimonial', 76 | 'app__primarybg', 77 | ); 78 | -------------------------------------------------------------------------------- /src/container/Footer/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | 3 | import { images } from '../../constants'; 4 | import { AppWrap, MotionWrap } from '../../wrapper'; 5 | import { client } from '../../client'; 6 | import './Footer.scss'; 7 | 8 | const Footer = () => { 9 | const [formData, setFormData] = useState({ name: '', email: '', message: '' }); 10 | const [isFormSubmitted, setIsFormSubmitted] = useState(false); 11 | const [loading, setLoading] = useState(false); 12 | 13 | const { username, email, message } = formData; 14 | 15 | const handleChangeInput = (e) => { 16 | const { name, value } = e.target; 17 | setFormData({ ...formData, [name]: value }); 18 | }; 19 | 20 | const handleSubmit = () => { 21 | setLoading(true); 22 | 23 | const contact = { 24 | _type: 'contact', 25 | name: formData.username, 26 | email: formData.email, 27 | message: formData.message, 28 | }; 29 | 30 | client.create(contact) 31 | .then(() => { 32 | setLoading(false); 33 | setIsFormSubmitted(true); 34 | }) 35 | .catch((err) => console.log(err)); 36 | }; 37 | 38 | return ( 39 | <> 40 |

Take a coffee & chat with me

41 | 42 |
43 |
44 | email 45 | hello@micael.com 46 |
47 |
48 | phone 49 | +1 (123) 456-7890 50 |
51 |
52 | {!isFormSubmitted ? ( 53 |
54 |
55 | 56 |
57 |
58 | 59 |
60 |
61 |