design changes and project updates
This commit is contained in:
parent
6ad19a8bfa
commit
e375cbe23d
29
src/App.css
29
src/App.css
|
@ -21,24 +21,6 @@ html {
|
||||||
animation: fade-down-anim 2s forwards 3s;
|
animation: fade-down-anim 2s forwards 3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we do this because scroll snapping is broken on moz://a for some reason */
|
|
||||||
@supports (-moz-appearance:none){
|
|
||||||
html {
|
|
||||||
scroll-snap-type: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* mobile won't play with snapping too well so we need to make it prox not mandatory */
|
|
||||||
@media only screen and (max-width: 600px) {
|
|
||||||
html {
|
|
||||||
scroll-snap-type: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.child {
|
|
||||||
scroll-snap-align: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
}
|
}
|
||||||
|
@ -160,17 +142,6 @@ h1 {
|
||||||
animation: move-left-atx-anim 1s forwards;
|
animation: move-left-atx-anim 1s forwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
html {
|
|
||||||
scroll-snap-type: y mandatory;
|
|
||||||
}
|
|
||||||
|
|
||||||
.child {
|
|
||||||
scroll-snap-align: center;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.pfp {
|
.pfp {
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
width: 25%
|
width: 25%
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Routes, Route } from 'react-router-dom';
|
import { Routes, Route } from 'react-router-dom';
|
||||||
import Home from './pages/Home';
|
import Home from './pages/Home';
|
||||||
import Blog from "./pages/Blog";
|
|
||||||
import SingleBlog from "./pages/SingleBlog";
|
import SingleBlog from "./pages/SingleBlog";
|
||||||
import Navbar from "./components/navbar/Navbar";
|
import Navbar from "./components/navbar/Navbar";
|
||||||
import Hero from "./components/hero/Hero";
|
import Hero from "./components/hero/Hero";
|
||||||
|
@ -9,6 +8,7 @@ import AboutMe from "./components/about-me/AboutMe";
|
||||||
import Contact from "./components/contact/Contact";
|
import Contact from "./components/contact/Contact";
|
||||||
import Hobbies from "./components/hobbies/Hobbies";
|
import Hobbies from "./components/hobbies/Hobbies";
|
||||||
import Projects from "./components/projects/Projects";
|
import Projects from "./components/projects/Projects";
|
||||||
|
import Blogs from "./components/blogs/Blogs";
|
||||||
|
|
||||||
|
|
||||||
const NavBarView = (props: {children: any}) => {
|
const NavBarView = (props: {children: any}) => {
|
||||||
|
@ -35,8 +35,8 @@ const Main = () => {
|
||||||
<Route element={<NavBarView><Contact/></NavBarView>} path='/contact'/>
|
<Route element={<NavBarView><Contact/></NavBarView>} path='/contact'/>
|
||||||
<Route element={<NavBarView><Hobbies/></NavBarView>} path='/hobbies'/>
|
<Route element={<NavBarView><Hobbies/></NavBarView>} path='/hobbies'/>
|
||||||
<Route element={<NavBarView><Projects/></NavBarView>} path='/projects'/>
|
<Route element={<NavBarView><Projects/></NavBarView>} path='/projects'/>
|
||||||
<Route element={<NavBarView><Blog/></NavBarView>} path='/blogs'/>
|
<Route element={<NavBarView><Blogs/></NavBarView>} path='/blogs'/>
|
||||||
<Route element={<SingleBlog/>} path='/blog'/>
|
<Route element={<SingleBlog/>} path='/blog/*'/>
|
||||||
</Routes>
|
</Routes>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -2,32 +2,30 @@ import React from "react";
|
||||||
|
|
||||||
export default function AboutMe() {
|
export default function AboutMe() {
|
||||||
return (
|
return (
|
||||||
<div className={"child"} style={{minHeight: "100vh"}}>
|
<div style={{
|
||||||
<div style={{
|
display: "flex",
|
||||||
display: "flex",
|
flexDirection:"column",
|
||||||
flexDirection:"column",
|
alignItems: "center",
|
||||||
alignItems: "center",
|
alignContent: "center",
|
||||||
alignContent: "center",
|
justifyContent: "center",
|
||||||
justifyContent: "center",
|
height: "95vh"
|
||||||
minHeight: "50rem"
|
}}>
|
||||||
}}>
|
<div style={{maxWidth: 600}}>
|
||||||
<h1 style={{marginBottom: 20}}>About Me</h1>
|
<h1>About</h1>
|
||||||
<div style={{width: "100vw", justifyContent: "center", display: "flex"}}>
|
<p>
|
||||||
<p style={{maxWidth: 600}}>
|
|
||||||
I'm from Austin, Texas. I've been writing code for nearly 9 years and I'm
|
I'm from Austin, Texas. I've been writing code for nearly 9 years and I'm
|
||||||
currently going to <b>The University of Texas at Austin</b>
|
currently going to <b>The University of Texas at Austin</b>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
|
||||||
|
|
||||||
|
<p>
|
||||||
<div style={{width: "100vw", justifyContent: "center", display: "flex"}}>
|
|
||||||
<p style={{maxWidth: 600}}>
|
|
||||||
I'm interested in infra and backend engineering.
|
I'm interested in infra and backend engineering.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
|
||||||
|
|
||||||
<p style={{maxWidth: 600}}>If you would like to contact me, you can reach me at:</p>
|
<p className={"mb-0"}>If you would like to contact me, you can reach me at:</p>
|
||||||
<a href={"mailto:nickorlow@nickorlow.com"}>nickorlow@nickorlow.com</a>
|
<a href={"mailto:nickorlow@nickorlow.com"}>nickorlow@nickorlow.com</a>
|
||||||
|
|
||||||
|
<p style={{color: "grey"}} className={"mb-0 mt-4 small"}>Website originally created by Nicholas Orlowsky - Licensed under GNU General Public License v3 - Original source available <a href={"https://github.com/nickorlow/personal-site"}>here</a></p>
|
||||||
|
<p className={"small"}>Hosting provided by <a href={"https://nws.nickorlow.com"}>Nick Web Services (NWS)</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -25,12 +25,14 @@
|
||||||
|
|
||||||
.blog-card-int {
|
.blog-card-int {
|
||||||
border-radius: 7px;
|
border-radius: 7px;
|
||||||
background-color: #1a1a1e;
|
font-family: monospace;
|
||||||
transition: 1s;
|
transition: 1s;
|
||||||
|
color: #FFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
.blog-card-int:hover {
|
.blog-card-int:hover {
|
||||||
transform: translateY(-5px);
|
color: #F38020;
|
||||||
transition: .5s;
|
transition: .5s;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
import ScrollAnimation from "react-animate-on-scroll";
|
import ScrollAnimation from "react-animate-on-scroll";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import {Link} from "react-router-dom";
|
||||||
import Job from "../../types/Job";
|
import Job from "../../types/Job";
|
||||||
import "./BlogCard.css";
|
import "./BlogCard.css";
|
||||||
import Blog from "../../types/Blog";
|
import Blog from "../../types/Blog";
|
||||||
|
|
||||||
export default function BlogCard(props: {style?: any, className?: string, blog: Blog, num: number}){
|
export default function BlogCard(props: {style?: any, className?: string, blog: Blog}){
|
||||||
return (
|
return (
|
||||||
<ScrollAnimation className={"blog-card "+(props.className || "")} style={props.style} animateIn="fade-up" duration={2} animateOnce={true} offset={50} delay={200}>
|
<div className={"blog-card "+(props.className || "")} style={props.style}>
|
||||||
<div onClick={()=>{window.location.href="/blog?id="+props.num}} className={"blog-card-int"}>
|
<Link to={"/blog/"+props.blog.uri} className={"blog-card-int"}>
|
||||||
{/*<img className={"blog-card-img"} src={props.blog.image}/>*/}
|
|
||||||
<div className={"blog-card-info"}>
|
<div className={"blog-card-info"}>
|
||||||
<h3>{props.blog.title}</h3>
|
<h4 className={"font-weight-bold"}>{props.blog.title}</h4>
|
||||||
<p>{props.blog.date.toLocaleDateString()}</p>
|
<p className={"font-weight-lighter"}>{props.blog.date.toLocaleDateString()}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</Link>
|
||||||
</ScrollAnimation>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,17 +5,16 @@ import {AllBlogs} from "../../static/data/Blogs";
|
||||||
|
|
||||||
export default function Blogs() {
|
export default function Blogs() {
|
||||||
|
|
||||||
let blogId = 0;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={"child"}>
|
<div className={"h-100 d-md-flex justify-content-center align-items-center"}>
|
||||||
<div className={"row"} style={{alignContent: "center"}}>
|
<div>
|
||||||
{AllBlogs.reverse().map((blog, i) => {
|
<h1 className={"mt-4"}>Blogs</h1>
|
||||||
blogId++;
|
<div className={"row"} style={{alignContent: "center"}}>
|
||||||
if(!blog.private) {
|
{AllBlogs.sort((a, b)=> b.date.getTime() - a.date.getTime()).map((blog) => {
|
||||||
return <BlogCard num={AllBlogs.length - blogId} className={"col-md-4"} blog={blog}/>
|
if(blog.private) return;
|
||||||
}
|
return <BlogCard className={"col-md-4"} blog={blog}/>
|
||||||
})}
|
})}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,7 +2,7 @@ import React from "react";
|
||||||
|
|
||||||
export default function Contact() {
|
export default function Contact() {
|
||||||
return (
|
return (
|
||||||
<div className={"child"} style={{minHeight: "90vh"}}>
|
<div style={{minHeight: "90vh"}}>
|
||||||
<div style={{minHeight: "90vh", display: "flex", alignItems: "center", justifyContent: "center"}}>
|
<div style={{minHeight: "90vh", display: "flex", alignItems: "center", justifyContent: "center"}}>
|
||||||
<div>
|
<div>
|
||||||
<h1>Contact</h1>
|
<h1>Contact</h1>
|
||||||
|
|
|
@ -5,7 +5,7 @@ import React from "react";
|
||||||
export default function Hero() {
|
export default function Hero() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className={"child"} style={{
|
<div style={{
|
||||||
height: "95vh",
|
height: "95vh",
|
||||||
display: "flex",
|
display: "flex",
|
||||||
alignContent: "center",
|
alignContent: "center",
|
||||||
|
|
|
@ -8,14 +8,11 @@ import JobCard from "../job-card/JobCard";
|
||||||
export default function Hobbies () {
|
export default function Hobbies () {
|
||||||
const [cur, setCur] = useState(1);
|
const [cur, setCur] = useState(1);
|
||||||
return (
|
return (
|
||||||
<div className={"child"} style={{minHeight: "100vh"}}>
|
<div style={{minHeight: "100vh"}}>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
{AllHobbies.map((hobby) => <InfoCard style={{textAlign: "left", maxWidth: "50vmax", margin: 50}}
|
{AllHobbies.map((hobby) => <InfoCard style={{textAlign: "left", maxWidth: "50vmax", margin: 50}}
|
||||||
info={hobby}/>)}
|
info={hobby}/>)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ export default function InfoCard(props: {style?: any, className?: string, info:
|
||||||
<div>
|
<div>
|
||||||
<h4>{props.info.listTitle}</h4>
|
<h4>{props.info.listTitle}</h4>
|
||||||
<div className={"row"} style={{color: "green", fontFamily: "monospace"}}>
|
<div className={"row"} style={{color: "green", fontFamily: "monospace"}}>
|
||||||
{props.info.list.map(s => <p className={"col-6 "+(props.info.listClassName || "col-md-4")} style={{fontSize: 16}}>{s}</p>)}
|
{props.info.list.map(s => <p className={"col-4"} style={{fontSize: 16}}>{s}</p>)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{props.info.link != null && <a href={props.info.link}>{props.info.linkTitle || "Relevant Link"}</a>}
|
{props.info.link != null && <a href={props.info.link}>{props.info.linkTitle || "Relevant Link"}</a>}
|
||||||
|
|
|
@ -8,7 +8,7 @@ import {Carousel} from "react-bootstrap";
|
||||||
export default function Jobs() {
|
export default function Jobs() {
|
||||||
const [cur, setCur] = useState(1);
|
const [cur, setCur] = useState(1);
|
||||||
return (
|
return (
|
||||||
<div className={"child"} style={{minHeight: "100vh"}}>
|
<div style={{minHeight: "100vh"}}>
|
||||||
<div className={"align-content-center d-md-block d-none"}>
|
<div className={"align-content-center d-md-block d-none"}>
|
||||||
<h1 style={{marginBottom: 40}}>Work</h1>
|
<h1 style={{marginBottom: 40}}>Work</h1>
|
||||||
{AllJobs.map((job, i) =><JobCard job={job}/>)}
|
{AllJobs.map((job, i) =><JobCard job={job}/>)}
|
||||||
|
|
|
@ -24,10 +24,11 @@ export default function Navbar() {
|
||||||
<Link to={"/projects"} className={"mb-0 no-blue-link"}>Projects</Link>
|
<Link to={"/projects"} className={"mb-0 no-blue-link"}>Projects</Link>
|
||||||
<div className={"navbar-selected-pill " + (location.pathname === "/projects" ? "" : "navbar-unselected-pill")}/>
|
<div className={"navbar-selected-pill " + (location.pathname === "/projects" ? "" : "navbar-unselected-pill")}/>
|
||||||
</div>
|
</div>
|
||||||
<div className={"d-flex flex-column justify-content-center align-items-center"}>
|
{/*Disabling this page for now*/}
|
||||||
<Link to={"/hobbies"} className={"mb-0 no-blue-link"}>Hobbies</Link>
|
{/*<div className={"d-flex flex-column justify-content-center align-items-center"}>*/}
|
||||||
<div className={"navbar-selected-pill " + (location.pathname === "/hobbies" ? "" : "navbar-unselected-pill")}/>
|
{/* <Link to={"/hobbies"} className={"mb-0 no-blue-link"}>Hobbies</Link>*/}
|
||||||
</div>
|
{/* <div className={"navbar-selected-pill " + (location.pathname === "/hobbies" ? "" : "navbar-unselected-pill")}/>*/}
|
||||||
|
{/*</div>*/}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
|
@ -4,17 +4,15 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-card-int {
|
.project-card-int {
|
||||||
background-color: #222;
|
font-family: monospace;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
transition: .5s;
|
transition: .5s;
|
||||||
border-radius: 10px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-card-int:hover {
|
.project-card-int:hover {
|
||||||
transform: translateY(-5px);
|
color: #F38020;
|
||||||
transition: .5s;
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +46,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.lang-card {
|
.lang-card {
|
||||||
|
color: white;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
background-color: #00AA00;
|
background-color: #00AA00;
|
||||||
|
@ -79,7 +78,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.react {
|
.react {
|
||||||
background-color: #61DAFB;
|
background-color: #0cc4f6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.typescript {
|
.typescript {
|
||||||
|
@ -130,11 +129,11 @@
|
||||||
background-color: #1572B6;
|
background-color: #1572B6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.xenhtml {
|
.xenhtmlframework {
|
||||||
background-color: #3A6A81;
|
background-color: #3A6A81;
|
||||||
}
|
}
|
||||||
|
|
||||||
.xeninfo {
|
.xeninfoapi {
|
||||||
background-color: #3E4E57;
|
background-color: #3E4E57;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,15 +141,15 @@
|
||||||
background-color: #007396;
|
background-color: #007396;
|
||||||
}
|
}
|
||||||
|
|
||||||
.apple-script {
|
.applescript {
|
||||||
background-color: #D9D9D9;
|
background-color: #a8a8a8;
|
||||||
}
|
}
|
||||||
|
|
||||||
.spotify {
|
.spotifyapi {
|
||||||
background-color: #1DB954;
|
background-color: #1DB954;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nodejs {
|
.node\.js {
|
||||||
background-color: #339933;
|
background-color: #339933;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +157,7 @@
|
||||||
background-color: #0075A8;
|
background-color: #0075A8;
|
||||||
}
|
}
|
||||||
|
|
||||||
.azure-devops {
|
.azuredevops {
|
||||||
background-color: #0078D7;
|
background-color: #0078D7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,3 +168,11 @@
|
||||||
.mssql {
|
.mssql {
|
||||||
background-color: #CC2927;
|
background-color: #CC2927;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.rust {
|
||||||
|
background-color: #CE412B;
|
||||||
|
}
|
||||||
|
|
||||||
|
.discordapi {
|
||||||
|
background-color: #7289DA;
|
||||||
|
}
|
||||||
|
|
|
@ -8,20 +8,20 @@ export default function ProjectCard(props: {info: ProjectCardProps}) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={"project-card col-md-4 p-2"}>
|
<div className={"project-card col-md-4 p-2"}>
|
||||||
<div className={"project-card-int pb-2"} style={{backgroundImage: "linear-gradient(to bottom, rgba(0, 0, 0, .60) 50%, rgba(0, 0, 0, 0.75) 100%), url(\""+props.info.imageUrl+"\")"}} onClick={()=>{setModalOpen(true)}}>
|
<div className={"project-card-int pb-2 justify-content-center align-items-center d-flex flex-column"} style={{backgroundImage: "linear-gradient(to bottom, rgba(0, 0, 0, .60) 50%, rgba(0, 0, 0, 0.75) 100%), url(\""+props.info.imageUrl+"\")"}} onClick={()=>{setModalOpen(true)}}>
|
||||||
<h3>{props.info.title}</h3>
|
<h4 className={"font-weight-bold"}>{props.info.title}</h4>
|
||||||
<p>{props.info.shortDescription}</p>
|
<p className={"font-weight-lighter w-75"}>{props.info.shortDescription}</p>
|
||||||
<div>
|
{/*<div>*/}
|
||||||
<div className={"row"} style={{fontFamily: "monospace"}}>
|
{/* <div className={"row"} style={{fontFamily: "monospace"}}>*/}
|
||||||
{props.info.techUsed.slice(0, 3).map(s =>
|
{/* {props.info.techUsed.slice(0, 3).map(s =>*/}
|
||||||
<div className={"col-md-4 col-12 mt-2"}>
|
{/* <div className={"col-md-4 col-12 mt-2"}>*/}
|
||||||
<div className={"lang-card "+s.toLowerCase().replace(" ", "")}>
|
{/* <div className={"lang-card "+s.toLowerCase().replace(" ", "")}>*/}
|
||||||
<p style={{fontSize: 16, margin: 0}}>{s}</p>
|
{/* <p style={{fontSize: 16, margin: 0}}>{s}</p>*/}
|
||||||
</div>
|
{/* </div>*/}
|
||||||
</div>
|
{/* </div>*/}
|
||||||
)}
|
{/* )}*/}
|
||||||
</div>
|
{/* </div>*/}
|
||||||
</div>
|
{/*</div>*/}
|
||||||
</div>
|
</div>
|
||||||
<Modal className={"project-card-modal"} isOpen={isModalOpen}>
|
<Modal className={"project-card-modal"} isOpen={isModalOpen}>
|
||||||
<p className={"back-button"} onClick={()=>{setModalOpen(false)}}>Back</p>
|
<p className={"back-button"} onClick={()=>{setModalOpen(false)}}>Back</p>
|
||||||
|
|
|
@ -8,7 +8,7 @@ import ProjectCard from "../project-card/ProjectCard";
|
||||||
export default function Projects() {
|
export default function Projects() {
|
||||||
const [cur, setCur] = useState(1);
|
const [cur, setCur] = useState(1);
|
||||||
return (
|
return (
|
||||||
<div className={"child"} style={{minHeight: "100vh"}}>
|
<div style={{minHeight: "100vh"}}>
|
||||||
|
|
||||||
<div style={{
|
<div style={{
|
||||||
display: "flex",
|
display: "flex",
|
||||||
|
@ -20,7 +20,7 @@ export default function Projects() {
|
||||||
alignItems: "center"
|
alignItems: "center"
|
||||||
}}>
|
}}>
|
||||||
|
|
||||||
<div className={"align-content-center"}>
|
<div className={"align-content-center mb-4 mt-4"}>
|
||||||
<h1>Projects</h1>
|
<h1>Projects</h1>
|
||||||
<p>Click to learn more about each project</p>
|
<p>Click to learn more about each project</p>
|
||||||
<div className={"row m-0"} style={{justifyContent: "center", padding: 50}}>
|
<div className={"row m-0"} style={{justifyContent: "center", padding: 50}}>
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
import React, {useState} from 'react';
|
|
||||||
import './Home.css';
|
|
||||||
import Blogs from "../components/blogs/Blogs";
|
|
||||||
|
|
||||||
function Blog() {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="Blog" style={{padding: 20}}>
|
|
||||||
<h1>Blog</h1>
|
|
||||||
<Blogs/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Blog;
|
|
|
@ -20,23 +20,7 @@ html {
|
||||||
background-color: black;
|
background-color: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we do this because scroll snapping is broken on moz://a for some reason */
|
|
||||||
@supports (-moz-appearance:none){
|
|
||||||
html {
|
|
||||||
scroll-snap-type: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* mobile won't play with snapping too well so we need to make it prox not mandatory */
|
|
||||||
@media only screen and (max-width: 600px) {
|
|
||||||
html {
|
|
||||||
scroll-snap-type: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.child {
|
|
||||||
scroll-snap-align: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
|
@ -154,15 +138,6 @@ ul {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
html {
|
|
||||||
scroll-snap-type: y proximity;
|
|
||||||
}
|
|
||||||
|
|
||||||
.child {
|
|
||||||
scroll-snap-align: center;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.pfp {
|
.pfp {
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
width: 25%
|
width: 25%
|
||||||
|
|
|
@ -5,82 +5,87 @@ import {AllBlogs} from "../static/data/Blogs";
|
||||||
import {Prism as SyntaxHighlighter} from 'react-syntax-highlighter'
|
import {Prism as SyntaxHighlighter} from 'react-syntax-highlighter'
|
||||||
import {a11yDark as theme} from "react-syntax-highlighter/dist/esm/styles/prism";
|
import {a11yDark as theme} from "react-syntax-highlighter/dist/esm/styles/prism";
|
||||||
import {Link} from "react-router-dom";
|
import {Link} from "react-router-dom";
|
||||||
|
import Blog from "../types/Blog";
|
||||||
|
|
||||||
function SingleBlog() {
|
function SingleBlog() {
|
||||||
|
|
||||||
const [blog, setBlog] = useState('');
|
const [blog, setBlog] = useState<Blog | undefined>(undefined);
|
||||||
const [blogId, setBlogId] = useState(0);
|
const [blogText, setBlogText] = useState<string>('');
|
||||||
|
|
||||||
useEffect(()=> {
|
useEffect(()=> {
|
||||||
const queryString = window.location.search;
|
let blogName = window.location.pathname.split('/').at(-1);
|
||||||
const urlParams = new URLSearchParams(queryString);
|
setBlog(AllBlogs.find(b => b.uri == blogName));
|
||||||
setBlogId(parseInt(urlParams.get('id') || ''));
|
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
fetch(AllBlogs[blogId].mdfile)
|
useEffect(()=> {
|
||||||
.then(response => {
|
if(blog === undefined) return;
|
||||||
return response.text()
|
fetch(blog.mdfile)
|
||||||
})
|
.then(response => {
|
||||||
.then(text => {
|
return response.text()
|
||||||
setBlog(text)
|
})
|
||||||
})
|
.then(text => {
|
||||||
|
setBlogText(text)
|
||||||
|
})
|
||||||
|
}, [blog]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="Blog" style={{paddingTop: 30}}>
|
blog === undefined ? <div></div> :
|
||||||
<h1>{AllBlogs[blogId].title}</h1>
|
<div className="Blog" style={{paddingTop: 30}}>
|
||||||
<p>{AllBlogs[blogId].date.toLocaleDateString()}</p>
|
<h1>{blog.title}</h1>
|
||||||
<p><Link to={"/blogs"}>Back</Link></p>
|
<p>{blog.date.toLocaleDateString()}</p>
|
||||||
<div style={{width: "100%", display: 'flex', justifyContent: 'center'}}>
|
<p><Link to={"/blogs"}>Back</Link></p>
|
||||||
<div className={"d-md-none d-block"} style={{textAlign: "left", margin: 20}}>
|
<div style={{width: "100%", display: 'flex', justifyContent: 'center'}}>
|
||||||
<ReactMarkdown
|
<div className={"d-md-none d-block"} style={{textAlign: "left", margin: 20}}>
|
||||||
components={{
|
<ReactMarkdown
|
||||||
code({node, inline, className, children, ...props}) {
|
components={{
|
||||||
const match = /language-(\w+)/.exec(className || '')
|
code({node, inline, className, children, ...props}) {
|
||||||
return !inline && match ? (
|
const match = /language-(\w+)/.exec(className || '')
|
||||||
<SyntaxHighlighter
|
return !inline && match ? (
|
||||||
children={String(children).replace(/\n$/, '')}
|
<SyntaxHighlighter
|
||||||
style={theme}
|
children={String(children).replace(/\n$/, '')}
|
||||||
language={match[1]}
|
style={theme}
|
||||||
PreTag="div"
|
language={match[1]}
|
||||||
{...props}
|
PreTag="div"
|
||||||
/>
|
{...props}
|
||||||
) : (
|
/>
|
||||||
<code className={className} {...props}>
|
) : (
|
||||||
{children}
|
<code className={className} {...props}>
|
||||||
</code>
|
{children}
|
||||||
)
|
</code>
|
||||||
}
|
)
|
||||||
}}
|
}
|
||||||
>
|
}}
|
||||||
{blog}
|
>
|
||||||
</ReactMarkdown>
|
{blogText}
|
||||||
</div>
|
</ReactMarkdown>
|
||||||
<div className={"d-none d-md-block"} style={{textAlign: "left", margin: 20, maxWidth: "80vw"}}>
|
</div>
|
||||||
<ReactMarkdown
|
<div className={"d-none d-md-block"} style={{textAlign: "left", margin: 20, maxWidth: "80vw"}}>
|
||||||
components={{
|
<ReactMarkdown
|
||||||
code({node, inline, className, children, ...props}) {
|
components={{
|
||||||
const match = /language-(\w+)/.exec(className || '')
|
code({node, inline, className, children, ...props}) {
|
||||||
return !inline && match ? (
|
const match = /language-(\w+)/.exec(className || '')
|
||||||
<SyntaxHighlighter
|
return !inline && match ? (
|
||||||
children={String(children).replace(/\n$/, '')}
|
<SyntaxHighlighter
|
||||||
style={theme}
|
children={String(children).replace(/\n$/, '')}
|
||||||
language={match[1]}
|
style={theme}
|
||||||
PreTag="div"
|
language={match[1]}
|
||||||
{...props}
|
PreTag="div"
|
||||||
/>
|
{...props}
|
||||||
) : (
|
/>
|
||||||
<code className={className} {...props}>
|
) : (
|
||||||
{children}
|
<code className={className} {...props}>
|
||||||
</code>
|
{children}
|
||||||
)
|
</code>
|
||||||
}
|
)
|
||||||
}}
|
}
|
||||||
>
|
}}
|
||||||
{blog}
|
>
|
||||||
</ReactMarkdown>
|
{blogText}
|
||||||
|
</ReactMarkdown>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ import SP2023 from "./blogs/spring-break-projects-2023.md";
|
||||||
import SPLG1 from "./blogs/side-project-log-3-20-2023.md";
|
import SPLG1 from "./blogs/side-project-log-3-20-2023.md";
|
||||||
|
|
||||||
const CSharpBlog: Blog = {
|
const CSharpBlog: Blog = {
|
||||||
|
uri: "c-assignments-in-csharp",
|
||||||
title: "Doing C assignments in C#",
|
title: "Doing C assignments in C#",
|
||||||
date: new Date(2022, 2, 18, 14, 15, 0),
|
date: new Date(2022, 2, 18, 14, 15, 0),
|
||||||
image: VrboImage,
|
image: VrboImage,
|
||||||
|
@ -16,6 +17,7 @@ const CSharpBlog: Blog = {
|
||||||
}
|
}
|
||||||
|
|
||||||
const TestBlog: Blog = {
|
const TestBlog: Blog = {
|
||||||
|
uri: "there-is-a-blog",
|
||||||
title: "There's a Blog!",
|
title: "There's a Blog!",
|
||||||
date: new Date(2022, 7, 6, 12, 0, 0),
|
date: new Date(2022, 7, 6, 12, 0, 0),
|
||||||
image: VrboImage,
|
image: VrboImage,
|
||||||
|
@ -24,6 +26,7 @@ const TestBlog: Blog = {
|
||||||
}
|
}
|
||||||
|
|
||||||
const PrivateBlog: Blog = {
|
const PrivateBlog: Blog = {
|
||||||
|
uri: "private-blog",
|
||||||
title: "This blog can only be accessed via the direct URI",
|
title: "This blog can only be accessed via the direct URI",
|
||||||
date: new Date(2022, 7, 6, 12, 0, 0),
|
date: new Date(2022, 7, 6, 12, 0, 0),
|
||||||
image: VrboImage,
|
image: VrboImage,
|
||||||
|
@ -32,6 +35,7 @@ const PrivateBlog: Blog = {
|
||||||
}
|
}
|
||||||
|
|
||||||
const NWSSSLBlog: Blog = {
|
const NWSSSLBlog: Blog = {
|
||||||
|
uri: "ssl-in-nws-cds",
|
||||||
title: "Implementing SSL in NWS CDS",
|
title: "Implementing SSL in NWS CDS",
|
||||||
date: new Date(2023, 0, 20, 12, 0, 0),
|
date: new Date(2023, 0, 20, 12, 0, 0),
|
||||||
image: VrboImage,
|
image: VrboImage,
|
||||||
|
@ -40,6 +44,7 @@ const NWSSSLBlog: Blog = {
|
||||||
}
|
}
|
||||||
|
|
||||||
const SpringBreak2023Blog: Blog = {
|
const SpringBreak2023Blog: Blog = {
|
||||||
|
uri: "spring-break-2023",
|
||||||
title: "Spring Break 2023",
|
title: "Spring Break 2023",
|
||||||
date: new Date(2023, 2, 11, 12, 0, 0),
|
date: new Date(2023, 2, 11, 12, 0, 0),
|
||||||
image: VrboImage,
|
image: VrboImage,
|
||||||
|
@ -49,6 +54,7 @@ const SpringBreak2023Blog: Blog = {
|
||||||
|
|
||||||
|
|
||||||
const SideProjectLogOne: Blog = {
|
const SideProjectLogOne: Blog = {
|
||||||
|
uri: "side-project-log-3-20-2023",
|
||||||
title: "Side Project Log 3/20/23",
|
title: "Side Project Log 3/20/23",
|
||||||
date: new Date(2023, 2, 20, 12, 0, 0),
|
date: new Date(2023, 2, 20, 12, 0, 0),
|
||||||
image: VrboImage,
|
image: VrboImage,
|
||||||
|
|
|
@ -24,7 +24,7 @@ const RoomyProject: ProjectCardProps = {
|
||||||
const CavCashProject: ProjectCardProps = {
|
const CavCashProject: ProjectCardProps = {
|
||||||
title: "CavCash",
|
title: "CavCash",
|
||||||
description: "CavCash started as a project in 2017 as a way to pay with flashdrives. After recruiting a few friends to help me, we build ourselves into a PayPal competitor but shutdown due to funding. I continued to re-write the platform as a cryptocurrency.",
|
description: "CavCash started as a project in 2017 as a way to pay with flashdrives. After recruiting a few friends to help me, we build ourselves into a PayPal competitor but shutdown due to funding. I continued to re-write the platform as a cryptocurrency.",
|
||||||
shortDescription: "Functional Venmo-like service",
|
shortDescription: "Like Venmo, but better",
|
||||||
techUsed: ["C#", "Kubernetes", "mongoDB", "MSSQL", "Docker", "nginx", "Azure DevOps", "React", "Cloudflare"],
|
techUsed: ["C#", "Kubernetes", "mongoDB", "MSSQL", "Docker", "nginx", "Azure DevOps", "React", "Cloudflare"],
|
||||||
link: "https://cavcash.com",
|
link: "https://cavcash.com",
|
||||||
linkTitle: "Project Website",
|
linkTitle: "Project Website",
|
||||||
|
@ -61,5 +61,15 @@ const NWSProject: ProjectCardProps = {
|
||||||
imageUrl: ""
|
imageUrl: ""
|
||||||
}
|
}
|
||||||
|
|
||||||
export const AllProjects: ProjectCardProps[] = [WebsiteProject, NWSProject, RoomyProject, XenMapProject, CavCashProject, SPONODEProject];
|
const Mahantongo: ProjectCardProps = {
|
||||||
|
title: "Mahantongo",
|
||||||
|
description: "I'm one of the members of the Community Team that runs some UT Computer Science community Discord servers. Currently, a Discord bot called Carlbot provides us a star-board, which is a specific channel where messages that 5 or more people react to with a star emoji get posted. It's supposed to be a collection of the funniest and best messages sent on the server. One of the things our server members have wanted is the addition of more '*-board' channels where you can create multiple star-board like channels but with custom emojis. \n\n I wrote this bot in Rust using Serenity to interact with the Discord API and it helped me gain a better understanding of Rust. It is hosted on NWS.",
|
||||||
|
shortDescription: "A Discord bot to show off the best (or worst) of your server.",
|
||||||
|
link: "https://github.com/nickorlow/mahantongo",
|
||||||
|
linkTitle: "Github Repo",
|
||||||
|
techUsed: ["Discord API", "Rust"],
|
||||||
|
imageUrl: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
export const AllProjects: ProjectCardProps[] = [WebsiteProject, NWSProject, Mahantongo, RoomyProject, XenMapProject, CavCashProject, SPONODEProject];
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
export default interface Blog {
|
export default interface Blog {
|
||||||
|
uri: string,
|
||||||
title: string,
|
title: string,
|
||||||
date: Date
|
date: Date
|
||||||
image: string,
|
image: string,
|
||||||
|
|
Loading…
Reference in a new issue