Heading

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.

dmsasser@outlook.com
Figma
Webflow
CodeSandbox
design system
Prototypes
Code

FIGMA PrototypEs

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Select a Breakpoint to use Interactive Prototype
SELECT
to expand selection

Desktop
All
Mobile
All
view on desktop or click the link below to access the interactive prototype

FIGMA PROTOTYPE

go to desktopgo to mobile

Development

GSAP animationS:

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

Design System

Control Panel

typography

Hero

H1

H4

H2

H5

H3

H6
Paragraph text lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
Caption text lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla
Subtitle text lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla
Overline text lorem ipsum dolor
Button Text

Color Palette

This is some text inside of a div block.

Filtering and Data Ordering

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

Layout

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  

Elements

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.

Performance

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

Closing thoughts