{"version":3,"sources":["components/Header.tsx","assets/img/initials.png","assets/img/me.jpg","components/About.tsx","components/Project.tsx","data/projects.ts","assets/img/antipua.jpg","assets/img/plume.jpg","components/Projects.tsx","components/Footer.tsx","App.tsx","index.tsx"],"names":["Header","Wrapper","href","Initials","src","alt","Icons","Icon","icon","faGithub","size","color","faLinkedinIn","styled","div","FontAwesomeIcon","img","About","Me","me","height","width","Greeting","Wave","Body","Link","bgColour","h1","waveAnimation","keyframes","span","a","props","p","Project","project","link","target","rel","style","textDecoration","Image","image","award","Award","Name","name","Pills","tools","map","tool","i","Pill","Description","description","h2","h4","projects","Projects","Title","h3","Footer","LastUpdated","App","Container","ReactGA","initialize","pageview","window","location","pathname","search","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.9e913eee.chunk.js","sourcesContent":["import React from \"react\";\nimport styled from \"styled-components\";\nimport initials from \"../assets/img/initials.png\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faGithub, faLinkedinIn } from \"@fortawesome/free-brands-svg-icons\";\n\nexport const Header = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n width: 100%;\n`;\n\nconst Icons = styled.div`\n display: flex;\n column-gap: 20px;\n justify-content: space-between;\n`;\n\nconst Icon = styled(FontAwesomeIcon)`\n :hover {\n color: #808080;\n }\n`;\n\nconst Initials = styled.img`\n height: 40px;\n\n @media only screen and (max-width: 600px) {\n height: 30px;\n }\n transition: transform 250ms;\n :hover {\n transform: translateY(-6px);\n }\n`;\n","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/me.63851da4.jpg\";","/* eslint-disable react/no-unescaped-entities */\nimport React from \"react\";\nimport styled, { keyframes } from \"styled-components\";\nimport me from \"../assets/img/me.jpg\";\n\nexport const About = () => {\n return (\n \n \n \n 👋 Nice to meet you. I'm Hao Chen.\n \n \n I'm a junior at Cornell University studying Information Science and Game Design.\n Currently, I'm assisting research\n at Smart Computer Interfaces for Future Interactions (SciFi) Lab and \n developing a smartwatch game at Rebble.\n
\n
\n I'm also a Business and Design subteam member \n at Cornell Mars Rover. \n From {\" \"} image filters, \n to {\" \"} music generators, \n I'm always looking to tackle interesting challenges, especially in the filmmaking or game category.\n
\n
\n Outside school, I'm learning to\n run a YouTube channel. \n In my free time, you can find me doing choreography, riding a skateboard, reading detective novels, or learning the piano.\n
\n
\n Got an exciting opportunity or want to learn more about me? \n Let's chat through: hc732@cornell.edu\n
\n \n
\n );\n};\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 20px;\n`;\n\nconst Me = styled.img`\n border-radius: 50%;\n`;\n\nconst Greeting = styled.h1`\n text-align: center;\n @media only screen and (max-width: 600px) {\n font-size: 30px;\n margin-bottom: 0;\n }\n`;\n\nconst waveAnimation = keyframes`\n 0% { transform: rotate( 0.0deg) }\n 10% { transform: rotate(14.0deg) } \n 20% { transform: rotate(-8.0deg) }\n 30% { transform: rotate(14.0deg) }\n 40% { transform: rotate(-4.0deg) }\n 50% { transform: rotate(10.0deg) }\n 60% { transform: rotate( 0.0deg) } \n 100% { transform: rotate( 0.0deg) }\n`;\n\nconst Wave = styled.span`\n animation: ${waveAnimation} 2.5s;\n animation-iteration-count: 3;\n transform-origin: 70% 70%;\n display: inline-block;\n`;\n\nexport const Link = styled.a<{bgColour?: string}>`\n font-weight: bold;\n text-decoration: none;\n color: black;\n :hover {\n color:#008aa3;\n };\n background-color: ${props => props.bgColour};\n`;\n\nconst Body = styled.p`\n font-size: 20px;\n max-width: 1100px;\n`;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { IProject } from \"../data/projects\";\n\ninterface IProps {\n project: IProject;\n}\n\nexport const Project = (props: IProps) => {\n const { project } = props;\n return (\n \n \n \n \n {project.award ? {project.award} : null}\n {project.name}\n \n {project.tools.map((tool, i) => {\n return {tool};\n })}\n \n {project.description}\n \n \n \n );\n};\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: row;\n @media only screen and (max-width: 600px) {\n flex-direction: column;\n }\n padding: 1px;\n border: 1px solid #3b403e;\n border-radius: 3%;\n margin-top: 20px;\n transition: transform 250ms;\n :hover {\n transform: translateY(-4px);\n }\n`;\n\nconst Image = styled.img`\n border-radius: 3% 0 0 3%;\n\n @media only screen and (max-width: 600px) {\n width: 100%;\n border-radius: 5% 5% 0 0;\n }\n @media only screen and (min-width: 600px) {\n width: 300px;\n height: (300 / 1.8) px;\n }\n @media only screen and (min-width: 1024px) {\n width: 400px;\n }\n`;\n\nconst About = styled.div`\n display: flex;\n flex-direction: column;\n\n @media only screen and (min-width: 600px) {\n width: 250px;\n }\n @media only screen and (min-width: 1024px) {\n width: 350px;\n }\n padding: 15px 15px 15px 25px;\n`;\n\nconst Pill = styled.p`\n background-color: #C7E4EE;\n margin: 0px 5px 0px 0px;\n padding: 1px 5px;\n border-radius: 15%;\n`;\n\nconst Pills = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n flex-wrap: nowrap;\n margin-top: 0;\n`;\n\nconst Description = styled.p`\n font-size: 18px;\n`;\n\nconst Name = styled.h2`\n margin: 0px 0px 5px 0px;\n`;\n\nconst Award = styled.h4`\n text-transform: uppercase;\n margin: 0;\n color: #a6a6a6;\n font-weight: 600;\n`;\n","import antipua from \"../assets/img/antipua.jpg\";\nimport plume from \"../assets/img/plume.jpg\";\n\nexport const projects: IProject[] = [\n {\n name: \"Anti-PUA\",\n tools: [\"OCR\", \"BERT\", \"AWS\", \"Flask\", \"React\"],\n image: antipua,\n description:\n \"Web app that identifies potential moral coercion through chat history.\",\n link: \"https://devpost.com/software/team-60\",\n award: \"Winner at Unihack 2021\",\n },\n {\n name: \"Plume (Team-based)\",\n tools: [\"Figma\", \"Ae\", \"Logic\", \"LibGDX\"],\n image: plume,\n description:\n \"Desktop puzzle/platform/shooting game to reunite NPCs.\",\n link: \"https://gdiac.cs.cornell.edu/temp/showcase/gallery/plume/\",\n award: \"Winner at GDIAC showcase 2022\",\n },\n // {\n // name: \"Lynz\",\n // tools: [\"Unity\"],\n // image: \"https://i.ibb.co/m96m8nc/lynz-Cropped.png\",\n // description:\n // \"Web app that calculates how busy nearby grocery stores are based on crowd-sourced data.\",\n // link: \"https://devpost.com/software/lynz\",\n // award: \"In progress\",\n // },\n];\n\nexport interface IProject {\n name: string;\n tools: string[];\n image: string;\n description: string;\n link: string;\n award?: string;\n}\n","export default __webpack_public_path__ + \"static/media/antipua.3c087d25.jpg\";","export default __webpack_public_path__ + \"static/media/plume.7f823699.jpg\";","import React from \"react\";\nimport styled from \"styled-components\";\nimport { Project } from \"./Project\";\nimport { projects } from \"../data/projects\";\nimport { IProject } from \"../data/projects\";\n\nexport const Projects = () => {\n return (\n \n Things I've designed/built\n {projects.map((project: IProject, i: number) => {\n return ;\n })}\n \n );\n};\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 20px;\n`;\n\nconst Title = styled.h3`\n text-align: center;\n font-family: \"Mada\", sans-serif;\n font-size: 32px;\n margin: 0;\n\n @media only screen and (max-width: 600px) {\n font-size: 28px;\n }\n`;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nexport const Footer = () => {\n return (\n \n

Made with ❤️ by Hao Chen © 2022

\n Last updated: September 2022\n
\n );\n};\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 5px;\n\n @media only screen and (max-width: 600px) {\n margin-top: 40px;\n }\n`;\n\nconst LastUpdated = styled.p`\n font-size: 0.8rem;\n margin-top: 0;\n`","import React from \"react\";\n\nimport styled from \"styled-components\";\nimport { Header } from \"./components/Header\";\nimport { About } from \"./components/About\";\nimport { Projects } from \"./components/Projects\";\nimport { Button } from \"./components/Button\";\nimport { Footer } from \"./components/Footer\";\nimport \"./fonts/fonts.css\";\n\nexport const App = () => {\n return (\n \n
\n \n \n {/*