diff --git a/asset-manifest.json b/asset-manifest.json
index 3e71f24..58bb8d3 100644
--- a/asset-manifest.json
+++ b/asset-manifest.json
@@ -1,8 +1,8 @@
{
"files": {
- "main.css": "/static/css/main.f31ed6c9.chunk.css",
- "main.js": "/static/js/main.3ab396df.chunk.js",
- "main.js.map": "/static/js/main.3ab396df.chunk.js.map",
+ "main.css": "/static/css/main.d8fb1f37.chunk.css",
+ "main.js": "/static/js/main.12d4b8ca.chunk.js",
+ "main.js.map": "/static/js/main.12d4b8ca.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.63efa834.js",
"runtime-main.js.map": "/static/js/runtime-main.63efa834.js.map",
"static/css/2.85610714.chunk.css": "/static/css/2.85610714.chunk.css",
@@ -12,7 +12,7 @@
"static/js/3.40aa4c12.chunk.js.map": "/static/js/3.40aa4c12.chunk.js.map",
"index.html": "/index.html",
"static/css/2.85610714.chunk.css.map": "/static/css/2.85610714.chunk.css.map",
- "static/css/main.f31ed6c9.chunk.css.map": "/static/css/main.f31ed6c9.chunk.css.map",
+ "static/css/main.d8fb1f37.chunk.css.map": "/static/css/main.d8fb1f37.chunk.css.map",
"static/js/2.032a3ef4.chunk.js.LICENSE.txt": "/static/js/2.032a3ef4.chunk.js.LICENSE.txt",
"static/media/HashiCorp_Logo_no_text.344aecaa.png": "/static/media/HashiCorp_Logo_no_text.344aecaa.png",
"static/media/SanDiego.35f8cc09.svg": "/static/media/SanDiego.35f8cc09.svg",
@@ -23,7 +23,7 @@
"static/js/runtime-main.63efa834.js",
"static/css/2.85610714.chunk.css",
"static/js/2.032a3ef4.chunk.js",
- "static/css/main.f31ed6c9.chunk.css",
- "static/js/main.3ab396df.chunk.js"
+ "static/css/main.d8fb1f37.chunk.css",
+ "static/js/main.12d4b8ca.chunk.js"
]
}
\ No newline at end of file
diff --git a/index.html b/index.html
index 6e9e8d8..99bffb2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-
Jake Cover You need to enable JavaScript to run this app.
\ No newline at end of file
+Jake Cover You need to enable JavaScript to run this app.
\ No newline at end of file
diff --git a/static/css/main.d8fb1f37.chunk.css b/static/css/main.d8fb1f37.chunk.css
new file mode 100644
index 0000000..d95b87e
--- /dev/null
+++ b/static/css/main.d8fb1f37.chunk.css
@@ -0,0 +1,2 @@
+@import url(https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600&family=Montserrat:wght@400;600;700&display=swap);body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,"Courier New",monospace}.App{text-align:center}.App-logo{height:40vmin;pointer-events:none}@media (prefers-reduced-motion:no-preference){.App-logo{-webkit-animation:App-logo-spin 20s linear infinite;animation:App-logo-spin 20s linear infinite}}.App-header{background-color:#282c34;min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:calc(10px + 2vmin);color:#fff}.App-link{color:#61dafb}@-webkit-keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.site-footer{background:#a9a9a9;margin:10px;border-radius:5px}.site-footer h2{font-family:"Fira Code",monospace;margin:0}.site-footer p{font-family:"Montserrat",sans-serif}@media screen and (min-width:900px){.site-footer p{font-size:16px}}.footer-grid{display:flex;justify-content:space-evenly}.footer-grid .blurb{flex:9 1}.footer-grid .links-container{flex:4 1}.footer-grid .footer-links{padding-left:0;margin:0;-webkit-columns:100px 2;columns:100px 2}.footer-grid .footer-links li{list-style:none}.footer-grid .footer-links a{font-family:"Montserrat",sans-serif;text-decoration:underline}header{display:flex;flex-direction:row;margin:10px;padding:10px;border-radius:5px;background:#66bb6a;font-family:"Fira Code",monospace}header h1{font-weight:600;margin:0 0 0 5px}header .headerLinks{display:flex;flex-direction:row;align-content:center;margin-left:auto}header .headerLinks h2{margin:0;border-radius:5px;line-height:normal}header .headerLinks h2:hover{background:#ddd}header .headerLinks h2.active{background-color:#4caf50;color:#fff}header .headerLinks h2:last-of-type{margin-right:5px}header .icon{display:none}@media screen and (max-width:660px){header h2{display:none}header .icon{margin-left:auto;display:block;position:absolute;top:19px;right:24px;font-size:30px;border:none}header .headerLinks{visibility:hidden;transition:visibility 0s,opacity .5s linear}}@media screen and (max-width:660px){header.responsive{display:block}header.responsive .headerLinks{visibility:visible;display:flex;flex-direction:column;align-items:flex-start}header.responsive h1{text-align:left}header.responsive h2{display:block;margin-left:5px}}#project-grid-parent{margin:10px;background:#ffd43b;border-radius:5px}#project-grid-parent>#project-header{background:grey;border-radius:5px 5px 0 0;margin-bottom:2px;padding:5px}#project-grid-parent>#project-header h2{margin-bottom:0;font-family:"Fira Code",monospace;font-size:24px}#project-grid-parent>#project-header p{margin:0 0 3px;font-family:"Montserrat",sans-serif;font-size:18px}@media (max-width:430px){#project-grid .FourByOne .Medium,#project-grid .GridSizer,#project-grid .OneWide{width:100%}}@media (min-width:431px) and (max-width:659px){#project-grid .GridSizer,#project-grid .OneWide .Medium{width:49%}#project-grid .FourByOne{width:100%}}@media (min-width:660px) and (max-width:899px){#project-grid .GridSizer,#project-grid .OneWide .Medium{width:33%}#project-grid .FourByOne{width:99%}}@media (min-width:900px) and (max-width:1299px){#project-grid .GridSizer,#project-grid .OneWide{width:24.9%}#project-grid .Medium{width:49.8%}#project-grid .FourByOne{width:74.6%}}@media (min-width:1300px) and (max-width:1559px){#project-grid .GridSizer,#project-grid .OneWide{max-width:300px;width:19.9%}#project-grid .Medium{max-width:600px;width:39.8%}#project-grid .FourByOne{width:59.5%;max-width:900px}}@media (min-width:1560px){#project-grid .GridSizer,#project-grid .OneWide{width:300px}#project-grid .Medium{width:600px}#project-grid .FourByOne{width:900px}}.GridElement{padding:5px}.GridElement .GridElementInternal{padding:9px;border-radius:5px;background:#e0ffff;box-shadow:0 1px 2px rgba(0,0,0,.15);transition:box-shadow .3s ease-in-out}.GridElement .GridElementInternal:hover{box-shadow:0 2px 5px rgba(0,0,0,.3)}.GridElement h2{font-family:"Fira Code",monospace;font-weight:400;margin-bottom:0;line-height:normal}.GridElement h3{line-height:normal;color:#a9a9a9;margin-bottom:3px}.GridElement p{font-family:"Montserrat",sans-serif;font-size:16px;color:#000;margin-bottom:0}.OneWide{display:flex;flex-direction:column;width:available}.Medium img,.OneWide img{width:100%;margin-bottom:5px}@media (max-width:899px){.Medium{display:flex;flex-direction:column;width:available}.Medium img{width:100%;margin-bottom:5px}}@media (min-width:900px){.Medium .image{float:left;width:50%;-webkit-shape-outside:inset(0);shape-outside:inset(0)}.Medium .image img{margin-bottom:0}.Medium .description{display:inline}.Medium .description p{text-align:justify}.Medium .description h2 h3{display:inline}}@media (min-width:1561px){.Medium .image{width:40%}}.FourByOne .GridElementInternal{display:flex;align-items:center}.FourByOne .GridElementInternal .image{flex:1 1}.FourByOne .GridElementInternal .image img{width:100%;max-width:100%}.FourByOne .GridElementInternal .description{min-width:20ch;width:30ch}@media (min-width:661px){.FourByOne .GridElementInternal{flex-direction:row}}@media (max-width:660px){.FourByOne .GridElementInternal{flex-direction:column}.FourByOne .GridElementInternal .description{width:95%}}.LinkIcon{position:absolute;right:12px;top:12px;font-size:24px;color:#000;background:rgba(224,255,255,.7);border-radius:5px}#about-me-parent{margin-left:10px;margin-right:10px;display:flex;flex-direction:row;justify-content:center}#about-me-parent b{font-weight:600}#about-me-parent .about-me-card{margin:0 5px;padding:10px}#about-me-parent #about-me,#about-me-parent .about-me-card{background:#61dafb;border-radius:5px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}#about-me-parent #about-me{padding:15px}#about-me-parent #about-me #info-parent{display:flex;flex-direction:row}#about-me-parent #about-me #info-parent #fun-info,#about-me-parent #about-me #info-parent #specific-info{flex:1 1}@media screen and (max-width:660px){#about-me-parent #about-me #info-parent{flex-direction:column}}#about-me-parent #about-me h1{font-family:"Fira Code",monospace;font-weight:500}#about-me-parent #about-me h2{font-family:"Fira Code",monospace;line-height:normal;margin-bottom:0;font-weight:400;text-align:left}#about-me-parent #about-me p{font-family:"Montserrat",sans-serif;font-size:16px;margin:0}#about-me-parent #about-me ul{text-align:left;padding-left:40px;margin-bottom:0}#about-me-parent #about-me li{font-family:"Montserrat",sans-serif;font-size:18px;list-style-type:symbols("+");list-style-position:inside}button{background:none!important;border:none;padding:0!important;color:#1890ff;cursor:pointer}
+/*# sourceMappingURL=main.d8fb1f37.chunk.css.map */
\ No newline at end of file
diff --git a/static/css/main.d8fb1f37.chunk.css.map b/static/css/main.d8fb1f37.chunk.css.map
new file mode 100644
index 0000000..f9a1327
--- /dev/null
+++ b/static/css/main.d8fb1f37.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["main.d8fb1f37.chunk.css","webpack://src/index.scss","webpack://src/App.scss","webpack://src/components/Footer.scss","webpack://src/components/Header.scss","webpack://src/components/ProjectGrid.scss","webpack://node_modules/include-media/dist/_include-media.scss","webpack://src/components/AboutMe.scss"],"names":[],"mappings":"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","file":"main.d8fb1f37.chunk.css","sourcesContent":["@import url(https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600&family=Montserrat:wght@400;600;700&display=swap);\nbody{margin:0;font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace}\n\n\n\n.App{text-align:center}.App-logo{height:40vmin;pointer-events:none}@media (prefers-reduced-motion: no-preference){.App-logo{-webkit-animation:App-logo-spin infinite 20s linear;animation:App-logo-spin infinite 20s linear}}.App-header{background-color:#282c34;min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:calc(10px + 2vmin);color:white}.App-link{color:#61dafb}@-webkit-keyframes App-logo-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes App-logo-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n\n.site-footer{background:darkgrey;margin:10px;border-radius:5px}.site-footer h2{font-family:\"Fira Code\", monospace;margin:0}.site-footer p{font-family:\"Montserrat\", sans-serif}@media screen and (min-width: 900px){.site-footer p{font-size:16px}}.footer-grid{display:flex;justify-content:space-evenly}.footer-grid .blurb{flex:9 1}.footer-grid .links-container{flex:4 1}.footer-grid .footer-links{padding-left:0;margin:0;-webkit-columns:100px 2;columns:100px 2}.footer-grid .footer-links li{list-style:none}.footer-grid .footer-links a{font-family:\"Montserrat\", sans-serif;text-decoration:underline}\n\nheader{display:flex;flex-direction:row;margin:10px;padding:10px;border-radius:5px;background:#66bb6a;font-family:\"Fira Code\", monospace}header h1{font-weight:600;margin:0 0 0 5px}header .headerLinks{display:flex;flex-direction:row;align-content:center;margin-left:auto}header .headerLinks h2{margin:0;border-radius:5px;line-height:normal}header .headerLinks h2:hover{background:#ddd}header .headerLinks h2.active{background-color:#4CAF50;color:white}header .headerLinks h2:last-of-type{margin-right:5px}header .icon{display:none}@media screen and (max-width: 660px){header h2{display:none}header .icon{margin-left:auto;display:block;position:absolute;top:19px;right:24px;font-size:30px;border:none}header .headerLinks{visibility:hidden;transition:visibility 0s, opacity 0.5s linear}}@media screen and (max-width: 660px){header.responsive{display:block}header.responsive .headerLinks{visibility:visible;display:flex;flex-direction:column;align-items:flex-start}header.responsive h1{text-align:left}header.responsive h2{display:block;margin-left:5px}}\n\n\n#project-grid-parent{margin:10px;background:#FFD43B;border-radius:5px}#project-grid-parent>#project-header{background:grey;border-radius:5px 5px 0 0;margin-bottom:2px;padding:5px}#project-grid-parent>#project-header h2{margin-bottom:0;font-family:\"Fira Code\", monospace;font-size:24px}#project-grid-parent>#project-header p{margin:0 0 3px;font-family:\"Montserrat\", sans-serif;font-size:18px}@media (max-width: 430px){#project-grid .GridSizer,#project-grid .OneWide,#project-grid .FourByOne .Medium{width:100%}}@media (min-width: 431px) and (max-width: 659px){#project-grid .GridSizer,#project-grid .OneWide .Medium{width:49%}#project-grid .FourByOne{width:100%}}@media (min-width: 660px) and (max-width: 899px){#project-grid .GridSizer,#project-grid .OneWide .Medium{width:33%}#project-grid .FourByOne{width:99%}}@media (min-width: 900px) and (max-width: 1299px){#project-grid .GridSizer,#project-grid .OneWide{width:24.9%}#project-grid .Medium{width:49.8%}#project-grid .FourByOne{width:74.6%}}@media (min-width: 1300px) and (max-width: 1559px){#project-grid .GridSizer,#project-grid .OneWide{max-width:300px;width:19.9%}#project-grid .Medium{max-width:600px;width:39.8%}#project-grid .FourByOne{width:59.5%;max-width:900px}}@media (min-width: 1560px){#project-grid .GridSizer,#project-grid .OneWide{width:300px}#project-grid .Medium{width:600px}#project-grid .FourByOne{width:900px}}.GridElement{padding:5px}.GridElement .GridElementInternal{padding:9px;border-radius:5px;background:lightcyan;box-shadow:0 1px 2px rgba(0,0,0,0.15);transition:box-shadow 0.3s ease-in-out}.GridElement .GridElementInternal:hover{box-shadow:0 2px 5px rgba(0,0,0,0.3)}.GridElement h2{font-family:\"Fira Code\", monospace;font-weight:400;margin-bottom:0px;line-height:normal}.GridElement h3{line-height:normal;color:darkgrey;margin-bottom:3px}.GridElement p{font-family:\"Montserrat\", sans-serif;font-size:16px;color:black;margin-bottom:0}.OneWide{display:flex;flex-direction:column;width:available}.OneWide img{width:100%;margin-bottom:5px}.Medium img{width:100%;margin-bottom:5px}@media (max-width: 899px){.Medium{display:flex;flex-direction:column;width:available}.Medium img{width:100%;margin-bottom:5px}}@media (min-width: 900px){.Medium .image{float:left;width:50%;-webkit-shape-outside:inset(0);shape-outside:inset(0)}.Medium .image img{margin-bottom:0}.Medium .description{display:inline}.Medium .description p{text-align:justify}.Medium .description h2 h3{display:inline}}@media (min-width: 1561px){.Medium .image{width:40%}}.FourByOne .GridElementInternal{display:flex;align-items:center}.FourByOne .GridElementInternal .image{flex:1 1}.FourByOne .GridElementInternal .image img{width:100%;max-width:100%}.FourByOne .GridElementInternal .description{min-width:20ch;width:30ch}@media (min-width: 661px){.FourByOne .GridElementInternal{flex-direction:row}}@media (max-width: 660px){.FourByOne .GridElementInternal{flex-direction:column}.FourByOne .GridElementInternal .description{width:95%}}.LinkIcon{position:absolute;right:12px;top:12px;font-size:24px;color:black;background:rgba(224,255,255,0.7);border-radius:5px}\n\n#about-me-parent{margin-left:10px;margin-right:10px;display:flex;flex-direction:row;justify-content:center}#about-me-parent b{font-weight:600}#about-me-parent .about-me-card{background:#61dafb;border-radius:5px;margin:0 5px 0;padding:10px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}#about-me-parent #about-me{background:#61dafb;border-radius:5px;padding:15px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}#about-me-parent #about-me #info-parent{display:flex;flex-direction:row}#about-me-parent #about-me #info-parent #specific-info{flex:1 1}#about-me-parent #about-me #info-parent #fun-info{flex:1 1}@media screen and (max-width: 660px){#about-me-parent #about-me #info-parent{flex-direction:column}}#about-me-parent #about-me h1{font-family:\"Fira Code\", monospace;font-weight:500}#about-me-parent #about-me h2{font-family:\"Fira Code\", monospace;line-height:normal;margin-bottom:0;font-weight:400;text-align:left}#about-me-parent #about-me p{font-family:\"Montserrat\", sans-serif;font-size:16px;margin:0}#about-me-parent #about-me ul{text-align:left;padding-left:40px;margin-bottom:0}#about-me-parent #about-me li{font-family:\"Montserrat\", sans-serif;font-size:18px;list-style-type:symbols(\"+\");list-style-position:inside}button{background:none !important;border:none;padding:0 !important;color:#1890ff;cursor:pointer}\n\n","body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n","@import '~antd/dist/antd.css';\n\n.App {\n text-align: center;\n}\n\n.App-logo {\n height: 40vmin;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .App-logo {\n animation: App-logo-spin infinite 20s linear;\n }\n}\n\n.App-header {\n background-color: #282c34;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: calc(10px + 2vmin);\n color: white;\n}\n\n.App-link {\n color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n",".site-footer {\n background: darkgrey;\n margin: 10px;\n border-radius: 5px;\n\n h2 {\n font-family: \"Fira Code\", monospace;\n margin: 0;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n\n @media screen and (min-width: 900px) {\n font-size: 16px;\n }\n }\n}\n\n.footer-grid {\n display: flex;\n justify-content: space-evenly;\n\n .blurb {\n flex: 9;\n }\n\n .links-container {\n flex: 4;\n }\n\n .footer-links {\n padding-left: 0;\n margin: 0;\n\n columns: 100px 2;\n\n li {\n list-style: none;\n }\n\n a {\n //color: black;\n font-family: \"Montserrat\", sans-serif;\n text-decoration: underline;\n }\n }\n\n}\n","header {\n display: flex;\n flex-direction: row;\n\n margin: 10px;\n padding: 10px;\n border-radius: 5px;\n background: #66bb6a;\n font-family: \"Fira Code\", monospace;\n\n h1 {\n font-weight: 600;\n margin: 0 0 0 5px;\n }\n\n .headerLinks {\n display: flex;\n flex-direction: row;\n align-content: center;\n margin-left: auto;\n\n h2 {\n margin: 0;\n border-radius: 5px;\n line-height: normal;\n\n &:hover {\n background: #ddd;\n }\n\n &.active {\n background-color: #4CAF50;\n color: white;\n }\n }\n\n h2:last-of-type {\n margin-right: 5px;\n }\n }\n\n /* Hide the link that should open and close the topnav on small screens */\n .icon {\n display: none;\n }\n\n @media screen and (max-width: 660px) {\n h2 {\n display: none;\n }\n\n .icon {\n margin-left: auto;\n display: block;\n position: absolute;\n top: 19px;\n right: 24px;\n font-size: 30px;\n border: none;\n }\n\n .headerLinks {\n visibility: hidden;\n transition: visibility 0s, opacity 0.5s linear;\n }\n }\n\n @media screen and (max-width: 660px) {\n &.responsive {\n display: block;\n\n .headerLinks {\n visibility: visible;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n }\n\n h1 {\n text-align: left;\n }\n\n h2 {\n display: block;\n margin-left: 5px;\n }\n }\n }\n}\n","@import \"~include-media/dist/_include-media.scss\";\n\n$breakpoints: (x-small: 430px, small: 660px, medium: 900px, large: 1300px, x-large: 1560px);\n\n// Override Sass min()\n@function min($numbers...) {\n @return m#{i}n(#{$numbers});\n}\n\n// Override Sass max()\n@function max($numbers...) {\n @return m#{a}x(#{$numbers});\n}\n\n#project-grid-parent {\n margin: 10px;\n background: #FFD43B;\n border-radius: 5px;\n\n & > #project-header {\n background: grey;\n border-radius: 5px 5px 0 0;\n margin-bottom: 2px;\n\n padding: 5px;\n\n h2 {\n margin-bottom: 0;\n font-family: \"Fira Code\", monospace;\n font-size: 24px;\n }\n\n p {\n margin: 0 0 3px;\n font-family: \"Montserrat\", sans-serif;\n font-size: 18px;\n }\n\n }\n}\n\n\n#project-grid {\n\n //padding: 10px;\n\n @include media(\"<=x-small\") {\n .GridSizer, .OneWide, .FourByOne .Medium {\n width: 100%;\n }\n }\n\n @include media(\">x-small\", \"=small\", \"=medium\", \"=large\", \"=x-large\") {\n .GridSizer, .OneWide {\n width: 300px;\n }\n .Medium {\n width: 600px;\n }\n .FourByOne {\n width: 900px;\n }\n }\n}\n\n.GridElement {\n padding: 5px;\n\n .GridElementInternal {\n padding: 9px;\n border-radius: 5px;\n background: lightcyan;\n\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);\n transition: box-shadow 0.3s ease-in-out;\n }\n\n .GridElementInternal:hover {\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);\n }\n\n h2 {\n font-family: \"Fira Code\", monospace;\n font-weight: 400;\n margin-bottom: 0px;\n line-height: normal;\n }\n\n h3 {\n line-height: normal;\n color: darkgrey;\n margin-bottom: 3px;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n font-size: 16px;\n color: black;\n margin-bottom: 0;\n }\n}\n\n.OneWide {\n display: flex;\n flex-direction: column;\n width: available;\n\n img {\n width: 100%;\n margin-bottom: 5px;\n }\n}\n\n.Medium {\n img {\n width: 100%;\n margin-bottom: 5px;\n }\n\n @include media(\"=medium\") {\n // Two column sort of layout\n .image {\n float: left;\n width: 50%;\n shape-outside: inset(0);\n\n img {\n margin-bottom: 0;\n }\n }\n\n .description {\n display: inline;\n\n p {\n text-align: justify;\n }\n\n h2 h3 {\n display: inline;\n }\n }\n }\n\n @include media(\">x-large\") {\n .image {\n width: 40%;\n }\n }\n}\n\n.FourByOne {\n .GridElementInternal {\n display: flex;\n align-items: center;\n\n .image {\n flex: 1;\n\n img {\n width: 100%;\n max-width: 100%;\n }\n }\n\n .description {\n min-width: 20ch;\n width: 30ch;\n }\n\n @include media(\">small\") {\n flex-direction: row;\n\n }\n @include media(\"<=small\") {\n flex-direction: column;\n .description {\n width: 95%;\n }\n }\n }\n}\n\n.LinkIcon {\n position: absolute;\n right: 12px;\n top: 12px;\n font-size: 24px;\n color: black;\n\n background: rgba(224, 255, 255, 0.7);\n border-radius: 5px;\n}\n","@charset \"UTF-8\";\n\n// _ _ _ _ _\n// (_) | | | | | (_)\n// _ _ __ ___| |_ _ __| | ___ _ __ ___ ___ __| |_ __ _\n// | | '_ \\ / __| | | | |/ _` |/ _ \\ | '_ ` _ \\ / _ \\/ _` | |/ _` |\n// | | | | | (__| | |_| | (_| | __/ | | | | | | __/ (_| | | (_| |\n// |_|_| |_|\\___|_|\\__,_|\\__,_|\\___| |_| |_| |_|\\___|\\__,_|_|\\__,_|\n//\n// Simple, elegant and maintainable media queries in Sass\n// v1.4.9\n//\n// http://include-media.com\n//\n// Authors: Eduardo Boucas (@eduardoboucas)\n// Hugo Giraudel (@hugogiraudel)\n//\n// This project is licensed under the terms of the MIT license\n\n\n////\n/// include-media library public configuration\n/// @author Eduardo Boucas\n/// @access public\n////\n\n\n///\n/// Creates a list of global breakpoints\n///\n/// @example scss - Creates a single breakpoint with the label `phone`\n/// $breakpoints: ('phone': 320px);\n///\n$breakpoints: (\n 'phone': 320px,\n 'tablet': 768px,\n 'desktop': 1024px\n) !default;\n\n\n///\n/// Creates a list of static expressions or media types\n///\n/// @example scss - Creates a single media type (screen)\n/// $media-expressions: ('screen': 'screen');\n///\n/// @example scss - Creates a static expression with logical disjunction (OR operator)\n/// $media-expressions: (\n/// 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)'\n/// );\n///\n$media-expressions: (\n 'screen': 'screen',\n 'print': 'print',\n 'handheld': 'handheld',\n 'landscape': '(orientation: landscape)',\n 'portrait': '(orientation: portrait)',\n 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi), (min-resolution: 2dppx)',\n 'retina3x': '(-webkit-min-device-pixel-ratio: 3), (min-resolution: 350dpi), (min-resolution: 3dppx)'\n) !default;\n\n\n///\n/// Defines a number to be added or subtracted from each unit when declaring breakpoints with exclusive intervals\n///\n/// @example scss - Interval for pixels is defined as `1` by default\n/// @include media('>128px') {}\n///\n/// /* Generates: */\n/// @media (min-width: 129px) {}\n///\n/// @example scss - Interval for ems is defined as `0.01` by default\n/// @include media('>20em') {}\n///\n/// /* Generates: */\n/// @media (min-width: 20.01em) {}\n///\n/// @example scss - Interval for rems is defined as `0.1` by default, to be used with `font-size: 62.5%;`\n/// @include media('>2.0rem') {}\n///\n/// /* Generates: */\n/// @media (min-width: 2.1rem) {}\n///\n$unit-intervals: (\n 'px': 1,\n 'em': 0.01,\n 'rem': 0.1,\n '': 0\n) !default;\n\n///\n/// Defines whether support for media queries is available, useful for creating separate stylesheets\n/// for browsers that don't support media queries.\n///\n/// @example scss - Disables support for media queries\n/// $im-media-support: false;\n/// @include media('>=tablet') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* Generates: */\n/// .foo {\n/// color: tomato;\n/// }\n///\n$im-media-support: true !default;\n\n///\n/// Selects which breakpoint to emulate when support for media queries is disabled. Media queries that start at or\n/// intercept the breakpoint will be displayed, any others will be ignored.\n///\n/// @example scss - This media query will show because it intercepts the static breakpoint\n/// $im-media-support: false;\n/// $im-no-media-breakpoint: 'desktop';\n/// @include media('>=tablet') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* Generates: */\n/// .foo {\n/// color: tomato;\n/// }\n///\n/// @example scss - This media query will NOT show because it does not intercept the desktop breakpoint\n/// $im-media-support: false;\n/// $im-no-media-breakpoint: 'tablet';\n/// @include media('>=desktop') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* No output */\n///\n$im-no-media-breakpoint: 'desktop' !default;\n\n///\n/// Selects which media expressions are allowed in an expression for it to be used when media queries\n/// are not supported.\n///\n/// @example scss - This media query will show because it intercepts the static breakpoint and contains only accepted media expressions\n/// $im-media-support: false;\n/// $im-no-media-breakpoint: 'desktop';\n/// $im-no-media-expressions: ('screen');\n/// @include media('>=tablet', 'screen') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* Generates: */\n/// .foo {\n/// color: tomato;\n/// }\n///\n/// @example scss - This media query will NOT show because it intercepts the static breakpoint but contains a media expression that is not accepted\n/// $im-media-support: false;\n/// $im-no-media-breakpoint: 'desktop';\n/// $im-no-media-expressions: ('screen');\n/// @include media('>=tablet', 'retina2x') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* No output */\n///\n$im-no-media-expressions: ('screen', 'portrait', 'landscape') !default;\n\n////\n/// Cross-engine logging engine\n/// @author Hugo Giraudel\n/// @access private\n////\n\n\n///\n/// Log a message either with `@error` if supported\n/// else with `@warn`, using `feature-exists('at-error')`\n/// to detect support.\n///\n/// @param {String} $message - Message to log\n///\n@function im-log($message) {\n @if feature-exists('at-error') {\n @error $message;\n } @else {\n @warn $message;\n $_: noop();\n }\n\n @return $message;\n}\n\n\n///\n/// Wrapper mixin for the log function so it can be used with a more friendly\n/// API than `@if im-log('..') {}` or `$_: im-log('..')`. Basically, use the function\n/// within functions because it is not possible to include a mixin in a function\n/// and use the mixin everywhere else because it's much more elegant.\n///\n/// @param {String} $message - Message to log\n///\n@mixin log($message) {\n @if im-log($message) {}\n}\n\n\n///\n/// Function with no `@return` called next to `@warn` in Sass 3.3\n/// to trigger a compiling error and stop the process.\n///\n@function noop() {}\n\n///\n/// Determines whether a list of conditions is intercepted by the static breakpoint.\n///\n/// @param {Arglist} $conditions - Media query conditions\n///\n/// @return {Boolean} - Returns true if the conditions are intercepted by the static breakpoint\n///\n@function im-intercepts-static-breakpoint($conditions...) {\n $no-media-breakpoint-value: map-get($breakpoints, $im-no-media-breakpoint);\n\n @if not $no-media-breakpoint-value {\n @if im-log('`#{$im-no-media-breakpoint}` is not a valid breakpoint.') {}\n }\n\n @each $condition in $conditions {\n @if not map-has-key($media-expressions, $condition) {\n $operator: get-expression-operator($condition);\n $prefix: get-expression-prefix($operator);\n $value: get-expression-value($condition, $operator);\n\n // scss-lint:disable SpaceAroundOperator\n @if ($prefix == 'max' and $value <= $no-media-breakpoint-value) or\n ($prefix == 'min' and $value > $no-media-breakpoint-value) {\n @return false;\n }\n } @else if not index($im-no-media-expressions, $condition) {\n @return false;\n }\n }\n\n @return true;\n}\n\n////\n/// Parsing engine\n/// @author Hugo Giraudel\n/// @access private\n////\n\n\n///\n/// Get operator of an expression\n///\n/// @param {String} $expression - Expression to extract operator from\n///\n/// @return {String} - Any of `>=`, `>`, `<=`, `<`, `≥`, `≤`\n///\n@function get-expression-operator($expression) {\n @each $operator in ('>=', '>', '<=', '<', '≥', '≤') {\n @if str-index($expression, $operator) {\n @return $operator;\n }\n }\n\n // It is not possible to include a mixin inside a function, so we have to\n // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because\n // functions cannot be called anywhere in Sass, we need to hack the call in\n // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with\n // Sass 3.3, change this line in `@if im-log(..) {}` instead.\n $_: im-log('No operator found in `#{$expression}`.');\n}\n\n\n///\n/// Get dimension of an expression, based on a found operator\n///\n/// @param {String} $expression - Expression to extract dimension from\n/// @param {String} $operator - Operator from `$expression`\n///\n/// @return {String} - `width` or `height` (or potentially anything else)\n///\n@function get-expression-dimension($expression, $operator) {\n $operator-index: str-index($expression, $operator);\n $parsed-dimension: str-slice($expression, 0, $operator-index - 1);\n $dimension: 'width';\n\n @if str-length($parsed-dimension) > 0 {\n $dimension: $parsed-dimension;\n }\n\n @return $dimension;\n}\n\n\n///\n/// Get dimension prefix based on an operator\n///\n/// @param {String} $operator - Operator\n///\n/// @return {String} - `min` or `max`\n///\n@function get-expression-prefix($operator) {\n @return if(index(('<', '<=', '≤'), $operator), 'max', 'min');\n}\n\n\n///\n/// Get value of an expression, based on a found operator\n///\n/// @param {String} $expression - Expression to extract value from\n/// @param {String} $operator - Operator from `$expression`\n///\n/// @return {Number} - A numeric value\n///\n@function get-expression-value($expression, $operator) {\n $operator-index: str-index($expression, $operator);\n $value: str-slice($expression, $operator-index + str-length($operator));\n\n @if map-has-key($breakpoints, $value) {\n $value: map-get($breakpoints, $value);\n } @else {\n $value: to-number($value);\n }\n\n $interval: map-get($unit-intervals, unit($value));\n\n @if not $interval {\n // It is not possible to include a mixin inside a function, so we have to\n // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because\n // functions cannot be called anywhere in Sass, we need to hack the call in\n // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with\n // Sass 3.3, change this line in `@if im-log(..) {}` instead.\n $_: im-log('Unknown unit `#{unit($value)}`.');\n }\n\n @if $operator == '>' {\n $value: $value + $interval;\n } @else if $operator == '<' {\n $value: $value - $interval;\n }\n\n @return $value;\n}\n\n\n///\n/// Parse an expression to return a valid media-query expression\n///\n/// @param {String} $expression - Expression to parse\n///\n/// @return {String} - Valid media query\n///\n@function parse-expression($expression) {\n // If it is part of $media-expressions, it has no operator\n // then there is no need to go any further, just return the value\n @if map-has-key($media-expressions, $expression) {\n @return map-get($media-expressions, $expression);\n }\n\n $operator: get-expression-operator($expression);\n $dimension: get-expression-dimension($expression, $operator);\n $prefix: get-expression-prefix($operator);\n $value: get-expression-value($expression, $operator);\n\n @return '(#{$prefix}-#{$dimension}: #{$value})';\n}\n\n///\n/// Slice `$list` between `$start` and `$end` indexes\n///\n/// @access private\n///\n/// @param {List} $list - List to slice\n/// @param {Number} $start [1] - Start index\n/// @param {Number} $end [length($list)] - End index\n///\n/// @return {List} Sliced list\n///\n@function slice($list, $start: 1, $end: length($list)) {\n @if length($list) < 1 or $start > $end {\n @return ();\n }\n\n $result: ();\n\n @for $i from $start through $end {\n $result: append($result, nth($list, $i));\n }\n\n @return $result;\n}\n\n////\n/// String to number converter\n/// @author Hugo Giraudel\n/// @access private\n////\n\n\n///\n/// Casts a string into a number\n///\n/// @param {String | Number} $value - Value to be parsed\n///\n/// @return {Number}\n///\n@function to-number($value) {\n @if type-of($value) == 'number' {\n @return $value;\n } @else if type-of($value) != 'string' {\n $_: im-log('Value for `to-number` should be a number or a string.');\n }\n\n $first-character: str-slice($value, 1, 1);\n $result: 0;\n $digits: 0;\n $minus: ($first-character == '-');\n $numbers: ('0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9);\n\n // Remove +/- sign if present at first character\n @if ($first-character == '+' or $first-character == '-') {\n $value: str-slice($value, 2);\n }\n\n @for $i from 1 through str-length($value) {\n $character: str-slice($value, $i, $i);\n\n @if not (index(map-keys($numbers), $character) or $character == '.') {\n @return to-length(if($minus, -$result, $result), str-slice($value, $i))\n }\n\n @if $character == '.' {\n $digits: 1;\n } @else if $digits == 0 {\n $result: $result * 10 + map-get($numbers, $character);\n } @else {\n $digits: $digits * 10;\n $result: $result + map-get($numbers, $character) / $digits;\n }\n }\n\n @return if($minus, -$result, $result);\n}\n\n\n///\n/// Add `$unit` to `$value`\n///\n/// @param {Number} $value - Value to add unit to\n/// @param {String} $unit - String representation of the unit\n///\n/// @return {Number} - `$value` expressed in `$unit`\n///\n@function to-length($value, $unit) {\n $units: ('px': 1px, 'cm': 1cm, 'mm': 1mm, '%': 1%, 'ch': 1ch, 'pc': 1pc, 'in': 1in, 'em': 1em, 'rem': 1rem, 'pt': 1pt, 'ex': 1ex, 'vw': 1vw, 'vh': 1vh, 'vmin': 1vmin, 'vmax': 1vmax);\n\n @if not index(map-keys($units), $unit) {\n $_: im-log('Invalid unit `#{$unit}`.');\n }\n\n @return $value * map-get($units, $unit);\n}\n\n///\n/// This mixin aims at redefining the configuration just for the scope of\n/// the call. It is helpful when having a component needing an extended\n/// configuration such as custom breakpoints (referred to as tweakpoints)\n/// for instance.\n///\n/// @author Hugo Giraudel\n///\n/// @param {Map} $tweakpoints [()] - Map of tweakpoints to be merged with `$breakpoints`\n/// @param {Map} $tweak-media-expressions [()] - Map of tweaked media expressions to be merged with `$media-expression`\n///\n/// @example scss - Extend the global breakpoints with a tweakpoint\n/// @include media-context(('custom': 678px)) {\n/// .foo {\n/// @include media('>phone', '<=custom') {\n/// // ...\n/// }\n/// }\n/// }\n///\n/// @example scss - Extend the global media expressions with a custom one\n/// @include media-context($tweak-media-expressions: ('all': 'all')) {\n/// .foo {\n/// @include media('all', '>phone') {\n/// // ...\n/// }\n/// }\n/// }\n///\n/// @example scss - Extend both configuration maps\n/// @include media-context(('custom': 678px), ('all': 'all')) {\n/// .foo {\n/// @include media('all', '>phone', '<=custom') {\n/// // ...\n/// }\n/// }\n/// }\n///\n@mixin media-context($tweakpoints: (), $tweak-media-expressions: ()) {\n // Save global configuration\n $global-breakpoints: $breakpoints;\n $global-media-expressions: $media-expressions;\n\n // Update global configuration\n $breakpoints: map-merge($breakpoints, $tweakpoints) !global;\n $media-expressions: map-merge($media-expressions, $tweak-media-expressions) !global;\n\n @content;\n\n // Restore global configuration\n $breakpoints: $global-breakpoints !global;\n $media-expressions: $global-media-expressions !global;\n}\n\n////\n/// include-media public exposed API\n/// @author Eduardo Boucas\n/// @access public\n////\n\n\n///\n/// Generates a media query based on a list of conditions\n///\n/// @param {Arglist} $conditions - Media query conditions\n///\n/// @example scss - With a single set breakpoint\n/// @include media('>phone') { }\n///\n/// @example scss - With two set breakpoints\n/// @include media('>phone', '<=tablet') { }\n///\n/// @example scss - With custom values\n/// @include media('>=358px', '<850px') { }\n///\n/// @example scss - With set breakpoints with custom values\n/// @include media('>desktop', '<=1350px') { }\n///\n/// @example scss - With a static expression\n/// @include media('retina2x') { }\n///\n/// @example scss - Mixing everything\n/// @include media('>=350px', ' 0) {\n @media #{unquote(parse-expression(nth($conditions, 1)))} {\n // Recursive call\n @include media(slice($conditions, 2)...) {\n @content;\n }\n }\n }\n}\n","#about-me-parent {\n margin-left: 10px;\n margin-right: 10px;\n display: flex;\n flex-direction: row;\n justify-content: center;\n\n b {\n font-weight: 600;\n }\n\n .about-me-card {\n background: #61dafb;\n border-radius: 5px;\n margin: 0 5px 0;\n padding: 10px;\n width: fit-content;\n }\n\n #about-me {\n background: #61dafb;\n border-radius: 5px;\n padding: 15px;\n width: fit-content;\n\n #info-parent {\n display: flex;\n flex-direction: row;\n\n #specific-info {\n flex: 1 1 0;\n }\n\n #fun-info {\n flex: 1 1 0;\n }\n\n @media screen and (max-width: 660px) {\n flex-direction: column;\n }\n }\n\n h1 {\n font-family: \"Fira Code\", monospace;\n font-weight: 500;\n }\n\n h2 {\n font-family: \"Fira Code\", monospace;\n line-height: normal;\n margin-bottom: 0;\n font-weight: 400;\n\n text-align: left;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n font-size: 16px;\n margin: 0;\n }\n\n ul {\n text-align: left;\n padding-left: 40px;\n margin-bottom: 0;\n }\n\n li {\n font-family: \"Montserrat\", sans-serif;\n font-size: 18px;\n list-style-type: symbols(\"+\");\n list-style-position: inside;\n\n }\n }\n\n}\n\nbutton {\n background: none!important;\n border: none;\n padding: 0!important;\n color: #1890ff;\n cursor: pointer;\n}\n"]}
\ No newline at end of file
diff --git a/static/css/main.f31ed6c9.chunk.css b/static/css/main.f31ed6c9.chunk.css
deleted file mode 100644
index 987b7ae..0000000
--- a/static/css/main.f31ed6c9.chunk.css
+++ /dev/null
@@ -1,2 +0,0 @@
-@import url(https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600&family=Montserrat:wght@400;600;700&display=swap);body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,"Courier New",monospace}.App{text-align:center}.App-logo{height:40vmin;pointer-events:none}@media (prefers-reduced-motion:no-preference){.App-logo{-webkit-animation:App-logo-spin 20s linear infinite;animation:App-logo-spin 20s linear infinite}}.App-header{background-color:#282c34;min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:calc(10px + 2vmin);color:#fff}.App-link{color:#61dafb}@-webkit-keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.site-footer{background:#a9a9a9;margin:10px;border-radius:5px}.site-footer h2{font-family:"Fira Code",monospace;margin:0}.site-footer p{font-family:"Montserrat",sans-serif}@media screen and (min-width:900px){.site-footer p{font-size:16px}}.footer-grid{display:flex;justify-content:space-evenly}.footer-grid .blurb{flex:9 1}.footer-grid .links-container{flex:4 1}.footer-grid .footer-links{padding-left:0;margin:0;-webkit-columns:100px 2;columns:100px 2}.footer-grid .footer-links li{list-style:none}.footer-grid .footer-links a{font-family:"Montserrat",sans-serif;text-decoration:underline}header{display:flex;flex-direction:row;margin:10px;padding:10px;border-radius:5px;background:#66bb6a;font-family:"Fira Code",monospace}header h1{font-weight:600;margin:0 0 0 5px}header .headerLinks{display:flex;flex-direction:row;align-content:center;margin-left:auto}header .headerLinks h2{margin:0;border-radius:5px;line-height:normal}header .headerLinks h2:hover{background:#ddd}header .headerLinks h2.active{background-color:#4caf50;color:#fff}header .headerLinks h2:last-of-type{margin-right:5px}header .icon{display:none}@media screen and (max-width:660px){header h2{display:none}header .icon{margin-left:auto;display:block;position:absolute;top:19px;right:24px;font-size:30px;border:none}header .headerLinks{visibility:hidden;transition:visibility 0s,opacity .5s linear}}@media screen and (max-width:660px){header.responsive{display:block}header.responsive .headerLinks{visibility:visible;display:flex;flex-direction:column;align-items:flex-start}header.responsive h1{text-align:left}header.responsive h2{display:block;margin-left:5px}}#project-grid-parent{margin:10px;background:#ffd43b;border-radius:5px}#project-grid-parent>#project-header{background:grey;border-radius:5px 5px 0 0;margin-bottom:2px;padding:5px}#project-grid-parent>#project-header h2{margin-bottom:0;font-family:"Fira Code",monospace;font-size:24px}#project-grid-parent>#project-header p{margin:0 0 3px;font-family:"Montserrat",sans-serif;font-size:18px}@media (max-width:400px){#project-grid .FourByOne,#project-grid .GridSizer,#project-grid .OneWide{width:100%}}@media (min-width:401px) and (max-width:659px){#project-grid .GridSizer,#project-grid .OneWide{width:49%}#project-grid .FourByOne{width:100%}}@media (min-width:660px) and (max-width:899px){#project-grid .GridSizer,#project-grid .OneWide{width:33%}#project-grid .FourByOne{width:99%}}@media (min-width:900px) and (max-width:1299px){#project-grid .GridSizer,#project-grid .OneWide{width:24.9%}#project-grid .FourByOne{width:74.6%}}@media (min-width:1300px) and (max-width:1559px){#project-grid .GridSizer,#project-grid .OneWide{max-width:300px;width:19.9%}#project-grid .FourByOne{width:59.5%;max-width:900px}}@media (min-width:1560px){#project-grid .GridSizer,#project-grid .OneWide{width:300px}#project-grid .FourByOne{width:900px}}.GridElement{padding:5px}.GridElement .GridElementInternal{padding:9px;border-radius:5px;background:#e0ffff;box-shadow:0 1px 2px rgba(0,0,0,.15);transition:box-shadow .3s ease-in-out}.GridElement .GridElementInternal:hover{box-shadow:0 2px 5px rgba(0,0,0,.3)}.GridElement h2{font-family:"Fira Code",monospace;font-weight:400;margin-bottom:0;line-height:normal}.GridElement h3{line-height:normal;color:#a9a9a9;margin-bottom:3px}.GridElement p{font-family:"Montserrat",sans-serif;color:#000;margin-bottom:0}.OneWide{display:flex;flex-direction:column;width:available}.OneWide img{width:100%;margin-bottom:5px}.FourByOne .GridElementInternal{display:flex;align-items:center}.FourByOne .GridElementInternal .image{flex:1 1}.FourByOne .GridElementInternal .image img{width:100%;max-width:100%}.FourByOne .GridElementInternal .description{min-width:20ch;width:30ch}@media (min-width:661px){.FourByOne .GridElementInternal{flex-direction:row}}@media (max-width:660px){.FourByOne .GridElementInternal{flex-direction:column}.FourByOne .GridElementInternal .description{width:95%}}.LinkIcon{position:absolute;right:12px;top:12px;font-size:24px;color:#000;background:rgba(224,255,255,.7);border-radius:5px}#about-me-parent{margin-left:10px;margin-right:10px;display:flex;flex-direction:row;justify-content:center}#about-me-parent b{font-weight:600}#about-me-parent .about-me-card{margin:0 5px;padding:10px}#about-me-parent #about-me,#about-me-parent .about-me-card{background:#61dafb;border-radius:5px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}#about-me-parent #about-me{padding:15px}#about-me-parent #about-me #info-parent{display:flex;flex-direction:row}#about-me-parent #about-me #info-parent #fun-info,#about-me-parent #about-me #info-parent #specific-info{flex:1 1}@media screen and (max-width:660px){#about-me-parent #about-me #info-parent{flex-direction:column}}#about-me-parent #about-me h1{font-family:"Fira Code",monospace;font-weight:500}#about-me-parent #about-me h2{font-family:"Fira Code",monospace;line-height:normal;margin-bottom:0;font-weight:400;text-align:left}#about-me-parent #about-me p{font-family:"Montserrat",sans-serif;font-size:16px;margin:0}#about-me-parent #about-me ul{text-align:left;padding-left:40px;margin-bottom:0}#about-me-parent #about-me li{font-family:"Montserrat",sans-serif;font-size:18px;list-style-type:symbols("+");list-style-position:inside}button{background:none!important;border:none;padding:0!important;color:#1890ff;cursor:pointer}
-/*# sourceMappingURL=main.f31ed6c9.chunk.css.map */
\ No newline at end of file
diff --git a/static/css/main.f31ed6c9.chunk.css.map b/static/css/main.f31ed6c9.chunk.css.map
deleted file mode 100644
index 9bc294a..0000000
--- a/static/css/main.f31ed6c9.chunk.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["main.f31ed6c9.chunk.css","webpack://src/index.scss","webpack://src/App.scss","webpack://src/components/Footer.scss","webpack://src/components/Header.scss","webpack://src/components/ProjectGrid.scss","webpack://node_modules/include-media/dist/_include-media.scss","webpack://src/components/AboutMe.scss"],"names":[],"mappings":"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","file":"main.f31ed6c9.chunk.css","sourcesContent":["@import url(https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600&family=Montserrat:wght@400;600;700&display=swap);\nbody{margin:0;font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace}\n\n\n\n.App{text-align:center}.App-logo{height:40vmin;pointer-events:none}@media (prefers-reduced-motion: no-preference){.App-logo{-webkit-animation:App-logo-spin infinite 20s linear;animation:App-logo-spin infinite 20s linear}}.App-header{background-color:#282c34;min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:calc(10px + 2vmin);color:white}.App-link{color:#61dafb}@-webkit-keyframes App-logo-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes App-logo-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n\n.site-footer{background:darkgrey;margin:10px;border-radius:5px}.site-footer h2{font-family:\"Fira Code\", monospace;margin:0}.site-footer p{font-family:\"Montserrat\", sans-serif}@media screen and (min-width: 900px){.site-footer p{font-size:16px}}.footer-grid{display:flex;justify-content:space-evenly}.footer-grid .blurb{flex:9 1}.footer-grid .links-container{flex:4 1}.footer-grid .footer-links{padding-left:0;margin:0;-webkit-columns:100px 2;columns:100px 2}.footer-grid .footer-links li{list-style:none}.footer-grid .footer-links a{font-family:\"Montserrat\", sans-serif;text-decoration:underline}\n\nheader{display:flex;flex-direction:row;margin:10px;padding:10px;border-radius:5px;background:#66bb6a;font-family:\"Fira Code\", monospace}header h1{font-weight:600;margin:0 0 0 5px}header .headerLinks{display:flex;flex-direction:row;align-content:center;margin-left:auto}header .headerLinks h2{margin:0;border-radius:5px;line-height:normal}header .headerLinks h2:hover{background:#ddd}header .headerLinks h2.active{background-color:#4CAF50;color:white}header .headerLinks h2:last-of-type{margin-right:5px}header .icon{display:none}@media screen and (max-width: 660px){header h2{display:none}header .icon{margin-left:auto;display:block;position:absolute;top:19px;right:24px;font-size:30px;border:none}header .headerLinks{visibility:hidden;transition:visibility 0s, opacity 0.5s linear}}@media screen and (max-width: 660px){header.responsive{display:block}header.responsive .headerLinks{visibility:visible;display:flex;flex-direction:column;align-items:flex-start}header.responsive h1{text-align:left}header.responsive h2{display:block;margin-left:5px}}\n\n\n#project-grid-parent{margin:10px;background:#FFD43B;border-radius:5px}#project-grid-parent>#project-header{background:grey;border-radius:5px 5px 0 0;margin-bottom:2px;padding:5px}#project-grid-parent>#project-header h2{margin-bottom:0;font-family:\"Fira Code\", monospace;font-size:24px}#project-grid-parent>#project-header p{margin:0 0 3px;font-family:\"Montserrat\", sans-serif;font-size:18px}@media (max-width: 400px){#project-grid .GridSizer,#project-grid .OneWide,#project-grid .FourByOne{width:100%}}@media (min-width: 401px) and (max-width: 659px){#project-grid .GridSizer,#project-grid .OneWide{width:49%}#project-grid .FourByOne{width:100%}}@media (min-width: 660px) and (max-width: 899px){#project-grid .GridSizer,#project-grid .OneWide{width:33%}#project-grid .FourByOne{width:99%}}@media (min-width: 900px) and (max-width: 1299px){#project-grid .GridSizer,#project-grid .OneWide{width:24.9%}#project-grid .FourByOne{width:74.6%}}@media (min-width: 1300px) and (max-width: 1559px){#project-grid .GridSizer,#project-grid .OneWide{max-width:300px;width:19.9%}#project-grid .FourByOne{width:59.5%;max-width:900px}}@media (min-width: 1560px){#project-grid .GridSizer,#project-grid .OneWide{width:300px}#project-grid .FourByOne{width:900px}}.GridElement{padding:5px}.GridElement .GridElementInternal{padding:9px;border-radius:5px;background:lightcyan;box-shadow:0 1px 2px rgba(0,0,0,0.15);transition:box-shadow 0.3s ease-in-out}.GridElement .GridElementInternal:hover{box-shadow:0 2px 5px rgba(0,0,0,0.3)}.GridElement h2{font-family:\"Fira Code\", monospace;font-weight:400;margin-bottom:0px;line-height:normal}.GridElement h3{line-height:normal;color:darkgrey;margin-bottom:3px}.GridElement p{font-family:\"Montserrat\", sans-serif;color:black;margin-bottom:0}.OneWide{display:flex;flex-direction:column;width:available}.OneWide img{width:100%;margin-bottom:5px}.FourByOne .GridElementInternal{display:flex;align-items:center}.FourByOne .GridElementInternal .image{flex:1 1}.FourByOne .GridElementInternal .image img{width:100%;max-width:100%}.FourByOne .GridElementInternal .description{min-width:20ch;width:30ch}@media (min-width: 661px){.FourByOne .GridElementInternal{flex-direction:row}}@media (max-width: 660px){.FourByOne .GridElementInternal{flex-direction:column}.FourByOne .GridElementInternal .description{width:95%}}.LinkIcon{position:absolute;right:12px;top:12px;font-size:24px;color:black;background:rgba(224,255,255,0.7);border-radius:5px}\n\n#about-me-parent{margin-left:10px;margin-right:10px;display:flex;flex-direction:row;justify-content:center}#about-me-parent b{font-weight:600}#about-me-parent .about-me-card{background:#61dafb;border-radius:5px;margin:0 5px 0;padding:10px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}#about-me-parent #about-me{background:#61dafb;border-radius:5px;padding:15px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}#about-me-parent #about-me #info-parent{display:flex;flex-direction:row}#about-me-parent #about-me #info-parent #specific-info{flex:1 1}#about-me-parent #about-me #info-parent #fun-info{flex:1 1}@media screen and (max-width: 660px){#about-me-parent #about-me #info-parent{flex-direction:column}}#about-me-parent #about-me h1{font-family:\"Fira Code\", monospace;font-weight:500}#about-me-parent #about-me h2{font-family:\"Fira Code\", monospace;line-height:normal;margin-bottom:0;font-weight:400;text-align:left}#about-me-parent #about-me p{font-family:\"Montserrat\", sans-serif;font-size:16px;margin:0}#about-me-parent #about-me ul{text-align:left;padding-left:40px;margin-bottom:0}#about-me-parent #about-me li{font-family:\"Montserrat\", sans-serif;font-size:18px;list-style-type:symbols(\"+\");list-style-position:inside}button{background:none !important;border:none;padding:0 !important;color:#1890ff;cursor:pointer}\n\n","body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n","@import '~antd/dist/antd.css';\n\n.App {\n text-align: center;\n}\n\n.App-logo {\n height: 40vmin;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .App-logo {\n animation: App-logo-spin infinite 20s linear;\n }\n}\n\n.App-header {\n background-color: #282c34;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: calc(10px + 2vmin);\n color: white;\n}\n\n.App-link {\n color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n",".site-footer {\n background: darkgrey;\n margin: 10px;\n border-radius: 5px;\n\n h2 {\n font-family: \"Fira Code\", monospace;\n margin: 0;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n\n @media screen and (min-width: 900px) {\n font-size: 16px;\n }\n }\n}\n\n.footer-grid {\n display: flex;\n justify-content: space-evenly;\n\n .blurb {\n flex: 9;\n }\n\n .links-container {\n flex: 4;\n }\n\n .footer-links {\n padding-left: 0;\n margin: 0;\n\n columns: 100px 2;\n\n li {\n list-style: none;\n }\n\n a {\n //color: black;\n font-family: \"Montserrat\", sans-serif;\n text-decoration: underline;\n }\n }\n\n}\n","header {\n display: flex;\n flex-direction: row;\n\n margin: 10px;\n padding: 10px;\n border-radius: 5px;\n background: #66bb6a;\n font-family: \"Fira Code\", monospace;\n\n h1 {\n font-weight: 600;\n margin: 0 0 0 5px;\n }\n\n .headerLinks {\n display: flex;\n flex-direction: row;\n align-content: center;\n margin-left: auto;\n\n h2 {\n margin: 0;\n border-radius: 5px;\n line-height: normal;\n\n &:hover {\n background: #ddd;\n }\n\n &.active {\n background-color: #4CAF50;\n color: white;\n }\n }\n\n h2:last-of-type {\n margin-right: 5px;\n }\n }\n\n /* Hide the link that should open and close the topnav on small screens */\n .icon {\n display: none;\n }\n\n @media screen and (max-width: 660px) {\n h2 {\n display: none;\n }\n\n .icon {\n margin-left: auto;\n display: block;\n position: absolute;\n top: 19px;\n right: 24px;\n font-size: 30px;\n border: none;\n }\n\n .headerLinks {\n visibility: hidden;\n transition: visibility 0s, opacity 0.5s linear;\n }\n }\n\n @media screen and (max-width: 660px) {\n &.responsive {\n display: block;\n\n .headerLinks {\n visibility: visible;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n }\n\n h1 {\n text-align: left;\n }\n\n h2 {\n display: block;\n margin-left: 5px;\n }\n }\n }\n}\n","@import \"~include-media/dist/_include-media.scss\";\n\n$breakpoints: (x-small: 400px, small: 660px, medium: 900px, large: 1300px, x-large: 1560px);\n\n// Override Sass min()\n@function min($numbers...) {\n @return m#{i}n(#{$numbers});\n}\n\n// Override Sass max()\n@function max($numbers...) {\n @return m#{a}x(#{$numbers});\n}\n\n#project-grid-parent {\n margin: 10px;\n background: #FFD43B;\n border-radius: 5px;\n\n & > #project-header {\n background: grey;\n border-radius: 5px 5px 0 0;\n margin-bottom: 2px;\n\n padding: 5px;\n\n h2 {\n margin-bottom: 0;\n font-family: \"Fira Code\", monospace;\n font-size: 24px;\n }\n\n p {\n margin: 0 0 3px;\n font-family: \"Montserrat\", sans-serif;\n font-size: 18px;\n }\n\n }\n}\n\n\n#project-grid {\n\n //padding: 10px;\n\n @include media(\"<=x-small\") {\n .GridSizer, .OneWide, .FourByOne {\n width: 100%;\n }\n }\n\n @include media(\">x-small\", \"=small\", \"=medium\", \"=large\", \"=x-large\") {\n .GridSizer, .OneWide {\n width: 300px;\n }\n .FourByOne {\n width: 900px;\n }\n }\n}\n\n.GridElement {\n padding: 5px;\n\n .GridElementInternal {\n padding: 9px;\n border-radius: 5px;\n background: lightcyan;\n\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);\n transition: box-shadow 0.3s ease-in-out;\n }\n\n .GridElementInternal:hover {\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);\n }\n\n h2 {\n font-family: \"Fira Code\", monospace;\n font-weight: 400;\n margin-bottom: 0px;\n line-height: normal;\n }\n\n h3 {\n line-height: normal;\n color: darkgrey;\n margin-bottom: 3px;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n color: black;\n margin-bottom: 0;\n }\n}\n\n.OneWide {\n display: flex;\n flex-direction: column;\n width: available;\n\n img {\n width: 100%;\n margin-bottom: 5px;\n }\n}\n\n.FourByOne {\n .GridElementInternal {\n display: flex;\n align-items: center;\n\n .image {\n flex: 1;\n\n img {\n width: 100%;\n max-width: 100%;\n }\n }\n\n .description {\n min-width: 20ch;\n width: 30ch;\n }\n\n @include media(\">small\") {\n flex-direction: row;\n\n }\n @include media(\"<=small\") {\n flex-direction: column;\n .description {\n width: 95%;\n }\n }\n }\n}\n\n.LinkIcon {\n position: absolute;\n right: 12px;\n top: 12px;\n font-size: 24px;\n color: black;\n\n background: rgba(224, 255, 255, 0.7);\n border-radius: 5px;\n}\n","@charset \"UTF-8\";\n\n// _ _ _ _ _\n// (_) | | | | | (_)\n// _ _ __ ___| |_ _ __| | ___ _ __ ___ ___ __| |_ __ _\n// | | '_ \\ / __| | | | |/ _` |/ _ \\ | '_ ` _ \\ / _ \\/ _` | |/ _` |\n// | | | | | (__| | |_| | (_| | __/ | | | | | | __/ (_| | | (_| |\n// |_|_| |_|\\___|_|\\__,_|\\__,_|\\___| |_| |_| |_|\\___|\\__,_|_|\\__,_|\n//\n// Simple, elegant and maintainable media queries in Sass\n// v1.4.9\n//\n// http://include-media.com\n//\n// Authors: Eduardo Boucas (@eduardoboucas)\n// Hugo Giraudel (@hugogiraudel)\n//\n// This project is licensed under the terms of the MIT license\n\n\n////\n/// include-media library public configuration\n/// @author Eduardo Boucas\n/// @access public\n////\n\n\n///\n/// Creates a list of global breakpoints\n///\n/// @example scss - Creates a single breakpoint with the label `phone`\n/// $breakpoints: ('phone': 320px);\n///\n$breakpoints: (\n 'phone': 320px,\n 'tablet': 768px,\n 'desktop': 1024px\n) !default;\n\n\n///\n/// Creates a list of static expressions or media types\n///\n/// @example scss - Creates a single media type (screen)\n/// $media-expressions: ('screen': 'screen');\n///\n/// @example scss - Creates a static expression with logical disjunction (OR operator)\n/// $media-expressions: (\n/// 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)'\n/// );\n///\n$media-expressions: (\n 'screen': 'screen',\n 'print': 'print',\n 'handheld': 'handheld',\n 'landscape': '(orientation: landscape)',\n 'portrait': '(orientation: portrait)',\n 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi), (min-resolution: 2dppx)',\n 'retina3x': '(-webkit-min-device-pixel-ratio: 3), (min-resolution: 350dpi), (min-resolution: 3dppx)'\n) !default;\n\n\n///\n/// Defines a number to be added or subtracted from each unit when declaring breakpoints with exclusive intervals\n///\n/// @example scss - Interval for pixels is defined as `1` by default\n/// @include media('>128px') {}\n///\n/// /* Generates: */\n/// @media (min-width: 129px) {}\n///\n/// @example scss - Interval for ems is defined as `0.01` by default\n/// @include media('>20em') {}\n///\n/// /* Generates: */\n/// @media (min-width: 20.01em) {}\n///\n/// @example scss - Interval for rems is defined as `0.1` by default, to be used with `font-size: 62.5%;`\n/// @include media('>2.0rem') {}\n///\n/// /* Generates: */\n/// @media (min-width: 2.1rem) {}\n///\n$unit-intervals: (\n 'px': 1,\n 'em': 0.01,\n 'rem': 0.1,\n '': 0\n) !default;\n\n///\n/// Defines whether support for media queries is available, useful for creating separate stylesheets\n/// for browsers that don't support media queries.\n///\n/// @example scss - Disables support for media queries\n/// $im-media-support: false;\n/// @include media('>=tablet') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* Generates: */\n/// .foo {\n/// color: tomato;\n/// }\n///\n$im-media-support: true !default;\n\n///\n/// Selects which breakpoint to emulate when support for media queries is disabled. Media queries that start at or\n/// intercept the breakpoint will be displayed, any others will be ignored.\n///\n/// @example scss - This media query will show because it intercepts the static breakpoint\n/// $im-media-support: false;\n/// $im-no-media-breakpoint: 'desktop';\n/// @include media('>=tablet') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* Generates: */\n/// .foo {\n/// color: tomato;\n/// }\n///\n/// @example scss - This media query will NOT show because it does not intercept the desktop breakpoint\n/// $im-media-support: false;\n/// $im-no-media-breakpoint: 'tablet';\n/// @include media('>=desktop') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* No output */\n///\n$im-no-media-breakpoint: 'desktop' !default;\n\n///\n/// Selects which media expressions are allowed in an expression for it to be used when media queries\n/// are not supported.\n///\n/// @example scss - This media query will show because it intercepts the static breakpoint and contains only accepted media expressions\n/// $im-media-support: false;\n/// $im-no-media-breakpoint: 'desktop';\n/// $im-no-media-expressions: ('screen');\n/// @include media('>=tablet', 'screen') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* Generates: */\n/// .foo {\n/// color: tomato;\n/// }\n///\n/// @example scss - This media query will NOT show because it intercepts the static breakpoint but contains a media expression that is not accepted\n/// $im-media-support: false;\n/// $im-no-media-breakpoint: 'desktop';\n/// $im-no-media-expressions: ('screen');\n/// @include media('>=tablet', 'retina2x') {\n/// .foo {\n/// color: tomato;\n/// }\n/// }\n///\n/// /* No output */\n///\n$im-no-media-expressions: ('screen', 'portrait', 'landscape') !default;\n\n////\n/// Cross-engine logging engine\n/// @author Hugo Giraudel\n/// @access private\n////\n\n\n///\n/// Log a message either with `@error` if supported\n/// else with `@warn`, using `feature-exists('at-error')`\n/// to detect support.\n///\n/// @param {String} $message - Message to log\n///\n@function im-log($message) {\n @if feature-exists('at-error') {\n @error $message;\n } @else {\n @warn $message;\n $_: noop();\n }\n\n @return $message;\n}\n\n\n///\n/// Wrapper mixin for the log function so it can be used with a more friendly\n/// API than `@if im-log('..') {}` or `$_: im-log('..')`. Basically, use the function\n/// within functions because it is not possible to include a mixin in a function\n/// and use the mixin everywhere else because it's much more elegant.\n///\n/// @param {String} $message - Message to log\n///\n@mixin log($message) {\n @if im-log($message) {}\n}\n\n\n///\n/// Function with no `@return` called next to `@warn` in Sass 3.3\n/// to trigger a compiling error and stop the process.\n///\n@function noop() {}\n\n///\n/// Determines whether a list of conditions is intercepted by the static breakpoint.\n///\n/// @param {Arglist} $conditions - Media query conditions\n///\n/// @return {Boolean} - Returns true if the conditions are intercepted by the static breakpoint\n///\n@function im-intercepts-static-breakpoint($conditions...) {\n $no-media-breakpoint-value: map-get($breakpoints, $im-no-media-breakpoint);\n\n @if not $no-media-breakpoint-value {\n @if im-log('`#{$im-no-media-breakpoint}` is not a valid breakpoint.') {}\n }\n\n @each $condition in $conditions {\n @if not map-has-key($media-expressions, $condition) {\n $operator: get-expression-operator($condition);\n $prefix: get-expression-prefix($operator);\n $value: get-expression-value($condition, $operator);\n\n // scss-lint:disable SpaceAroundOperator\n @if ($prefix == 'max' and $value <= $no-media-breakpoint-value) or\n ($prefix == 'min' and $value > $no-media-breakpoint-value) {\n @return false;\n }\n } @else if not index($im-no-media-expressions, $condition) {\n @return false;\n }\n }\n\n @return true;\n}\n\n////\n/// Parsing engine\n/// @author Hugo Giraudel\n/// @access private\n////\n\n\n///\n/// Get operator of an expression\n///\n/// @param {String} $expression - Expression to extract operator from\n///\n/// @return {String} - Any of `>=`, `>`, `<=`, `<`, `≥`, `≤`\n///\n@function get-expression-operator($expression) {\n @each $operator in ('>=', '>', '<=', '<', '≥', '≤') {\n @if str-index($expression, $operator) {\n @return $operator;\n }\n }\n\n // It is not possible to include a mixin inside a function, so we have to\n // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because\n // functions cannot be called anywhere in Sass, we need to hack the call in\n // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with\n // Sass 3.3, change this line in `@if im-log(..) {}` instead.\n $_: im-log('No operator found in `#{$expression}`.');\n}\n\n\n///\n/// Get dimension of an expression, based on a found operator\n///\n/// @param {String} $expression - Expression to extract dimension from\n/// @param {String} $operator - Operator from `$expression`\n///\n/// @return {String} - `width` or `height` (or potentially anything else)\n///\n@function get-expression-dimension($expression, $operator) {\n $operator-index: str-index($expression, $operator);\n $parsed-dimension: str-slice($expression, 0, $operator-index - 1);\n $dimension: 'width';\n\n @if str-length($parsed-dimension) > 0 {\n $dimension: $parsed-dimension;\n }\n\n @return $dimension;\n}\n\n\n///\n/// Get dimension prefix based on an operator\n///\n/// @param {String} $operator - Operator\n///\n/// @return {String} - `min` or `max`\n///\n@function get-expression-prefix($operator) {\n @return if(index(('<', '<=', '≤'), $operator), 'max', 'min');\n}\n\n\n///\n/// Get value of an expression, based on a found operator\n///\n/// @param {String} $expression - Expression to extract value from\n/// @param {String} $operator - Operator from `$expression`\n///\n/// @return {Number} - A numeric value\n///\n@function get-expression-value($expression, $operator) {\n $operator-index: str-index($expression, $operator);\n $value: str-slice($expression, $operator-index + str-length($operator));\n\n @if map-has-key($breakpoints, $value) {\n $value: map-get($breakpoints, $value);\n } @else {\n $value: to-number($value);\n }\n\n $interval: map-get($unit-intervals, unit($value));\n\n @if not $interval {\n // It is not possible to include a mixin inside a function, so we have to\n // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because\n // functions cannot be called anywhere in Sass, we need to hack the call in\n // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with\n // Sass 3.3, change this line in `@if im-log(..) {}` instead.\n $_: im-log('Unknown unit `#{unit($value)}`.');\n }\n\n @if $operator == '>' {\n $value: $value + $interval;\n } @else if $operator == '<' {\n $value: $value - $interval;\n }\n\n @return $value;\n}\n\n\n///\n/// Parse an expression to return a valid media-query expression\n///\n/// @param {String} $expression - Expression to parse\n///\n/// @return {String} - Valid media query\n///\n@function parse-expression($expression) {\n // If it is part of $media-expressions, it has no operator\n // then there is no need to go any further, just return the value\n @if map-has-key($media-expressions, $expression) {\n @return map-get($media-expressions, $expression);\n }\n\n $operator: get-expression-operator($expression);\n $dimension: get-expression-dimension($expression, $operator);\n $prefix: get-expression-prefix($operator);\n $value: get-expression-value($expression, $operator);\n\n @return '(#{$prefix}-#{$dimension}: #{$value})';\n}\n\n///\n/// Slice `$list` between `$start` and `$end` indexes\n///\n/// @access private\n///\n/// @param {List} $list - List to slice\n/// @param {Number} $start [1] - Start index\n/// @param {Number} $end [length($list)] - End index\n///\n/// @return {List} Sliced list\n///\n@function slice($list, $start: 1, $end: length($list)) {\n @if length($list) < 1 or $start > $end {\n @return ();\n }\n\n $result: ();\n\n @for $i from $start through $end {\n $result: append($result, nth($list, $i));\n }\n\n @return $result;\n}\n\n////\n/// String to number converter\n/// @author Hugo Giraudel\n/// @access private\n////\n\n\n///\n/// Casts a string into a number\n///\n/// @param {String | Number} $value - Value to be parsed\n///\n/// @return {Number}\n///\n@function to-number($value) {\n @if type-of($value) == 'number' {\n @return $value;\n } @else if type-of($value) != 'string' {\n $_: im-log('Value for `to-number` should be a number or a string.');\n }\n\n $first-character: str-slice($value, 1, 1);\n $result: 0;\n $digits: 0;\n $minus: ($first-character == '-');\n $numbers: ('0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9);\n\n // Remove +/- sign if present at first character\n @if ($first-character == '+' or $first-character == '-') {\n $value: str-slice($value, 2);\n }\n\n @for $i from 1 through str-length($value) {\n $character: str-slice($value, $i, $i);\n\n @if not (index(map-keys($numbers), $character) or $character == '.') {\n @return to-length(if($minus, -$result, $result), str-slice($value, $i))\n }\n\n @if $character == '.' {\n $digits: 1;\n } @else if $digits == 0 {\n $result: $result * 10 + map-get($numbers, $character);\n } @else {\n $digits: $digits * 10;\n $result: $result + map-get($numbers, $character) / $digits;\n }\n }\n\n @return if($minus, -$result, $result);\n}\n\n\n///\n/// Add `$unit` to `$value`\n///\n/// @param {Number} $value - Value to add unit to\n/// @param {String} $unit - String representation of the unit\n///\n/// @return {Number} - `$value` expressed in `$unit`\n///\n@function to-length($value, $unit) {\n $units: ('px': 1px, 'cm': 1cm, 'mm': 1mm, '%': 1%, 'ch': 1ch, 'pc': 1pc, 'in': 1in, 'em': 1em, 'rem': 1rem, 'pt': 1pt, 'ex': 1ex, 'vw': 1vw, 'vh': 1vh, 'vmin': 1vmin, 'vmax': 1vmax);\n\n @if not index(map-keys($units), $unit) {\n $_: im-log('Invalid unit `#{$unit}`.');\n }\n\n @return $value * map-get($units, $unit);\n}\n\n///\n/// This mixin aims at redefining the configuration just for the scope of\n/// the call. It is helpful when having a component needing an extended\n/// configuration such as custom breakpoints (referred to as tweakpoints)\n/// for instance.\n///\n/// @author Hugo Giraudel\n///\n/// @param {Map} $tweakpoints [()] - Map of tweakpoints to be merged with `$breakpoints`\n/// @param {Map} $tweak-media-expressions [()] - Map of tweaked media expressions to be merged with `$media-expression`\n///\n/// @example scss - Extend the global breakpoints with a tweakpoint\n/// @include media-context(('custom': 678px)) {\n/// .foo {\n/// @include media('>phone', '<=custom') {\n/// // ...\n/// }\n/// }\n/// }\n///\n/// @example scss - Extend the global media expressions with a custom one\n/// @include media-context($tweak-media-expressions: ('all': 'all')) {\n/// .foo {\n/// @include media('all', '>phone') {\n/// // ...\n/// }\n/// }\n/// }\n///\n/// @example scss - Extend both configuration maps\n/// @include media-context(('custom': 678px), ('all': 'all')) {\n/// .foo {\n/// @include media('all', '>phone', '<=custom') {\n/// // ...\n/// }\n/// }\n/// }\n///\n@mixin media-context($tweakpoints: (), $tweak-media-expressions: ()) {\n // Save global configuration\n $global-breakpoints: $breakpoints;\n $global-media-expressions: $media-expressions;\n\n // Update global configuration\n $breakpoints: map-merge($breakpoints, $tweakpoints) !global;\n $media-expressions: map-merge($media-expressions, $tweak-media-expressions) !global;\n\n @content;\n\n // Restore global configuration\n $breakpoints: $global-breakpoints !global;\n $media-expressions: $global-media-expressions !global;\n}\n\n////\n/// include-media public exposed API\n/// @author Eduardo Boucas\n/// @access public\n////\n\n\n///\n/// Generates a media query based on a list of conditions\n///\n/// @param {Arglist} $conditions - Media query conditions\n///\n/// @example scss - With a single set breakpoint\n/// @include media('>phone') { }\n///\n/// @example scss - With two set breakpoints\n/// @include media('>phone', '<=tablet') { }\n///\n/// @example scss - With custom values\n/// @include media('>=358px', '<850px') { }\n///\n/// @example scss - With set breakpoints with custom values\n/// @include media('>desktop', '<=1350px') { }\n///\n/// @example scss - With a static expression\n/// @include media('retina2x') { }\n///\n/// @example scss - Mixing everything\n/// @include media('>=350px', ' 0) {\n @media #{unquote(parse-expression(nth($conditions, 1)))} {\n // Recursive call\n @include media(slice($conditions, 2)...) {\n @content;\n }\n }\n }\n}\n","#about-me-parent {\n margin-left: 10px;\n margin-right: 10px;\n display: flex;\n flex-direction: row;\n justify-content: center;\n\n b {\n font-weight: 600;\n }\n\n .about-me-card {\n background: #61dafb;\n border-radius: 5px;\n margin: 0 5px 0;\n padding: 10px;\n width: fit-content;\n }\n\n #about-me {\n background: #61dafb;\n border-radius: 5px;\n padding: 15px;\n width: fit-content;\n\n #info-parent {\n display: flex;\n flex-direction: row;\n\n #specific-info {\n flex: 1 1 0;\n }\n\n #fun-info {\n flex: 1 1 0;\n }\n\n @media screen and (max-width: 660px) {\n flex-direction: column;\n }\n }\n\n h1 {\n font-family: \"Fira Code\", monospace;\n font-weight: 500;\n }\n\n h2 {\n font-family: \"Fira Code\", monospace;\n line-height: normal;\n margin-bottom: 0;\n font-weight: 400;\n\n text-align: left;\n }\n\n p {\n font-family: \"Montserrat\", sans-serif;\n font-size: 16px;\n margin: 0;\n }\n\n ul {\n text-align: left;\n padding-left: 40px;\n margin-bottom: 0;\n }\n\n li {\n font-family: \"Montserrat\", sans-serif;\n font-size: 18px;\n list-style-type: symbols(\"+\");\n list-style-position: inside;\n\n }\n }\n\n}\n\nbutton {\n background: none!important;\n border: none;\n padding: 0!important;\n color: #1890ff;\n cursor: pointer;\n}\n"]}
\ No newline at end of file
diff --git a/static/js/main.12d4b8ca.chunk.js b/static/js/main.12d4b8ca.chunk.js
new file mode 100644
index 0000000..f6f5743
--- /dev/null
+++ b/static/js/main.12d4b8ca.chunk.js
@@ -0,0 +1,2 @@
+(this["webpackJsonppersonal-website-static"]=this["webpackJsonppersonal-website-static"]||[]).push([[0],{101:function(e,t,i){},102:function(e,t,i){},103:function(e,t,i){},104:function(e,t,i){},109:function(e,t,i){},125:function(e,t,i){},126:function(e,t,i){},131:function(e,t,i){},150:function(e,t,i){"use strict";i.r(t);var r=i(1),n=i(0),s=i(17),c=i.n(s),a=(i(101),i(102),i(103),i(104),i(12));function o(){return Object(r.jsxs)("footer",{className:"site-footer",children:[Object(r.jsxs)("div",{className:"footer-grid",children:[Object(r.jsx)("div",{className:"blurb",children:Object(r.jsxs)("p",{className:"text-justify",children:["Made with \u2615 and \u2764\ufe0f by Jake Cover, a CS student who really needs to find something witty and interesting to put here soon. Feel free to reach out!",Object(r.jsx)("br",{}),"Checklist Icon by Arthur Shlain from the Noun Project"]})}),Object(r.jsxs)("div",{className:"links-container",children:[Object(r.jsx)("h2",{children:"Links and Stuff"}),Object(r.jsxs)("ul",{className:"footer-links",children:[Object(r.jsx)("li",{children:Object(r.jsx)(a.b,{to:"/",children:"Home"})}),Object(r.jsx)("li",{children:Object(r.jsx)(a.b,{to:"/contact",children:"Contact"})}),Object(r.jsx)("li",{children:Object(r.jsx)(a.b,{to:"/resume",children:"Resume"})}),Object(r.jsx)("li",{children:Object(r.jsx)("a",{href:"https://github.com/JakeCover",children:"GitHub"})})]})]})]}),Object(r.jsx)("hr",{}),Object(r.jsx)("div",{className:"copyright-text",children:"Copyright \xa9 2020 All Rights Reserved by Jake Cover"})]})}i(109);var l=i(153),d=i(155),j=i(156);function h(){return Object(r.jsxs)("header",{className:"header",id:"myHeader",children:[Object(r.jsx)(a.b,{to:"/",className:"navbar-brand",children:Object(r.jsx)("h1",{children:"Jake Cover"})}),Object(r.jsx)(l.a,{href:void 0,className:"icon",onClick:function(){return function(){var e=document.getElementById("myHeader");"header"===e.className?e.className+=" responsive":e.className="header"}()},children:Object(r.jsx)(j.a,{className:"fa fa-bars"})}),Object(r.jsxs)(d.b,{className:"headerLinks",children:[Object(r.jsx)(a.b,{className:"nav-link",to:"/",children:Object(r.jsx)("h2",{children:"Home"})}),Object(r.jsx)(a.b,{className:"nav-link",to:"/contact",children:Object(r.jsx)("h2",{children:"Contact"})}),Object(r.jsx)(a.b,{className:"nav-link",to:"/resume",children:Object(r.jsx)("h2",{children:"Resume"})}),Object(r.jsx)("a",{className:"nav-link",href:"https://github.com/JakeCover",target:"_blank",rel:"noreferrer",children:Object(r.jsx)("h2",{children:"GitHub"})})]})]})}var b=i(7),m=function(){return Object(r.jsx)("div",{children:Object(r.jsx)("h1",{style:{margin:"auto"},children:"Contact"})})},u=(i(125),i(126),i(83)),x=i.n(u),O=i(84),g=i.n(O),p=i(157),f=i.p+"static/media/SanDiego.35f8cc09.svg",v=i.p+"static/media/distest.6bf47b83.svg",A=i.p+"static/media/scoresaver.3f65e348.svg",k=i.p+"static/media/HashiCorp_Logo_no_text.344aecaa.png";function y(e){var t=e.title,i=e.text,n=e.link,s=e.org;return void 0===n?Object(r.jsx)("div",{className:"OneWide GridElement",children:Object(r.jsxs)("div",{className:"GridElementInternal",children:[Object(r.jsxs)("div",{className:"title",children:[Object(r.jsx)("h2",{children:t}),s&&Object(r.jsx)("h3",{children:s})]}),Object(r.jsx)("div",{className:"description",children:Object(r.jsx)("p",{children:i})})]})}):Object(r.jsx)("a",{className:"OneWide GridElement Link",href:n,rel:"noreferrer",target:"_blank",children:Object(r.jsxs)("div",{className:"GridElementInternal",children:[Object(r.jsxs)("div",{className:"title",children:[Object(r.jsx)("h2",{children:t}),s&&Object(r.jsx)("h3",{children:s}),Object(r.jsx)(p.a,{className:"LinkIcon"})]}),Object(r.jsx)("div",{className:"description",children:Object(r.jsx)("p",{children:i})})]})})}function w(e){var t=e.image_url,i=e.image_alt,n=e.title,s=e.text,c=e.link,a=e.org;return void 0===c?Object(r.jsx)("div",{className:"OneWide Pic GridElement",children:Object(r.jsxs)("div",{className:"GridElementInternal",children:[Object(r.jsx)("div",{className:"image",children:Object(r.jsx)("img",{src:t,alt:i})}),Object(r.jsxs)("div",{className:"description",children:[Object(r.jsx)("h2",{children:n}),a&&Object(r.jsx)("h3",{children:a}),Object(r.jsx)("p",{children:s})]})]})}):Object(r.jsx)("a",{className:"OneWide Pic GridElement Link",href:c,target:"_blank",rel:"noreferrer",children:Object(r.jsxs)("div",{className:"GridElementInternal",children:[Object(r.jsxs)("div",{className:"image",children:[Object(r.jsx)("img",{src:t,alt:i}),Object(r.jsx)(p.a,{className:"LinkIcon"})]}),Object(r.jsxs)("div",{className:"description",children:[Object(r.jsx)("h2",{children:n}),a&&Object(r.jsx)("h3",{children:a}),Object(r.jsx)("p",{children:s})]})]})})}function N(e){var t=e.image_url,i=e.image_alt,n=e.title,s=e.text,c=e.link,a=e.org;return void 0===c?Object(r.jsx)("div",{className:"Medium GridElement",children:Object(r.jsxs)("div",{className:"GridElementInternal",children:[Object(r.jsx)("div",{className:"image",children:Object(r.jsx)("img",{src:t,alt:i})}),Object(r.jsxs)("div",{className:"description",children:[Object(r.jsx)("h2",{children:n}),a&&Object(r.jsx)("h3",{children:a}),Object(r.jsx)("p",{children:s})]})]})}):Object(r.jsx)("a",{className:"Medium GridElement Link",href:c,target:"_blank",rel:"noreferrer",children:Object(r.jsxs)("div",{className:"GridElementInternal",children:[Object(r.jsxs)("div",{className:"image",children:[Object(r.jsx)("img",{src:t,alt:i}),Object(r.jsx)(p.a,{className:"LinkIcon"})]}),Object(r.jsxs)("div",{className:"description",children:[Object(r.jsx)("h2",{children:n}),a&&Object(r.jsx)("h3",{children:a}),Object(r.jsx)("p",{children:s})]})]})})}function D(e){var t=e.image_url,i=e.image_alt,n=e.title,s=e.text,c=e.link,a=e.org;return void 0===c?Object(r.jsx)("div",{className:"FourByOne GridElement",children:Object(r.jsxs)("div",{className:"GridElementInternal",children:[Object(r.jsx)("div",{className:"image",children:Object(r.jsx)("img",{src:t,alt:i})}),Object(r.jsxs)("div",{className:"description",children:[Object(r.jsx)("h2",{children:n}),a&&Object(r.jsx)("h3",{children:a}),Object(r.jsx)("p",{children:s})]})]})}):Object(r.jsx)("a",{className:"FourByOne GridElement Link",href:c,target:"_blank",rel:"noreferrer",children:Object(r.jsxs)("div",{className:"GridElementInternal",children:[Object(r.jsxs)("div",{className:"image",children:[Object(r.jsx)("img",{src:t,alt:i}),Object(r.jsx)(p.a,{className:"LinkIcon"})]}),Object(r.jsxs)("div",{className:"description",children:[Object(r.jsx)("h2",{children:n}),a&&Object(r.jsx)("h3",{children:a}),Object(r.jsx)("p",{children:s})]})]})})}function I(){return Object(n.useEffect)((function(){var e=document.querySelector("#project-grid");if(e){var t=new x.a(e,{itemSelector:".GridElement",gutter:0,columnWidth:".GridSizer",percentPosition:!0});g()(e).on("progress",(function(){setTimeout((function(){var e;return null===(e=t.layout)||void 0===e?void 0:e.call(t)}),200)}))}})),Object(r.jsx)("div",{children:Object(r.jsxs)("div",{id:"project-grid-parent",children:[Object(r.jsxs)("div",{id:"project-header",children:[Object(r.jsx)("h2",{children:"> My Projects"}),Object(r.jsxs)("p",{children:["A gallery of some of my most interesting projects. Look for"," ",Object(r.jsx)(p.a,{}),", click those projects for more information!"]})]}),Object(r.jsxs)("div",{id:"project-grid",children:[Object(r.jsx)("div",{className:"GridSizer"}),Object(r.jsx)(y,{title:"ElaticMatch",org:"CodeDay",text:"A set of tools, including a custom suggestion and weighting system, as well as a custom matching algorithm that I wrote and used to match around 350 students to the best-fitting mentors in the CodeDay Labs summer internship program in 2020.",link:"https://github.com/codeday/labs-elastic-match"}),Object(r.jsx)(y,{title:"John Peter",org:"CodeDay",text:"John Peter is a Discord bot used for moderation and server management for Virtual CodeDay. It has a very extensive featureset, and has been used for multiple CodeDays and has worked with over 1000 students.",link:"https://github.com/codeday/johnpeter-discord"}),Object(r.jsx)(y,{title:"CopyMoji",org:"BetterDiscord",text:"An extension for the alternate discord client BetterDiscord that changes the functionality of copying emoji to copy the actual emoji characters rather than their names from the discord client.",link:"https://github.com/JakeCover/BetterDiscordExtensions/tree/main/plugins/CopyMoji"}),Object(r.jsx)(w,{image_url:f,image_alt:"CodeDay San Diego Logo",org:"CodeDay",title:"CodeDay San Diego",text:"A 24 hour hackathon occurring around the world a few times a year. I volunteered for and then later ran the San Diego event.",link:"https://event.codeday.org/sandiego"}),Object(r.jsx)(D,{image_url:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAACcCAMAAAAXtt4bAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAaVBMVEX///8AAAAAfbwAfbwAfbwAfbwAfbwAfbwAfbwAfbwAfbwAfbwAfbwAfbwAfbwAfbwAfbxlZmplZmplZmplZmplZmplZmplZmplZmplZmplZmplZmplZmplZmplZmplZmoAfbxlZmr///8s4zd8AAAAIHRSTlMAACBAYIC/79+PEJ/PcFAwr0CAv58gEI/fr3BgMO/PUBnHhG0AAAABYktHRACIBR1IAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QEEACcXYUmp1AAAFjBJREFUeNrtXdeCw6oOPK5J7DT3FtvJ///k3XQXBEI4OXvuah53UxwYxGgQ8M8/DAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAY/0+wvgXbcT3P9/3VeYD1zx82nuc4gcVgfAD/At0dL/TPKmx9b8esZ/yn6R7sN9uzBlb+xnW4kxj/QbofPC2qDyL9xj1wTzH+Q3S3N+uzCVZHj8M84z9B98DdnpeAz5Rn/Ha625vVeTGsjjube43xW+luh+elsd7sueMYv5DuHyD7I8i77FIyfhfdA291/hx8ljWMX0T3/fr8YWyZ8YzfQffgeP4GmPGMX0D3/er8LfjcjYx/le5BeD7/x+keRXEcJwDSn//FUZT90l7Nbw9fPJ+2vLxx/0sVx3WUmzVPPfiGMX4+PW6i05+h+2G+rHStdrxhebq7w69uLySMiHuKE+zHdMW4V3PN722TtBnRjvb4g4/Im7REvqtMm1nXudPW3cyGUpwmyM+v4mjy7mzWgBIanaYvrq5/TS5kpB+hu7MasNzbOdO1UNtxPM9fKpFdS1sI2TGD7oxLvfcmwy5tCF/e1u/396THT950SvXGextP+mY2LY87r6l0f1w6YvysfWIJj+rpixtCQBmi/wTd3XeZi9wcP7ieby7xd8OPjGntULw/gDA9DGJkSos6r/cXpPe/xkut//TdWNNM+2M1Imtp1riWNRstMsnTiebg3oDunxAzm7spji1iPLihUZxfBdIWQg77Z3DsjN5O1lIvRpD49ORMThps1ag3ps0bDmZOYuMORvOsfUpZBiIUPimd7dUH6P4zG2oveQYGlA9NpPNzxn12aGv2fiui9kQGSFstKUZUtcMA68GJUdSSedaDWi2VsKIRBoWSTvd6ebqHa6IRftjRsljbMpTO7wB3IndoY6RF3nKkNome1Lg3lM8zjyEwyyomE0gBz4tzzH5PRE/OHjFlabofJmlp1MdxlSTJ04e4uVQ94IEF7tHQhUxN2JrTA0dhpqVejK0Mgmdv+N23Hpit4lmWaSi4iWZIq8nM0FY0h8b0hyg/WkQQxZWEPz+077MFGL+3FrMhK3pLJiZa5P0BuQGZ8tbw4YU2pPdUiZ0J20GtlmjbkAbPUXyM7qcYpSPbJO5zI8avrQVsyM5Md7+7rSF/QGUQoCvLLOylEhvyYKrS3jJEpNVqCYfixW3Iz9D9VGipgq6YUd7erSkuJLVTCsswB3rSnT4/xAZarDYL7gPtvhvJxKP32j2WmbH9qVnMbMjcKKDcJsHF6Z7XFNp0xXT5zQn1XUjqTBdZhg35pDudcrXBiMsMNW0zrfxYHz1n7DckhnQHloxlNmS2vA25ON11F/VGy2/j1XQrQIR4V95COjaikTiNTc2LiK7FSuFI+dGJ16qeKeq4gpRGcHNl1uF+7iJHhmzvAHOn0LEhY7OAchvVi9I9Sw2bpZowXhXit/IWSiIUTooeLW91T606OBeG4W8qbWP840+ZlMKWx8xjeXhqq2s1tXhxUCjSuqS4mmwv9NeyubgSNVQF+GYyG1IofMxsyEXpnhumM0LG27INUStb3kK1xtMLRmo5TyquzmoKpmKlOGyOQ8IPMVIg/CViP4Pw+JXstYlIiO1Xq/CA1RU/w0nC1KgDMtIS8ifRNmQ2HeuzQQGHiGUrIuv2shAmTemucSbkvIU06DLP+NsGHR4fqVgGrbWqTYdC9AydRuu3+BRwKttuXHRXHrwSPotjnby4NxJHgxO4+oT5jBSfz36+ADhLLguiLEZMdXyEcJ+3UKnx/DOl2GUaLy6FWqTC92UvEiQF/vF7nV8uCAqHMNAJtIo4EonHvZYNWUAJNb2eeDm6LxfaX1Ps6Ocd5iJ+5ahaSIMusyjRnnQiTyXUUg3+A4R6KsI/foFfvbGyeIxbmjpUW/VzW0sKZJi9ZuyoAHsn07Uhkfnsh+meV5cPoB2FeDsci3hBOCrpdMm0mi0Thyl8b8ZCPrRYLaQkR0nbqJQ1440bQC2OUmSJc6jc3IbE5bMfpvupvHwIVTQyJv33wUq2uoV06DKdZ9tcS5sKzZFOkw8nDWWr0CeXMm4izd1z/XwTVC/WMg0tKM4miS6GUeGET6vZ5wvQvWkvn0M5NmoOjuvtHRtF2YoeHRU6qBc2coGfIFALRUmsRqb2xd/bR287SB8WxTRUFC24FtobhJEFyvdkYRuZzy5J9+byWbQxcmau6EEo01GVkBYp0fOqeB6grHNlxD5IRsVKwLaQREzTlEh3o6hYGuSzS9I9vXweaUaZ0BvMGo14YlCo0wSjRVrNgUkpfuogY1OvWe/Cp0G65T2N7SczCgg/U6ueeAm6f4Pt11970peGGkEj0VufEk60NToInoSdRJklCyO6T4JhJZ46NIbxZDXtscqamD2jZIxp1RMvQfcvsf0y2e+PmtjwfMn1tIzY30+w8+qsdDwlN2VkSPcRi4BtpLGOlsmjJk6TTjQFmRXM55hsTb2Mbkb377FdTfiS3t2NnpYREiDHzqunTjy4CNK2tUzpXkpmx0JMU0jLnJpCXFcEhBS9vl/EhjSke3P5LmSEp0lD8ait9WycHmNDnm4lVEXSAbI0ovi0RkJuQl5gG2mGqXPJ6qpVTEFmXKlx9qv1Sbp/m+1SwpM2NVfiafykV16Ti4ZMPAp7kqnnYfFTtNhLL9H3dsTw7ChdIR1xvUNMQWZCIENla+kn6X5qL/8CIJeGVLPTCCeGUm+UJxIbMmsqRSs9qxU6IxLExnTPgFCgrDJVTavp92zI/oN0z/8VtkOEzw2CRqwXJFKMDXnroEhdXPFkO2VnSrdAFhWr0j7lzFeQQgrNgTK0IU3oDofT6xLey/S+HaO7MOEFC08k9dqJf0mvt1ySAUMmR/zsJDMQhqNlW9p5du/PQNqQpbqWS8hBs70QPSpbQyyjk+kunD7bKhYfIZNHddotx/fZQZ606FZYWp6KzpJoj+nhQUkQpchuEmhPcdWR6Z4DoUA586mmpWoJGxKXrdWfo7vASKhqlQ8UxYvF+bJZwIaMLM3SLtHAKqAho+jhbrRVajJllPgVYcH6znMj3a1aBufcQzakcjVBNS3VZK2mCtta9cRmdJ8duDXec2c7rucdfVcUHIuF6idHJg1JGrZi8Znq+TInIH3NdIJ7r+0xaOIxCEC5m4rHQa50tlXTUvYpG1KrntiQ7mOKlPWb64533E6PoJqKrngZXdMvY0MmMkmsFHEllL5ieriB8r3e+hBKgCKlOBT0KFkhkfIdMChkBU0dzYYsPkb3kZRJXn1z8LaSk/BHjF8gxpeqlR9irXis5UcVkH+BUuMRwDb89oxcsDcJXzaaKtK+ArW6KYm5tX5dOjJsax1rYET3oZQZaApHfvHDdMiYViDUqpUfYhZS6FQZ3yOPyL9oNSaYTJdVYJDr9IJvA82OjTiMKB+sEQbmSGdBqCHakNan6B6LBbQe3akHjk1WIyUrPzjUsg+ePnEqNjAE/sVpfkOX4Ncm4mfQODEk1ZrRcyAsQPrhotuwpXD0adWlp9AUaGxD0uietS//YPT3nfwAR2Fsols1sWrlh1zmBh5CIPC2Gx0tlccAfSp9jwHgV6xlH3cKGzLSTQeBcWt+zvUiNiSN7hVgfoOnJUvHTmoe3DWLXtTLJElcj7Z6nqKoEZqobY4uo5KJA4LHANjeBS5QTSgC6Yf4oqNCBBzM9evSkWEbl88uQPdosiAIi5kjrseK1jC4n+h0od7sOOr9Bj2vxkJazXaDJiiIvrqVVUn3JdaGPIGLd2VxNVWyabnn9fjJ+d7uihCJY5TwyS96qyV0ut+iXCt4Ykd++LrMXWiNgrtm0YvWqiDGVcYf1hcLu5K2wp6ICVkm17MbBXv759XolUo/mK4K9kB+r33dHjWfNad7BMpbR35v0qKEj62FbMhogeU+/GF94lMgaRl7bUzICGqDdBm6l8AEqn/dHjGfXYDuCTyUzvq56vtnFuTgjpfOS9M9En5EiVZOpUm14MlUipVgUWMDRH1NNMCC0AI2pO4BM1S6//RtC0XPteJA6uWS1lTWQtW36J6K2VKgvyylLwk/yLrIqjR4QJ3ZWmAHjSbtc64XsiEJdE8uJai85ncqOVor3Cf05JnJWqj+Et2fUwxeS4lrBWiSoTClewLOjp21iJg5WR+zIXH5rC7d8z5OkyoelDpG00vFpcY70puReAeI4G5yzrVRqhqJP6HFp2G5UK3qxGaDwXoC9UMMr0noS5l5JE50og/ynOvMnO6DzTht+ujbVKa77LNheL+O21Y3uGtIZ6zvrtWd+MP6xLUCxH3Vhk8/iIewfjBRegVpQegz51wj6D491vdWYZ7JPb7t2Ui9Awv1iuBucs61Ra9NbSC2NOivqg1CaGX29EPOSYyTZIHR9AvOuVbTfX4cyqVTmj1zNYNaWZ1OaJ1OcDeyIYXBDZUoRiBbMvQ3nUxtSHp4b8Ais1E0od4ePGie33DOtZLumfiEHEWlYXCmyJn5lUDy2xFSeQtpTycEvg92y2pshmoXtCGfgyqnBODRZTNS44T08eUw2C5w3d5SNiRId2hUl4rQKbgpb3VQPIIrcOezCum5G9qQYOmXvDdzkpYSb1minZkxCJGNbgTuGlmR2VQ/RJrRoK0a+YKQuQ2JzGfxdId/YiXNge2zNt/dVaDn0fTyFiIdtn+KExzlk3S6Ixd/Z0i8uA35DA41elN2lzaZQj/MjJN8cqkHPAaTYr5f2fy6vcVsSIjuMrOgldranojvMj3jnl29ZdbC+hSya91j/N7U/EJ6/VOtex3Gl5E/z9y9nbo7efgr+llll15G9W6d4eff70n4aZwot34/xHSXRzpZyhoIb4UE89UgFHg3z3aLSqVwZzCM6a50tyR3Mu/F11uLA/z+Z3DMpM6pgEV123CXMRamu1qptbDRuRFf+Su4kvl2XeosTz2NKN2MpHmacY8xFqY7ai0N9mi2wB3XW3dYD3zY3WRPOHNJ2okvm/f3NLKraiY7Y3m6I70C6PDpAOL7+bwOvb3jOK53fEj8bTBPulmvML5Id3yhBGBKBqszElO2Xxc1Su4UxhfprmMEi8W0JL5L2X6zYji4M75Id80qOCHhAx/D9uk97zGhnvEN+0cl7bwnHEexmOt4Ijh3HDBfeH3hfvpuxZKa6Dt3qi/1ULBlD/r+4h8xyXQf0F17lU9IeE/N9okn86hJIwT3wN34Iv203Uj2yoaKpztKWGF7/hrOT44u+EZVkwgPkd3jpkpbOKb9rTCFcpjud7pTKpZEt546a4WQGQez54lDnfYvcI6Sb9mAb1PnFxBrD8qpaw0E6r2+vrNAZ1dZaR14kt/oH5juV7rTqq8TgS0pa+3VhEuvCplIN7IryBBCgwTBIDEjXMQ7gTKhDYm2axTdZwvXrnxAr2ym+z/0vWzDQ69V4WW9G8ewKKGWM6qTYiBGY5gXUtkObVpEEXc/VU44LXPQFGtgIPhTdDfZnZjOQ7M7VxqrcNKhgxMIWt2FpC2ReBbGO/KJs8IVQsmPeudUf+1Q71rpv4vp/o/ZmVqXMp7xNdh77zxy7XvTJClKqGcIDBPi9fHpqvxo65tjcpRw9sW8pynyxN3ZCdfwW18Beutvrq917298OB9HX8al3aM+dIq7veMDD2xPXn0fqP7kr5PgfngNA/9mxvwguH/S69edD0x3swvSbrmmcKn/1tJztZiPa8B089RnuBQ6MA+d48sEuHzS8MH3rd0AUldH+JN9uYg44A5vkOfRo686+3uJkLOZ7oTTGgWML3AJZ59CR0EgsZF2fShhz1HOLB+i+1qZ5u1BugcqoqI29+4xXD1I5bnDYublzOTpZQG0VS2nvOg6aV0p8zATj9IQ7VFC5Ap4q6sOrR54GOyDqAGYdqPi9gZzwMP9RatA9ohbpvutiCBb6jbIpKhFW1zyqK5K+CgJPA5iK2OsdBxCiAQ/+Kg+2DgEJVSoYNkeJanXivWEwYtCaRzYMN3/EaSPxqS/nb98OwBceoN2qb35y5NOyjvJfxUhcgfEYRshN9bgS9aKN4eYQ8IPmDFhS+NAIP3vH6Q7+cpxE/mjvxH0KMlFjUIklKnu1LoZ5pKSqCuMHb4T2o5icf4nF5JIdP8+4Qm1MveEcq3fq7b8BBwbOq17q7ZOYIHuKYL3DhV0fcyY8FBZANN9dEbkVwkfW1S6/4iS8Oktv2EbhMhQrmVctXTfglMGSNTHJgGFlsGls95gNcKVG/RM93dOuYQriVyQpTz7UV584gW0ELmDXLydwlqRyiSFYn6sHiFtyAD1KnBL2YHpLj7wui5/L9uV5SvQeU4P5m0cAXbeGiyo9dW5Apwkum+iHqal6uFr3XmlIHKI8hBtYiHRX6f7lyQN9ewYVeELQJ49pXTlNUp2apkkir4DgzLE14dhFwQANQOC693B2zs+TnjySUnKesidTJvr1p1jfHEfTGZX7wdaYcuiaTbk22nVKTNmur/QJ7+S7Zaw4nKROtxtQPLF4Qng8FZI4OTi27iojbm/0wlXXA5JpLtlRemv8mRGRHLmO0CfWtiXhEipkgnAURIisgkbCrdr6eSiXkHY6lSq25OdtMNiT6a74iqy7DM2zYdOwXscVelThO0qtCX5n6v2imAbcmOJz8BHKuol1kOPTHfczXt50y3O9pJ8qO49pDuEOPhYMxXv59+Djr2r9gBhLTNwbIKZG+RuVribTlyMDXn3fXaKLJbpjrho8pQuG+JT+iHJK2mgk7go1BCJkO5wkYGivt7B0T3EaJ5QvvRLr7z4e3RfNsS3Pf25HXmgk7goqBBJ082wglLU1+P2bAzdHdWLtGubme5QiC/Kfzu0K2u2fTgUh8Twpg7Akmp4BQcdlMGIqvw6yF/k/t2Ne0S6X51Jc1EDHaiKhC+taZSJA1SIBGnkKtPjFTzZ2PLBq6hzHLo7KkG1kj/j2mK6a9DdmPFlb/jc0li7X8GLqgdicayj2kkqq3pRbUHyUbtUUdsyNrLJy95yEQGN7lfGU1VN0hs/98Mz3Ljj4sfrVvvNVnZFzoYY3pzX1v7N+1jH10kC71P71rBlvzGT7rZGhfA53DmjwyAP13KgZwnpnw3uRnS/6vhae8G1TZe40YtWB2DRd64FyANm9jBRQdcUtd1a5e6M6c4VM5+g+xVRrEH5aqFlJfWxSOJ6SJu8UoM61Fg8jlRbkFDbrZXuzsgM5XrIT9H9RnnxbuvpgRz9Ys+trGrcHgxCpEzNEE6iUxF1jTIHcVxV3iWx+subnBai+4PzcQK48l0VL3zvprzmb+0ZhUjZSJF9616mg1yF6XNADXBljn2Q8z380ztYl6T7Hfn9yIHqdclsH33kCjH4oGt/A2sVog15F0LhWrpJaC8nakDzDvUUz3V0bdbw0fOBZTHdl6T7F3GYXcHhXs9ClDFWddOFikqOoMzw5tRIvtaRV7E8yn9UGuP+KlzSYQ/uMXk94d/epSqkO4PBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAzGD/4HN2QpKtltTXYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDRUMDA6Mzk6MjArMDA6MDA/tYRbAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA0VDAwOjM5OjIwKzAwOjAwTug85wAAAABJRU5ErkJggg==",image_alt:"Foresight Sports Logo",title:"Foresight Sports",text:"Foresight Sports creates advanced augmented reality sports experiences. I created multiple games using Unity that took data from their launch monitor technology and translated it into a seamless experience."}),Object(r.jsx)(w,{image_url:v,image_alt:"Distest Logo",title:"Distest",org:"Random Projects",text:"Distest is a testing library I wrote for Discord bots that allows for full integration tests of bots, improving the discord bot development workflow significantly. As far as I know, it's the only tool available for this sort of testing.",link:"https://github.com/JakeCover/distest"}),Object(r.jsx)(w,{image_url:A,image_alt:"Scoresaver Logo",title:"ScoreSaver",org:"Random Projects",text:"A Chrome extension to help you download beatsaber songs directly from ScoreSaber. No more searching for mapper names on BeatSaver, just download the newest ranked songs directly!",link:"https://github.com/JakeCover/ScoreSaverExtention"}),Object(r.jsx)(N,{image_url:k,image_alt:"HashiCorp Logo",title:"Hashicorp Stack Sysadmin",org:"CodeDay, Random Projects",text:"I've setup and used a stack consisting of Nomad, Consul, and Vault along with Traefik both at CodeDay, where it runs almost every service we have, as well as at home, where I use it to run a number of assorted services on a few old machines. I strongly recommend it, it's very powerful and not all that complex to get started with at any scale, from one personal server to large corporate backends."}),Object(r.jsx)(y,{title:"Personal Website",org:"Random Projects",text:"You're looking at it! There's not a whole lot to this, it's just a React site hosted on GitHub Pages, but I didn't know React before starting on this so I'm pretty proud of it.",link:"https://github.com/JakeCover/PersonalWebsite_Static"}),Object(r.jsx)(y,{title:"Nomad Job Templates Tool",link:"https://github.com/JakeCover/NomadJobTemplatesTool",org:"Random Projects",text:"A little custom tool to allow you to use jinga-esque text substitutions in Nomad jobfiles to help centralize the definition of service traefik tags. This mainly makes it easier to update and change networking configuration across many jobs easily."}),Object(r.jsx)(y,{title:"Assorted Discord Bots",org:"Random Projects",text:"I've made quite a number of discord bots over time! Some of them, like ReplyBot, which added a reply functionality to Discord years before they finally implemented it first-party, have been obsoleted nowadays, others like DiscordChannelMirror really aren't significantly notable, and many more have been lost to time and past me's lack of understanding of the importance of backup. I digress, however I really do love writing these sorts of applications!"})]})]})})}var M=i(61),S=i.n(M),G=i(85),T=i(39),C=(i(131),i(154)),J=i(86),B=i.n(J);function E(){var e=Object(n.useState)("nothing"),t=Object(T.a)(e,2),i=(t[0],t[1],Object(n.useState)("no-one")),s=Object(T.a)(i,2);s[0],s[1];function c(){return a.apply(this,arguments)}function a(){return(a=Object(G.a)(S.a.mark((function e(){var t;return S.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,B.a.get("https://jsonplaceholder.typicode.com/posts");case 3:t=e.sent,console.log(t.data),e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),console.error(e.t0);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}return Object(n.useEffect)((function(){c();var e=setInterval(c,1e4);return function(){clearInterval(e)}}),[]),Object(r.jsx)("li",{children:"listening to ____ by ____"})}function R(){function e(t,i,r,n,s){var c=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,a=i+n,o=r+s;return++c>25?[a,o]:Math.abs(t-a/o)>.001?t>a/o?e(t,a,o,n,s,c):e(t,i,r,a,o,c):[a,o]}function t(){var t=(new Date).getTime()-0xedb89b32e0,i=function(){var e=new Date,t=Math.round(new Date(e.getFullYear(),0,1).getTime());return Math.round(new Date(e.getFullYear(),11,31,23,59,59,999).getTime())-t}(),r=Math.floor(t/i),n=e(Math.floor(t%i/1e3)/(i/1e3),0,1,1,1),s=Object(T.a)(n,2),c=s[0],a=s[1];return"".concat(r," and ").concat(c,"/").concat(a)}var i=Object(n.useState)(t()),s=Object(T.a)(i,2),c=s[0],a=s[1];function o(){a(t())}return Object(n.useEffect)((function(){o();var e=setInterval(o,5e3);return function(){clearInterval(e)}}),[]),Object(r.jsxs)("li",{children:[c," years old"]})}function Y(){return Object(r.jsx)("div",{id:"about-me-parent",children:Object(r.jsxs)("div",{id:"about-me",className:"about-me-card",children:[Object(r.jsx)("h1",{children:" Hi! I'm Jake!"}),Object(r.jsxs)("div",{id:"info-parent",children:[Object(r.jsxs)("div",{id:"specific-info",children:[Object(r.jsx)("h2",{children:" A bit about me:"}),Object(r.jsxs)("ul",{children:[Object(r.jsxs)("li",{children:[Object(r.jsx)("b",{children:"Name"}),": Jake Cover"]}),Object(r.jsx)("li",{children:"Occupation: Student"}),Object(r.jsx)("li",{children:"Location: Southern California"}),Object(r.jsxs)("li",{children:["Projects:"," ",Object(r.jsx)("button",{onClick:function(){var e;return null===(e=document.getElementById("project-header"))||void 0===e?void 0:e.scrollIntoView({behavior:"smooth",block:"start"})},children:"Down there"})]}),Object(r.jsxs)("li",{children:["Resume: ",Object(r.jsx)(a.b,{to:"/resume",children:"Over here"})]}),Object(r.jsxs)("li",{children:["Find Me:",Object(r.jsxs)("ul",{children:[Object(r.jsxs)("li",{children:["Email: ",Object(r.jsx)("button",{onClick:function(){window.prompt("Thanks for being a human! Here's my email:",atob("Y29udGFjdEBqYWtlY292ZXIubWU="))},children:"Click This"})]}),Object(r.jsxs)("li",{children:["Twitter:"," ",Object(r.jsx)(C.a,{title:":(",children:Object(r.jsx)("a",{href:"https://github.com/JakeCover",target:"_blank",rel:"noreferrer",children:"@cobular_"})})]}),Object(r.jsxs)("li",{children:["GitHub:"," ",Object(r.jsx)("a",{href:"https://github.com/JakeCover",target:"_blank",rel:"noreferrer",children:"JakeCover"})]}),Object(r.jsxs)("li",{children:["Telegram:"," ",Object(r.jsx)("a",{href:"https://t.me/cobular",target:"_blank",rel:"noreferrer",children:"@cobular"})]}),Object(r.jsx)("li",{children:"Elsewhere: Probably @cobular"})]})]})]})]}),Object(r.jsxs)("div",{id:"fun-info",children:[Object(r.jsx)("h2",{children:"I'm:"}),Object(r.jsxs)("ul",{children:[Object(r.jsx)(R,{}),Object(r.jsxs)(C.a,{title:"Hey! This part is still a work in progress, check back in a bit to see if it's working!",children:[Object(r.jsx)(E,{}),Object(r.jsx)("li",{children:"doing (general stuff - in class, projects, sleeping, games)"})]}),Object(r.jsx)("li",{children:"rather colorblind"})]})]})]})]})})}function H(){return Object(r.jsxs)("div",{id:"home",children:[Object(r.jsx)(Y,{}),Object(r.jsx)(I,{})]})}function P(){return Object(r.jsx)("div",{children:Object(r.jsx)("h1",{style:{margin:"auto"},children:"Resume"})})}function U(){return Object(r.jsx)("main",{children:Object(r.jsxs)(b.c,{children:[Object(r.jsx)(b.a,{exact:!0,path:"/",component:H}),Object(r.jsx)(b.a,{path:"/contact",component:m}),Object(r.jsx)(b.a,{path:"/resume",component:P})]})})}var X=function(){return Object(r.jsxs)("div",{className:"App",style:{maxWidth:1823,margin:"auto"},children:[Object(r.jsx)(h,{}),Object(r.jsx)(U,{}),Object(r.jsx)(o,{})]})},z=function(e){e&&e instanceof Function&&i.e(3).then(i.bind(null,158)).then((function(t){var i=t.getCLS,r=t.getFID,n=t.getFCP,s=t.getLCP,c=t.getTTFB;i(e),r(e),n(e),s(e),c(e)}))};c.a.render(Object(r.jsx)(a.a,{children:Object(r.jsx)(X,{})}),document.getElementById("root")),z()}},[[150,1,2]]]);
+//# sourceMappingURL=main.12d4b8ca.chunk.js.map
\ No newline at end of file
diff --git a/static/js/main.12d4b8ca.chunk.js.map b/static/js/main.12d4b8ca.chunk.js.map
new file mode 100644
index 0000000..56b6294
--- /dev/null
+++ b/static/js/main.12d4b8ca.chunk.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["components/Footer.tsx","components/Header.tsx","components/Contact.tsx","images/SanDiego.svg","images/distest.svg","images/scoresaver.svg","images/HashiCorp_Logo_no_text.png","components/ProjectGrid.tsx","images/foresightsports.png","components/AboutMe.tsx","components/Home.tsx","components/Resume.tsx","components/Main.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["Footer","className","to","href","Header","id","onClick","x","document","getElementById","showHideHamburger","MenuOutlined","target","rel","Contact","style","margin","SmallElement","title","text","link","org","undefined","LinkOutlined","SmallElementPic","image_url","image_alt","src","alt","MediumElement","LargeElementPic","ProjectGrid","useEffect","elem","querySelector","msnry","Masonry","itemSelector","gutter","columnWidth","percentPosition","ImagesLoaded","on","setTimeout","layout","CodeDaySD","Distest","Scoresaver","Hashicorp","LastFmLi","useState","updateNowPlaying","a","axios","get","songData","console","log","data","error","interval","setInterval","clearInterval","Age","searchSternBorcotTree","left_n","left_d","right_n","right_d","count","center_n","center_d","Math","abs","CalcAge","ageMs","Date","getTime","yearMs","dateObj","dateInit","round","getFullYear","milliseconds_year","ageYearsComponent","floor","target_n","target_d","age","setAge","UpdateAge","AboutMe","scrollIntoView","behavior","block","window","prompt","atob","Home","Resume","Main","exact","path","component","App","maxWidth","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render"],"mappings":"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","file":"static/js/main.12d4b8ca.chunk.js","sourcesContent":["import \"./Footer.scss\"\nimport { Link } from \"react-router-dom\";\n\n\nexport function Footer() {\n return (\n \n );\n};\n","import React from \"react\";\nimport \"./Header.scss\";\nimport { Button, Space } from \"antd\";\nimport { Link } from \"react-router-dom\";\nimport { MenuOutlined } from \"@ant-design/icons\";\n\nexport function Header() {\n function showHideHamburger() {\n var x = document.getElementById(\"myHeader\");\n // @ts-ignore\n if (x.className === \"header\") {\n // @ts-ignore\n x.className += \" responsive\";\n } else {\n // @ts-ignore\n x.className = \"header\";\n }\n }\n\n return (\n \n );\n}\n","export const Contact = () => {\n return (\n \n
Contact \n \n )\n}\n","export default __webpack_public_path__ + \"static/media/SanDiego.35f8cc09.svg\";","export default __webpack_public_path__ + \"static/media/distest.6bf47b83.svg\";","export default __webpack_public_path__ + \"static/media/scoresaver.3f65e348.svg\";","export default __webpack_public_path__ + \"static/media/HashiCorp_Logo_no_text.344aecaa.png\";","/**\n * TODO:\n * - For things that can't be linked, use to signal that clicking will open a modal https://ant.design/components/modal/\n * in order to give a more complex writeup and some pictures\n * - Tooltip for modal and linkable items, possibly which displays a modal with an example card with tooltips or explanations\n * - Footer\n * - Responsive top bar\n *\n */\n\nimport \"./ProjectGrid.scss\";\nimport Masonry from \"masonry-layout\";\nimport ImagesLoaded from \"imagesloaded\";\n\nimport { useEffect } from \"react\";\nimport { LinkOutlined } from \"@ant-design/icons\";\nimport CodeDaySD from \"../images/SanDiego.svg\";\nimport Foresight from \"../images/foresightsports.png\";\nimport Distest from \"../images/distest.svg\";\nimport Scoresaver from \"../images/scoresaver.svg\";\nimport Hashicorp from \"../images/HashiCorp_Logo_no_text.png\";\n\ntype GridElementImageProps = {\n image_url: string;\n image_alt: string;\n title: string;\n text: string;\n link?: string;\n org?: string;\n};\n\ntype GridElementProps = {\n title: string;\n text: string;\n link?: string;\n org?: string;\n};\n\nfunction SmallElement({ title, text, link, org }: GridElementProps) {\n if (link === undefined) {\n return (\n \n
\n
\n
{title} \n {org && {org} }\n \n
\n
\n
\n );\n }\n return (\n \n \n
\n
{title} \n {org && {org} }\n \n \n
\n
\n \n );\n}\n\nfunction SmallElementPic({\n image_url,\n image_alt,\n title,\n text,\n link,\n org,\n}: GridElementImageProps) {\n if (link === undefined) {\n return (\n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n\n
{text}
\n
\n
\n
\n );\n }\n return (\n \n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n
{text}
\n
\n
\n \n );\n}\n\nfunction MediumElement({\n image_url,\n image_alt,\n title,\n text,\n link,\n org,\n}: GridElementImageProps) {\n if (link === undefined) {\n return (\n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n
{text}
\n
\n
\n
\n );\n }\n return (\n \n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n
{text}
\n
\n
\n \n );\n}\n\nfunction LargeElementPic({\n image_url,\n image_alt,\n title,\n text,\n link,\n org,\n}: GridElementImageProps) {\n if (link === undefined) {\n return (\n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n
{text}
\n
\n
\n
\n );\n }\n return (\n \n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n
{text}
\n
\n
\n \n );\n}\n\nexport function ProjectGrid() {\n useEffect(() => {\n var elem = document.querySelector(\"#project-grid\");\n\n if (elem) {\n const msnry = new Masonry(elem, {\n itemSelector: \".GridElement\",\n gutter: 0,\n columnWidth: \".GridSizer\",\n percentPosition: true,\n });\n\n ImagesLoaded(elem).on(\"progress\", () => {\n setTimeout(() => msnry.layout?.(), 200);\n });\n }\n });\n\n return (\n \n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n );\n}\n","export default \"data:image/png;base64,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\"","import \"./AboutMe.scss\";\nimport { Link } from \"react-router-dom\";\nimport { Tooltip } from \"antd\";\nimport { useState, useEffect } from \"react\";\nimport axios from \"axios\";\n\nfunction LastFmLi() {\n const [nowPlayingSong, setNowPlayingSong] = useState(\"nothing\");\n const [nowPlayingArtist, setNowPlayingArtist] = useState(\"no-one\");\n\n async function updateNowPlaying() {\n try {\n const songData = await axios.get(\n \"https://jsonplaceholder.typicode.com/posts\"\n );\n\n console.log(songData.data);\n } catch (err) {\n console.error(err);\n }\n }\n\n useEffect(() => {\n updateNowPlaying();\n\n const interval = setInterval(updateNowPlaying, 10000);\n\n return () => {\n clearInterval(interval);\n };\n }, []);\n return listening to ____ by ____ ;\n};\n\nfunction Age() {\n // Accounts for leap years and stuff\n function milliseconds_year() {\n const dateObj = new Date();\n const dateInit = Math.round(\n new Date(dateObj.getFullYear(), 0, 1).getTime()\n );\n const dateEnd = Math.round(\n new Date(dateObj.getFullYear(), 11, 31, 23, 59, 59, 999).getTime()\n );\n return dateEnd - dateInit;\n }\n\n function searchSternBorcotTree(\n target: number,\n left_n: number,\n left_d: number,\n right_n: number,\n right_d: number,\n count: number = 0\n ): [number, number] {\n count++;\n const center_n: number = left_n + right_n;\n const center_d: number = left_d + right_d;\n // Check to see if we've gone too deep\n if (count > 25) return [center_n, center_d];\n // Check to see if we're close enough to the target\n if (Math.abs(target - (center_n / center_d)) > 0.001) {\n // Look right down the tree\n if (target > (center_n / center_d))\n return searchSternBorcotTree(\n target,\n center_n,\n center_d,\n right_n,\n right_d,\n count\n );\n // Ok now look left\n return searchSternBorcotTree(\n target,\n left_n,\n left_d,\n center_n,\n center_d,\n count\n );\n }\n return [center_n, center_d];\n }\n\n function CalcAge() {\n let ageMs = new Date().getTime() - 1021004428000;\n const yearMs = milliseconds_year();\n const ageYearsComponent = Math.floor(ageMs / yearMs);\n const ageSecondsComponent = Math.floor((ageMs % yearMs) / 1000);\n const [target_n, target_d] = searchSternBorcotTree(\n ageSecondsComponent / (yearMs / 1000),\n 0,\n 1,\n 1,\n 1\n );\n return `${ageYearsComponent} and ${target_n}/${target_d}`;\n }\n\n const [age, setAge] = useState(CalcAge());\n\n function UpdateAge() {\n setAge(CalcAge());\n }\n\n useEffect(() => {\n UpdateAge();\n\n const interval = setInterval(UpdateAge, 5000);\n\n return () => {\n clearInterval(interval);\n };\n }, []);\n\n return (\n \n {age} years old\n \n );\n};\n\nexport function AboutMe() {\n function EmailHandler() {\n const email = \"Y29udGFjdEBqYWtlY292ZXIubWU=\";\n window.prompt(\"Thanks for being a human! Here's my email:\", atob(email));\n }\n\n return (\n \n
\n
Hi! I'm Jake! \n\n
\n
\n
A bit about me: \n\n
\n \n Name : Jake Cover\n \n Occupation: Student \n Location: Southern California \n \n Projects:{\" \"}\n \n document.getElementById(\"project-header\")?.scrollIntoView({\n behavior: \"smooth\",\n block: \"start\",\n })\n }\n >\n Down there\n \n \n \n Resume: Over here\n \n \n Find Me:\n \n \n \n
\n
\n
I'm: \n
\n \n \n \n \n doing (general stuff - in class, projects, sleeping, games)\n \n \n \n rather colorblind\n \n \n
\n
\n
\n
\n );\n}\n","import \"./Home.scss\";\nimport { ProjectGrid } from \"./ProjectGrid\";\nimport { AboutMe } from \"./AboutMe\";\n\nexport function Home() {\n return (\n \n );\n}\n","export function Resume() {\n return (\n \n
Resume \n \n );\n}\n","import { Route, Switch } from \"react-router-dom\";\nimport { Contact } from \"./Contact\";\nimport { Home } from \"./Home\";\nimport { Resume } from \"./Resume\";\n\nexport function Main() {\n return (\n \n \n \n \n \n \n \n );\n}\n","import React from \"react\";\nimport \"./App.scss\";\nimport { Footer } from \"./components/Footer\";\nimport { Header } from \"./components/Header\";\nimport { Main } from \"./components/Main\";\n\nfunction App() {\n return (\n \n \n \n \n
\n );\n}\n\nexport default App;\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.scss\";\nimport \"./imports.scss\"\nimport App from \"./App\";\nimport reportWebVitals from \"./reportWebVitals\";\nimport { HashRouter } from \"react-router-dom\";\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/js/main.3ab396df.chunk.js b/static/js/main.3ab396df.chunk.js
deleted file mode 100644
index 0971491..0000000
--- a/static/js/main.3ab396df.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(this["webpackJsonppersonal-website-static"]=this["webpackJsonppersonal-website-static"]||[]).push([[0],{101:function(e,t,i){},102:function(e,t,i){},103:function(e,t,i){},104:function(e,t,i){},109:function(e,t,i){},125:function(e,t,i){},126:function(e,t,i){},131:function(e,t,i){},150:function(e,t,i){"use strict";i.r(t);var n=i(1),r=i(0),s=i(17),c=i.n(s),a=(i(101),i(102),i(103),i(104),i(12));function o(){return Object(n.jsxs)("footer",{className:"site-footer",children:[Object(n.jsxs)("div",{className:"footer-grid",children:[Object(n.jsx)("div",{className:"blurb",children:Object(n.jsxs)("p",{className:"text-justify",children:["Made with \u2615 and \u2764\ufe0f by Jake Cover, a CS student who really needs to find something witty and interesting to put here soon. Feel free to reach out!",Object(n.jsx)("br",{}),"Checklist Icon by Arthur Shlain from the Noun Project"]})}),Object(n.jsxs)("div",{className:"links-container",children:[Object(n.jsx)("h2",{children:"Links and Stuff"}),Object(n.jsxs)("ul",{className:"footer-links",children:[Object(n.jsx)("li",{children:Object(n.jsx)(a.b,{to:"/",children:"Home"})}),Object(n.jsx)("li",{children:Object(n.jsx)(a.b,{to:"/contact",children:"Contact"})}),Object(n.jsx)("li",{children:Object(n.jsx)(a.b,{to:"/resume",children:"Resume"})}),Object(n.jsx)("li",{children:Object(n.jsx)("a",{href:"https://github.com/JakeCover",children:"GitHub"})})]})]})]}),Object(n.jsx)("hr",{}),Object(n.jsx)("div",{className:"copyright-text",children:"Copyright \xa9 2020 All Rights Reserved by Jake Cover"})]})}i(109);var l=i(153),d=i(155),j=i(156);function h(){return Object(n.jsxs)("header",{className:"header",id:"myHeader",children:[Object(n.jsx)(a.b,{to:"/",className:"navbar-brand",children:Object(n.jsx)("h1",{children:"Jake Cover"})}),Object(n.jsx)(l.a,{href:void 0,className:"icon",onClick:function(){return function(){var e=document.getElementById("myHeader");"header"===e.className?e.className+=" responsive":e.className="header"}()},children:Object(n.jsx)(j.a,{className:"fa fa-bars"})}),Object(n.jsxs)(d.b,{className:"headerLinks",children:[Object(n.jsx)(a.b,{className:"nav-link",to:"/",children:Object(n.jsx)("h2",{children:"Home"})}),Object(n.jsx)(a.b,{className:"nav-link",to:"/contact",children:Object(n.jsx)("h2",{children:"Contact"})}),Object(n.jsx)(a.b,{className:"nav-link",to:"/resume",children:Object(n.jsx)("h2",{children:"Resume"})}),Object(n.jsx)("a",{className:"nav-link",href:"https://github.com/JakeCover",target:"_blank",rel:"noreferrer",children:Object(n.jsx)("h2",{children:"GitHub"})})]})]})}var b=i(7),m=function(){return Object(n.jsx)("div",{children:Object(n.jsx)("h1",{style:{margin:"auto"},children:"Contact"})})},u=(i(125),i(126),i(83)),x=i.n(u),O=i(84),g=i.n(O),p=i(157),f=i.p+"static/media/SanDiego.35f8cc09.svg",v=i.p+"static/media/distest.6bf47b83.svg",A=i.p+"static/media/scoresaver.3f65e348.svg",k=i.p+"static/media/HashiCorp_Logo_no_text.344aecaa.png";function w(e){var t=e.title,i=e.text,r=e.link,s=e.org;return void 0===r?Object(n.jsx)("div",{className:"OneWide GridElement",children:Object(n.jsxs)("div",{className:"GridElementInternal",children:[Object(n.jsxs)("div",{className:"title",children:[Object(n.jsx)("h2",{children:t}),s&&Object(n.jsx)("h3",{children:s})]}),Object(n.jsx)("div",{className:"description",children:Object(n.jsx)("p",{children:i})})]})}):Object(n.jsx)("a",{className:"OneWide GridElement Link",href:r,rel:"noreferrer",target:"_blank",children:Object(n.jsxs)("div",{className:"GridElementInternal",children:[Object(n.jsxs)("div",{className:"title",children:[Object(n.jsx)("h2",{children:t}),s&&Object(n.jsx)("h3",{children:s}),Object(n.jsx)(p.a,{className:"LinkIcon"})]}),Object(n.jsx)("div",{className:"description",children:Object(n.jsx)("p",{children:i})})]})})}function y(e){var t=e.image_url,i=e.image_alt,r=e.title,s=e.text,c=e.link,a=e.org;return void 0===c?Object(n.jsx)("div",{className:"OneWide Pic GridElement",children:Object(n.jsxs)("div",{className:"GridElementInternal",children:[Object(n.jsx)("div",{className:"image",children:Object(n.jsx)("img",{src:t,alt:i})}),Object(n.jsxs)("div",{className:"description",children:[Object(n.jsx)("h2",{children:r}),a&&Object(n.jsx)("h3",{children:a}),Object(n.jsx)("p",{children:s})]})]})}):Object(n.jsx)("a",{className:"OneWide Pic GridElement Link",href:c,target:"_blank",rel:"noreferrer",children:Object(n.jsxs)("div",{className:"GridElementInternal",children:[Object(n.jsxs)("div",{className:"image",children:[Object(n.jsx)("img",{src:t,alt:i}),Object(n.jsx)(p.a,{className:"LinkIcon"})]}),Object(n.jsxs)("div",{className:"description",children:[Object(n.jsx)("h2",{children:r}),a&&Object(n.jsx)("h3",{children:a}),Object(n.jsx)("p",{children:s})]})]})})}function N(e){var t=e.image_url,i=e.image_alt,r=e.title,s=e.text,c=e.link,a=e.org;return void 0===c?Object(n.jsx)("div",{className:"FourByOne GridElement",children:Object(n.jsxs)("div",{className:"GridElementInternal",children:[Object(n.jsx)("div",{className:"image",children:Object(n.jsx)("img",{src:t,alt:i})}),Object(n.jsxs)("div",{className:"description",children:[Object(n.jsx)("h2",{children:r}),a&&Object(n.jsx)("h3",{children:a}),Object(n.jsx)("p",{children:s})]})]})}):Object(n.jsx)("a",{className:"FourByOne GridElement Link",href:c,target:"_blank",rel:"noreferrer",children:Object(n.jsxs)("div",{className:"GridElementInternal",children:[Object(n.jsxs)("div",{className:"image",children:[Object(n.jsx)("img",{src:t,alt:i}),Object(n.jsx)(p.a,{className:"LinkIcon"})]}),Object(n.jsxs)("div",{className:"description",children:[Object(n.jsx)("h2",{children:r}),a&&Object(n.jsx)("h3",{children:a}),Object(n.jsx)("p",{children:s})]})]})})}function D(){return Object(r.useEffect)((function(){var e=document.querySelector("#project-grid");if(e){var t=new x.a(e,{itemSelector:".GridElement",gutter:0,columnWidth:".GridSizer",percentPosition:!0});g()(e).on("progress",(function(){setTimeout((function(){var e;return null===(e=t.layout)||void 0===e?void 0:e.call(t)}),200)}))}})),Object(n.jsx)("div",{children:Object(n.jsxs)("div",{id:"project-grid-parent",children:[Object(n.jsxs)("div",{id:"project-header",children:[Object(n.jsx)("h2",{children:"> My Projects"}),Object(n.jsxs)("p",{children:["A gallery of some of my most interesting projects. Look for"," ",Object(n.jsx)(p.a,{}),", click those projects for more information!"]})]}),Object(n.jsxs)("div",{id:"project-grid",children:[Object(n.jsx)("div",{className:"GridSizer"}),Object(n.jsx)(w,{title:"ElaticMatch",org:"CodeDay",text:"A set of tools, including a custom suggestion and weighting system, as well as a custom matching algorithm that I wrote and used to match around 350 students to the best-fitting mentors in the CodeDay Labs summer internship program in 2020.",link:"https://github.com/codeday/labs-elastic-match"}),Object(n.jsx)(w,{title:"John Peter",org:"CodeDay",text:"John Peter is a Discord bot used for moderation and server management for Virtual CodeDay. It has a very extensive featureset, and has been used for multiple CodeDays and has worked with over 1000 students.",link:"https://github.com/codeday/johnpeter-discord"}),Object(n.jsx)(w,{title:"CopyMoji",org:"BetterDiscord",text:"An extension for the alternate discord client BetterDiscord that changes the functionality of copying emoji to copy the actual emoji characters rather than their names from the discord client.",link:"https://github.com/JakeCover/BetterDiscordExtensions/tree/main/plugins/CopyMoji"}),Object(n.jsx)(y,{image_url:f,image_alt:"CodeDay San Diego Logo",org:"CodeDay",title:"CodeDay San Diego",text:"A 24 hour hackathon occurring around the world a few times a year. I volunteered for and then later ran the San Diego event.",link:"https://event.codeday.org/sandiego"}),Object(n.jsx)(N,{image_url:"data:image/png;base64,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",image_alt:"Foresight Sports Logo",title:"Foresight Sports",text:"Foresight Sports creates advanced augmented reality sports experiences. I created multiple games using Unity that took data from their launch monitor technology and translated it into a seamless experience."}),Object(n.jsx)(y,{image_url:v,image_alt:"Distest Logo",title:"Distest",org:"Random Projects",text:"Distest is a testing library I wrote for Discord bots that allows for full integration tests of bots, improving the discord bot development workflow significantly. As far as I know, it's the only tool available for this sort of testing.",link:"https://github.com/JakeCover/distest"}),Object(n.jsx)(y,{image_url:A,image_alt:"Scoresaver Logo",title:"ScoreSaver",org:"Random Projects",text:"A Chrome extension to help you download beatsaber songs directly from ScoreSaber. No more searching for mapper names on BeatSaver, just download the newest ranked songs directly!",link:"https://github.com/JakeCover/ScoreSaverExtention"}),Object(n.jsx)(w,{title:"Personal Website",org:"Random Projects",text:"You're looking at it! There's not a whole lot to this, it's just a React site hosted on GitHub Pages, but I didn't know React before starting on this so I'm pretty proud of it.",link:"https://github.com/JakeCover/PersonalWebsite_Static"}),Object(n.jsx)(y,{image_url:k,image_alt:"HashiCorp Logo",title:"Hashicorp Stack Sysadmin",org:"CodeDay, Random Projects",text:"I've setup and used a stack consisting of Nomad, Consul, and Vault along with Traefik both at CodeDay, where it runs almost every service we have, as well as at home, where I use it to run a number of assorted services on a few old machines. I strongly recommend it, it's very powerful and not all that complex to get started with!"}),Object(n.jsx)(w,{title:"CodeDay",text:"CodeDay, an event by SRND, is a beginner-friendly 24 hour event for students that challenges\n attendees to create a game or an app."})]})]})})}var M=i(61),I=i.n(M),S=i(85),C=i(39),G=(i(131),i(154)),T=i(86),J=i.n(T);function B(){var e=Object(r.useState)("nothing"),t=Object(C.a)(e,2),i=(t[0],t[1],Object(r.useState)("no-one")),s=Object(C.a)(i,2);s[0],s[1];function c(){return a.apply(this,arguments)}function a(){return(a=Object(S.a)(I.a.mark((function e(){var t;return I.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,J.a.get("https://jsonplaceholder.typicode.com/posts");case 3:t=e.sent,console.log(t.data),e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),console.error(e.t0);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}return Object(r.useEffect)((function(){c();var e=setInterval(c,1e4);return function(){clearInterval(e)}}),[]),Object(n.jsx)("li",{children:"listening to ____ by ____"})}function E(){function e(t,i,n,r,s){var c=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,a=i+r,o=n+s;return++c>25?[a,o]:Math.abs(t-a/o)>.001?t>a/o?e(t,a,o,r,s,c):e(t,i,n,a,o,c):[a,o]}function t(){var t=(new Date).getTime()-0xedb89b32e0,i=function(){var e=new Date,t=Math.round(new Date(e.getFullYear(),0,1).getTime());return Math.round(new Date(e.getFullYear(),11,31,23,59,59,999).getTime())-t}(),n=Math.floor(t/i),r=e(Math.floor(t%i/1e3)/(i/1e3),0,1,1,1),s=Object(C.a)(r,2),c=s[0],a=s[1];return"".concat(n," and ").concat(c,"/").concat(a)}var i=Object(r.useState)(t()),s=Object(C.a)(i,2),c=s[0],a=s[1];function o(){a(t())}return Object(r.useEffect)((function(){o();var e=setInterval(o,5e3);return function(){clearInterval(e)}}),[]),Object(n.jsxs)("li",{children:[c," years old"]})}function Y(){return Object(n.jsx)("div",{id:"about-me-parent",children:Object(n.jsxs)("div",{id:"about-me",className:"about-me-card",children:[Object(n.jsx)("h1",{children:" Hi! I'm Jake!"}),Object(n.jsxs)("div",{id:"info-parent",children:[Object(n.jsxs)("div",{id:"specific-info",children:[Object(n.jsx)("h2",{children:" A bit about me:"}),Object(n.jsxs)("ul",{children:[Object(n.jsxs)("li",{children:[Object(n.jsx)("b",{children:"Name"}),": Jake Cover"]}),Object(n.jsx)("li",{children:"Occupation: Student"}),Object(n.jsx)("li",{children:"Location: Southern California"}),Object(n.jsxs)("li",{children:["Projects:"," ",Object(n.jsx)("button",{onClick:function(){var e;return null===(e=document.getElementById("project-header"))||void 0===e?void 0:e.scrollIntoView({behavior:"smooth",block:"start"})},children:"Down there"})]}),Object(n.jsxs)("li",{children:["Resume: ",Object(n.jsx)(a.b,{to:"/resume",children:"Over here"})]}),Object(n.jsxs)("li",{children:["Find Me:",Object(n.jsxs)("ul",{children:[Object(n.jsxs)("li",{children:["Email: ",Object(n.jsx)("button",{onClick:function(){window.prompt("Thanks for being a human! Here's my email:",atob("Y29udGFjdEBqYWtlY292ZXIubWU="))},children:"Click This"})]}),Object(n.jsxs)("li",{children:["Twitter:"," ",Object(n.jsx)(G.a,{title:":(",children:Object(n.jsx)("a",{href:"https://github.com/JakeCover",target:"_blank",rel:"noreferrer",children:"@cobular_"})})]}),Object(n.jsxs)("li",{children:["GitHub:"," ",Object(n.jsx)("a",{href:"https://github.com/JakeCover",target:"_blank",rel:"noreferrer",children:"JakeCover"})]}),Object(n.jsxs)("li",{children:["Telegram:"," ",Object(n.jsx)("a",{href:"https://t.me/cobular",target:"_blank",rel:"noreferrer",children:"@cobular"})]}),Object(n.jsx)("li",{children:"Elsewhere: Probably @cobular"})]})]})]})]}),Object(n.jsxs)("div",{id:"fun-info",children:[Object(n.jsx)("h2",{children:"I'm:"}),Object(n.jsxs)("ul",{children:[Object(n.jsx)(E,{}),Object(n.jsxs)(G.a,{title:"Hey! This part is still a work in progress, check back in a bit to see if it's working!",children:[Object(n.jsx)(B,{}),Object(n.jsx)("li",{children:"doing (general stuff - in class, projects, sleeping, games)"})]}),Object(n.jsx)("li",{children:"rather colorblind"})]})]})]})]})})}function R(){return Object(n.jsxs)("div",{id:"home",children:[Object(n.jsx)(Y,{}),Object(n.jsx)(D,{})]})}function H(){return Object(n.jsx)("div",{children:Object(n.jsx)("h1",{style:{margin:"auto"},children:"Resume"})})}function P(){return Object(n.jsx)("main",{children:Object(n.jsxs)(b.c,{children:[Object(n.jsx)(b.a,{exact:!0,path:"/",component:R}),Object(n.jsx)(b.a,{path:"/contact",component:m}),Object(n.jsx)(b.a,{path:"/resume",component:H})]})})}var U=function(){return Object(n.jsxs)("div",{className:"App",style:{maxWidth:1823,margin:"auto"},children:[Object(n.jsx)(h,{}),Object(n.jsx)(P,{}),Object(n.jsx)(o,{})]})},X=function(e){e&&e instanceof Function&&i.e(3).then(i.bind(null,158)).then((function(t){var i=t.getCLS,n=t.getFID,r=t.getFCP,s=t.getLCP,c=t.getTTFB;i(e),n(e),r(e),s(e),c(e)}))};c.a.render(Object(n.jsx)(a.a,{children:Object(n.jsx)(U,{})}),document.getElementById("root")),X()}},[[150,1,2]]]);
-//# sourceMappingURL=main.3ab396df.chunk.js.map
\ No newline at end of file
diff --git a/static/js/main.3ab396df.chunk.js.map b/static/js/main.3ab396df.chunk.js.map
deleted file mode 100644
index 0821799..0000000
--- a/static/js/main.3ab396df.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["components/Footer.tsx","components/Header.tsx","components/Contact.tsx","images/SanDiego.svg","images/distest.svg","images/scoresaver.svg","images/HashiCorp_Logo_no_text.png","components/ProjectGrid.tsx","images/foresightsports.png","components/AboutMe.tsx","components/Home.tsx","components/Resume.tsx","components/Main.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["Footer","className","to","href","Header","id","onClick","x","document","getElementById","showHideHamburger","MenuOutlined","target","rel","Contact","style","margin","OneWide","title","text","link","org","undefined","LinkOutlined","OneWidePic","image_url","image_alt","src","alt","FourByOneGridElement","ProjectGrid","useEffect","elem","querySelector","msnry","Masonry","itemSelector","gutter","columnWidth","percentPosition","ImagesLoaded","on","setTimeout","layout","CodeDaySD","Distest","Scoresaver","Hashicorp","LastFmLi","useState","updateNowPlaying","a","axios","get","songData","console","log","data","error","interval","setInterval","clearInterval","Age","searchSternBorcotTree","left_n","left_d","right_n","right_d","count","center_n","center_d","Math","abs","CalcAge","ageMs","Date","getTime","yearMs","dateObj","dateInit","round","getFullYear","milliseconds_year","ageYearsComponent","floor","target_n","target_d","age","setAge","UpdateAge","AboutMe","scrollIntoView","behavior","block","window","prompt","atob","Home","Resume","Main","exact","path","component","App","maxWidth","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render"],"mappings":"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","file":"static/js/main.3ab396df.chunk.js","sourcesContent":["import \"./Footer.scss\"\nimport { Link } from \"react-router-dom\";\n\n\nexport function Footer() {\n return (\n \n );\n};\n","import React from \"react\";\nimport \"./Header.scss\";\nimport { Button, Space } from \"antd\";\nimport { Link } from \"react-router-dom\";\nimport { MenuOutlined } from \"@ant-design/icons\";\n\nexport function Header() {\n function showHideHamburger() {\n var x = document.getElementById(\"myHeader\");\n // @ts-ignore\n if (x.className === \"header\") {\n // @ts-ignore\n x.className += \" responsive\";\n } else {\n // @ts-ignore\n x.className = \"header\";\n }\n }\n\n return (\n \n );\n}\n","export const Contact = () => {\n return (\n \n
Contact \n \n )\n}\n","export default __webpack_public_path__ + \"static/media/SanDiego.35f8cc09.svg\";","export default __webpack_public_path__ + \"static/media/distest.6bf47b83.svg\";","export default __webpack_public_path__ + \"static/media/scoresaver.3f65e348.svg\";","export default __webpack_public_path__ + \"static/media/HashiCorp_Logo_no_text.344aecaa.png\";","/**\n * TODO:\n * - For things that can't be linked, use to signal that clicking will open a modal https://ant.design/components/modal/\n * in order to give a more complex writeup and some pictures\n * - Tooltip for modal and linkable items, possibly which displays a modal with an example card with tooltips or explanations\n * - Footer\n * - Responsive top bar\n *\n */\n\nimport \"./ProjectGrid.scss\";\nimport Masonry from \"masonry-layout\";\nimport ImagesLoaded from \"imagesloaded\";\n\nimport { useEffect } from \"react\";\nimport { LinkOutlined } from \"@ant-design/icons\";\nimport CodeDaySD from \"../images/SanDiego.svg\";\nimport Foresight from \"../images/foresightsports.png\";\nimport Distest from \"../images/distest.svg\";\nimport Scoresaver from \"../images/scoresaver.svg\";\nimport Hashicorp from \"../images/HashiCorp_Logo_no_text.png\";\n\ntype GridElementImageProps = {\n image_url: string;\n image_alt: string;\n title: string;\n text: string;\n link?: string;\n org?: string;\n};\n\ntype GridElementProps = {\n title: string;\n text: string;\n link?: string;\n org?: string;\n};\n\nfunction OneWide({ title, text, link, org }: GridElementProps) {\n if (link === undefined) {\n return (\n \n
\n
\n
{title} \n {org && {org} }\n \n
\n
\n
\n );\n }\n return (\n \n \n
\n
{title} \n {org && {org} }\n \n \n
\n
\n \n );\n};\n\nfunction OneWidePic({ image_url, image_alt, title, text, link, org }: GridElementImageProps) {\n if (link === undefined) {\n return (\n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n\n
{text}
\n
\n
\n
\n );\n }\n return (\n \n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n
{text}
\n
\n
\n \n );\n}\n\nfunction FourByOneGridElement({ image_url, image_alt, title, text, link, org }: GridElementImageProps) {\n if (link === undefined) {\n return (\n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n
{text}
\n
\n
\n
\n );\n }\n return (\n \n \n
\n
\n
\n
\n
\n
{title} \n {org &&
{org} }\n
{text}
\n
\n
\n \n );\n}\n\nexport function ProjectGrid() {\n useEffect(() => {\n var elem = document.querySelector(\"#project-grid\");\n\n if (elem) {\n const msnry = new Masonry(elem, {\n itemSelector: \".GridElement\",\n gutter: 0,\n columnWidth: \".GridSizer\",\n percentPosition: true,\n });\n\n ImagesLoaded(elem).on(\"progress\", () => {\n setTimeout(() => msnry.layout?.(), 200);\n });\n }\n });\n\n return (\n \n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n );\n}\n","export default \"data:image/png;base64,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\"","import \"./AboutMe.scss\";\nimport { Link } from \"react-router-dom\";\nimport { Tooltip } from \"antd\";\nimport { useState, useEffect } from \"react\";\nimport axios from \"axios\";\n\nfunction LastFmLi() {\n const [nowPlayingSong, setNowPlayingSong] = useState(\"nothing\");\n const [nowPlayingArtist, setNowPlayingArtist] = useState(\"no-one\");\n\n async function updateNowPlaying() {\n try {\n const songData = await axios.get(\n \"https://jsonplaceholder.typicode.com/posts\"\n );\n\n console.log(songData.data);\n } catch (err) {\n console.error(err);\n }\n }\n\n useEffect(() => {\n updateNowPlaying();\n\n const interval = setInterval(updateNowPlaying, 10000);\n\n return () => {\n clearInterval(interval);\n };\n }, []);\n return listening to ____ by ____ ;\n};\n\nfunction Age() {\n // Accounts for leap years and stuff\n function milliseconds_year() {\n const dateObj = new Date();\n const dateInit = Math.round(\n new Date(dateObj.getFullYear(), 0, 1).getTime()\n );\n const dateEnd = Math.round(\n new Date(dateObj.getFullYear(), 11, 31, 23, 59, 59, 999).getTime()\n );\n return dateEnd - dateInit;\n }\n\n function searchSternBorcotTree(\n target: number,\n left_n: number,\n left_d: number,\n right_n: number,\n right_d: number,\n count: number = 0\n ): [number, number] {\n count++;\n const center_n: number = left_n + right_n;\n const center_d: number = left_d + right_d;\n // Check to see if we've gone too deep\n if (count > 25) return [center_n, center_d];\n // Check to see if we're close enough to the target\n if (Math.abs(target - (center_n / center_d)) > 0.001) {\n // Look right down the tree\n if (target > (center_n / center_d))\n return searchSternBorcotTree(\n target,\n center_n,\n center_d,\n right_n,\n right_d,\n count\n );\n // Ok now look left\n return searchSternBorcotTree(\n target,\n left_n,\n left_d,\n center_n,\n center_d,\n count\n );\n }\n return [center_n, center_d];\n }\n\n function CalcAge() {\n let ageMs = new Date().getTime() - 1021004428000;\n const yearMs = milliseconds_year();\n const ageYearsComponent = Math.floor(ageMs / yearMs);\n const ageSecondsComponent = Math.floor((ageMs % yearMs) / 1000);\n const [target_n, target_d] = searchSternBorcotTree(\n ageSecondsComponent / (yearMs / 1000),\n 0,\n 1,\n 1,\n 1\n );\n return `${ageYearsComponent} and ${target_n}/${target_d}`;\n }\n\n const [age, setAge] = useState(CalcAge());\n\n function UpdateAge() {\n setAge(CalcAge());\n }\n\n useEffect(() => {\n UpdateAge();\n\n const interval = setInterval(UpdateAge, 5000);\n\n return () => {\n clearInterval(interval);\n };\n }, []);\n\n return (\n \n {age} years old\n \n );\n};\n\nexport function AboutMe() {\n function EmailHandler() {\n const email = \"Y29udGFjdEBqYWtlY292ZXIubWU=\";\n window.prompt(\"Thanks for being a human! Here's my email:\", atob(email));\n }\n\n return (\n \n
\n
Hi! I'm Jake! \n\n
\n
\n
A bit about me: \n\n
\n \n Name : Jake Cover\n \n Occupation: Student \n Location: Southern California \n \n Projects:{\" \"}\n \n document.getElementById(\"project-header\")?.scrollIntoView({\n behavior: \"smooth\",\n block: \"start\",\n })\n }\n >\n Down there\n \n \n \n Resume: Over here\n \n \n Find Me:\n \n \n \n
\n
\n
I'm: \n
\n \n \n \n \n doing (general stuff - in class, projects, sleeping, games)\n \n \n \n rather colorblind\n \n \n
\n
\n
\n
\n );\n}\n","import \"./Home.scss\";\nimport { ProjectGrid } from \"./ProjectGrid\";\nimport { AboutMe } from \"./AboutMe\";\n\nexport function Home() {\n return (\n \n );\n}\n","export function Resume() {\n return (\n \n
Resume \n \n );\n}\n","import { Route, Switch } from \"react-router-dom\";\nimport { Contact } from \"./Contact\";\nimport { Home } from \"./Home\";\nimport { Resume } from \"./Resume\";\n\nexport function Main() {\n return (\n \n \n \n \n \n \n \n );\n}\n","import React from \"react\";\nimport \"./App.scss\";\nimport { Footer } from \"./components/Footer\";\nimport { Header } from \"./components/Header\";\nimport { Main } from \"./components/Main\";\n\nfunction App() {\n return (\n \n \n \n \n
\n );\n}\n\nexport default App;\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.scss\";\nimport \"./imports.scss\"\nimport App from \"./App\";\nimport reportWebVitals from \"./reportWebVitals\";\nimport { HashRouter } from \"react-router-dom\";\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}
\ No newline at end of file