├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── index.html ├── logo192.png ├── logo512.png ├── manifest.json └── robots.txt ├── src ├── App.css ├── App.js ├── App.test.js ├── components │ ├── ContactForm.js │ ├── FeaturedProject.js │ ├── FramerMotion.js │ ├── NavBar.js │ ├── Projects.js │ ├── SocialMedia.js │ ├── TextAnimation.js │ ├── detail-project │ │ ├── DetailProject.css │ │ └── DetailProject.js │ └── featured-project │ │ ├── FeaturedProjectMedium.js │ │ └── FeaturedProjectSmall.js ├── data │ └── imgData.js ├── hooks │ └── CustomHook.js ├── img │ ├── 0001.png │ ├── 558669671596975469.gif │ ├── EF7C8E.jpg │ ├── Pokemon.jpg │ ├── avatar.gif │ ├── barSite.jpg │ ├── connectFour.jpg │ ├── disney.jpg │ ├── hotelProject.jpg │ ├── planner.jpg │ ├── random.jpg │ ├── starWar.jpg │ └── starWars.jpg ├── index.css ├── index.js ├── logo.svg ├── pages │ ├── About.js │ ├── Footer.js │ ├── Home.js │ └── Work.js ├── reportWebVitals.js ├── services │ ├── project-api.js │ └── quotes-api.js └── setupTests.js └── tailwind.config.js /.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 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # My Portfolio 2 | > This is my web portfolio to introduce my self 3 | 4 | ## About 5 | [My Porfolio](https://tmp-portfolio.onrender.com/) - This is a deployment link for my portfolio website 6 | 7 | ### Main Features 8 | - Responsive Design 9 | - Fetching Quotes API 10 | - Sticky Nav Bar 11 | - Applying Bootstrap and Tailwind library framework 12 | - Validation for contact form 13 | 14 | ### Build With 15 | - ![HTML5](https://img.shields.io/badge/html5-%23E34F26.svg?style=for-the-badge&logo=html5&logoColor=white) 16 | - ![CSS3](https://img.shields.io/badge/css3-%231572B6.svg?style=for-the-badge&logo=css3&logoColor=white) 17 | - ![JavaScript](https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge&logo=javascript&logoColor=%23F7DF1E) 18 | - ![React](https://img.shields.io/badge/react-%2320232a.svg?style=for-the-badge&logo=react&logoColor=%2361DAFB) 19 | - ![React Hook Form](https://img.shields.io/badge/React%20Hook%20Form-%23EC5990.svg?style=for-the-badge&logo=reacthookform&logoColor=white) 20 | - ![Bootstrap](https://img.shields.io/badge/bootstrap-%23563D7C.svg?style=for-the-badge&logo=bootstrap&logoColor=white) 21 | - ![TailwindCSS](https://img.shields.io/badge/tailwindcss-%2338B2AC.svg?style=for-the-badge&logo=tailwind-css&logoColor=white) 22 | 23 | ## Getting Started 24 | 25 | ### Available Scripts 26 | 27 | In the project directory, you can run: 28 | 29 | ### `npm start` 30 | 31 | Runs the app in the development mode.\ 32 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 33 | 34 | The page will reload when you make changes.\ 35 | You may also see any lint errors in the console. 36 | 37 | ### `npm test` 38 | 39 | Launches the test runner in the interactive watch mode.\ 40 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 41 | 42 | ### `npm run build` 43 | 44 | Builds the app for production to the `build` folder.\ 45 | It correctly bundles React in production mode and optimizes the build for the best performance. 46 | 47 | The build is minified and the filenames include the hashes.\ 48 | Your app is ready to be deployed! 49 | 50 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 51 | 52 | ## Roadmap 53 | 54 | [ ] Local Storage 55 | 56 | ## License 57 | Distributed under the MIT License. See `LICENSE.txt` for more information 58 | 59 | ## Contact 60 | My Phung Tieu - [LinkedIn](https://www.linkedin.com/in/my-phung-tieu-0bba22219/) - [Github](https://github.com/tmp03099):heart_eyes: 61 | 62 | 63 | Project Link - [My Portfolio](https://tmp-portfolio.onrender.com/) 64 | 65 | ## Acknowledgements 66 | - [API Qoute](https://animechan.vercel.app/) 67 | - [Tailwind](https://tailwindcss.com/docs/installation) 68 | - [React BootStrap](https://react-bootstrap.netlify.app/getting-started/introduction) 69 | - [Formik](https://formik.org/docs/tutorial) 70 | - [Netlify](https://app.netlify.com/) 71 | 72 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-portfolio", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@fortawesome/fontawesome-svg-core": "^6.4.0", 7 | "@fortawesome/free-brands-svg-icons": "^6.4.0", 8 | "@fortawesome/free-solid-svg-icons": "^6.4.0", 9 | "@fortawesome/react-fontawesome": "^0.2.0", 10 | "@testing-library/jest-dom": "^5.16.5", 11 | "@testing-library/react": "^13.4.0", 12 | "@testing-library/user-event": "^13.5.0", 13 | "axios": "^1.3.4", 14 | "bootstrap": "^5.2.3", 15 | "deepai": "^1.0.21", 16 | "formik": "^2.2.9", 17 | "framer-motion": "^10.10.0", 18 | "install": "^0.13.0", 19 | "next-gallery": "^1.2.1", 20 | "npm": "^9.6.2", 21 | "react": "^18.2.0", 22 | "react-bootstrap": "^2.7.2", 23 | "react-dom": "^18.2.0", 24 | "react-icons": "^4.8.0", 25 | "react-router-dom": "^6.9.0", 26 | "react-scripts": "5.0.1", 27 | "react-scroll": "^1.8.9", 28 | "web-vitals": "^2.1.4", 29 | "yup": "^1.0.2" 30 | }, 31 | "scripts": { 32 | "start": "react-scripts start", 33 | "build": "react-scripts build", 34 | "test": "react-scripts test", 35 | "eject": "react-scripts eject" 36 | }, 37 | "eslintConfig": { 38 | "extends": [ 39 | "react-app", 40 | "react-app/jest" 41 | ] 42 | }, 43 | "browserslist": { 44 | "production": [ 45 | ">0.2%", 46 | "not dead", 47 | "not op_mini all" 48 | ], 49 | "development": [ 50 | "last 1 chrome version", 51 | "last 1 firefox version", 52 | "last 1 safari version" 53 | ] 54 | }, 55 | "devDependencies": { 56 | "tailwindcss": "^3.3.0" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tmp03099/MyPortfolio/15d0a4f855570a7489b5dde4e7260f31d727c9e5/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | 30 | 31 | React App 32 | 33 | 34 | 35 |
36 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tmp03099/MyPortfolio/15d0a4f855570a7489b5dde4e7260f31d727c9e5/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tmp03099/MyPortfolio/15d0a4f855570a7489b5dde4e7260f31d727c9e5/public/logo512.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import "./App.css"; 2 | import NavBar from "./components/NavBar"; 3 | import Home from "./pages/Home"; 4 | import About from "./pages/About"; 5 | import Work from "./pages/Work"; 6 | import Footer from "./pages/Footer"; 7 | 8 | function App() { 9 | return ( 10 |
11 | 12 | 13 | 14 | 15 |
17 | ); 18 | } 19 | 20 | export default App; 21 | -------------------------------------------------------------------------------- /src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /src/components/ContactForm.js: -------------------------------------------------------------------------------- 1 | import { useFormik } from "formik"; 2 | import * as Yup from "yup"; 3 | 4 | function ContactForm() { 5 | const formik = useFormik({ 6 | initialValues: { 7 | fullName: "", 8 | email: "", 9 | phone: "", 10 | }, 11 | 12 | validationSchema: Yup.object({ 13 | fullName: Yup.string().min(2, "Too Short!").required("Required"), 14 | email: Yup.string().email("Invalid email").required("Required"), 15 | phone: Yup.string() 16 | .min(9, "Too Short!") 17 | .max(11, "Too Long!") 18 | .required("Required"), 19 | }), 20 | onSubmit: (values, { resetForm }) => { 21 | resetForm({ values: "" }); 22 | alert("Your successfully submit the form "); 23 | }, 24 | }); 25 | 26 | return ( 27 |
28 |
32 |
33 |
34 | 40 |
41 |
42 | 56 | {formik.touched.fullName && formik.errors.fullName ? ( 57 |
{formik.errors.fullName}
58 | ) : null} 59 |
60 |
61 |
62 |
63 | 69 |
70 |
71 | 85 | {formik.touched.email && formik.errors.email ? ( 86 |
{formik.errors.email}
87 | ) : null} 88 |
89 |
90 |
91 |
92 | 98 |
99 |
100 | 114 | {formik.touched.phone && formik.errors.phone ? ( 115 |
{formik.errors.phone}
116 | ) : null} 117 |
118 |
119 |
120 |
121 |