diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..1ca87ab --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +{ + "singleQuote": false +} diff --git a/bun.lock b/bun.lock index 08e1d4a..4aa0902 100644 --- a/bun.lock +++ b/bun.lock @@ -28,11 +28,13 @@ }, "devDependencies": { "@types/bun": "^1.3.11", + "prettier": "^3.8.1", + "prettier-plugin-astro": "^0.14.1", }, }, }, "packages": { - "@astrojs/compiler": ["@astrojs/compiler@3.0.1", "", {}, "sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA=="], + "@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="], "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.8.0", "", { "dependencies": { "picomatch": "^4.0.3" } }, "sha512-J56GrhEiV+4dmrGLPNOl2pZjpHXAndWVyiVDYGDuw6MWKpBSEMLdFxHzeM/6sqaknw9M+HFfHZAcvi3OfT3D/w=="], @@ -1526,6 +1528,10 @@ "precinct": ["precinct@12.2.0", "", { "dependencies": { "@dependents/detective-less": "^5.0.1", "commander": "^12.1.0", "detective-amd": "^6.0.1", "detective-cjs": "^6.0.1", "detective-es6": "^5.0.1", "detective-postcss": "^7.0.1", "detective-sass": "^6.0.1", "detective-scss": "^5.0.1", "detective-stylus": "^5.0.1", "detective-typescript": "^14.0.0", "detective-vue2": "^2.2.0", "module-definition": "^6.0.1", "node-source-walk": "^7.0.1", "postcss": "^8.5.1", "typescript": "^5.7.3" }, "bin": { "precinct": "bin/cli.js" } }, "sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w=="], + "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], + + "prettier-plugin-astro": ["prettier-plugin-astro@0.14.1", "", { "dependencies": { "@astrojs/compiler": "^2.9.1", "prettier": "^3.0.0", "sass-formatter": "^0.7.6" } }, "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw=="], + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], @@ -1628,6 +1634,8 @@ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + "s.color": ["s.color@0.0.15", "", {}, "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA=="], + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], @@ -1638,6 +1646,8 @@ "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + "sass-formatter": ["sass-formatter@0.7.9", "", { "dependencies": { "suf-log": "^2.5.3" } }, "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw=="], + "sax": ["sax@1.4.3", "", {}, "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="], "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], @@ -1724,6 +1734,8 @@ "style-to-object": ["style-to-object@1.0.9", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw=="], + "suf-log": ["suf-log@2.5.3", "", { "dependencies": { "s.color": "0.0.15" } }, "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], @@ -1988,6 +2000,8 @@ "archiver-utils/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + "astro/@astrojs/compiler": ["@astrojs/compiler@3.0.1", "", {}, "sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA=="], + "better-ajv-errors/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "compress-commons/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], diff --git a/package.json b/package.json index 67b4d82..d4194a6 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,8 @@ "tw-animate-css": "^1.4.0" }, "devDependencies": { - "@types/bun": "^1.3.11" + "@types/bun": "^1.3.11", + "prettier": "^3.8.1", + "prettier-plugin-astro": "^0.14.1" } } diff --git a/src/components/lastfm.tsx b/src/components/lastfm.tsx index 5944582..c5391d8 100644 --- a/src/components/lastfm.tsx +++ b/src/components/lastfm.tsx @@ -21,7 +21,7 @@ export default function LastFM() { }, []) if (loading) return ( -
+
@@ -33,7 +33,7 @@ export default function LastFM() { if (error) return null; return ( -
+

{track.nowplaying ? "Now playing" : "Recently Played"}

diff --git a/src/components/links.astro b/src/components/links.astro index 3e0f28b..228dd27 100644 --- a/src/components/links.astro +++ b/src/components/links.astro @@ -6,48 +6,49 @@ import LinkedIn from "../assets/icons/linkedin.svg"; import Bluesky from "../assets/icons/bluesky.svg"; import { Mail } from "@lucide/astro"; -const {className} = Astro.props; +const { className } = Astro.props; --- -
-

Where to find me

- + +
+

Where to find me

+
diff --git a/src/components/nav.astro b/src/components/nav.astro index 1c9da52..5b657fe 100644 --- a/src/components/nav.astro +++ b/src/components/nav.astro @@ -4,37 +4,37 @@ import { Birdhouse, TentTree, Trees } from "@lucide/astro"; const pathname = Astro.url.pathname; const links = [ - { name: "Home", href: "/", icon: Birdhouse }, - { name: "Work", href: "/work", icon: TentTree }, - { name: "Blog", href: "/blog", icon: Trees } + { name: "Home", href: "/", icon: Birdhouse }, + { name: "Work", href: "/work", icon: TentTree }, + { name: "Blog", href: "/blog", icon: Trees }, ]; const { className } = Astro.props; ---
-
- -
+
+ +
diff --git a/src/components/whoami.astro b/src/components/whoami.astro index f06d44f..a4cef7b 100644 --- a/src/components/whoami.astro +++ b/src/components/whoami.astro @@ -3,23 +3,25 @@ import { Image } from "astro:assets"; import me from "../assets/me.jpeg"; --- -
-
-
-

Hi, I'm Dustin!

-

- I'm a full stack software engineer from Michigan! -

-

- You can often find me on the computer, out in nature, on the - tennis courts, or wherever there will be some cool cars, and almost always with my camera :) -

-
- Me smiling in my snowboarding jacket on a sunny winter day +
+
+
+

Hi, I'm Dustin!

+

+ I'm a senior full stack software engineer from Michigan, currently + working on some cool stuff at Zenimax Online Studios! +

+

+ Lately you can find me out in nature, at cars and coffees taking + pictures, or at home playing around with my homelab or enjoying some + video games, shows, or movies! +

+ Me smiling in my snowboarding jacket on a sunny winter day +
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index c75d558..adf3259 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -11,26 +11,26 @@ const { title } = Astro.props; --- - - -
-
-
-
- -
-
-
-
+ + +
+
+
+
+
-
-
+
+
- +
+
+
+
+
+ diff --git a/src/pages/index.astro b/src/pages/index.astro index 1203366..cd0eff8 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -2,22 +2,17 @@ import LastFM from "../components/lastfm.tsx"; import Whoami from "../components/whoami.astro"; import Layout from "../layouts/Layout.astro"; - - --- -
-
- -
-
- -
-
+
+
+ +
+
+
- +
+
diff --git a/src/pages/work.astro b/src/pages/work.astro index 3066752..2475960 100644 --- a/src/pages/work.astro +++ b/src/pages/work.astro @@ -2,66 +2,65 @@ import Layout from "../layouts/Layout.astro"; const jobs = [ - { - company: "Zenimax Online Studios", - title: "Applications Engineer", - notes: [ - "Architected and built web app to bring studio knowledge and communication to one place and automate workflows across different teams - React, Fastify, BullMQ, MySQL", - "Worked on web app to search and review both 2D and 3D game assets - React, Fastify, ArangoDB", - "Worked on web app to aggregate in-game market performance data and various BI data - React, Fastify, MySQL", - "Managed and automated deployments for web applications and set up hosting infrastrucure - Ubuntu, Docker, Nginx, Github Actions", - "Worked on UX improvement features in desktop application that automates 3D asset pipeline from 3DS Max to game ready assets - Python, PyQT" - ], - startYear: "2023", - endYear: "Present" - }, - { - company: "Ford Motor Company", - title: "Software Engineer Technical Lead", - notes: [ - "Modernized legacy manufacturing quality software, leading the development effort as the team technical lead", - "Worked with designers and product managers to plan out features in order to meet deliverable expectations", - - ], - startYear: "2022", - endYear: "2023" - }, - { - company: "Ford Motor Company", - title: 'Software Engineer - "Ford College Graduate (FCG)"', - notes: [ - "Helped automate internal application onboarding into various monitoring tools, like Splunk and Dynatrace in a single self-serve web application", - "Worked on FordPass Android application", - "Built various web applications used to train and onboard engineers to company coding standards" - ], - startYear: "2019", - endYear: "2022" - } + { + company: "Zenimax Online Studios", + title: "Applications Engineer", + notes: [ + "Architected and built web app to bring studio knowledge and communication to one place and automate workflows across different teams - React, Fastify, BullMQ, MySQL", + "Worked on web app to search and review both 2D and 3D game assets - React, Fastify, ArangoDB", + "Worked on web app to aggregate in-game market performance data and various BI data - React, Fastify, MySQL", + "Managed and automated deployments for web applications and set up hosting infrastrucure - Ubuntu, Docker, Nginx, Github Actions", + "Worked on UX improvement features in desktop application that automates 3D asset pipeline from 3DS Max to game ready assets - Python, PyQT", + ], + startYear: "2023", + endYear: "Present", + }, + { + company: "Ford Motor Company", + title: "Software Engineer Technical Lead", + notes: [ + "Modernized legacy manufacturing quality software, leading the development effort as the team technical lead", + "Worked with designers and product managers to plan out features in order to meet deliverable expectations", + ], + startYear: "2022", + endYear: "2023", + }, + { + company: "Ford Motor Company", + title: 'Software Engineer - "Ford College Graduate (FCG)"', + notes: [ + "Helped automate internal application onboarding into various monitoring tools, like Splunk and Dynatrace in a single self-serve web application", + "Worked on FordPass Android application", + "Built various web applications used to train and onboard engineers to company coding standards", + ], + startYear: "2019", + endYear: "2022", + }, ]; --- -
-

Work Experience

-
- { - jobs.map((job) => ( -
-

{job.title}

-
- {job.company} - - {job.startYear} - {job.endYear} - -
-
    - {job.notes.map((note) => ( -
  • {note}
  • - ))} -
-
- )) - } -
+
+

Resume

+
+ { + jobs.map((job) => ( +
+

{job.title}

+
+ {job.company} + + {job.startYear} - {job.endYear} + +
+
    + {job.notes.map((note) => ( +
  • {note}
  • + ))} +
+
+ )) + }
+
diff --git a/src/styles/global.css b/src/styles/global.css index bcf4ac7..659843e 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -120,3 +120,7 @@ body { .skeleton { @apply rounded-md animate-pulse bg-gray-0/30 } + +.surface { + @apply bg-gray-2/10 border border-solid rounded-lg p-4 +}