feat (v1.0.0): initial refactor and redesign

This commit is contained in:
Aidan 2025-10-09 04:12:05 -04:00
parent 3058aa1ab4
commit fe9b50b30e
134 changed files with 17792 additions and 3670 deletions

View file

@ -1,7 +1,5 @@
"use client"
import Header from '@/components/Header'
import Footer from '@/components/Footer'
import Button from '@/components/objects/Button'
import LastPlayed from '@/components/widgets/NowPlaying'
import LiveIndicator from '@/components/widgets/LiveIndicator'
@ -22,29 +20,37 @@ import {
SiPostgresql
} from 'react-icons/si'
import { useTranslation } from 'react-i18next'
import {TbHeartHandshake, TbUserHeart, TbMessage} from "react-icons/tb";
import {BiDonateHeart} from "react-icons/bi";
export default function Home() {
const { t } = useTranslation()
const mainStrings: string[][] = [
t('home.whoAmI', { returnObjects: true }) as string[],
t('home.whatIDo', { returnObjects: true }) as string[],
t('home.whereYouAre', { returnObjects: true }) as string[]
[
"Hey there! My name is Aidan, and I'm a systems administrator, full-stack developer, and student from the Boston area. I primarily work with Linux, Docker, Next.js, Tailwind CSS and TypeScript.",
"My favorite projects and hobbies revolve around web development and SysAdmin. Most of my work is released into the public domain.",
"I'm also a huge advocate for AI and it's practical applications to programming and life itself. I am fond of open-source models the most, specifically Qwen3!",
"When I'm not programming, I can be found re-flashing my phone with a new custom ROM and jumping between projects. I tend to be quite depressed, but I make do."
],
[
"I'm at my best when I'm doing system administration and development in TypeScript. I frequently implement AI into my workflow.",
"I manage three servers, including a mailserver (against my better judgement). I'm also crazy enough to self-host LLMs running on CPU.",
"My biggest project is p0ntus, a cloud services provider which I self-host and maintain. It features most services you would find from large companies like Google, although everything is free and open-source."
],
[
"I am not here to brag about my accomplishments or plug my shitty SaaS. That's why I've made every effort to make this website as personal and fun as possible.",
"I hope you find this website an interesting place to find more about me, but also learn something new; maybe inspire a new project or two.",
"In a technical sense, this site is hosted on my dedicated server hosted in Buffalo, New York by ColoCrossing."
]
]
const mainSections = [
t('home.sections.whoIAm'),
t('home.sections.whatIDo'),
t('home.sections.whereYouAre')
"Who I am",
"What I do",
"Where you are"
]
return (
<div className="min-h-screen flex flex-col">
<Header />
<main className="w-full">
<div className="w-full">
<div className="my-12 text-center">
<Image
src="/ihatenodejs.jpg"
@ -53,8 +59,8 @@ export default function Home() {
height={150}
className="rounded-full mx-auto mb-6 border-4 border-gray-700 hover:border-gray-600 transition-colors duration-300"
/>
<h1 className="text-4xl font-bold mb-2 text-gray-100 glow">{t('home.profile.name')}</h1>
<p className="text-gray-400 text-xl">{t('home.profile.description')}</p>
<h1 className="text-4xl font-bold mb-2 text-gray-100 glow">Aidan Honor</h1>
<p className="text-gray-400 text-xl">SysAdmin, Developer, and Student</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 p-4">
@ -69,23 +75,23 @@ export default function Home() {
{mainSections.map((section, secIndex) => (
<section key={secIndex} className="p-4 sm:p-8 border-2 border-gray-700 rounded-lg hover:border-gray-600 transition-colors duration-300">
<h2 className="text-2xl font-semibold mb-4 text-gray-200">{section === t('home.sections.whereYouAre') ? (
<h2 className="text-2xl font-semibold mb-4 text-gray-200">{section === "Where you are" ? (
<div className="flex flex-row items-center gap-2">
<TbHeartHandshake />
<span className="align-middle">{section}</span>
</div>
) : section === t('home.sections.whoIAm') ? (
) : section === "Who I am" ? (
<div className="flex flex-row items-center gap-2">
<UserCircle />
<span className="align-middle">{section}</span>
</div>
) : section === t('home.sections.whatIDo') ? (
) : section === "What I do" ? (
<div className="flex flex-row items-center gap-2">
<TbUserHeart />
<span className="align-middle">{section}</span>
</div>
) : (section)}</h2>
{section === t('home.sections.whatIDo') && (
{section === "What I do" && (
<div className="flex flex-row items-center justify-center gap-4 my-8">
<SiNextdotjs size={38} />
<SiTypescript size={38} />
@ -107,76 +113,74 @@ export default function Home() {
<section id="contact" className="p-4 sm:p-8 border-2 border-gray-700 rounded-lg hover:border-gray-600 transition-colors duration-300">
<h2 className="flex flex-row items-center gap-2 text-2xl font-semibold mb-4 text-gray-200">
<TbMessage />
{t('home.contact.title')}
Send me a message
</h2>
<p className="text-gray-300 mb-6">{t('home.contact.description')}</p>
<p className="text-gray-300 mb-6">Feel free to reach out for feedback, collaborations, or just a hello! I aim to answer all of my messages in a timely fashion, but please have patience.</p>
<Button
href={'/contact'}
icon={<Mail size={16} />}
>
{t('home.contact.button')}
Contact Me
</Button>
</section>
<section id="donation" className="p-4 sm:p-8 border-2 border-gray-700 rounded-lg hover:border-gray-600 transition-colors duration-300">
<h2 className="flex flex-row items-center gap-2 text-2xl font-semibold mb-4 text-gray-200">
<BiDonateHeart />
{t('home.donation.title')}
Support my work
</h2>
<p className="text-gray-300 mb-6">{t('home.donation.description')}</p>
<h4 className="text-lg font-semibold mb-2 text-gray-200">{t('home.donation.charities.title')}</h4>
<p className="text-gray-300 mb-6">Feeling generous? Support me or one of the causes I support!</p>
<h4 className="text-lg font-semibold mb-2 text-gray-200">Charities</h4>
<div className="grid grid-cols-1 md:grid-cols-2 md:text-sm gap-3">
<Button
href="https://unsilenced.org"
icon={<FaHandcuffs />}
target="_blank"
>
{t('home.donation.charities.unsilenced')}
Unsilenced
</Button>
<Button
href="https://drugpolicy.org"
icon={<PillBottle size={16} />}
target="_blank"
>
{t('home.donation.charities.drugpolicy')}
Drug Policy Alliance
</Button>
<Button
href="https://www.aclu.org"
icon={<Scale size={16} />}
target="_blank"
>
{t('home.donation.charities.aclu')}
ACLU
</Button>
<Button
href="https://www.epicrestartfoundation.org"
icon={<BsArrowClockwise size={16} />}
target="_blank"
>
{t('home.donation.charities.epic-restart')}
EPIC Restart Foundation
</Button>
</div>
<h4 className="text-lg font-semibold mt-5 mb-2 text-gray-200">{t('home.donation.donate.title')}</h4>
<h4 className="text-lg font-semibold mt-5 mb-2 text-gray-200">Donate to Me</h4>
<div className="grid grid-cols-1 md:grid-cols-2 md:text-sm gap-3">
<Button
href="https://donate.stripe.com/6oEeWVcXs9L9ctW4gj"
icon={<CreditCard size={16} />}
target="_blank"
>
{t('home.donation.donate.stripe')}
Stripe
</Button>
<Button
href="https://github.com/sponsors/ihatenodejs"
icon={<SiGithubsponsors size={16} />}
target="_blank"
>
{t('home.donation.donate.github')}
GitHub Sponsors
</Button>
</div>
</section>
</div>
</main>
<Footer />
</div>
);
}