feat: match cv style to new site theming

This commit is contained in:
Troy 2025-03-02 18:07:22 +00:00
parent 907747cd8e
commit 817c3be13c
Signed by: troy
GPG key ID: DFC06C02ED3B4711
12 changed files with 8921 additions and 1726 deletions

View file

@ -13,11 +13,11 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup Bun - name: Setup Node
uses: oven-sh/setup-bun@v2 uses: actions/setup-node@v4
with: with:
bun-version: "latest" node-version: "latest"
- name: Run Bun install and build - name: Run npm clean install and build
run: | run: |
bun install --frozen-lockfile npm ci
bun run build npm run build

View file

@ -1,12 +1,12 @@
FROM oven/bun:latest as bun FROM node:latest as node
USER bun USER node
WORKDIR /usr/src/app WORKDIR /usr/src/app
COPY . . COPY . .
RUN ["bun", "install", "--frozen-lockfile"] RUN ["npm", "ci"]
RUN ["bunx", "--bun", "astro", "build"] RUN ["npx", "astro", "build"]
FROM ghcr.io/static-web-server/static-web-server:latest FROM ghcr.io/static-web-server/static-web-server:latest
WORKDIR / WORKDIR /
COPY --from=bun /usr/src/app/dist /public COPY --from=node /usr/src/app/dist /public

View file

@ -1,4 +1,4 @@
import { defineConfig, passthroughImageService } from "astro/config"; import { defineConfig } from "astro/config";
import sitemap from "@astrojs/sitemap"; import sitemap from "@astrojs/sitemap";
import rehypeExternalLinks from "rehype-external-links"; import rehypeExternalLinks from "rehype-external-links";
import mdx from "@astrojs/mdx"; import mdx from "@astrojs/mdx";
@ -30,7 +30,7 @@ export default defineConfig({
}, },
}, },
}, },
image: { experimental: {
service: passthroughImageService(), responsiveImages: true,
}, },
}); });

1297
bun.lock

File diff suppressed because it is too large Load diff

8554
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -3,31 +3,33 @@
"type": "module", "type": "module",
"version": "0.0.1", "version": "0.0.1",
"scripts": { "scripts": {
"dev": "bunx --bun astro dev", "dev": "npx astro dev",
"build": "bunx --bun astro check && bunx --bun astro build", "build": "npx astro check && npx astro build",
"preview": "bunx --bun astro preview", "preview": "npx astro preview",
"astro": "astro", "astro": "astro",
"format:check": "prettier --check .", "format:check": "prettier --check .",
"format:write": "prettier --write ." "format:write": "prettier --write .",
"update": "npx npm-check-updates"
}, },
"dependencies": { "dependencies": {
"@astrojs/check": "0.9.4", "@astrojs/check": "0.9.4",
"@astrojs/mdx": "^4.0.8", "@astrojs/mdx": "^4.1.0",
"@astrojs/rss": "^4.0.11", "@astrojs/rss": "^4.0.11",
"@astrojs/sitemap": "3.2.1", "@astrojs/sitemap": "3.2.1",
"@fontsource-variable/outfit": "^5.1.1", "@fontsource-variable/outfit": "^5.2.5",
"@fontsource-variable/red-hat-mono": "^5.1.1", "@fontsource-variable/red-hat-mono": "^5.2.5",
"@tailwindcss/vite": "^4.0.8", "@tailwindcss/vite": "^4.0.9",
"astro": "^5.3.1", "astro": "^5.4.1",
"astro-icon": "^1.1.5", "astro-icon": "^1.1.5",
"npm-check-updates": "^17.1.15",
"rehype-external-links": "^3.0.0", "rehype-external-links": "^3.0.0",
"tailwindcss": "^4.0.8", "tailwindcss": "^4.0.9",
"typescript": "^5.7.3" "typescript": "^5.8.2"
}, },
"devDependencies": { "devDependencies": {
"@iconify-json/mdi": "^1.2.3", "@iconify-json/mdi": "^1.2.3",
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.16",
"@types/bun": "^1.2.3", "@types/node": "^22.13.8",
"prettier": "^3.5.2", "prettier": "^3.5.2",
"prettier-plugin-astro": "^0.14.1", "prettier-plugin-astro": "^0.14.1",
"prettier-plugin-tailwindcss": "^0.6.11" "prettier-plugin-tailwindcss": "^0.6.11"

View file

@ -1,6 +1,6 @@
{pkgs ? import <nixpkgs> {}}: {pkgs ? import <nixpkgs> {}}:
pkgs.mkShell { pkgs.mkShell {
nativeBuildInputs = with pkgs.buildPackages; [ nativeBuildInputs = with pkgs.buildPackages; [
bun nodejs
]; ];
} }

View file

@ -9,15 +9,13 @@ const currentPath = pathname.replace(/\/$/, "");
<header class="mx-auto w-full"> <header class="mx-auto w-full">
<nav class="flex w-full justify-between"> <nav class="flex w-full justify-between">
<div class="flex w-fit items-center justify-between"> <a href="/" aria-label={SITE.TITLE} title={SITE.TITLE}>
<a href="/" aria-label={SITE.TITLE} title={SITE.TITLE} class="group"> <Icon
<Icon name="icon"
name="icon" title={SITE.TITLE}
title={SITE.TITLE} class="hover:text-tertiary h-8 w-auto transition-colors duration-500 ease-in-out"
class="hover:text-tertiary h-8 w-auto transition-colors duration-500 ease-in-out" />
/> </a>
</a>
</div>
<ul class="flex w-fit flex-row items-center gap-4"> <ul class="flex w-fit flex-row items-center gap-4">
{ {
SITE.NAVLINKS.map((link) => { SITE.NAVLINKS.map((link) => {
@ -27,7 +25,11 @@ const currentPath = pathname.replace(/\/$/, "");
<li class="text-tertiary hover:text-secondary focus:text-secondary font-medium capitalize transition-colors duration-300 focus:outline-hidden"> <li class="text-tertiary hover:text-secondary focus:text-secondary font-medium capitalize transition-colors duration-300 focus:outline-hidden">
<a <a
href={link.href} href={link.href}
class:list={[isActive ? "text-secondary" : null]} class:list={[
isActive
? "text-secondary hover:text-tertiary transition-colors duration-300"
: null,
]}
> >
{link.name} {link.name}
</a> </a>

View file

@ -10,7 +10,7 @@
and on the side I manage online operations for a family run and on the side I manage online operations for a family run
<a <a
href="/projects/camouflage-store" href="/projects/camouflage-store"
class="hover:text-secondary underline decoration-wavy underline-offset-2 transition-colors duration-300" class="underline decoration-2 underline-offset-2 hover:no-underline"
>outdoor apparel business</a >outdoor apparel business</a
>. >.
</div> </div>

View file

@ -1,5 +1,5 @@
<div <div
class="prose prose-neutral dark:prose-invert prose-lg prose-img:max-h-[90svh] prose-img:rounded-sm prose-img:w-auto prose-img:max-w-full prose-video:max-h-[90svh] prose-video:rounded-sm prose-video:w-auto prose-video::max-w-full prose-a:decoration-wavy" class="prose prose-neutral dark:prose-invert prose-lg prose-img:max-h-[90svh] prose-img:rounded-sm prose-img:w-auto prose-img:max-w-full prose-video:max-h-[90svh] prose-video:rounded-sm prose-video:w-auto prose-video::max-w-full prose-a:hover:no-underline"
> >
<slot /> <slot />
</div> </div>

View file

@ -39,11 +39,6 @@ export const SITE: Site = {
href: "mailto:hello@troylusty.com", href: "mailto:hello@troylusty.com",
icon: "mdi:email", icon: "mdi:email",
}, },
{
name: "CV",
href: "/cv",
icon: "mdi:certificate",
},
{ {
name: "GitHub", name: "GitHub",
href: "https://github.com/troylusty", href: "https://github.com/troylusty",
@ -64,6 +59,10 @@ export const SITE: Site = {
name: "posts", name: "posts",
href: "/posts", href: "/posts",
}, },
{
name: "cv",
href: "/cv",
},
], ],
}; };

View file

@ -1,393 +1,328 @@
--- ---
import "@styles/global.css"; import Layout from "@layouts/Layout.astro";
import { SITE, CV } from "@consts"; import { SITE, HOME } from "@consts";
import { Icon } from "astro-icon/components";
import Head from "@components/Head.astro";
import Link from "@components/Link.astro";
import { Image } from "astro:assets"; import { Image } from "astro:assets";
import { Icon } from "astro-icon/components";
import Link from "@components/Link.astro";
import icon from "public/assets/icon.png"; import icon from "public/assets/icon.png";
const skills = [
{ id: 1, name: "Python" },
{ id: 2, name: "Rust" },
{ id: 3, name: "TypeScript" },
{ id: 4, name: "Git" },
{ id: 5, name: "Docker" },
{ id: 6, name: "Linux" },
{ id: 7, name: "Shopify" },
{ id: 8, name: "Astro" },
{ id: 9, name: "Steamworks" },
{ id: 10, name: "Blender" },
{ id: 11, name: "Godot" },
{ id: 12, name: "Unreal Engine" },
{ id: 13, name: "Adobe Photoshop" },
{ id: 14, name: "GIMP" },
{ id: 15, name: "Inkscape" },
{ id: 16, name: "DaVinci Resolve" },
{ id: 17, name: "Pixelmator Pro" },
{ id: 99, name: "Full drivers licence (A & B)" },
];
const sortedSkills = [...skills].sort((a, b) => a.id - b.id);
const projects = [
{
id: 1,
name: "troylusty.com",
description: "My personal portfolio website made using Astro.",
tags: ["Astro", "Tailwind CSS", "TypeScript", "GitHub Actions", "Docker"],
link: "https://github.com/troylusty/troylusty.com/",
},
{
id: 2,
name: "Artwork",
description:
"A collection of digital artwork created with a variety of tools.",
tags: ["Blender"],
link: "/projects",
},
{
id: 3,
name: "Packard",
description: "Terminal based feed checker.",
tags: ["Rust", "Tokio", "Clap", "NixOS Flake"],
link: "https://github.com/troylusty/packard/",
},
];
const sortedProjects = [...projects].sort((a, b) => a.id - b.id);
const education = [
{
id: 1,
school: "University of Plymouth",
course: "BA (Hons) Game Arts and Design",
dates: "2024 - 2025",
description: ["1st year: Estimated completion May 2025"],
},
{
id: 2,
school: "University Centre South Devon",
course: "FdA Games and Interactive Design",
dates: "2022 - 2024",
description: [
"2nd year: 70.25% State Aggregate Mark",
"1st year: 69.43% State Aggregate Mark",
],
},
{
id: 3,
school: "South Devon College",
course:
"UAL Level 3 Extended Diploma in Creative Media Production and Technology",
dates: "2020 - 2022",
description: [
"2nd year: Extended Diploma - Distinction",
"1st year: Diploma - Distinction",
],
},
{
id: 4,
school: "Kennicott Sixth Form",
course: "BTEC & A-level",
dates: "2018 - 2020",
description: [
"Pearson BTEC Level 3 National Extended Diploma in Art and Design - Distinction Merit Merit",
"AQA GCE/A Computer Science ADV (Python) - C",
],
},
{
id: 5,
school: "King Edward VI Community College",
course: "GCSEs & Cambridge Nationals qualification",
dates: "2014 - 2018",
description: [
"10 GCSEs including Maths and English",
"OCR Cambridge Nationals Creative iMedia Level 1/2 Award/Certificate - Merit at Level 2",
],
},
];
const sortedEducation = [...education].sort((a, b) => a.id - b.id);
--- ---
<!doctype html> <Layout title={HOME.TITLE} description={HOME.DESCRIPTION}>
<html lang="en" class="scroll-smooth antialiased" transition:animate="none"> <div class="animate-reveal flex items-center justify-between opacity-0">
<Head title={CV.TITLE} description={CV.DESCRIPTION} /> <div class="flex-1 space-y-1.5">
<body class="w-full font-sans antialiased"> <h1 class="text-2xl font-bold">{SITE.AUTHOR}</h1><p
<div class="mx-auto max-w-screen-xl"> class="text-secondary/70 max-w-md font-mono text-sm text-pretty"
<main class="flex flex-col sm:m-12"> >
<div Digital designer.
class="flex flex-col items-center justify-between p-4 sm:flex-row-reverse sm:items-start sm:p-8" </p><p
class="text-secondary/70 max-w-md items-center font-mono text-xs text-pretty"
>
<Link
class="inline-flex gap-x-1.5 align-baseline leading-none hover:underline"
href="https://www.google.com/maps/place/Devon"
> >
<div> <Icon name="mdi:earth" class="h-3 w-3" />
<Image Devon, United Kingdom, GMT
src={icon} </Link>
alt="Troy Lusty" </p><div
class="mx-auto mb-2 w-32 rounded-full" class="text-secondary/70 flex gap-x-1 pt-1 font-mono text-sm print:hidden"
loading="eager" >
/> <a
</div> href={`mailto:${SITE.EMAIL}`}
<div> class="bg-button text-secondary hover:bg-button-active flex w-fit flex-row items-center gap-1 justify-self-center rounded-full p-2 text-center text-sm text-nowrap capitalize transition-colors duration-300"
<h1 class="mb-2 text-5xl font-bold">{SITE.AUTHOR}</h1> >
<h2 class="mb-2 text-center text-xl italic sm:text-left"> <Icon name="mdi:email" title="Email" class="h-4 w-4" />
Digital Designer </a>
</h2> <Link
<div href="/"
class="social-links grid grid-cols-1 gap-1 py-4 font-medium md:grid-cols-2" class="bg-button text-secondary hover:bg-button-active flex w-fit flex-row items-center gap-1 justify-self-center rounded-full p-2 text-center text-sm text-nowrap capitalize transition-colors duration-300"
> >
<div class="flex items-center"> <Icon name="mdi:link-variant" title="Website" class="h-4 w-4" />
<Icon name="mdi:house" class="mr-2 inline w-6" /> </Link>
Devon, United Kingdom
</div>
<div class="flex items-center">
<Icon name="mdi:globe" class="mr-2 inline w-6" />
<a href="/">troylusty.com</a>
</div>
<div class="flex items-center">
<Icon name="mdi:email" class="mr-2 inline w-6" />
<a href={`mailto:${SITE.EMAIL}`}>hello@troylusty.com</a>
</div>
<div class="flex items-center">
<Icon name="mdi:house" class="mr-2 inline w-6" />
<Link href="https://github.com/troylusty"
>github.com/troylusty</Link
>
</div>
</div>
</div>
</div>
<div class="flex flex-col sm:flex-row-reverse">
<div class="w-full p-4 sm:max-w-sm sm:p-8">
<div class="mb-12 px-2 text-lg font-light">
<div class="mb-4 flex items-center">
<Icon name="mdi:cogs" class="mr-2" />
<h2 class="text-xl font-semibold">Skills & Tools</h2>
</div>
<h3>Programming</h3>
<p class="leading-8">
<span class="box">Python</span>
<span class="box">Rust</span>
<span class="box">TypeScript</span>
</p>
<h3>Development</h3>
<p class="leading-8">
<span class="box">Git</span>
<span class="box">Docker</span>
<span class="box">Linux</span>
<span class="box">Shopify</span>
<span class="box">Astro</span>
<span class="box">Steamworks</span>
</p>
<h3>3D</h3>
<p class="leading-8">
<span class="box">Blender</span>
<span class="box">Godot</span>
<span class="box">Unreal Engine</span>
</p>
<h3>2D</h3>
<p class="leading-8">
<span class="box">Adobe Photoshop</span>
<span class="box">GIMP</span>
<span class="box">Inkscape</span>
<span class="box">DaVinci Resolve</span>
<span class="box">Pixelmator Pro</span>
</p>
<h3>Other</h3>
<p class="leading-8">
<span class="box">Full drivers licence (A & B)</span>
</p>
</div>
<div class="mb-12 px-2 text-lg font-light">
<div class="mb-4 flex items-center">
<Icon name="mdi:chart-timeline-variant-shimmer" class="mr-2" />
<h2 class="text-xl font-semibold">Education</h2>
</div>
<h3 class="font-semibold">BA (Hons) Game Arts and Design</h3>
<p>2024 - 2025 University of Plymouth</p>
<ol class="list-inside list-disc">
<li><small>1st year: Estimated completion May 2025</small></li>
</ol>
<h3 class="font-semibold">FdA Games and Interactive Design</h3>
<p>2022 - 2024 University Centre South Devon</p>
<ol class="list-inside list-disc">
<li><small>2nd year: 70.25% State Aggregate Mark</small></li>
<li><small>1st year: 69.43% State Aggregate Mark</small></li>
</ol>
<h3 class="font-semibold">
UAL Level 3 Extended Diploma in Creative Media Production and
Technology
</h3>
<p>2020 - 2022 South Devon College</p>
<ol class="list-inside list-disc">
<li><small>2nd year: Extended Diploma - Distinction</small></li>
<li><small>1st year: Diploma - Distinction</small></li>
</ol>
<h3 class="font-semibold">BTEC & A-level</h3>
<p>2018 - 2020 Kennicott Sixth Form</p>
<ol class="list-inside list-disc">
<li>
<small
>Pearson BTEC Level 3 National Extended Diploma in Art and
Design - Distinction Merit Merit</small
>
</li>
<li>
<small>AQA GCE/A Computer Science ADV (Python) - C</small>
</li>
</ol>
<h3 class="font-semibold">
GCSEs & Cambridge Nationals qualification
</h3>
<p>2014 - 2018 King Edward VI Community College</p>
<ol class="list-inside list-disc">
<li><small>10 GCSEs including Maths and English</small></li>
<li>
<small
>OCR Cambridge Nationals Creative iMedia Level 1/2
Award/Certificate - Merit at Level 2</small
>
</li>
</ol>
</div>
<div class="mb-12 px-2 text-lg font-light">
<div class="mb-4 flex items-center">
<Icon name="mdi:wrench" class="mr-2" />
<h2 class="text-xl font-semibold">Other</h2>
</div>
<h3 class="font-semibold">Production Assistant</h3>
<p>2024 SDC Radiant Rumble</p>
<h3 class="font-semibold">Photogrammetrist</h3>
<p>2023 Paignton Picture House</p>
</div>
<div class="mb-12 px-2 text-lg font-light">
<div class="mb-4 flex items-center">
<Icon name="mdi:plane-train" class="mr-2" />
<h2 class="text-xl font-semibold">Languages</h2>
</div>
<h3 class="font-semibold">English</h3>
<p>Native</p>
</div>
</div>
<div class="content w-full p-4 sm:p-8">
<div class="prose">
<h2>Summary</h2>
<p>
My specific chosen area of focus is design, lighting, and
rendering focusing on 3D environments within software such as
Blender and Unreal Engine. Using either real-time or offline
rendering techniques. In addition to this I also have interests
in web development and cyber security.
</p>
<p>
My portfolio of work can be found on my website at <a
href="/projects">troylusty.com/projects</a
>.
</p>
</div>
<hr class="mt-8 mb-12" />
<div class="prose">
<h2>Experience</h2>
<div>
<h3>Camouflage Store</h3>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
2020 - Current:
</p>
<p class="w-full lg:inline-block lg:w-8/12">
E-commerce Business Management
</p>
</section>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Task:
</p>
<p class="w-full lg:inline-block lg:w-8/12">
<Link href="/projects/camouflage-store"
>CMS Migration and Rebrand</Link
>
</p>
</section>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Description:
</p>
<div class="w-full lg:inline-block lg:w-8/12">
<p>
My role has me in charge of managing an online e-commerce
store in addition to creating, editing, and publishing
informational YouTube and social media content for a
family run outdoors store. This includes the recent
redesign and also any maintenance and general upkeep of
the site with all its related systems.
</p>
<ul>
<li>Migration of content to Shopify</li>
<li>Branding refresh and site redesign</li>
<li>VPS setup and self-hosted analytics platform</li>
</ul>
</div>
</section>
<section class="mb-6">
<div
class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top"
>
Tools:
</div>
<div class="w-full lg:inline-block lg:w-8/12">
<span class="box">Shopify</span>
<span class="box">Docker</span>
<span class="box">DaVinci Resolve</span>
<span class="box">Pixelmator Pro</span>
<span class="box">YouTube Creator Studio</span>
<span class="box">GitHub</span>
</div>
</section>
</div>
</div>
<hr class="mt-8 mb-12" />
<div class="prose">
<h2>Projects</h2>
<div class="mb-16">
<h3>troylusty.com</h3>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Personal blog:
</p>
<p class="w-full lg:inline-block lg:w-8/12">
My personal portfolio website made using Astro. A place for
me to share my portfolio of work and anything else I've
learnt.
</p>
</section>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Deployed to:
</p>
<p class="w-full lg:inline-block lg:w-8/12">
<Link href="/">troylusty.com</Link>
</p>
</section>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Code on:
</p>
<p class="w-full lg:inline-block lg:w-8/12">
<Link href="https://github.com/troylusty/troylusty.com"
>github.com/troylusty/troylusty.com</Link
>
</p>
</section>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Features:
</p>
<div class="w-full lg:inline-block lg:w-8/12">
<ul>
<li>Static generation</li>
<li>Blog and project articles written in Markdown/MDX</li>
<li>SEO</li>
<li>RSS feed</li>
</ul>
</div>
</section>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Built with:
</p>
<div class="mt-5 w-full lg:inline-block lg:w-8/12">
<span class="box">Astro</span>
<span class="box">Tailwind CSS</span>
<span class="box">TypeScript</span>
<span class="box">GitHub Actions</span>
<span class="box">Docker</span>
</div>
</section>
</div>
<div class="mb-16">
<h3>Packard</h3>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Terminal based feed checker:
</p>
<p class="w-full lg:inline-block lg:w-8/12">
Packard is a simple RSS aggregator meant to allow you to
take a quick glance at what's occurring in topics you care
about.
</p>
</section>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Code on:
</p>
<p class="w-full lg:inline-block lg:w-8/12">
<Link href="https://github.com/troylusty/packard"
>github.com/troylusty/packard</Link
>
</p>
</section>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Features:
</p>
<div class="w-full lg:inline-block lg:w-8/12">
<ul>
<li>Fast feed fetching with visual progress updates</li>
<li>Feed lists configurable via TOML</li>
<li>
Command line configuration of selected list and more
</li>
<li>Quickly open feed items as links</li>
</ul>
</div>
</section>
<section class="mb-6">
<p class="mb-2 italic lg:inline-block lg:w-3/12 lg:align-top">
Built with:
</p>
<div class="mt-5 w-full lg:inline-block lg:w-8/12">
<span class="box">Rust</span>
<span class="box">Tokio</span>
<span class="box">Clap</span>
<span class="box">NixOS Flake</span>
</div>
</section>
</div>
</div>
</div>
</div>
</main>
</div>
</body>
</html>
<style> <Link
body { href="https://github.com/troylusty"
color: #3c3c42; class="bg-button text-secondary hover:bg-button-active flex w-fit flex-row items-center gap-1 justify-self-center rounded-full p-2 text-center text-sm text-nowrap capitalize transition-colors duration-300"
background: #f3f1ea; >
} <Icon name="mdi:github" title="GitHub" class="h-4 w-4" />
p, </Link>
li, <Link
h1, href="https://store.steampowered.com/developer/troy"
h2, class="bg-button text-secondary hover:bg-button-active flex w-fit flex-row items-center gap-1 justify-self-center rounded-full p-2 text-center text-sm text-nowrap capitalize transition-colors duration-300"
h3 { >
color: #3c3c42; <Icon name="mdi:steam" title="Steamworks" class="h-4 w-4" />
a { </Link>
color: #3c3c42; </div><div
class="text-secondary/70 hidden flex-col gap-x-1 font-mono text-sm print:flex"
>
<a href={`mailto:${SITE.EMAIL}`}
><span class="underline">{`mailto:${SITE.EMAIL}`}</span></a
>
</div>
</div><span
class="relative flex h-28 w-28 shrink-0 overflow-hidden rounded-xl"
>
<Image
src={icon}
alt="Troy Lusty"
class="aspect-square h-full w-full"
loading="eager"
/>
</span>
</div>
<section
class="animate-reveal flex min-h-0 flex-col gap-y-3 opacity-0 [animation-delay:0.1s]"
>
<h2 class="text-xl font-bold">About</h2><p
class="text-secondary/70 font-mono text-sm text-pretty"
>
My specific chosen area of focus is design, lighting, and rendering
focusing on 3D environments within software such as Blender and Unreal
Engine. Using either real-time or offline rendering techniques. In
addition to this I also have interests in web development and cyber
security. My portfolio of work can be found on my website at <a
href="/projects"
class="underline hover:no-underline">troylusty.com/projects</a
>.
</p>
</section>
<section
class="animate-reveal flex min-h-0 flex-col gap-y-3 opacity-0 [animation-delay:0.2s]"
>
<h2 class="text-xl font-bold">Experience</h2>
<div>
<div class="flex flex-col space-y-1.5">
<div class="flex items-center justify-between gap-x-2 text-base">
<h3
class="inline-flex items-center justify-center gap-x-1 leading-none font-semibold"
>
<Link class="hover:underline" href="https://camouflagestore.uk/"
>Camouflage Store</Link
>
</h3><div class="text-tertiary text-sm tabular-nums">
2020 - Current
</div>
</div><h4 class="font-mono text-sm leading-none">
E-commerce Business Management
</h4>
</div><div class="text-secondary/70 mt-2 font-mono text-xs text-pretty">
My role has me in charge of managing an online e-commerce store in
addition to creating, editing, and publishing informational YouTube and
social media content for a family run outdoors store. This includes the
recent redesign and also any maintenance and general upkeep of the site
with all its related systems.
<ul class="mt-2 list-inside list-disc">
<li>Migration of content to Shopify</li>
<li>Branding refresh and site redesign</li>
<li>VPS setup and self-hosted analytics platform</li>
</ul>
</div>
</div>
<div>
<div class="flex flex-col space-y-1.5">
<div class="flex items-center justify-between gap-x-2 text-base">
<h3
class="inline-flex items-center justify-center gap-x-1 leading-none font-semibold"
>
Smaller Roles
</h3>
</div>
<h4 class="font-mono text-sm leading-none">Production Assistant</h4>
</div><div class="text-secondary/70 mt-2 font-mono text-xs text-pretty">
SDC Radiant Rumble (2024)
</div>
<h4 class="mt-2 font-mono text-sm leading-none">Photogrammetrist</h4>
<div class="text-secondary/70 mt-2 font-mono text-xs text-pretty">
Paignton Picture House (2023)
</div>
</div>
</section>
<section
class="animate-reveal flex min-h-0 flex-col gap-y-3 opacity-0 [animation-delay:0.3s]"
>
<h2 class="text-xl font-bold">Education</h2>
{
sortedEducation.map((education) => (
<div>
<div class="flex flex-col space-y-1.5">
<div class="flex items-center justify-between gap-x-2 text-base">
<h3 class="leading-none font-semibold">{education.school}</h3>
<div class="text-tertiary text-sm tabular-nums">
{education.dates}
</div>
</div>
</div>
<div class="text-secondary mt-2 font-mono text-sm text-pretty">
{education.course}
<ul class="text-secondary/70 mt-2 list-inside list-disc text-xs">
{education.description.map((line) => (
<li>{line}</li>
))}
</ul>
</div>
</div>
))
} }
} </section>
a { <section
text-decoration-style: wavy; class="animate-reveal flex min-h-0 flex-col gap-y-3 opacity-0 [animation-delay:0.4s]"
text-decoration-color: #3c3c42; >
} <h2 class="text-xl font-bold">Skills & Tools</h2><div
hr { class="flex flex-wrap gap-1"
color: #d4d2cc; >
} {
.social-links { sortedSkills.map((skill) => (
color: #78787e; <li class="bg-button text-secondary hover:bg-button-active flex w-fit flex-row items-center gap-1 justify-self-center rounded-full px-2 py-1 text-center text-xs text-nowrap capitalize transition-colors duration-300">
} {skill.name}
.box { </li>
border-radius: var(--radius-md); ))
background: #d4d2cc; }
color: #3c3c42; </div>
padding-inline: calc(var(--spacing) * 2); </section>
font-weight: var(--font-weight-medium); <section
} class="animate-reveal flex min-h-0 scroll-mb-16 flex-col gap-y-3 opacity-0 [animation-delay:0.5s]"
</style> >
<h2 class="text-xl font-bold">Projects</h2>
<ol
class="-mx-3 grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3 print:grid-cols-3 print:gap-2"
>
{
sortedProjects.map((project) => (
<li class="flex flex-col overflow-hidden rounded-lg p-3">
<div class="flex flex-col space-y-1.5">
<div class="space-y-1">
<>
<h3 class="text-base font-semibold tracking-tight">
<Link
href={project.link}
class="text-secondary inline-flex items-center gap-1 hover:underline"
>
<span class="mr-1 h-1 w-1 rounded-full bg-green-500" />
{project.name}
</Link>
</h3>
<div class="hidden font-mono text-xs underline print:visible">
{project.name}
</div>
<p class="text-secondary/70 font-mono text-xs">
{project.description}
</p>
</>
</div>
</div>
<div class="mt-auto flex font-mono text-sm text-pretty">
<div class="mt-2 flex flex-wrap gap-1">
{project.tags.map((tag) => (
<div class="bg-button text-secondary hover:bg-button-active flex w-fit flex-row items-center gap-1 justify-self-center rounded-full px-2 py-1 text-center font-sans text-[10px] font-light text-nowrap capitalize transition-colors duration-300">
{tag}
</div>
))}
</div>
</div>
</li>
))
}
</ol>
</section>
</Layout>