├── .gitignore ├── 4.0.0 ├── 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 ├── Aboutme │ ├── Aboutme.js │ └── ame.module.css ├── Home.js ├── Letsconnect.js ├── Letsconnectnew │ ├── Letsconnectnew.js │ └── lcnew.module.css ├── Navbar.js ├── Weather.js ├── Weathernew.js ├── letsconnect.html └── show-on-scroll.js ├── hashscrolling.jpg ├── headshot1.jpg ├── icons ├── cssicon.png ├── cvicon.png ├── emailicon.png ├── githubicon.png ├── html5icon.png ├── jsicon.png ├── linkedinicon.png ├── mongodb-icon.svg ├── nodejs-icon.svg ├── openicon.png ├── postgresql-icon.svg ├── reacticon.png ├── tailwindcssicon.png └── weatherapp.png ├── index.css ├── index.js ├── logo.svg ├── movieappimage.png ├── reportWebVitals.js ├── ronaldPowellCV.pdf ├── setupTests.js ├── tetrisScreenShot.png └── weather.css /.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 | -------------------------------------------------------------------------------- /4.0.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/4.0.0 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## Ron Powell's Tech Portfolio 3 | 4 | My personal portfolio website, concentrating on my Software Engineering Skills and Work 5 | 6 | API idea1: Google Translate 7 | API idea2: REST Countries 8 | API idea3: chatbot 9 | API idea4: real time weather 10 | 11 | ## Tech Stack 12 | 1. HTML 13 | 2. CSS 14 | 3. JavaScript 15 | 4. React 16 | 5. Tailwind 17 | 18 | ## Resources 19 | - Youtube 20 | - MDN 21 | - https://app.diagrams.net/ (for wire framing) 22 | - flaticon.com and vectorlogo.zone for tech stack logos 23 | - w3schools.com for css info 24 | - google for css, javasctipt, tailwind and react help searches 25 | - trello 26 | 27 | ## Future Iterations 28 | - email/message page where the user can input name, email, subject and message which will be sent to my email 29 | - navbar to stay at the top 30 | - add animations of major sections to slide into position from out of the screen when sections come into view on scroll 31 | - better projects 32 | - better all around spacing of divs/sections 33 | 34 | 35 | ## Attributions 36 | - HTML5 logo: Html5 icons created by Freepik - Flaticon 37 | 38 | - CSS logo: Css icons created by Pixel perfect - Flaticon 39 | 40 | - JS logo: Javascript icons created by Freepik - Flaticon 41 | 42 | - React logo: React icons created by Putra Arif Munazar - Flaticon 43 | 44 | - linkedin: Linkedin icons created by riajulislam - Flaticon 45 | 46 | - github: Github icons created by Pixel perfect - Flaticon 47 | 48 | - open: Export icons created by Amazona Adorada - Flaticon 49 | 50 | - cv: Recruitment icons created by Freepik - Flaticon 51 | 52 | - email: Email icons created by Freepik - Flaticon -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mod2project", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@emailjs/browser": "^3.11.0", 7 | "@testing-library/jest-dom": "^5.17.0", 8 | "@testing-library/react": "^13.4.0", 9 | "@testing-library/user-event": "^13.5.0", 10 | "axios": "^1.4.0", 11 | "react": "^18.2.0", 12 | "react-dom": "^18.2.0", 13 | "react-router": "^6.15.0", 14 | "react-router-dom": "^6.15.0", 15 | "react-scripts": "5.0.1", 16 | "react-scroll": "^1.8.9", 17 | "react-scroll-into-view": "^2.0.2", 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 | "@babel/plugin-proposal-private-property-in-object": "^7.21.11" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/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 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import Aboutme from "./components/Aboutme/Aboutme"; 2 | import "./index.css"; 3 | import headshot1 from "./headshot1.jpg"; 4 | import html from "./icons/html5icon.png"; 5 | import css from "./icons/cssicon.png"; 6 | import javasc from "./icons/jsicon.png"; 7 | import reackt from "./icons/reacticon.png"; 8 | import tailwind from "./icons/tailwindcssicon.png"; 9 | import Navbar from "./components/Navbar"; 10 | import github from "./icons/githubicon.png"; 11 | import linkedin from "./icons/linkedinicon.png"; 12 | import openicon from "./icons/openicon.png"; 13 | // import { Link } from "react-scroll"; 14 | import tetris from "./tetrisScreenShot.png"; 15 | // import Weathernew from "./components/Weathernew"; 16 | import email from "./icons/emailicon.png"; 17 | import "./components/Aboutme/ame.module.css"; 18 | import mycv from "./ronaldPowellCV.pdf"; 19 | import cvicon from "./icons/cvicon.png"; 20 | import weatherapi from './icons/weatherapp.png'; 21 | import movieimage from './movieappimage.png'; 22 | 23 | // import { Link } from 'react-router-dom'; 24 | // import Letsconnectnew from './components/Letsconnectnew/Letsconnectnew'; 25 | 26 | function App() { 27 | return ( 28 |
29 |
30 | 31 |
32 |

33 |
34 |
35 |
36 |
37 |

Junior Software Developer

38 |
39 | 44 | 45 | 46 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
58 |

59 | Hi! My Name is Ron Powell. I'm a recent graduate from 60 | PerScholas' Certificate Course for Software Development. 61 | PerScholas is fully-sponsored by Google and Comcast and prepares 62 | its student for real world development. I'm based in NYC and 63 | can't wait to work with you on your next project. 64 |

65 |
66 |

Tech Stack

67 |
68 | 69 |
70 |
71 | 72 |
73 |
74 | 75 |
76 |
77 | 78 |
79 |
80 | 86 |
87 |
88 |
89 |
90 | ... 91 |
92 |
93 |
94 |
95 |
96 |

Projects

97 |

98 | Each crafted with efficiency, style and usability in mind. 99 |

100 |
101 |
102 | {" "} 103 | {/* OUTER MOST CONTAINER */} 104 |
105 | {" "} 106 | {/* PROJECT IMAGE CONTAINER */} 107 | 113 |
114 |
115 | {" "} 116 | {/* PROJECT INFO CONTAINER */} 117 |
118 |

Tetris

119 |
120 |
121 |

122 | Have a few minutes to burn? How about you try your hand at 123 | this fully immersive rendition of the retro arcade favorite: 124 | Tetris! Go head to head against the computer in this 125 | stimulating cyberpunk landscape while listening to a great 126 | score to fit the theme. 127 |

128 |
129 |
130 |

HTML

131 |

CSS

132 |

JavaScript

133 |
134 |
135 |
136 |

Code:

137 | 142 | 143 | 144 |
145 | 146 |
147 |

Demo:

148 | 153 | 154 | 155 |
156 |
157 |
158 |
159 |
160 | {" "} 161 | {/* OUTER MOST CONTAINER */} 162 |
163 | {" "} 164 | {/* PROJECT INFO CONTAINER */} 165 |
166 |

The Weather Api

167 |
168 |
169 |

170 | It's always good to know the current weather! With this App you can type in any city you want, and around the world and get up-to-date information about that city's current weather conditions! Just dont be a smart-alec and type in... -take a breath- Taumatawhakatangihangak -take another breath- oauauotamateaturipukaka -and another- pikimaungahoronuku -almost there- pokaiwhenuakitanatahu... and expect an answer. 171 |

172 |
173 |
174 |

JavaScript

175 |

React

176 |

CSS

177 |
178 |
179 |
180 |

Code:

181 | 186 | 187 | 188 |
189 | 190 |
191 |

Demo:

192 | 197 | 198 | 199 |
200 |
201 |
202 |
203 | {" "} 204 | {/* PROJECT IMAGE CONTAINER */} 205 | 211 |
212 |
213 |
214 | {" "} 215 | {/* OUTER MOST CONTAINER */} 216 |
217 | {" "} 218 | {/* PROJECT IMAGE CONTAINER */} 219 | 225 |
226 |
227 | {" "} 228 | {/* PROJECT INFO CONTAINER */} 229 |
230 |

The Movie App

231 |
232 |
233 |

234 | Don't you just hate it when you can't remember when a movie came out? Well with this app you can type in any movie title and abracadabra, the release year will be output along with some other basic information. Happy searching! 235 |

236 |
237 |
238 |

HTML

239 |

CSS

240 |

JavaScript

241 |
242 |
243 |
244 |

Code:

245 | 250 | 251 | 252 |
253 | 254 |
255 |

Demo:

256 | 261 | 262 | 263 |
264 |
265 |
266 |
267 |
268 | 269 | {/*
270 |
271 |
272 |
273 | 274 |
275 | 276 |
277 | 278 |
279 |
280 |

Tetris

281 |

282 | Have a few minutes to burn? How about you try your hand at this 283 | fully immersive rendition of the retro arcade favorite: Tetris! 284 | Go head to head against the computer in this stimulating 285 | cyberpunk landscape while listening to a great score to fit the 286 | theme. 287 |

288 |

Code

289 | 290 |

Live Demo

291 | 292 | 293 |
294 |
295 |

Tetris

296 |

297 | Have a few minutes to burn? How about you try your hand at this 298 | fully immersive rendition of the retro arcade favorite: Tetris! 299 | Go head to head against the computer in this stimulating 300 | cyberpunk landscape while listening to a great score to fit the 301 | theme. 302 |

303 |

Code

304 | 305 |

Live Demo

306 | 307 | 308 |
309 |
*/} 310 | 311 | {/*

*/} 312 |
313 | 314 |
315 |
316 |

317 | 351 |
352 | ); 353 | } 354 | 355 | export default App; 356 | 357 | 358 | 359 | // {/* */} -------------------------------------------------------------------------------- /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/Aboutme/Aboutme.js: -------------------------------------------------------------------------------- 1 | // import cvicon from '../src/icons/cvicon.png'; 2 | // import mycv from './compon'; 3 | import './ame.module.css'; 4 | 5 | 6 | 7 | function Aboutme() { 8 | 9 | 10 | return ( 11 |
12 |

About Me

13 |
14 | 15 | Highly motivated Software Engineer with a unique background as an 16 | Industrial Engineer in the prestigious NYC Carpenter's Union with a 17 | focus in Commercial Carpentry. Demonstrated adaptability, exceptional 18 | multitasking abilities, and proven team leadership skills in managing 19 | complex workflows. Eager to leverage my diverse experience and embark on 20 | a fulfilling career as a full stack engineer, where I can independently 21 | and collaboratively cultivate my technical skills. Committed to 22 | delivering innovative solutions and contributing to the success of a 23 | leading software engineering organization. 24 |



25 | My transition into Tech... As a Carpenter in the NYC Union, I honed my 26 | skills in all aspects of carpentry. However, due to the changing climate 27 | of the Construction industry post-lockdown, I decided to explore a new 28 | industry that had captured my interest during the quarantine; 29 | day-trading. 30 |



31 | During this time, I delved into day-trading and discovered TD 32 | Ameritrade's ThinkOrSwim platform, which featured a proprietary coding 33 | language called "Thinkscript." As someone who had a natural affinity for 34 | computer science, I found myself enjoying the coding aspect of trading 35 | more than the actual trading itself. The more I learned about 36 | Thinkscript, the more I realized that I had rekindled my passion for 37 | computer science and the creativity that can be expressed through 38 | coding. 39 |



40 | After pausing my trading activities in September 2022, I enrolled in 41 | Harvard's Extension course Cs50x, which provides a comprehensive 42 | introduction to software engineering, including C, Python, Javascript, 43 | HTML, CSS, and topics such as arrays, algorithms, data structures, and 44 | memory. I couldn't get enough and proceeded my tech education completing 45 | various certificate programs in various tech related areas such as Cloud 46 | Computing at the IBM Skills Network, Intro to Agile Dev and Scrum on 47 | Coursera, Intro to DevOps also on Coursera, and even CompTia's 48 | CyberSecurity(CC) course. 49 |



50 | I'm currently enrolled in PerScholas for Software Engineering, which is 51 | sponsored by Google and Comcast. 52 | 53 |
54 | {/*

55 |

56 |

57 |

58 |

59 |

60 |

61 |

62 |

63 |

*/} 64 | 65 | {/* */} 66 | 67 |
68 | 78 | {/*

For Fun

79 |
    80 |
  • Strength Training
  • 81 |
  • Cycling
  • 82 |
  • Travelling to New Places
  • 83 |
  • Anything Batman
  • 84 |
  • Going to The Movies
  • 85 |
  • Beach Days
  • 86 |
*/} 87 |
88 |
89 | ); 90 | } 91 | 92 | export default Aboutme; 93 | -------------------------------------------------------------------------------- /src/components/Aboutme/ame.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/components/Aboutme/ame.module.css -------------------------------------------------------------------------------- /src/components/Home.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/components/Home.js -------------------------------------------------------------------------------- /src/components/Letsconnect.js: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | export default function ContactForm() { 4 | const [formData, setFormData] = useState({name: '', email: '', subject: '', message: ''}); 5 | 6 | const handleChange = (e) => { 7 | const { name, value } = e.target; 8 | setFormData((prevFormData) => ({ ...prevFormData, [name]: value})); 9 | }; 10 | 11 | const handleSubmit = (e) => { 12 | e.preventDefault(); 13 | alert(`Name: ${formData.name}, Email: ${formData.email}, Subject: ${formData.subject}, Message: ${formData.message}`); 14 | }; 15 | return ( 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
33 | ) 34 | } 35 | 36 | 37 | 38 | 39 | 40 | // import {useState} from 'react'; 41 | 42 | // export default function ContactForm() { 43 | // const [name, setName] = useState(''); 44 | 45 | // const handleChange = (e) => { 46 | // setName(e.target.value); 47 | // }; 48 | 49 | // return ( 50 | //
51 | // 58 | //

Name: { name }

59 | //
60 | // )}; 61 | 62 | 63 | 64 | // ==================================================== 65 | 66 | 67 | // import { useState, useRef, useContext } from 'react'; 68 | 69 | // // const [formData, setFormData] = useState({ 70 | 71 | // // name:'', 72 | // // email:'', 73 | // // subject:'', 74 | // // message:'' 75 | // // }) 76 | 77 | // const handleSubmit = (e) => { 78 | // e.preventDefault(); 79 | 80 | // const newMessage = {...formData, id: new Date()}; 81 | // } 82 | 83 | // function Letsconnect() { 84 | 85 | // return ( 86 | //
87 | //

Let's Connect

88 | //

Interested in connecting about a project or a job opportunity? Feel free to leave me a message and I will get back to you shortly.

89 | //
90 | //
91 | //
92 | // 93 | // 99 | //
100 | //
101 | // 102 | // 109 | //
110 | //
111 | // 112 | // 118 | //
119 | //
120 | // 121 | // 127 | //
128 | // 129 | 130 | 131 | //
132 | //
133 | // ) 134 | 135 | // } 136 | 137 | // export default Letsconnect; -------------------------------------------------------------------------------- /src/components/Letsconnectnew/Letsconnectnew.js: -------------------------------------------------------------------------------- 1 | import "./App.css"; 2 | import { useState } from "react"; 3 | import './lcnew.module.css'; 4 | 5 | function ContactForm() { 6 | const [formData, setFormData] = useState({ 7 | name: "", 8 | email: "", 9 | subject: "", 10 | message: "", 11 | }); 12 | 13 | const handleChange = (e) => { 14 | const { name, value } = e.target; 15 | setFormData((prevFormData) => ({ ...prevFormData, [name]: value })); 16 | }; 17 | 18 | const handleSubmit = (e) => { 19 | e.preventDefault(); 20 | alert( 21 | `Name: ${formData.name}, Email: ${formData.email}, Subject: ${formData.subject}, Message: ${formData.message}` 22 | ); 23 | }; 24 | return ( 25 |
26 |
27 |

28 | Thanks for taking the time to reach out. How can I help you today? 29 |

30 |
31 |
32 |
33 |
34 |
35 | 36 | 37 |
38 | 45 |
46 |
47 | 48 |
49 |
50 | 51 | 52 |
53 | 60 |
61 |
62 |
63 |
64 | 65 |
66 |
67 | 68 |
69 | 77 |
78 | 79 |
80 |
81 | 82 |
83 |
84 | 85 |
86 | 87 | 88 |
89 | 97 |
98 |
99 | 100 |
101 | 102 |
103 |
104 | 105 |
106 |
107 | ); 108 | } 109 | 110 | export default ContactForm; 111 | -------------------------------------------------------------------------------- /src/components/Letsconnectnew/lcnew.module.css: -------------------------------------------------------------------------------- 1 | .Form { 2 | text-align: center; 3 | } 4 | 5 | .contactFormContainer { 6 | display: flex; 7 | justify-content: center; 8 | flex-direction: column; 9 | background-color: grey; 10 | width: 70%; 11 | margin: 10%; 12 | } 13 | 14 | .nameEmailContainers { 15 | display: flex; 16 | justify-content: center; 17 | text-align: left; 18 | } 19 | 20 | .subjectContainer { 21 | display: flex; 22 | justify-content: center; 23 | text-align: left; 24 | } 25 | 26 | .subjectBox { 27 | width: 500px; 28 | } 29 | 30 | .messageBox { 31 | width: 500px; 32 | height: 200px; 33 | } -------------------------------------------------------------------------------- /src/components/Navbar.js: -------------------------------------------------------------------------------- 1 | // import Letsconnect from "./Letsconnect"; 2 | import { Link } from 'react-scroll'; 3 | // import { Link } from 'react-router-dom'; 4 | import Weathernew from "./Weathernew"; 5 | // import ScrollTo from 'react-scroll-into-view'; 6 | // import Letsconnect from "./components/Letsconnect"; 7 | import React from 'react'; 8 | import ReactDOM from 'react-dom'; 9 | 10 | const Navbar = () => { 11 | 12 | return ( 13 | 35 | ); 36 | }; 37 | 38 | export default Navbar; 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/components/Weather.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import axios from 'axios'; 3 | 4 | function App() { 5 | 6 | const [data, setData] = useState({}) 7 | const [location, setLocation] = useState('') 8 | 9 | const url = `https://api.openweathermap.org/data/2.5/weather?q=${location}&units=imperial&appid=fb1f49e56c08682cf0a5390a623da3e1` 10 | 11 | const searchLocation = (e) => { 12 | if (e.key === 'Enter') { 13 | axios.get(url).then((Response) => { 14 | setData(Response.data) 15 | console.log(Response.data) 16 | }) 17 | setLocation('') 18 | } 19 | } 20 | 21 | return ( 22 |
23 |
24 | setLocation(e.target.value)} 27 | onKeyPress={searchLocation} 28 | placeholder='Enter Location' 29 | /> 30 |
31 |
32 |
33 |
34 |

{data.name}

35 |
36 |
37 | {data.main ?

{data.main.temp.toFixed()}ºF

: null} 38 |
39 |
40 | {data.weather ?

{data.weather[0].main}

: null} 41 |
42 |
43 | 44 | {data.name != undefined && 45 |
46 |
47 | {data.main ?

{data.main.feels_like.toFixed()}ºF

: null} 48 |

Feels Like

49 |
50 |
51 | {data.main ?

{data.main.humidity}%

: null} 52 |

Humidity

53 |
54 |
55 | {data.wind ?

{data.wind.speed} MPH

: null} 56 |

Wind Speed

57 |
58 |
59 | } 60 | 61 | 62 | 63 |
64 |
65 | ); 66 | } 67 | 68 | export default App; 69 | -------------------------------------------------------------------------------- /src/components/Weathernew.js: -------------------------------------------------------------------------------- 1 | // import React, { useState, useEffect } from "react"; 2 | // import "./App.css"; 3 | import React, { useState } from "react"; 4 | import axios from "axios"; 5 | 6 | function Weather() { 7 | const [data, setData] = useState({}); 8 | const [location, setLocation] = useState(""); 9 | 10 | const url = `https://api.openweathermap.org/data/2.5/weather?q=${location}&units=imperial&appid=fb1f49e56c08682cf0a5390a623da3e1`; 11 | 12 | 13 | const searchLocation = (e) => { 14 | if (e.key === "Enter") { 15 | axios.get(url).then((Response) => { 16 | setData(Response.data); 17 | console.log(Response.data); 18 | }); 19 | setLocation(""); 20 | } 21 | }; 22 | 23 | return ( 24 |
25 |
26 |
27 | setLocation(e.target.value)} 30 | onKeyPress={searchLocation} 31 | placeholder="Enter Your City" 32 | /> 33 |
34 |
35 |
36 |
37 |

{data.name}

38 | {data.main ?

{data.main.temp.toFixed()}ºF

: null} 39 |
40 |
41 | {data.main ? (

Real Feel: {data.main.feels_like.toFixed()}ºF

) : null} 42 | {data.weather ? (

{data.weather[0].main}

) : null} 43 |
44 |
45 |
46 | ); 47 | } 48 | 49 | export default Weather; 50 | -------------------------------------------------------------------------------- /src/components/letsconnect.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Let's Connect 7 | 8 | 9 |
10 |
11 |

12 | Thanks for taking the time to reach out. How can I help you today? 13 |

14 |
15 |
16 |
17 |
18 |
19 | 20 | 21 |
22 | 29 |
30 |
31 | 32 |
33 |
34 | 35 | 36 |
37 | 44 |
45 |
46 |
47 |
48 | 49 |
50 |
51 | 52 |
53 | 61 |
62 | 63 |
64 |
65 | 66 |
67 |
68 | 69 |
70 | 71 | 72 |
73 | 81 |
82 |
83 | 84 |
85 | 86 |
87 |
88 | 89 |
90 |
91 | 92 | 93 | -------------------------------------------------------------------------------- /src/components/show-on-scroll.js: -------------------------------------------------------------------------------- 1 | const scroll = window.requestAnimationFrame || 2 | function(callback) { window.setTimeout(callback, 1000/60)}; 3 | 4 | const elementsToShow = document.querySelectorAll('.show-on-scroll'); 5 | 6 | function loop() { 7 | elementsToShow.forEach(function(element) { 8 | if (isElementInViewport(element)) { 9 | element.classList.add('is-visible') 10 | } else { 11 | element.classList.remove('is-visible'); 12 | } 13 | }); 14 | scroll(loop); 15 | } 16 | 17 | loop(); 18 | 19 | function isElementInViewport(el) { 20 | if (typeof jQuery === 'function' && el instanceof jQuery) { 21 | el = el[0]; 22 | } 23 | let rect = el.getBoundingClientRect(); 24 | return ( 25 | (rect.top <= 0 26 | && rect.bottom >= 0) 27 | || 28 | (rect.bottom >= (window.innerHeight || document.documentElement.clientHeight) && 29 | rect.top <= (window.innerHeight || document.documentElement.clientHeight)) 30 | || 31 | (rect.top >= 0 && 32 | rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)) 33 | ) 34 | } -------------------------------------------------------------------------------- /src/hashscrolling.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/hashscrolling.jpg -------------------------------------------------------------------------------- /src/headshot1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/headshot1.jpg -------------------------------------------------------------------------------- /src/icons/cssicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/cssicon.png -------------------------------------------------------------------------------- /src/icons/cvicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/cvicon.png -------------------------------------------------------------------------------- /src/icons/emailicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/emailicon.png -------------------------------------------------------------------------------- /src/icons/githubicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/githubicon.png -------------------------------------------------------------------------------- /src/icons/html5icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/html5icon.png -------------------------------------------------------------------------------- /src/icons/jsicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/jsicon.png -------------------------------------------------------------------------------- /src/icons/linkedinicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/linkedinicon.png -------------------------------------------------------------------------------- /src/icons/mongodb-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/nodejs-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/openicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/openicon.png -------------------------------------------------------------------------------- /src/icons/postgresql-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/reacticon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/reacticon.png -------------------------------------------------------------------------------- /src/icons/tailwindcssicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/tailwindcssicon.png -------------------------------------------------------------------------------- /src/icons/weatherapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/icons/weatherapp.png -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | /* Box Model Hack */ 2 | /* * { 3 | box-sizing: border-box; 4 | } */ 5 | 6 | /* Clear fix hack */ 7 | /* .clearfix:after { 8 | content: "."; 9 | display: block; 10 | clear: both; 11 | visibility: hidden; 12 | line-height: 0; 13 | height: 0; 14 | } 15 | 16 | .clear { 17 | clear: both; 18 | } */ 19 | 20 | /****************************************** 21 | /* BASE STYLES 22 | /****************************************** */ 23 | 24 | 25 | /* @import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap'); */ 26 | 27 | @import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300&display=swap'); 28 | 29 | 30 | * { 31 | margin: 1% 4% 2% 4%; 32 | font-family: "Outfit"; 33 | color: dimgrey; 34 | background-color: white; 35 | } 36 | /* 37 | main { 38 | 39 | } */ 40 | 41 | .navbar { 42 | width: 100%; 43 | font-size: .8rem; 44 | /* margin-left: 0px; */ 45 | text-decoration: none; 46 | height: 50px; 47 | /* text-decoration: double; */ 48 | padding: 0px; 49 | display: flex; 50 | /* justify-content: flex-end; */ 51 | /* align-items: flex-end; */ 52 | /* max-width: 95%; */ 53 | 54 | margin: 0%; 55 | /* position: absolute ; */ 56 | top: 10; 57 | border-bottom: 1px solid dimgrey; 58 | /* background-color: white; 59 | position: fixed; 60 | top: 0; */ 61 | } 62 | 63 | .headerMain { 64 | margin: 0%; 65 | padding: 0%; 66 | display: flex; 67 | justify-content: space-around; 68 | align-items: flex-end; 69 | } 70 | 71 | .headerLeft { 72 | margin: 0%; 73 | padding: 0%; 74 | width: 100%; 75 | display: flex; 76 | justify-content: flex-start; 77 | align-items: flex-end; 78 | } 79 | 80 | .headerRight { 81 | margin: 0%; 82 | padding: 0%; 83 | width: 100%; 84 | display: flex; 85 | justify-content: flex-end; 86 | /* justify-content: space-between; */ 87 | align-items: flex-end; 88 | } 89 | 90 | .weatherContainer { 91 | margin: 0 0 0 3%; 92 | padding: 0%; 93 | line-height: 50%; 94 | width: 100%; 95 | height: 40px; 96 | display: flex; 97 | justify-content: flex-start; 98 | align-items:flex-end; 99 | background-color: white; 100 | /* border-radius: 15px; */ 101 | } 102 | 103 | .weatherLeft { 104 | display: flex; 105 | justify-content: space-between; 106 | line-height: 100%; 107 | /* flex-direction: column; */ 108 | margin: 0 2% 0 0; 109 | padding: 0%; 110 | width: 200px; 111 | background-color: white; 112 | } 113 | 114 | .bold, .bold2 { 115 | padding-top: 10%; 116 | display: flex; 117 | justify-content: flex-start; 118 | align-items:flex-end; 119 | width: 150px; 120 | } 121 | 122 | .bold2 { 123 | width: 128px; 124 | border-right: 2px solid darkcyan; 125 | } 126 | 127 | .weatherContainer .description { 128 | /* position: relative; 129 | right: -90%; 130 | transform-origin: 0 0; 131 | transform: rotate(269deg); */ 132 | } 133 | 134 | .weatherRight { 135 | margin-right: 2%; 136 | width: 40%; 137 | display: flex; 138 | justify-content: flex-end; 139 | align-items: center; 140 | background-color: white; 141 | } 142 | 143 | .weather { 144 | margin: 0%; 145 | padding: 0%; 146 | } 147 | 148 | .search { 149 | border-radius: 10px; 150 | display: flex; 151 | justify-content: flex-end; 152 | align-items: flex-end; 153 | } 154 | 155 | .cityLeft { 156 | font-size: 4rem; 157 | height: 0px; 158 | margin: 0px; 159 | padding: 0px; 160 | /* padding-left: 20%; */ 161 | width: 80px; 162 | display: flex; 163 | justify-content: left; 164 | } 165 | 166 | /* .cityLeft { 167 | height: 0px; 168 | margin: 0px; 169 | padding: 0px; 170 | width: 50%; 171 | display: flex; 172 | justify-content: flex-end; 173 | } */ 174 | 175 | .actualTemp { 176 | /* display: flex; 177 | align-items: flex-end; */ 178 | padding-top: 15%; 179 | font-size: 1.5rem; 180 | color: darkcyan; 181 | } 182 | 183 | .cityRight { 184 | display: flex; 185 | justify-content: right; 186 | width: 200px; 187 | } 188 | 189 | input { 190 | padding-left: 5%; 191 | background-color: rgba(0, 139, 139, 0.3); 192 | border: 1px solid darkcyan; 193 | border-radius: 5px; 194 | width: 120px; 195 | } 196 | 197 | ::placeholder { 198 | color: rgb(0, 57, 57); 199 | } 200 | 201 | .navbar h1 { 202 | color: darkcyan; 203 | } 204 | /* .navbar .links { 205 | margin-left: auto; 206 | } */ 207 | 208 | .navbar a:hover { 209 | color: darkcyan; 210 | /* font-weight: bold; */ 211 | /* border-top: 1px solid darkcyan; 212 | border-bottom: 1px solid darkcyan; */ 213 | transform: translateY(-2px); 214 | transition-property: transform; 215 | transition-duration: 0.1s; 216 | cursor: pointer; 217 | /* border: 2px solid darkcyan; 218 | background-color: darkcyan; 219 | border-radius: 35px solid darkcyan; */ 220 | } 221 | 222 | .headerRight a { 223 | /* padding-left: 2%; */ 224 | /* margin: 0; */ 225 | /* padding: 0; */ 226 | display: flex; 227 | justify-content: space-between; 228 | } 229 | 230 | .titles { 231 | margin: 0; 232 | padding: 0; 233 | font-size: 2rem; 234 | color: darkcyan; 235 | } 236 | 237 | .projectsTitleBox h4{ 238 | padding: 2% 0 0 0; 239 | border-bottom: 2px solid darkcyan; 240 | } 241 | /* .content { 242 | max-width: 600px; 243 | margin: 40px auto; 244 | padding: 20px; 245 | } */ 246 | 247 | .mainSection { 248 | margin: 10% 0 20% 0; 249 | /* margin-bottom: 20%; */ 250 | } 251 | 252 | .projectsTitleBox, .projectsTitleBox h4 { 253 | /* display: flex; 254 | justify-content: flext-start; 255 | align-items: center; */ 256 | width: 100%; 257 | margin: 0 0 8% 0; 258 | } 259 | 260 | .projectContents { 261 | margin: 0 2% 0 2%; 262 | display: flex; 263 | justify-content: center; 264 | align-items: center; 265 | background-color: white; 266 | } 267 | 268 | .projectContents h3 { 269 | margin: 0 0 4% -10%; 270 | color: darkcyan; 271 | font-size: 1.7em; 272 | 273 | } 274 | 275 | .languages { 276 | margin: 4% 2% 0 2%; 277 | display: flex; 278 | justify-content: center; 279 | align-items: center; 280 | background-color: white; 281 | } 282 | 283 | .mainContainer { 284 | /* background-color: darkcyan; */ 285 | display: flex; 286 | align-items: center; 287 | gap: 2em; 288 | margin: 0px; 289 | padding: 0px; 290 | width: 100%; 291 | height: 100%; 292 | /* margin-top: 20%; 293 | margin-bottom: 20%; */ 294 | } 295 | 296 | .projectLinks { 297 | margin: 5% 2% 0 0; 298 | display: flex; 299 | justify-content: center; 300 | align-items: center; 301 | background-color: white; 302 | } 303 | 304 | .personalContacts { 305 | margin: 2% 0 2% 0; 306 | padding: 0%; 307 | width: 80%; 308 | display: flex; 309 | justify-content: flex-start; 310 | } 311 | 312 | .projectImageColumn { 313 | margin: 0; 314 | display: flex; 315 | width: 50%; 316 | height: 100%; 317 | background-color: white; 318 | } 319 | 320 | .projectInfoColumn { 321 | margin: 0; 322 | display: flex; 323 | flex-direction: column; 324 | justify-content: center; 325 | width: 50%; 326 | height: 100%; 327 | background-color: white; 328 | } 329 | 330 | .sourceLinks { 331 | display: flex; 332 | justify-content: flex-start; 333 | align-items: flex-start; 334 | } 335 | 336 | .sourceLinks h4 { 337 | margin-top: 10%; 338 | } 339 | 340 | .tetrisScreenShot { 341 | width: 100%; 342 | height: 100%; 343 | object-fit: fill; 344 | padding: 0; 345 | margin: 0; 346 | border-radius: 3%; 347 | } 348 | 349 | #home { 350 | margin: 0; 351 | padding: 0; 352 | } 353 | 354 | .homeContentLeft { 355 | margin: 0 0 0 0; 356 | width: 60%; 357 | height: 100%; 358 | } 359 | 360 | /* .homeContentLeft img { 361 | display: flex; 362 | justify-content: space-evenly; 363 | flex-direction: column; 364 | } */ 365 | 366 | .homeContentLeft p { 367 | margin: 2% 0 3% 0; 368 | } 369 | 370 | .homeContentRight { 371 | margin: 0 0 0 0; 372 | width: 40%; 373 | height: 100%; 374 | display: flex; 375 | justify-content: flex-end; 376 | } 377 | 378 | .techskills { 379 | margin: 0; 380 | display: flex; 381 | justify-content: flext-start; 382 | align-items: center; 383 | /* width: 400px; 384 | height: 400px; */ 385 | } 386 | 387 | .techskills h4 { 388 | margin: 0; 389 | display: flex; 390 | justify-content: flex-start; 391 | } 392 | 393 | 394 | .skillsbox { 395 | display: flex; 396 | justify-content: space-around; 397 | width: 100%; 398 | height: 30px; 399 | margin-top: 6%; 400 | } 401 | 402 | /* #about { 403 | border: 2px solid darkcyan; 404 | } */ 405 | 406 | .max-w-full { 407 | height: 20rem; 408 | width: 14rem; 409 | /* width: 60%; */ 410 | min-width: 40%; 411 | min-height: 40%; 412 | border-radius: 5%; 413 | /* box-shadow: 30px, 30px, red; */ 414 | border: 2px solid darkcyan; 415 | } 416 | 417 | 418 | footer { 419 | /* width: 80%; */ 420 | border-top: 1px solid dimgrey; 421 | display: flex; 422 | justify-content: center; 423 | flex-direction: column; 424 | 425 | } 426 | 427 | .footer { 428 | margin: 4% 0 0 0 ; 429 | padding: 0; 430 | height: 3%; 431 | display: flex; 432 | justify-content: space-evenly; 433 | align-items: center; 434 | line-height: .1em; 435 | gap: 3em; 436 | } 437 | 438 | 439 | /* =================================== ABOUT ME SECTION */ 440 | 441 | 442 | #about { 443 | margin: 0; 444 | padding: 0; 445 | } 446 | 447 | .aboutMe { 448 | border-top: 2px solid darkcyan; 449 | border-left: 2px solid darkcyan; 450 | border-right: 2px solid darkcyan; 451 | margin: 5% 0 0 0; 452 | padding: 0 0 0 2%; 453 | width: 100%; 454 | font-size: 2rem; 455 | color: darkcyan; 456 | background-color: rgba(0,139,139, 0.3); 457 | } 458 | 459 | .biotext { 460 | border-bottom: 2px solid darkcyan; 461 | border-left: 2px solid darkcyan; 462 | border-right: 2px solid darkcyan; 463 | background-color: rgba(0,139,139, 0.1); 464 | margin: 0; 465 | padding: 1%; 466 | /* border: 2px solid darkcyan; */ 467 | font-size: 1rem; 468 | width: 100%; 469 | height: 10rem; 470 | overflow-y: scroll; 471 | } 472 | 473 | .titles { 474 | margin: 0; 475 | padding: 0; 476 | font-size: 2rem; 477 | color: darkcyan; 478 | } 479 | 480 | .forFun, .forFun h2, #forFun { 481 | color: darkcyan; 482 | margin: 0; 483 | padding: 0; 484 | } 485 | 486 | #forFun { 487 | border: 1px solid darkcyan; 488 | border-radius: 15px; 489 | } 490 | 491 | .forFun { 492 | padding-bottom: 10%; 493 | } 494 | 495 | option { 496 | padding-left: 2%; 497 | } 498 | 499 | .mainContainer, .mainProjectContainer, .mainProjectContainerTop { 500 | display: flex; 501 | align-items: center; 502 | gap: 2em; 503 | margin: 0px; 504 | padding: 0px; 505 | width: 100%; 506 | height: 100%; 507 | /* margin-top: 20%; 508 | margin-bottom: 20%; */ 509 | } 510 | 511 | .mainProjectContainer { 512 | margin: 20% 0 0 0; 513 | } 514 | 515 | .mainProjectContainerTop { 516 | margin-top: 10%; 517 | } 518 | 519 | .copyRights { 520 | font-size: 11px; 521 | display: flex; 522 | justify-content: center; 523 | align-items: flex-end; 524 | padding: 0px; 525 | margin: 0px; 526 | border: 0px; 527 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById('root')); 8 | root.render( 9 | 10 | 11 | 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/movieappimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/movieappimage.png -------------------------------------------------------------------------------- /src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /src/ronaldPowellCV.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/ronaldPowellCV.pdf -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /src/tetrisScreenShot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notesmane/Mod2_Portfolio_Project/39436e9ae64e4c9ebead9037ce7652a03083ead5/src/tetrisScreenShot.png -------------------------------------------------------------------------------- /src/weather.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300&display=swap'); 2 | 3 | * { 4 | box-sizing: border-box; 5 | margin: 0; 6 | padding: 0; 7 | } 8 | 9 | body { 10 | margin: 0; 11 | font-family: 'Outfit', 'Segoe UI', 'Roboto', 'Oxygen', 12 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 13 | sans-serif; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | p { 19 | font-size: 1.6rem; 20 | } 21 | 22 | h1 { 23 | font-size: 6rem; 24 | } 25 | 26 | .App { 27 | width: 100%; 28 | height: 100vh; 29 | position: relative; 30 | background-color: rgba(0,0,0,0.4); 31 | color: #fff; 32 | } 33 | 34 | .App:before { 35 | content: ''; 36 | background: url('./assets/sunset.jpeg') no-repeat center center/cover; 37 | position: absolute; 38 | width: 100%; 39 | height: 100%; 40 | top: 0; 41 | left: 0; 42 | z-index: -1; 43 | } 44 | 45 | .App .search { 46 | text-align: center; 47 | padding: 1rem; 48 | } 49 | 50 | .App input { 51 | padding: .7rem 1.5rem; 52 | font-size: 1.2rem; 53 | border-radius: 25px; 54 | border: 1px solid rgba(255,255,255, 0.8); 55 | background: rgba(255,255,255, 0.1); 56 | color: #f8f8f8; 57 | } 58 | 59 | ::placeholder { 60 | color: #f8f8f8; 61 | } 62 | 63 | .container { 64 | max-width: 700px; 65 | height: 700px; 66 | margin: auto; 67 | padding: 0 1rem; 68 | position: relative; 69 | top: 10%; 70 | display: flex; 71 | flex-direction: column; 72 | justify-content: space-between; 73 | } 74 | 75 | .App .top { 76 | width: 100%; 77 | margin: 1rem auto; 78 | } 79 | 80 | .App .description { 81 | position: relative; 82 | right: -90%; 83 | transform-origin: 0 0; 84 | transform: rotate(269deg); 85 | } 86 | 87 | .App .bottom { 88 | display: flex; 89 | justify-content: space-evenly; 90 | text-align: center; 91 | width: 100%; 92 | margin: 1rem auto; 93 | padding: 1rem; 94 | border-radius: 12px; 95 | background-color: rgba(255,255,255, 0.2); 96 | } 97 | 98 | .bold { 99 | font-weight: 700; 100 | } --------------------------------------------------------------------------------