Updates
This commit is contained in:
@@ -10,15 +10,29 @@ export default function AboutSection() {
|
||||
return (
|
||||
<Section>
|
||||
<Stack className="w-full max-w-full xl:max-w-[50vw]">
|
||||
<H2 className="leading-snug">About Me</H2>
|
||||
<H2 className="leading-snug">
|
||||
I Build & Operate Production Systems
|
||||
</H2>
|
||||
<Span>
|
||||
I'm passionate and dedicated to solving problems using the
|
||||
best technologies available.
|
||||
I'm Benjamin Toby. DevOps/Platform engineer and CTO at
|
||||
Summit Lending. I design, deploy, and operate infrastructure
|
||||
that supports real businesses:
|
||||
</Span>
|
||||
<ul className="space-y-4">
|
||||
<li>Automated CI/CD pipelines (TurboCI)</li>
|
||||
<li>Multi-cloud deployments (AWS, GCP, Azure, Hetzner)</li>
|
||||
<li>NGINX hardening, TLS, caching, rate limiting</li>
|
||||
<li>Full-stack delivery (Next.js, Bun, SQL)</li>
|
||||
</ul>
|
||||
<Span>
|
||||
I focus on measurable outcomes: faster deployments, lower
|
||||
costs, fewer incidents.
|
||||
</Span>
|
||||
|
||||
<Link className="dotted-text" href="/about">
|
||||
<Row>
|
||||
<UserRoundSearch size={19} />
|
||||
<Span>Learn More About Me</Span>
|
||||
<Span>View Resume</Span>
|
||||
</Row>
|
||||
</Link>
|
||||
</Stack>
|
||||
|
||||
@@ -6,10 +6,11 @@ import Span from "@/components/lib/layout/Span";
|
||||
import Stack from "@/components/lib/layout/Stack";
|
||||
import { work } from "../(data)/work";
|
||||
import Link from "@/components/lib/layout/Link";
|
||||
import React from "react";
|
||||
import React, { Fragment } from "react";
|
||||
import Row from "@/components/lib/layout/Row";
|
||||
import Divider from "@/components/lib/layout/Divider";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
import { CheckCircle2, Circle } from "lucide-react";
|
||||
|
||||
type Props = {
|
||||
noTitle?: boolean;
|
||||
@@ -19,7 +20,7 @@ type Props = {
|
||||
export default function MyWorkSection({ noTitle, expand }: Props) {
|
||||
const categories = Object.keys(work) as (keyof typeof work)[];
|
||||
const [category, setCategory] = React.useState<keyof typeof work>(
|
||||
categories[0]
|
||||
categories[0],
|
||||
);
|
||||
|
||||
if (expand) {
|
||||
@@ -53,7 +54,7 @@ export default function MyWorkSection({ noTitle, expand }: Props) {
|
||||
key={index}
|
||||
/>
|
||||
);
|
||||
}
|
||||
},
|
||||
)}
|
||||
</div>
|
||||
</Stack>
|
||||
@@ -88,7 +89,7 @@ export default function MyWorkSection({ noTitle, expand }: Props) {
|
||||
"cursor-pointer",
|
||||
isActive
|
||||
? ""
|
||||
: "opacity-40 hover:opacity-70"
|
||||
: "opacity-40 hover:opacity-70",
|
||||
)}
|
||||
onClick={() => setCategory(ctgr)}
|
||||
>
|
||||
@@ -134,19 +135,39 @@ export function MyWorkPortfolioCard({
|
||||
{portfolio.href}
|
||||
</Link>
|
||||
<Span>{portfolio.description}</Span>
|
||||
{portfolio.metrics?.[0] && (
|
||||
<Fragment>
|
||||
<Divider />
|
||||
<Row className="gap-4">
|
||||
{portfolio.metrics.map((tch, _i) => (
|
||||
<React.Fragment key={_i}>
|
||||
<Row>
|
||||
<CheckCircle2 size={15} />
|
||||
<Span className="text-xs dark:text-white/40">
|
||||
{tch}
|
||||
</Span>
|
||||
</Row>
|
||||
</React.Fragment>
|
||||
))}
|
||||
</Row>
|
||||
</Fragment>
|
||||
)}
|
||||
{portfolio.technologies?.[0] && (
|
||||
<Row className="gap-4">
|
||||
{portfolio.technologies.map((tch, _i) => (
|
||||
<React.Fragment key={_i}>
|
||||
<Span className="text-sm dark:text-white/40">
|
||||
{tch}
|
||||
</Span>
|
||||
{_i < portfolio.technologies.length - 1 && (
|
||||
<Divider vertical />
|
||||
)}
|
||||
</React.Fragment>
|
||||
))}
|
||||
</Row>
|
||||
<Fragment>
|
||||
<Divider />
|
||||
<Row className="gap-4 opacity-60">
|
||||
{portfolio.technologies.map((tch, _i) => (
|
||||
<React.Fragment key={_i}>
|
||||
<Span className="text-xs dark:text-white/40">
|
||||
{tch}
|
||||
</Span>
|
||||
{_i < portfolio.technologies.length - 1 && (
|
||||
<Divider vertical />
|
||||
)}
|
||||
</React.Fragment>
|
||||
))}
|
||||
</Row>
|
||||
</Fragment>
|
||||
)}
|
||||
</Stack>
|
||||
</Card>
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import Button from "@/components/lib/layout/Button";
|
||||
import H2 from "@/components/lib/layout/H2";
|
||||
import Row from "@/components/lib/layout/Row";
|
||||
import Section from "@/components/lib/layout/Section";
|
||||
import Span from "@/components/lib/layout/Span";
|
||||
import Stack from "@/components/lib/layout/Stack";
|
||||
import { Contact, Mail } from "lucide-react";
|
||||
|
||||
export default function FooterCTASection() {
|
||||
return (
|
||||
<Section>
|
||||
<Stack className="w-full max-w-full xl:max-w-[50vw] gap-8">
|
||||
<H2 className="leading-snug">Need Help With Infrastructure?</H2>
|
||||
<Span>
|
||||
Whether it's CI/CD, cost optimization, or production
|
||||
hardening, I can help.
|
||||
</Span>
|
||||
|
||||
<Row className="items-stretch flex-col md:flex-row w-full md:w-auto gap-4">
|
||||
<Button
|
||||
title="Contact Me"
|
||||
beforeIcon={
|
||||
<Contact size={17} className="font-normal" />
|
||||
}
|
||||
href="/contact"
|
||||
className="grow w-full"
|
||||
>
|
||||
Schedule a Call
|
||||
</Button>
|
||||
<Button
|
||||
title="View My Work"
|
||||
beforeIcon={<Mail size={17} className="font-normal" />}
|
||||
href={`mailto:${process.env.NEXT_PUBLIC_EMAIL_ADDRESS}`}
|
||||
className="grow w-full bg-transparent!"
|
||||
variant="outlined"
|
||||
>
|
||||
Email Me
|
||||
</Button>
|
||||
{/* <Button
|
||||
beforeIcon={
|
||||
<ScrollText size={17} className="font-normal" />
|
||||
}
|
||||
href="/contact"
|
||||
variant="outlined"
|
||||
className="grow w-full"
|
||||
>
|
||||
Resume
|
||||
</Button> */}
|
||||
</Row>
|
||||
</Stack>
|
||||
</Section>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user