Many of the features on this site were incorporated to help me seamlessly add new content as my collection of projects expands. I like to do things the right way the first time, and chose to use tools which wouldn’t limit my creative expression or restrict me to a certain feature set. Building this site was also an incredible learning experience, and I intend to continue using it as a tool to refine and expand my web design and development skills.
Contact me for more information about specific site features or web design inquiries.
I wrote the following script to add custom GSAP animations to my site:
1document.addEventListener("DOMContentLoaded", function () {
2 // Hero image fade in
3 gsap.from(".hero-projects", { opacity: 0.6, scale: 0.6, duration: 1 });
4
5 //Tag buttons and scroll arrow fade in sequentially
6 gsap.from(".tag-button", { delay: 0.5, opacity: 0, stagger: 0.2 });
7
8 gsap.from(".arrow-icon", { delay: 2, opacity: 0, duration: 1 });
9
10
11 // Set initial icon positions
12 setTimeout(function () {
13 gsap.set(".light-mode-icon", {
14 y: document.documentElement.classList.contains("dark-mode") ? "100%" : 0,
15 });
16 gsap.set(".dark-mode-icon", {
17 y: document.documentElement.classList.contains("dark-mode") ? 0 : "100%",
18 });
19 }, 10); // 10 millisecond delay
20
21 // Mode switch animation
22 const toggleButtons = document.querySelectorAll("[tr-color-toggle]"); // Select all elements with the attribute
23 if (toggleButtons) {
24 toggleButtons.forEach((toggleButton) => {
25 toggleButton.addEventListener("click", function () {
26 const isCurrentlyDark =
27 document.documentElement.classList.contains("dark-mode");
28
29 if (isCurrentlyDark) {
30 // Animate to light mode icons
31 gsap.to(".light-mode-icon", {
32 delay: 0.5,
33 duration: 0.5,
34 opacity: 1,
35 y: 0,
36 });
37 gsap.to(".dark-mode-icon", { duration: 0.25, opacity: 0, y: "100%" });
38 } else {
39 // Animate to dark mode icons
40 gsap.to(".light-mode-icon", {
41 duration: 0.25,
42 opacity: 0,
43 y: "100%",
44 });
45 gsap.to(".dark-mode-icon", {
46 delay: 0.5,
47 duration: 0.5,
48 opacity: 1,
49 y: 0,
50 });
51 }
52 });
53 });
54 }
55});
56
I have a diverse set of skills and experiences, so I needed a filtering method which allowed users to quickly find what they were looking for. I also wanted this system to be flexible enough to allow for
One of my primary considerations in designing layouts was making my portfolio fully responsive across breakpoints, as I have seen designers request that their portfolio is viewed only on desktop due to static layouts and raster elements which don't scale properly. I used variable modes, component properties, and SVG elements in my design to create layouts which resize fluidly, resulting in pages that appropriately
With the exception of any trademarked materials, I created every component, element, and icon on this site. I used SVGs for the majority of elements to have more control over resizing, color, and interactions. To streamline my current and future workflow, I used a component-based design system and set up properties for any component variants I may need.
I took considerations to reduce CSS bloat and improve scripting, but at the end of the day this is a portfolio, not a high-traffic e-commerce site. All images have been converted to WebP format