Switch to new fonts, darker background with gradient

This commit is contained in:
Xevion
2023-02-26 19:57:23 -06:00
parent 9210aa779a
commit e5186462f3
4 changed files with 165 additions and 137 deletions

View File

@@ -18,7 +18,7 @@ type WrapperProps = {
}; };
const AppWrapper: FunctionComponent<WrapperProps> = ({current, children, hideNavigation, className}: WrapperProps) => { const AppWrapper: FunctionComponent<WrapperProps> = ({current, children, hideNavigation, className}: WrapperProps) => {
return <main className="min-h-screen bg-gradient-to-tl from-zinc-900 via-zinc-400/10 to-zinc-900 text-zinc-50"> return <main className={classNames("body-gradient min-h-screen text-zinc-50", className)}>
{!hideNavigation ? <Disclosure as="nav"> {!hideNavigation ? <Disclosure as="nav">
{({open}) => ( {({open}) => (
<> <>
@@ -38,14 +38,14 @@ const AppWrapper: FunctionComponent<WrapperProps> = ({current, children, hideNav
</div> </div>
<div className="flex flex-1 items-center justify-center sm:items-stretch sm:justify-start"> <div className="flex flex-1 items-center justify-center sm:items-stretch sm:justify-start">
<div className="hidden sm:ml-6 sm:block"> <div className="hidden sm:ml-6 sm:block">
<div className="flex space-x-4"> <div className="flex space-x-4 text-lg font-roboto ">
{navigation.map((item) => ( {navigation.map((item) => (
<Link <Link
key={item.name} key={item.name}
href={item.href} href={item.href}
className={classNames( className={classNames(
item.id == current ? 'bg-zinc-900 text-white' : 'text-gray-300 hover:bg-zinc-800/60 hover:text-white', item.id == current ? 'bg-zinc-900 text-white' : 'text-gray-300 hover:bg-zinc-800/60 hover:text-white',
'px-2.5 py-1 rounded-md text-sm font-medium text-lg' 'px-2.5 py-1 rounded-md'
)} )}
aria-current={item.id == current ? 'page' : undefined} aria-current={item.id == current ? 'page' : undefined}
> >

View File

@@ -53,8 +53,8 @@ const ItemCard = ({banner, bannerBlur, title, description, links, location, bann
<div <div
className="col-span-12 sm:col-span-9 lg:col-span-8 max-h-full overflow-hidden drop-shadow-2xl pb-2 md:p-1 pl-2"> className="col-span-12 sm:col-span-9 lg:col-span-8 max-h-full overflow-hidden drop-shadow-2xl pb-2 md:p-1 pl-2">
<Link href={{pathname: location}} <Link href={{pathname: location}}
className="text-lg sm:text-2xl md:text-3xl font-semibold">{title}</Link> className="text-lg sm:text-2xl md:text-3xl font-semibold font-roboto">{title}</Link>
<div className="description mt-0 md:mt-1.5 text-base sm:text-xl md:text-xl overflow-hidden" <div className="description mt-0 md:mt-1.5 text-base sm:text-xl md:text-xl font-light overflow-hidden"
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
navigate(); navigate();

View File

@@ -6,14 +6,14 @@ import {getPlaiceholder} from "plaiceholder";
import { useBreakpointValue } from "../utils/helpers"; import { useBreakpointValue } from "../utils/helpers";
import type { Project } from "../utils/types"; import type { Project } from "../utils/types";
import Link from "next/link"; import Link from "next/link";
import Balancer from "react-wrap-balancer";
import AppWrapper from "../components/AppWrapper"; import AppWrapper from "../components/AppWrapper";
type ProjectWithBlur = Project & { bannerBlur: string }; type ProjectWithBlur = Project & { bannerBlur: string };
type HomeStaticProps = { type HomeStaticProps = {
projects: ProjectWithBlur[]; projects: ProjectWithBlur[];
} };
export async function getStaticProps() { export async function getStaticProps() {
const projects: Project[] = [ const projects: Project[] = [
@@ -21,95 +21,107 @@ export async function getStaticProps() {
title: "Portal", title: "Portal",
banner: "/portal/banner.jpeg", banner: "/portal/banner.jpeg",
location: "/portal", location: "/portal",
longDescription: "An advanced membership & event management system for my university's premier computer science organization.", longDescription:
shortDescription: "Advanced membership & event management system for students", "An advanced membership & event management system for my university's premier computer science organization.",
shortDescription:
"Advanced membership & event management system for students",
links: [ links: [
{ {
icon: "github", icon: "github",
location: "https://github.com/UTSA-ACM/Portal" location: "https://github.com/UTSA-ACM/Portal",
}, },
{ {
icon: "external", icon: "external",
location: "https://portal.acmutsa.org/" location: "https://portal.acmutsa.org/",
} },
] ],
}, },
{ {
title: "Phototag", title: "Phototag",
banner: "/phototag.png", banner: "/phototag.png",
location: "/phototag", location: "/phototag",
longDescription: `Using Google's Vision API and supporting metadata formats on Windows, Phototag makes it easy to quickly add rich, descriptive tags to your photos, saving you time and effort.`, longDescription: `Using Google's Vision API and supporting metadata formats on Windows, Phototag makes it easy to quickly add rich, descriptive tags to your photos, saving you time and effort.`,
shortDescription: "Effortlessly add rich & descriptive tags to your photos with Phototag.", shortDescription:
"Effortlessly add rich & descriptive tags to your photos with Phototag.",
links: [ links: [
{ {
icon: "github", icon: "github",
location: "https://github.com/Xevion/phototag" location: "https://github.com/Xevion/phototag",
}, },
{ {
icon: "external", icon: "external",
location: "https://phototag.xevion.dev" location: "https://phototag.xevion.dev",
} },
] ],
}, },
{ {
title: "Paths", title: "Paths",
banner: "/paths.png", banner: "/paths.png",
location: "/paths", location: "/paths",
shortDescription: "Discover the power of graph traversal algorithms with my interactive application.", shortDescription:
"Discover the power of graph traversal algorithms with my interactive application.",
longDescription: `Discover the power of graph traversal algorithms with my interactive Unity application! longDescription: `Discover the power of graph traversal algorithms with my interactive Unity application!
Easily generate and edit graphs, create mazes, and experiment with different algorithm configurations to find the most efficient path.`, Easily generate and edit graphs, create mazes, and experiment with different algorithm configurations to find the most efficient path.`,
links: [ links: [
{ {
icon: "github", icon: "github",
location: "https://github.com/Xevion/Paths", location: "https://github.com/Xevion/Paths",
} },
] ],
}, },
{ {
title: "Grain", title: "Grain",
banner: "/grain/banner.jpeg", banner: "/grain/banner.jpeg",
bannerSettings: { quality: 100 }, bannerSettings: { quality: 100 },
location: "/grain", location: "/grain",
shortDescription: "An experimental React app to generate beautiful backgrounds with noise filters.", shortDescription:
longDescription: "Quickly generate beautiful backgrounds with noise filters. Built with React, hosted on Vercel, and rendered using simple SVG noise filters (just HTML & CSS).", "An experimental React app to generate beautiful backgrounds with noise filters.",
longDescription:
"Quickly generate beautiful backgrounds with noise filters. Built with React, hosted on Vercel, and rendered using simple SVG noise filters (just HTML & CSS).",
links: [ links: [
{ {
icon: 'external', icon: "external",
location: "https://grain.xevion.dev" location: "https://grain.xevion.dev",
}, },
{ {
icon: "github", icon: "github",
location: "https://github.com/Xevion/grain" location: "https://github.com/Xevion/grain",
} },
] ],
} },
]; ];
return { return {
props: { props: {
projects: await Promise.all(projects.map(async project => { projects: await Promise.all(
const {base64} = await getPlaiceholder(project.banner, {size: 16}); projects.map(async (project) => {
const { base64 } = await getPlaiceholder(project.banner, {
size: 16,
});
return { return {
...project, ...project,
bannerBlur: base64 bannerBlur: base64,
};
})
),
},
}; };
}))
}
}
} }
const buttons = [ const buttons = [
{ text: "GitHub", href: "https://github.com/Xevion" }, { text: "GitHub", href: "https://github.com/Xevion" },
{ text: "Contact", href: "/contact" }, { text: "Contact", href: "/contact" },
{text: "Resume", href: "/resume"} { text: "Resume", href: "/resume" },
] ];
const Home: NextPage<HomeStaticProps> = ({ projects }: HomeStaticProps) => { const Home: NextPage<HomeStaticProps> = ({ projects }: HomeStaticProps) => {
const useLong = useBreakpointValue("sm", true, false); const useLong = useBreakpointValue("sm", true, false);
// use-tailwind-breakpoint // use-tailwind-breakpoint
useEffect(() => { useEffect(() => {
typeof window !== "undefined" ? window.dispatchEvent(new Event("resize")) : null; typeof window !== "undefined"
? window.dispatchEvent(new Event("resize"))
: null;
}, []); }, []);
return ( return (
@@ -120,35 +132,47 @@ const Home: NextPage<HomeStaticProps> = ({projects}: HomeStaticProps) => {
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
</Head> </Head>
<AppWrapper hideNavigation={true} className="overflow-x-hidden"> <AppWrapper hideNavigation={true} className="overflow-x-hidden">
<div className="flex justify-center items-center h-screen w-screen overflow-hidden"> <div className="flex h-screen w-screen items-center justify-center overflow-hidden">
<div className="top-0 p-3 absolute w-full flex justify-end"> <div className="flex w-full flex-col items-center justify-start">
<span <nav className="animate-fade-in">
className="leading-3 bg-yellow-300 rounded-md text-black font-bold font-inter p-2">WIP</span> <ul className="flex items-center justify-center gap-4">
</div> {buttons.map(({ text, href }) => (
<div className="w-full flex flex-col items-center h-40"> <Link
<div className="text-4xl sm:text-5xl pb-3">Hi. I&apos;m Ryan Walters.</div> key={href}
<div className="text-lg text-zinc-200">Full Stack Software Developer</div> className="text-sm text-zinc-500 duration-500 hover:text-zinc-300"
<div className="w-full flex justify-center py-2 space-x-2"> href={href}
{buttons.map(({text, href}) => >
<Link href={href} key={href}>
<div className="p-2 rounded-sm bg-zinc-900 hover:bg-zinc-800">
{text} {text}
</div>
</Link> </Link>
)} ))}
</ul>
</nav>
<div className="cursor-default select-none py-10 font-hanken text-4xl font-black tracking-widest sm:text-9xl">
XEVION
</div>
<div className="text-sm text-zinc-500 text-center">
<Balancer>
Building software at <Link href="">Black Pearl Technology</Link> during my undergrad. <br/>
Always open to new opportunities.
</Balancer>
</div> </div>
</div> </div>
</div> </div>
<div id="projects" <div
className="flex py-12 sm:py-8 min-h-screen flex-row md:items-center justify-center"> id="projects"
<div className="h-full w-full max-w-[95%] lg:max-w-[85%] xl:max-w-[70%] mx-auto"> className="flex min-h-screen flex-row justify-center py-12 sm:py-8 md:items-center"
<div className="flex h-full m-1 flex-col justify-start gap-y-1"> >
{ <div className="mx-auto h-full w-full max-w-[95%] lg:max-w-[85%] xl:max-w-[70%]">
projects.map((project, index) => <div className="m-1 flex h-full flex-col justify-start gap-y-1">
<ItemCard key={index} {...project} {projects.map((project, index) => (
description={useLong ? project.longDescription : project.shortDescription}/> <ItemCard
) key={index}
{...project}
description={
useLong ? project.longDescription : project.shortDescription
} }
/>
))}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -8,6 +8,10 @@
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
.body-gradient {
background-image: linear-gradient(to top left, black, rgb(161 161 170 / 0.1), black);
}
@mixin active { @mixin active {
.elements { .elements {
@apply grid opacity-100; @apply grid opacity-100;