186 lines
7.9 KiB
TypeScript
186 lines
7.9 KiB
TypeScript
"use client"
|
|
|
|
import Button from '@/components/objects/Button'
|
|
import LastPlayed from '@/components/widgets/NowPlaying'
|
|
import LiveIndicator from '@/components/widgets/LiveIndicator'
|
|
|
|
import Image from 'next/image'
|
|
|
|
import {CreditCard, Mail, PillBottle, Scale, UserCircle} from 'lucide-react'
|
|
import { BsArrowClockwise } from "react-icons/bs";
|
|
import { FaHandcuffs } from "react-icons/fa6"
|
|
import {
|
|
SiGithubsponsors,
|
|
SiNextdotjs,
|
|
SiTailwindcss,
|
|
SiDocker,
|
|
SiLinux,
|
|
SiTypescript,
|
|
SiClaude,
|
|
SiPostgresql
|
|
} from 'react-icons/si'
|
|
|
|
import {TbHeartHandshake, TbUserHeart, TbMessage} from "react-icons/tb";
|
|
import {BiDonateHeart} from "react-icons/bi";
|
|
|
|
export default function Home() {
|
|
const mainStrings: 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 = [
|
|
"Who I am",
|
|
"What I do",
|
|
"Where you are"
|
|
]
|
|
|
|
return (
|
|
<div className="w-full">
|
|
<div className="my-12 text-center">
|
|
<Image
|
|
src="/ihatenodejs.jpg"
|
|
alt="My Profile Picture"
|
|
width={150}
|
|
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">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">
|
|
<div className="relative border-2 border-gray-700 rounded-lg hover:border-gray-600 transition-colors duration-300 p-4">
|
|
<div className="absolute top-2 right-2">
|
|
<LiveIndicator />
|
|
</div>
|
|
<div className="flex justify-center items-center h-full">
|
|
<LastPlayed />
|
|
</div>
|
|
</div>
|
|
|
|
{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 === "Where you are" ? (
|
|
<div className="flex flex-row items-center gap-2">
|
|
<TbHeartHandshake />
|
|
<span className="align-middle">{section}</span>
|
|
</div>
|
|
) : section === "Who I am" ? (
|
|
<div className="flex flex-row items-center gap-2">
|
|
<UserCircle />
|
|
<span className="align-middle">{section}</span>
|
|
</div>
|
|
) : section === "What I do" ? (
|
|
<div className="flex flex-row items-center gap-2">
|
|
<TbUserHeart />
|
|
<span className="align-middle">{section}</span>
|
|
</div>
|
|
) : (section)}</h2>
|
|
{section === "What I do" && (
|
|
<div className="flex flex-row items-center justify-center gap-4 my-8">
|
|
<SiNextdotjs size={38} />
|
|
<SiTypescript size={38} />
|
|
<SiTailwindcss size={38} />
|
|
<SiPostgresql size={38} />
|
|
<SiDocker size={38} />
|
|
<SiLinux size={38} />
|
|
<SiClaude size={38} />
|
|
</div>
|
|
)}
|
|
{mainStrings[secIndex].map((text: string, index: number) => (
|
|
<p key={index} className="text-gray-300 leading-relaxed mt-2">
|
|
{text}
|
|
</p>
|
|
))}
|
|
</section>
|
|
))}
|
|
|
|
<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 />
|
|
Send me a message
|
|
</h2>
|
|
<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} />}
|
|
>
|
|
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 />
|
|
Support my work
|
|
</h2>
|
|
<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"
|
|
>
|
|
Unsilenced
|
|
</Button>
|
|
<Button
|
|
href="https://drugpolicy.org"
|
|
icon={<PillBottle size={16} />}
|
|
target="_blank"
|
|
>
|
|
Drug Policy Alliance
|
|
</Button>
|
|
<Button
|
|
href="https://www.aclu.org"
|
|
icon={<Scale size={16} />}
|
|
target="_blank"
|
|
>
|
|
ACLU
|
|
</Button>
|
|
<Button
|
|
href="https://www.epicrestartfoundation.org"
|
|
icon={<BsArrowClockwise size={16} />}
|
|
target="_blank"
|
|
>
|
|
EPIC Restart Foundation
|
|
</Button>
|
|
</div>
|
|
|
|
<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"
|
|
>
|
|
Stripe
|
|
</Button>
|
|
<Button
|
|
href="https://github.com/sponsors/ihatenodejs"
|
|
icon={<SiGithubsponsors size={16} />}
|
|
target="_blank"
|
|
>
|
|
GitHub Sponsors
|
|
</Button>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|