From c7be9f3aba46148856e2aba226bb884a468297eb Mon Sep 17 00:00:00 2001 From: Troy Date: Fri, 25 Jul 2025 16:55:23 +0100 Subject: [PATCH] feat: rewrite cv about text --- package-lock.json | 31 +- package.json | 6 +- src/assets/ucsd.png | Bin 35480 -> 0 bytes src/components/AboutList.astro | 2 +- src/components/Button.astro | 2 +- src/components/Gallery.astro | 21 +- src/components/Hero.astro | 2 +- src/components/ShowcaseProject.astro | 13 +- src/consts.ts | 4 +- src/content/config.ts | 1 + .../projects/a-long-way-down/index.mdx | 1 + src/content/projects/archive/index.mdx | 7 +- src/content/projects/mortis/index.mdx | 1 + src/content/projects/the-batman/index.mdx | 1 + .../university-dissertation/index.mdx | 1 + src/pages/about.astro | 274 +++++++++--------- src/pages/projects/index.astro | 7 +- src/styles/global.css | 2 +- 18 files changed, 197 insertions(+), 179 deletions(-) delete mode 100644 src/assets/ucsd.png diff --git a/package-lock.json b/package-lock.json index 9255e5e..95b071b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@astrojs/rss": "^4.0.12", "@astrojs/sitemap": "3.4.1", "@tailwindcss/vite": "^4.1.11", - "astro": "^5.12.0", + "astro": "^5.12.3", "astro-icon": "^1.1.5", "rehype-external-links": "^3.0.0", "tailwindcss": "^4.1.11", @@ -22,8 +22,8 @@ "devDependencies": { "@iconify-json/mdi": "^1.2.3", "@tailwindcss/typography": "^0.5.16", - "@types/node": "^24.0.15", - "npm-check-updates": "^18.0.1", + "@types/node": "^24.1.0", + "npm-check-updates": "^18.0.2", "prettier": "^3.6.2", "prettier-plugin-astro": "^0.14.1", "prettier-plugin-tailwindcss": "^0.6.14" @@ -2139,9 +2139,9 @@ } }, "node_modules/@types/node": { - "version": "24.0.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz", - "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", + "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", "license": "MIT", "dependencies": { "undici-types": "~7.8.0" @@ -2455,9 +2455,9 @@ } }, "node_modules/astro": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.12.0.tgz", - "integrity": "sha512-Oov5JsMFHuUmuO+Nx6plfv3nQNK1Xl/8CgLvR8lBhZTjYnraxhuPX5COVAzbom+YLgwaDfK7KBd8zOEopRf9mg==", + "version": "5.12.3", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.12.3.tgz", + "integrity": "sha512-fU1hNPMkccm+FuonGsY5DFkC2QyuLCju++8L2ubzBtYBDBf6bmfgmVM7A2dK+Hl+ZJCUNgepsClhBpczj+2LRw==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.12.2", @@ -3888,14 +3888,15 @@ } }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -6243,9 +6244,9 @@ } }, "node_modules/npm-check-updates": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-18.0.1.tgz", - "integrity": "sha512-MO7mLp/8nm6kZNLLyPgz4gHmr9tLoU+pWPLdXuGAx+oZydBHkHWN0ibTonsrfwC2WEQNIQxuZagYwB67JQpAuw==", + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-18.0.2.tgz", + "integrity": "sha512-9uVFZUCg5oDOcbzdsrJ4BEvq2gikd23tXuF5mqpl4mxVl051lzB00Xmd7ZVjVWY3XNUF3BQKWlN/qmyD8/bwrA==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 655f6ad..70eb7d8 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@astrojs/rss": "^4.0.12", "@astrojs/sitemap": "3.4.1", "@tailwindcss/vite": "^4.1.11", - "astro": "^5.12.0", + "astro": "^5.12.3", "astro-icon": "^1.1.5", "rehype-external-links": "^3.0.0", "tailwindcss": "^4.1.11", @@ -26,8 +26,8 @@ "devDependencies": { "@iconify-json/mdi": "^1.2.3", "@tailwindcss/typography": "^0.5.16", - "@types/node": "^24.0.15", - "npm-check-updates": "^18.0.1", + "@types/node": "^24.1.0", + "npm-check-updates": "^18.0.2", "prettier": "^3.6.2", "prettier-plugin-astro": "^0.14.1", "prettier-plugin-tailwindcss": "^0.6.14" diff --git a/src/assets/ucsd.png b/src/assets/ucsd.png deleted file mode 100644 index 38db740dc1e7d1a3c97682d3e7c7c7183d0989d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35480 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 diff --git a/src/components/AboutList.astro b/src/components/AboutList.astro index 676e3d0..31fc047 100644 --- a/src/components/AboutList.astro +++ b/src/components/AboutList.astro @@ -43,7 +43,7 @@ const { information } = Astro.props;

{item.date}

{item.date_opt ? ( -

{item.date_opt}

+

{item.date_opt}

) : null}
diff --git a/src/components/Button.astro b/src/components/Button.astro index f56dcfa..c31e76b 100644 --- a/src/components/Button.astro +++ b/src/components/Button.astro @@ -9,7 +9,7 @@ const { href, link } = Astro.props;
{link}
diff --git a/src/components/Gallery.astro b/src/components/Gallery.astro index 07bc19d..8ff4022 100644 --- a/src/components/Gallery.astro +++ b/src/components/Gallery.astro @@ -17,21 +17,14 @@ const { items } = Astro.props as Props;
{ items.map((item: Item) => ( -
+ )) diff --git a/src/components/Hero.astro b/src/components/Hero.astro index 504c738..5af5d31 100644 --- a/src/components/Hero.astro +++ b/src/components/Hero.astro @@ -9,7 +9,7 @@ class="text-secondary/70 animate-reveal text-lg font-medium opacity-0 [animation-delay:0.1s]" > I’m a recent Game Arts and Design graduate with a chosen area of focus on the design, lighting, and rendering diff --git a/src/components/ShowcaseProject.astro b/src/components/ShowcaseProject.astro index 0c6c2f8..d4727a0 100644 --- a/src/components/ShowcaseProject.astro +++ b/src/components/ShowcaseProject.astro @@ -17,7 +17,7 @@ const { collection } = Astro.props; src={collection.data.image.url} alt={collection.data.image.alt} loading="eager" - class="aspect-[2/1] object-cover transition-all duration-300 ease-in-out group-hover:brightness-50" + class="aspect-square object-cover transition-all duration-300 ease-in-out group-hover:brightness-50" fit="cover" />
@@ -25,7 +25,16 @@ const { collection } = Astro.props; class="relative opacity-0 transition-all delay-100 duration-300 ease-in-out group-hover:opacity-100" >

- {collection.data.title} + { + collection.data.collection ? ( + + {collection.data.title}{" "} + (Collection) + + ) : ( + {collection.data.title} + ) + }

{ diff --git a/src/consts.ts b/src/consts.ts index 8729f5f..99ef279 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -3,7 +3,7 @@ import type { Metadata, Site } from "@types"; export const SITE: Site = { TITLE: "Troy Lusty", DESCRIPTION: - "Hi, my name is Troy and I’m a student 3D artist studying on a BA (Hons) Game Arts and Design course in the UK.", + "Hi, my name is Troy and I’m a recent Game Arts and Design graduate with a chosen area of focus on the design, lighting, and rendering of 3D environments.", EMAIL: "hello@troylusty.com", KEYWORDS: [ "troy", @@ -74,7 +74,7 @@ export const SITE: Site = { export const HOME: Metadata = { TITLE: "Troy Lusty", DESCRIPTION: - "Hi, my name is Troy and I'm a student 3D artist currently studying in my second year of an FdA Games and Interactive Design course in the UK.", + "Hi, my name is Troy and I’m a recent Game Arts and Design graduate with a chosen area of focus on the design, lighting, and rendering of 3D environments.", }; export const PROJECTS: Metadata = { diff --git a/src/content/config.ts b/src/content/config.ts index b3df877..d9320b5 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -56,6 +56,7 @@ const projects = defineCollection({ featured: z.boolean().optional(), collection: z.boolean().optional(), highlight: z.boolean().optional(), + rank: z.number().optional().default(0), }) .merge(rssSchema), }); diff --git a/src/content/projects/a-long-way-down/index.mdx b/src/content/projects/a-long-way-down/index.mdx index 8fad659..3a1c91a 100644 --- a/src/content/projects/a-long-way-down/index.mdx +++ b/src/content/projects/a-long-way-down/index.mdx @@ -7,6 +7,7 @@ image: { url: "alwd-img1.jpg", alt: "A Long Way Down Intro Showcase" } tags: ["unreal engine", "blender", "inkscape"] categories: ["education"] extraAuthors: [{ name: "Sam Griffiths", url: "https://samgriffiths.dev" }] +rank: 7 --- import Gallery from "@components/Gallery.astro"; diff --git a/src/content/projects/archive/index.mdx b/src/content/projects/archive/index.mdx index 3dbd097..32d3877 100644 --- a/src/content/projects/archive/index.mdx +++ b/src/content/projects/archive/index.mdx @@ -1,6 +1,6 @@ --- title: "Archive" -description: "A collection of smaller, unfinished, or historic personal works." +description: "A collection of smaller, historic, or incomplete personal works." date: 2021-01-15 featured: true image: { url: "2023-11-23.jpg", alt: "Ugolino and His Sons lighting" } @@ -8,6 +8,7 @@ tags: [ "blender", "unreal engine", + "houdini", "davinci resolve", "photoshop", "gimp", @@ -15,11 +16,13 @@ tags: ] categories: ["personal"] highlight: true +rank: 10 +collection: true --- import Gallery from "@components/Gallery.astro"; -Whilst not all of these pieces are large enough to have their own project page, I still think they showcase what I am interested in and it didn't feel right to exclude them entirely. This page receives updates periodically. +Whilst not all of these pieces are large enough to have their own project page, I still think they showcase what I am interested in and it didn't feel right to exclude them entirely. This page receives updates periodically with work not necessarily being arranged in order of completion. import video2023_04_08 from "./2023-04-08.webm"; import video2023_02_08 from "./2023-02-08.webm"; diff --git a/src/content/projects/mortis/index.mdx b/src/content/projects/mortis/index.mdx index b23c9dd..fd817d3 100644 --- a/src/content/projects/mortis/index.mdx +++ b/src/content/projects/mortis/index.mdx @@ -10,6 +10,7 @@ image: featured: true tags: ["blender", "davinci resolve"] categories: ["personal"] +rank: 9 --- import Gallery from "@components/Gallery.astro"; diff --git a/src/content/projects/the-batman/index.mdx b/src/content/projects/the-batman/index.mdx index 20d730d..e0eb573 100644 --- a/src/content/projects/the-batman/index.mdx +++ b/src/content/projects/the-batman/index.mdx @@ -16,6 +16,7 @@ tags: "clip studio paint", ] categories: ["education"] +rank: 8 --- import image1 from "googleformexportframe_3.1.1.jpg"; diff --git a/src/content/projects/university-dissertation/index.mdx b/src/content/projects/university-dissertation/index.mdx index d6e0953..1557962 100644 --- a/src/content/projects/university-dissertation/index.mdx +++ b/src/content/projects/university-dissertation/index.mdx @@ -6,6 +6,7 @@ image: { url: "15.jpg", alt: "Tomb final" } tags: ["blender", "affinity photo", "affinity designer", "gimp"] categories: ["personal"] featured: true +rank: 6 --- import Gallery from "@components/Gallery.astro"; diff --git a/src/pages/about.astro b/src/pages/about.astro index 5275f07..82e2be2 100644 --- a/src/pages/about.astro +++ b/src/pages/about.astro @@ -1,20 +1,15 @@ --- import Layout from "@layouts/Layout.astro"; import { SITE, ABOUT } from "@consts"; -import { Image } from "astro:assets"; import { Icon } from "astro-icon/components"; import Link from "@components/Link.astro"; -import { createSlug } from "@lib/utils"; import AboutList from "@components/AboutList.astro"; -import me from "@assets/me.jpg"; import camoicon from "@assets/camouflage-store.png"; import nisaicon from "@assets/nisa.png"; import pphicon from "@assets/paigntonpicturehouse.png"; import webbossicon from "@assets/webboss.png"; - import uopicon from "@assets/uop.png"; -import ucsdicon from "@assets/ucsd.png"; import sdcicon from "@assets/sdc.png"; import keviccicon from "@assets/kevicc.png"; @@ -23,8 +18,16 @@ const projects = [ id: 1, name: "MUST FIND BEANS", description: - "A fast-paced first person shooter set following the realization that you’re all out of beans. The problem is, you’re nearing the end of cooking all the other items and you can’t just not have them. Without beans, the day just won’t be started off right.", - tags: ["Godot", "Blender", "GIMP", "Steamworks"], + "A fast-paced first person shooter set following the realization that you’re all out of beans, and without beans the day just won’t be started off right. This game is very early in development but there is a public playtest available on Steam.", + tags: [ + "Godot", + "Blender", + "GIMP", + "Steamworks", + "Git version control", + "Performance optimisation", + "GDScript", + ], link: "/projects/must-find-beans", print_link: "https://troylusty.com/projects/must-find-beans", done: false, @@ -33,8 +36,18 @@ const projects = [ id: 2, name: "Sinkie Soldiers", description: - "Sinkie Soldiers is a local co-op versus game in which you battle against your friends for control of the castle! Your goal is to break down the integrity of your enemy's armour and finish them off to claim the victory.", - tags: ["Unreal Engine", "Blender", "GIMP", "FL Studio", "Inkscape"], + "Sinkie Soldiers is a local co-op versus game in which you battle against your friends for control of the castle! This started off as a game jam submission but is being polished up and published onto Steam.", + tags: [ + "Unreal Engine", + "Blender", + "GIMP", + "FL Studio", + "Inkscape", + "Asset creation", + "Team collaboration", + "Time management", + "Branding design", + ], link: "/projects/sinkie-soldiers", print_link: "https://troylusty.com/projects/sinkie-soldiers", done: true, @@ -43,13 +56,15 @@ const projects = [ id: 3, name: "troylusty.com", description: - "My personal website made using Astro as a way to show off my portfolio of work and display blog posts.", + "My personal website made using Astro as a way to show off my portfolio of work, display blog posts, and host my CV.", tags: [ "Astro", "Tailwind CSS", "TypeScript", "Self-hosted Forgejo Actions", "Docker", + "CI/CD", + "Open source", ], link: "https://code.threepop.com/troy/troylusty.com", print_link: "https://code.threepop.com/troy/troylusty.com", @@ -59,8 +74,18 @@ const projects = [ id: 4, name: "Artwork", description: - "A collection of digital artwork created with a variety of tools.", - tags: ["Blender", "Cinema 4D", "DaVinci Resolve"], + "A collection of digital artwork created with a variety of tools to showcase software proficiency and develop skills.", + tags: [ + "Blender", + "Cinema 4D", + "Houdini", + "DaVinci Resolve", + "Image manipulation", + "Environment design", + "Lighting", + "Cycles", + "EEVEE", + ], link: "/projects", print_link: "https://troylusty.com/projects", done: true, @@ -70,7 +95,7 @@ const projects = [ name: "Packard", description: "Packard is a simple terminal based RSS aggregator meant to allow you to take a quick glance at what’s occurring in topics you care about.", - tags: ["Rust", "Tokio", "Clap", "NixOS Flake"], + tags: ["Rust", "Tokio", "NixOS Flake", "Command-line interaction"], link: "/projects/packard", print_link: "https://troylusty.com/projects/packard", done: true, @@ -89,23 +114,23 @@ const experience = [ }, { id: 2, + location: "Paignton Picture House Trust", + image: pphicon, + main: "Photogrammetrist (Volunteer)", + date: "2023", + }, + { + id: 3, location: "Nisa", image: nisaicon, main: "Promotional graphic design", date: "2022", }, - { - id: 3, - location: "Paignton Picture House Trust", - image: pphicon, - main: "Photogrammetrist (Volunteering)", - date: "2023", - }, { id: 4, location: "WebBoss", image: webbossicon, - main: "Website mock-up templates (Work experience)", + main: "Website template design (Work experience)", date: "2019", }, ]; @@ -117,16 +142,9 @@ const education = [ location: "University of Plymouth", image: uopicon, main: "BA (Hons) Game Arts and Design", - date: "2024 - 2025", + date: "2022 - 2025", date_opt: "First Class Honours", }, - { - id: 2, - location: "University Centre South Devon", - image: ucsdicon, - main: "FdA Games and Interactive Design", - date: "2022 - 2024", - }, { id: 3, location: "South Devon College", @@ -136,9 +154,9 @@ const education = [ }, { id: 4, - location: "King Edward VI Community College", + location: "King Edward VI Community College (Kennicott)", image: keviccicon, - main: "Art & Design BTEC, Computer Science A-level, 10 GCSEs, Creative iMedia Level 2", + main: "Art & Design BTEC and Computer Science A-level", date: "2014 - 2020", }, ]; @@ -180,74 +198,73 @@ const sortedLinks = [...links].sort((a, b) => a.id - b.id); --- -
-
-

- {SITE.AUTHOR}Digital designer -

-

- - - Devon, United Kingdom, GMT - -

-
- { - sortedLinks.map((link) => ( - - - - )) - } -
- -
+

- {SITE.AUTHOR} - -

+ {SITE.AUTHOR}Digital designer + +

+ + + Devon, United Kingdom, GMT + +

+
+ { + sortedLinks.map((link) => ( + + + + )) + } +
+ + -
+

- I’m a recent Game Arts and Design graduate with a chosen area of focus on the design, lighting, and rendering - of 3D environments. Using either real-time or offline rendering techniques - in software packages such as Blender, Unreal Engine, and more recently: Godot. - In addition to this I also have interests in web development, graphic design, - and cyber security in addition to motorbike touring. An up-to-date portfolio - of my work can be found on my website at graduate with a specialization in 3D environment design, I'm passionate about + crafting visually compelling atmospheres which utilize dynamic lighting in + order to enhance storytelling and create a more memorable space. I have experience + designing within Blender, Unreal Engine, and Godot – possessing a thorough + understanding of both real-time and offline rendering techniques. +

+

+ My skillset extends beyond traditional 3D art; I’m proficient in + programming leveraging Godot's GDScript for example to develop robust game + logic and systems that complement my visual assets whilst still achieving + high performance on the end-user's hardware. +

+

+ You can view my portfolio at troylusty.com/projects.

@@ -255,73 +272,58 @@ const sortedLinks = [...links].sort((a, b) => a.id - b.id);

Education

-
    +
    -

    Other education

    -
    -
      -
    • Full drivers licence (Category A & B)
    • -
    -

Experience

-
    +

Projects

-
    +
      { sortedProjects.map((project) => (
    1. -
      - <> -

      - - {project.done ? ( - - ) : ( - - )} - {project.name} - -

      -

      {project.description}

      - - -
      +

      + + {project.done ? ( + + ) : ( + + )} + {project.name} + +

      +

      {project.description}

      +
      -
      -
      - {project.tags.map((tag) => ( - - {tag} - - ))} -
      +
      + {project.tags.map((tag) => ( +

      + {tag} +

      + ))}
    2. )) diff --git a/src/pages/projects/index.astro b/src/pages/projects/index.astro index 2d0f68c..cc5e080 100644 --- a/src/pages/projects/index.astro +++ b/src/pages/projects/index.astro @@ -6,7 +6,12 @@ import ShowcaseProject from "@components/ShowcaseProject.astro"; const projects = (await getCollection("projects")) .filter((project) => !project.data.draft) - .sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf()); + .sort((a, b) => { + if (a.data.rank !== b.data.rank) { + return b.data.rank - a.data.rank; + } + return b.data.date.valueOf() - a.data.date.valueOf(); + }); --- diff --git a/src/styles/global.css b/src/styles/global.css index 17cf3bb..4fc21af 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -34,7 +34,7 @@ color-scheme: light dark; --primary: light-dark(oklch(0.855 0.01 264), oklch(0.145 0.01 264)); --secondary: light-dark(oklch(0.145 0.01 264), oklch(0.855 0.01 264)); - --tertiary: light-dark(oklch(0.556 0.01 264), oklch(0.556 0.01 264)); + --tertiary: light-dark(oklch(0.456 0.01 264), oklch(0.556 0.01 264)); --button: light-dark(oklch(0.731 0.01 264), oklch(0.269 0.01 264)); --button-active: light-dark(oklch(0.629 0.01 264), oklch(0.371 0.01 264));