A Design System and Product Design for NodeSource


Almighty Numbers

370+

Components (and counting)

100%

Accessible (WCAG 2.2)

12

Team Members

2+

Years of Evolution


Origins

What's the pattern?

Most of NodeSource's products start with the motif "N|"… yeah, a vertical bar (Pipe symbol). The names with "Solid|" are pricing plans.

Check out all their product logos below πŸ‘‡πŸ»:

All NodeSource's product logos

All NodeSource's product logos

Design System

Name: N|Core

Obviously I had to use the "N|" motif somehow. And "Core" is a central system that everything else is built upon. That's how the name N|Core happened. Doh!

Below: Cover design for the Figma file and justification page for the name N|Core below πŸ‘‡πŸ½:

N|Core Design System Cover

N|Core Design System Cover

Justification for N|Core Design System

Justification for N|Core Design System


Figma Variables

Primitives & Tokens for Color and Typography, Numbers, and Modular Scale variables

With these variables in place, creating new components is like "pttt!", easy peasy.

Did you build this design system from scratch?

What! No way! I used the UI Prep Design System as a starting point. I got access to the full DS file after completing the Design System Bootcamp by Molly Hellmut. I completed this bootcamp on October 13, 2024.

Check out my certificate! lol.

Color Primitives

Color Primitives

Color Tokens

Color Tokens

Typography Primitives

Typography Primitives

Typography Tokens

Typography Tokens

Numbers

Numbers

Modular Scale (πŸ™…πŸ½8pt grid system)

Modular Scale (πŸ™…πŸ½8pt grid system)


Typography System

Let's talk typography, will ya?

Note: I will use the term "typeface" and "font" interchangeably. I DO KNOW the difference, but for the sake of making this thing somewhat enjoyable to read for designers and non-designers… whatever, lol.

When I inherited the NodeSource project, I was given the "Source Sans Pro" typeface. RED FLAG! 🚩. Why?

  1. Performance:
    • The user would have to download a file for each style. Yeah, right.
    • Because this font had to be served locally.
    • Multiple files: One file per style. 🀯
  2. Headaches: That meant having to deal with TTF, OTF, and WOFF files. No thanks!

What a P.I.A. 🫏

So, guess what I did? Went to Google Fonts! And lo and behold, there was the almighty "Source Sans 3" πŸ₯³. All kinds of "wins":

  1. Performance:
    • Variable font: One file to download.
    • Served by Google. Way faster servers.
  2. No headaches: Didn't have to deal with TTF, OTF, and WOFF files.

And for the monospaced font, NodeSource was already using "Source Code Pro" which is also on Google Fonts, lol. πŸ‘πŸ½

Fun fact

All fonts, Source Sans Pro, Source Sans 3, and Source Code Pro are created by the same designer, Paul D. Hunt. HA! (that sounded funny in my head, not so much here, lol).

Modular Scale, WTF is that?

A modular scale is a bunch of numbers/values that are harmonious with each other. These numbers can be used for typography, spacing, margins, line-heights, etc.

All the font sizes used in the N|Core Design System are based on a modular scale. Check out the modular scale here. If you're not familiar with a Modular Scale, that page is going to mean πŸ’©.

Bro, why didn't you use the 8pt grid system?

Because:

  1. Every single designer in the planet uses that damn 8pt grid system, lol.
  2. The Modular Scale app provides all font sizes in em, which is much more useful for developers.

Aaaaaaaaaanyway, check out the screenshot for the Typography System from Figma below πŸ‘‡πŸ½:

Typescale using a Modular Scale

Typescale using a Modular Scale

HTML + CSS

CodePen Demo

What the heck is happening in this demo?

  1. As you shrink or enlarge the viewport, the font sizes change.
  2. The font sizes are based on the Modular Scale, which keeps the harmony regardless of the viewport size.
  3. This method uses the calc() function.
  4. FYI, the clamp() function wasn't supported at the time 🀷🏽.
Drag the handle to test responsiveness

Here's an example YOU can drop in your CSS: font-size: clamp(12px, 4vw, 18px);


Color System

Let's talk colors, will ya?

When I inherited the NodeSource project, the client had 7 base colors defined. You can see them on the "Base Colors" column on the image below with white background.

After a πŸ’©-ton of work, using all kinds of color creation tools and Figma plugins, the final color palette is shown below in the screenshot from Figma.

Why was it difficult to create the color palette?

Because:

  1. As powerful as they may be, the Figma plugins do not consider accessibility. In other words, they can create shades that don't work with either White or Black text.
  2. Most tools only create a Light mode ramp.
  3. Some tools are unnecessarily complicated to use.
  4. I ended editing each shade in each ramp manually to make sure they were accessible.

What tool did you use then?

Well, I went and built and designed the damn tool myself, lol.

Create accessible color ramps in less than 5 seconds, no BS: Color-Ramp.com

Middle column: 7 defined colors by the client

Middle column: 7 defined colors by the client

100% accessible Light and Dark mode color ramps

100% accessible Light and Dark mode color ramps


Design System Components

Friggin' Buttons, lol

144 buttons in total… damn, haha.

Although not all buttons are used (yet), they are ready when the moment comes. NodeSource has multiple products and with a design system like N|Core, supporting new products is easier.

Check out the buttons in Dark and Light modes below πŸ‘‡πŸ½:

Dark mode buttons

Dark mode buttons

Light mode buttons

Light mode buttons

Input Fields

These input fields are a work in progress, but for now I have:

  1. Text
  2. Password
  3. Search
  4. Upload file
  5. Number
  6. Textarea
  7. Select menu

Checkboxes and radio buttons are in their own pages.

What's pending?

The Small versions 😁.

All current input fields [WIP]

All current input fields [WIP]

Input text detail - Notice the Properties panel 😎

Input text detail - Notice the Properties panel 😎

Tables

Oh boy, tables in Figma! Well, initially I was using the plugin Table Creator. It worked well for a while, until I realized that if the file had a lot of tables, the performance of Figma would go in the gutter.

I also wasn't too fond of depending on a plugin for this. So, following best practices and scalability, I created a table component.

I can build any kind of table in a snap with this component.

Check out the table component in Dark and Light modes below πŸ‘‡πŸ½:

Table component

Table component

Table detail: Dark and Light modes

Table detail: Dark and Light modes


N|Solid Console

NodeSource's Flagship Product

Here is an example of the Dashboard table UI with selected rows.

Figma file showing the design with a 12-column layout

Figma file showing the design with a 12-column layout

Dev handoff via Zeplin

Dev handoff via Zeplin

Final Dashboard screen implemented by the devs

Final Dashboard screen implemented by the devs


NodeSource Website Redesign

The 2020 and 2024 Websites

I started working with NodeSource in 2020 and inherited an old website with serious accessibility and branding issues.

In 2024, I was asked: "Hay amigo Ricardo, we need to redesign the website. Are you down for the job?" Well, DOH! πŸ˜’ lol

AI with Midjourney

This is when I first started using Midjourney to generate images for the website. All icons and hero background textures were generated using Midjourney.

Check out the 2020 and 2024 websites below πŸ‘‡πŸ½:

2020 Homepage design I inherited. SERIOUS accessibility issues 😢

2020 Homepage design I inherited. SERIOUS accessibility issues 😢

Redesign 2024: Homepage. Bolder branding and Accessibility-compliant.

Redesign 2024: Homepage. Bolder branding and Accessibility-compliant.

Design Process: NodeSource's flagship product page

The CEO provided me with the initial wireframes. Wait, WHAT?! 😢. Yep! Talk about a client that has their shit together, eh!

The beauty of the provided wireframes was NOT that I didn't have to create any wireframes. I would've been happy to do so. The beauty was that it provided me with a clear… what? I'll give you 1 guess:

Icons and hero background texture were generated using Midjourney as well.

Check the design process for the N|Solid product page below πŸ‘‡πŸ½:

Figma file. From left: Components & Exploration, Design, and Wireframe

Figma file. From left: Components & Exploration, Design, and Wireframe

Close-up of the design and the wireframe

Close-up of the design and the wireframe

Dev handoff using Zeplin

Dev handoff using Zeplin

Final page implemented by the devs

Final page implemented by the devs


Mobile Menu Prototype

This is a very bare prototype I built to show the devs how the mobile menu should look and work.

As simple as this prototype is, multiple design decisions are happening here:

  1. Interaction Design:
    • 40x40px target size of the hamburger menu button.
    • Slide-in navigation with a duration of 0.2s and ease-in-out timing function. In other words, the damn thing feels organic and responsive, haha.
    • Transforming the "3-line" icon to an "x" icon to clearly convey when the menu is open or closed. This also happens smoothly and quickly.
    • Dropdowns from main nav items are also smoothly animated.
    • For good measure, hover effects on menu and submenu items. This is also a visual cue when the link is tapped on a mobile device.
  2. Accessibility:
    • All elements are accessible from a typography and color contrast perspective.
    • Hover effects on menu and submenu items.
  3. Scalability: This structure uses the same menu used on the desktop version. One menu to rule them all! 🀣

Click on the hamburger icon in the prototype below πŸ‘‡πŸ½:

Simple 🫏 prototype


A few more notes about Color Accessibility and Branding ☝🏽

Accessibility issues with the color off the bat! πŸ¦‡ (there is no baseball bat emoji, WTF, lol)

The original green #5AC878 the client provided was OK.

The problem was that the prior designs had white text over that green which failed accessibility with a contrast ratio of 2.1:1 - Minimum contrast ratio should be 4.5:1 for Normal size text.

I knew I needed to use black text over that green. But I went a step further and lightened up that green a little to make it "pop" (🀦🏽lol ) in Dark mode, and settled on #71D08B. The contrast ratio was excellent: 11.09:1 with dark text.

This adjustment was ideal for Dark mode, which is NodeSource’s default theme.

Retaining branding identity

To get to the new green #71D08B, I edited the Lightness in the HSL color space of the original green #5AC878 from 57% to 63%. It was light enough while retaining the same Hue and Saturation of the original green πŸ‘πŸ½.

Branding improvement FTW! πŸ™‚

Old green: Accessibility = πŸ’€

Old green: Accessibility = πŸ’€

New green: Accessibility = πŸ’ͺ🏽

New green: Accessibility = πŸ’ͺ🏽

Brand enhancement for Light mode

The new green #71D08B was made for Dark mode. For Light mode, I took a similar approach but this time I edited the Saturation and Lightness of the original green #5AC878, from 50%, 57% to 52%, 24%.

This gave me a darker, more saturated green perfect for Light mode while retaining the same Hue of the original green. The contrast ratio is 7.9:1 with white text or over light backgrounds.

Check out all the greens and the NodeSource logo in both Dark and Light modes below πŸ‘‡πŸ½:

Original vs. New greens

Original vs. New greens

NodeSource logos with new greens

NodeSource logos with new greens

Phew! πŸ˜… - Look at you, you made it all the way down here! Thank you! πŸ™πŸ½lol