Skip to main content
Product Design and Design System

Portfolio Design System

A personal portfolio rebuilt as a real design system: foundations in Figma, reusable components, dual-theme support, and a hand-built frontend.

Company
Personal Project
Role
Designer & Design Engineer
Timeline
April 2026
Scope
Brand · Design System · Product Design · Frontend
ronglopez.com portfolio and design system hero

Section 01

Background & Goal

This project started with a simple goal: redesign my portfolio in a way that better reflects how I think and work now. The previous version still served its purpose, but I wanted the site itself to become a clearer example of my design process, not just a container for finished work.

More specifically, I wanted to show the parts of the work that are easy to miss in a polished final screen: the system thinking, the design decisions, the way pages relate to each other, and the handoff between visual design and frontend implementation. That made the redesign a useful project in its own right, because the portfolio needed to communicate both the outcomes and the process behind them.

From the start, I knew this was more than a visual refresh. I wanted a portfolio that behaved like a product: a clear visual language, a reusable design system, and a frontend build that preserved the logic of the design instead of flattening it.

Composite of old ronglopez.com pages home, projects, and a project detail page fanned and stacked.

The redesign was less about replacing the old site and more about creating a portfolio that could show the process behind the work.

— Design intent

Section 02

Research & Strategy

  1. Reference Research
  2. Define Principles
  3. Build System
  4. Implement & Ship

Before designing anything, I reviewed a range of product design portfolios from designers in Canada and the United States. I focused on homepages and at least one detailed project page for each site, looking at layout, typography, color, case study structure, writing style, navigation, and the overall sense of personality.

The strongest examples shared a few patterns: concise introductions, restrained visual systems, project pages with a clear problem-to-outcome narrative, and enough personality to feel authored without distracting from the work. Just as important, they made the process visible through headings, summaries, research, diagrams, and reflections.

That research translated into a set of principles I committed to before opening Figma:

  • Use a more restrained visual hierarchy with purple as an accent, not the whole page
  • Structure case studies around context, research, design decisions, and outcomes
  • Make long pages easier to scan with section headings, summaries, and a table of contents
  • Show more of the process, not just polished final screens
  • Build enough personality into the system without tipping into over-styled portfolio theater
  • Create a design system robust enough to support multiple page types and both themes

Reviewing other portfolios made the opportunity clear: build something more structured, more personal, and more process-forward.

— Reference takeaway

Section 03

Design Foundations

  1. Atoms / Tokens
  2. Molecules
  3. Organisms
  4. Templates
  5. Pages

Tokens did most of the work at this stage. I built primitives for the raw values, then semantic tokens for how those values behave in the system. Figma variables and styles became the source of truth, and the naming stayed practical: roles like bg/surface, text/primary, and border/focus instead of loose visual guesses.

That structure shaped more than color. Typography, spacing, radius, borders, focus, and shadow all followed named scales, so both the design files and the frontend had a shared vocabulary. Pages never reach for primitives directly. They only consume the semantic layer.

Color Ramp

Purple ramp @purple-100 through @purple-900
100#F4EEFF
200#E0D0FF
300#C4A1FE
400#A465FD
500#6610F2
600#540DC8
700#420AA0
800#310878
900#200550
Ocean ramp @ocean-100 through @ocean-900
100#ECFEFF
200#CDFAFF
300#A0F0FC
400#2DD4E8
500#0891B2
600#077593
700#065E77
800#054A5E
900#03313F
Slate ramp @slate-100 through @slate-900
100#F8F7FB
200#EEEDF5
300#DDDBE8
400#A9A6B8
500#706D82
600#504D63
700#3C394D
800#282636
900#1A1823

Purple remained the signature, but it stopped carrying the entire site by itself. Ocean adds contrast, Slate handles structure, and the supporting state ramps give feedback and status their own vocabulary. That made the palette feel intentional instead of decorative.

Typography

heading/h1

Space Grotesk

heading/h2

Space Grotesk

heading/h3

Space Grotesk

heading/h4

Space Grotesk

heading/label

Space Grotesk

body/lg

Poppins Light reads well at long lengths and leaves room for the headings to lead.

body/md

Poppins at 16px is the default throughout the site line-height 1.75, calm and unhurried.

body/smPoppins at 14px for captions, metadata, and footnotes.

The type system has distinct jobs. Space Grotesk handles display moments, navigation, and labels with enough character to give the portfolio a voice. Poppins carries the reading experience across longer case-study pages without fighting for attention.

Spacing Scale

spacing/xs4px
spacing/sm8px
spacing/md16px
spacing/lg24px
spacing/xl32px
spacing/2xl48px
spacing/3xl80px
spacing/4xl128px

Elevation, 5 shadow tokens

shadow/button
shadow/button-hover
shadow/drop
shadow/raised

Section 04

Design Components

Once the tokens were stable, I turned them into a component library. Buttons, badges, navigation, project cards, heroes, and supporting UI all reference the same semantic layer. That is where the design system starts to prove itself: the components carry the brand, the hierarchy, and the theme logic without needing one-off styling every time.

This mattered because the portfolio mixes very different content types. The same library has to support landing-page moments, index cards, navigation, long-form case studies, and utility patterns. Building the components first made those variations feel related instead of bespoke.

components / project-card
components / footer
components / project-hero
components / cta-banner
components / quote-banner
components / table-of-contents

Section 05

Page Patterns

Page design was where the system got tested. I defined a small set of page types for the portfolio: home, about, projects, and project detail. Each one uses the same foundations and components, but with different pacing, density, and content priorities. That balance is where the design system stops being theory and starts behaving like a real product language.

Designing the pages this way made the system visible. Repeated structure became a strength, not a limitation, because the differentiation came from content, sequencing, and emphasis rather than new UI for every screen.

pages / page-patterns
FIG. 01 — Home, about, projects, and project detail. Four page types, one system

Section 06

Dark Mode & Theming

Dark mode was planned at the token layer, not patched in afterward. Because components bind to semantic roles instead of raw hex values, supporting a second theme came down to defining a parallel set of semantic values and letting the rest of the system inherit them.

The theme system works through 3 clear states, so the site can respect user preference without adding visual drift or duplicated component logic.

  • System preference by default: first load follows prefers-color-scheme
  • Explicit dark: user toggles via the moon/sun icon in the nav
  • Explicit light: user overrides a dark system preference
Light / Dark theme
text/primary
Light mode#1A1823   slate/900
Dark mode#F8F7FB   slate/100

Section 07

Building It by Hand

The frontend needed to preserve the system rather than reinterpret it. I kept the stack intentionally simple so the structure stayed legible: Pug for templates, LESS for styling, vanilla JavaScript for behavior, and a small custom build script to compile the site without adding unnecessary abstraction.

  • Pug templates for structure (legacy .jade extension)
  • LESS for styles, with design tokens as variables
  • Vanilla JavaScript: no bundler, no framework
  • Custom Node build script: HTML, CSS, JS, and assets as 4 independent stages
  • Bootstrap, jQuery, and Font Awesome via CDN. Never bundled

That simplicity matters because the design system survives implementation. Shared mixins handle repeated structure, LESS variables mirror the token language, and new project pages start from composition instead of a blank canvas. The code reflects the same modular thinking as the Figma file.

The point was never to keep the system trapped in Figma. It carries through into the build, from named variables, to reusable templates, to the final rendered pages.

pipeline / design-to-code
FIG. 02 — Design system to code. Tokens, source, build, and the rendered site in 4 stages

Section 08

Results & System Impact

63

Color primitives tokens

52

Color semantic tokens

17

Shipped components

19

Reusable Pug includes

5

Case study pages at launch

The clearest outcome was not just a more polished portfolio. It was a reusable system I can keep extending without diluting the brand or re-solving the same layout problems. Once the foundations and components existed, new pages became much more about story and sequencing than about rebuilding UI.

That changed the maintenance story as much as the visuals. New case studies can borrow proven patterns, dark mode stays aligned across the site, and visual decisions remain tied to named tokens instead of memory or instinct. The site feels more personal now, but it is also much easier to evolve.

For this project, the design system is the result. The finished pages matter, but the stronger outcome is that the portfolio now has a foundation sturdy enough to carry whatever comes next.

Let’s connect

Want to see the Figma file?

If you’d like to see more of this design, the full Figma file, and annotations, connect with me and I’ll send you an invite to view the source.