Roman Gomez

Design system · My own product

In progress

tend design system

Colors, type and components for my own app, built for light and dark from day one.

Role
Designer, solo
Type
Design system, in progress
Tools
Figma, Claude Code
Year
2026

Overview

System first, screens second

tend is an app I’m building for solo workers to keep track of clients, appointments and payments. Before drawing real screens, I set up color, type, spacing and the core parts. Dozens of screens later, everything still matches.

01 · Color

Brighter, until it broke

I picked petrol, then pushed it brighter one step at a time. The limit was readability: white text on a button needs 4.5:1. P4 and P5 looked great but failed, so I stopped at P2 (#08739A), the brightest step where petrol text on its own light tint still passes too.

Six petrol swatches from Original to P5, each with a Mark paid button. Original to P3 pass white text (7.6, 6.13, 5.34, 4.91); P4 and P5 are too light (4.33, 3.72).
Same hue, brighter from left to right. P4 and P5 fail white text, so P2 won.

02 · Light and dark

Same tokens, second mode

Every color in tend has a light and a dark value, so switching modes never breaks a screen. I checked every key pair in both. One failed: the green Paid text in light mode was 4.3:1, so it moved to a darker green.

The tend Today screen in light and dark mode, side by side
PairLightDark
Main text17.717.5
White on petrol button5.35.3
Petrol text5.39.2
Paid5.88.3
Owes5.58.5
Overdue5.16.9
Contrast for the key pairs in both modes. Every one needs 4.5:1.

03 · Components

Parts for a busy day

Buttons, status pills, client and appointment rows, the chat bar and the tab bar. Each one is built from tokens only, so it works in both modes without a second version. The button alone has 24 versions across style, size and state.

  • 35color tokens
  • 2modes, light and dark
  • 24button versions
  • Button
  • Status Pill
  • Avatar
  • Client Row
  • Appointment Row
  • Text Input
  • Chat Bar
  • Confirmation Card
  • Tab Bar
  • Toast
  • Chip
  • Segmented Control
  • Calendar Event
  • Transaction Row
  • List Row
  • Card
Part of the component set, all bound to the same tokens.

04 · Figma to code

Same names in the prototype

The coded prototype uses the same tokens as CSS variables with the same names. color/bg/brand in Figma is --color-bg-brand in code. Dark mode is just a second set of values for those same names, so no screen needs its own dark version.

Tokens
FigmaCode
color/bg/brandvar(--color-bg-brand)
color/text/paidvar(--color-text-paid)
color/bg/elevatedvar(--color-bg-elevated)
color/border/focusvar(--color-border-focus)
A few of the matches. The prototype follows the phone’s light or dark setting, or your choice in Settings.

05 · Where it stands

What’s next

Next up is testing with real people. Whatever I learn will change the screens, and the system is set up so those changes stay small: fix a token or a component once, and every screen follows.

More work