Features

Choosing the right tech

When deciding how to solve a problem, I try to avoid using my tech stack as a hammer that turns everything into a nail. Instead, I try to assess and reach for the correct tool for any given problem.

To do this, I looked at what aspects were most important to me for a portfolio site:

Choosing a base framework

With this criteria in mind, I assessed a few options for what I wanted to use for my base framework for my site.

I chose 11ty for the promise of speed, the simplicity of creating, and its flexibility. So far, I have not been disappointed. It has been exceptionally easy to set up, and I've been extremely impressed by the capabilities of front matter for supplying data so that I can keep things DRY. It's lovely.

Choosing a compiler

In the ever-growing landscape of web development, I've seen the pages turn on many compilers as they rise into and fall out of the spotlight. Grunt, Babel, Webpack -- you name it. I've had plenty of experience with Webpack in my professional environments, but have also seen some teams make splendid use of Laravel Mix and Vite. With 11ty decided, I landed on Vite because of its brilliant speed, 11ty's pain-free Vite plugin, and Tailwind's similarly pain-free Vite package.

Why TailwindCSS?

I used TailwindCSS at my first job and loved it. I became accustomed to the speed in which I was able to quickly apply CSS properties. Once you get used to Tailwind's syntax, it literally lets you fly through applying CSS properties in minimal strokes. Having to return to typing out full properties in my second job felt like a sad, miserable slog. Additionally, it scales in rem units right off the bat, making it easy to structure a mathematical rhythm for hierarchy in a design system.

I knew that if I wanted to have fun with this project, I'd want to return to TailwindCSS. It's come with the additional benefit of witnessing first-hand just how far the framework has come; the ease of customizability now is truly impressive.

Tailwind's bundled tailwindcss/nesting plugin has postcss-nested built in, which I'd reach for anyway to give me the nesting capabilities I'm used to with SASS.

Now, you might notice that unlike a normal Tailwind site, the markup is still fairly readable. This is because I use Tailwind's @apply syntax to apply their utility classes in the site's CSS files rather than adding them inline. This keeps the DOM fairly clean and readable, while letting me iterate insanely fast with minimal keystrokes in my CSS file.

Yes, I know that some years ago, this was considered a deeply-regretted anti-pattern by the creator of Tailwind. There's a variety of pros and cons to inline utility classes, and I am happy to use them inline for any project with more granular templating that enables my code to remain DRY. But for my purposes, I highly value readability in my markup for my personal projects, and once you get to more than a few utility classes, the markup becomes difficult to read and modify in a template. It pulls you out of a flow state to slow down and figure out which element you're looking at, which for more complicated layouts, can become quite overwhelming. So I like using @apply. Thanks, Adam. Sorry about your hundreds of thousands of dollars, Adam.

Anyway. That aside! I like Tailwind. So I used Tailwind!

Deciding on design

My design and agency background instilled a very ritualistic process for projects in me from very early on. You spec features, you design, you develop. However, when I started working on my own personal projects outside of other mandated structures, I realized that my brain doesn't always function that way. In practice, I'd sit down to start on a design and get "stuck" on the pressure of feeling like I had to create something totally new.

That's exactly what happened with this project. It's easy for me to design and build for everyone else -- they have branding, they have a style, and I just need to create the best user experience I can that matches their brand. But what represents me? That's a harder question for me to answer.

In more recent years, to get "unstuck", I've just started building. Building gets me into the flow, rewarding me with exciting challenges to solve right off the bat, and if I need to go back to the drawing board for anything, I can. It also lets me get a feeling for how my scope will creep and what I want to build for fun in the future that I might need to visually plan for. So I just started building instead. I got 11ty set up, got my lightning-fast build system figured out, and scaffolded my base CSS the way I like. All was well!

The issue with winging it

But this methodology came with another problem. I wanted something new, but without anything planned, I started falling back into old patterns and old designs. Standard floating top navigation, centered content container, "Hi, I'm Vanessa" banner, skills section, projects section, contact. And it just felt-- boring. Just so, so lame. Intro banners always feel so awkward on a site where you're not totally sure who you're talking to. Of course, I'm building this to appeal to potential employers, but everyone has their individual vibes and if they're landing on my website, it's going to be from a place they already know my name and my summary (LinkedIn, resume, application). Is it really worth it to re-iterate so verbosely?

From there, I started asking more questions. Do I really need a whole navigation bar for what's basically a Single Page Application? Is that a good use of screen real-estate? Who does that serve? Who finds it fun or useful when a navigation item is just an anchor link to something you've already read instead of taking you to a new page with more info? I certainly don't.

So I went back to the drawing board. I looked at other portfolios for examples, and saw much of the format I was tired of repeated over and over. A part of me wondered if maybe there was a reason for that. What if this convention exists because it's a working strategy? Anecdotally, many of the portfolios that I saw in this layout belonged to either student, introductory, or freelance developers. Even as I looked through them, they all blended together; despite their names being front-and-center, I couldn't remember any that stuck out to me. The ones I did remember were the ones that broke out of this mold, not the ones that fit into it. So this gave me the confidence I needed to break out of this observed convention and into trying something new.

Asking the right questions

As always in design, content is king and less is more. So what if I started with the bare minimum that I needed and built up from there? This is how the typographical theme came about.

I started asking new questions that would inform my design:

Answering the right questions

I thought about what potential employers would look for right off the bat: my tech stack, my work, and my experience. A recruiter or a tech lead will look for the stack they're using and the level of experience they're working for, and will look for projects and experience that exhibit that skill. So: big and bold skills it is, first after the intro in the left column.

As a software developer with a love for frontend and a passion for accessibility, I want to make sure that my site is responsive, accessible, and easy to use. The site is responsive on all devices, respects your device's light & dark settings, as well as your reduced motion settings. For some flair, I used JavaScript to implement the lovely Rough Notation package for hover effects, giving some playful variety to the otherwise geometric and rigid design.

Then, finally, I want employers to see my work, and then hopefully contact me. To help with this, I figured I could keep my LinkedIn present at all times in the left sidebar. While this started as an icon in my original design, I later expanded this to a more clear action item button in order to reduce friction.

With all of this in mind, this time I mocked up a very rough wireframe in Figma. Since this was the equivalent of jotting something down in a sketchbook, I didn't worry about character styles, exact measurements, or even accessible colors; I just slapped things down willy-nilly to get the idea out of my brain and onto a visual.

A screenshot of the Figma design comp for this site
The rough Figma wireframe. Not perfect, but perfect is the enemy of finished for me!

Development retrospective

First and foremost, wow, 11ty is fun. A lot of the limitations I worried that I'd run into with a static site generator, 11ty mitigated completely with their wonderful front matter data system. It was wonderfully intuitive, and exactly the right mixture of code-and-markdown I'm looking for. Solutions for issues were easy to find, and the .eleventy.js file was super easy to augment. Every plugin I plopped in was documented consistently and usefully, and Just Worked Every Time. I was able to painlessly build or add features gradually as I needed them.

Big shoutouts to the following 11ty community plugins for making it so that I didn't have to reinvent the wheel on some wonderful QOL features:

It was fun to check out v4 of TailwindCSS and see how much the framework has grown. I remember having to edit a several-thousand-line commented file of theme variables in older Tailwind projects, so it was nice to be able to easily override and add utilities with the @theme and @utility directives.

Rough Notation was a real treat to work with. I'm usually picky on styling for these kinds of effects, but it just looked good right out of the box, and I had very few issues. I actually had to be careful to not over-use the effects because they are simply just that fun.

The JavaScript for the tech highlighting feature was simple but fun. I index the project and experience elements in an object to organize their elements and extract their attached data properties, then attach event listeners that show and hide the already-instantiated annotations when requested. Normally, I'd reach for class-based addition and subtraction for a highlighting feature like this, but since Rough Notation draws the SVGs with JavaScript, they don't have that kind of option available. It was still lovely and easy enough, even then, and it's very snappy.