Building the eLockr Design System

A token-first design language for a platform that handles people's work records — where visual inconsistency isn't just an aesthetic problem, it's a trust problem.

eLockr Design System — token panel, components, and product screens
Company eLockr
Role System Architect
Team Solo → 3 Designers
Release v1.0 · Aug 2025

When your head is the source of truth

eLockr lets companies issue digital, fraud-proof work records — a product whose entire value is built on verification and trust. For the first year, I was the sole designer. I moved fast and kept every decision in my head: the exact blues, the button padding, which grey meant "disabled" versus "subtle."

With one person touching all the files, that worked. There was no drift because there was no divergence possible. But the system was undocumented by design, and my mental model was the only source of truth that existed.

Design files before the system — visual inconsistencies across features

Scaling a mental model breaks it

When the design team grew, inconsistencies appeared immediately — not because new designers were careless, but because there was no shared reference. Colour usage, type scales, and spacing varied across features. Design reviews shifted from solving user problems to debating pixel values: 30–40% of review time spent on "which grey is this?" instead of outcomes.

The stakes were higher than aesthetics. eLockr sells fraud-proof verification records. Visual inconsistency directly undermines the trustworthiness the product promises to every employer and employee who uses it.

Design drift across screens — annotated inconsistencies

Four rules that govern every decision

Before building anything, I set constraints that every new pattern would have to pass — the criteria for every component review, every token naming decision, every "should we add a variant?" conversation.

Token-first

No raw values in designs or code

Every colour, space, and radius resolves through a semantic token. A rebrand or a new mode (user → admin) is a one-place change — not a 200-screen update.

Trust by default

Calm, verifiable, never decorative

eLockr handles people's work records. The system enforces restraint: measured colour, generous whitespace, explicit states. The UI must feel trustworthy.

Accessible, not optional

WCAG 2.1 AA is baked in

Every text/surface pair ships at AA or better. Focus states, touch targets, and error messaging are part of the component spec — not added later.

Build once, reuse everywhere

Detached instances are bugs

If a pattern appears twice, it becomes a component. Local overrides are treated as technical debt, not shortcuts. No exceptions.

Token architecture — three layers, one rule

The system is layered. UI never touches primitives directly — it only consumes semantic tokens. This indirection is what makes the system scalable: one change at the top propagates everywhere below it automatically.

LayerExampleRule
Primitivesblue/500 · #38B6E8Raw values. Used only by token authors — never in designs or components.
Semantic tokenssurface/brand/defaultNamed by intent, not appearance. The only layer UI consumes.
ComponentsButton / Primary / MBuilt entirely from semantic tokens. Variants cover state, size, and content.
TemplatesDashboard, Data tableComposed only from published components — no local styles anywhere.

Why this layering? When we stood up the admin portal, it took one afternoon — not a sprint. The user and admin portals share every component; a mode only swaps the top-layer chrome. Because each component already referenced semantic tokens, we mapped those tokens for the admin mode in Figma Variables multi-mode, and everything updated simultaneously.

Colour primitives — 6 ramps, 60 raw values

Six ramps on a 50–900 scale — Blue (brand), Dark Blue (ink/navy), Grey, Green, Red, Yellow. Step 500 is the anchor. Steps 50–100 are tinted surfaces; 200–300 are borders and fills; 600–900 hold WCAG AA contrast for text on light surfaces.

eLockr design system primitives — components, elevation, number scale, and type scale

Blue — brand

50
100
200
300
400
500
600
700
800
900

Dark Blue — ink / logo navy

50
100
200
300
400
500
600
700
800
900

Grey

50
100
200
300
400
500
600
700
800
900

Green — success

50
100
200
300
400
500
600
700
800
900

Red — danger

50
100
200
300
400
500
600
700
800
900

Yellow

50
100
200
300
400
500
600
700
800
900

Semantic tokens — intent over value

40+ tokens across three groups: Surface, Border, and Text/Icon. Designers pick by intent — "the danger surface" — never by value. This is the only layer components touch.

Figma Variables panel — primitive to semantic alias mapping
TokenMaps toUsed for
surface/brand/defaultblue/500Primary buttons, active controls
surface/brand/subtleblue/50Selected states, info washes
surface/success/defaultgreen/500Verified, issued, completed
surface/danger/defaultred/500Destructive actions, failed verification
surface/warning/defaultyellow/400Pending, expiring records
border/defaultgrey/300Inputs, cards, dividers
border/brandblue/500Focused inputs, selected cards
text/titlegrey/900Headings, key data
text/bodygrey/800Default body copy
text/disabledgrey/400Disabled labels
text/inkdarkblue/800Display headings, brand moments

Naming conventions — one grammar, no translation at handoff

The same naming pattern runs across Figma Variables, component properties, and CSS custom properties. A developer reading a token name in Figma knows exactly what to write in code.

ThingPatternExample
Primitive{ramp}/{step}blue/500
Semantic token{property}/{intent}/{variant}surface/brand/subtle
Component{Component} / {Variant} / {Size}Button / Primary / M
CSS variable--{property}-{intent}-{variant}--surface-brand-subtle

Typography — Poppins + Inter, never mixed below H4

Poppins for display (H1–H4) gives eLockr its confident, geometric voice. Inter for everything below keeps dense record data legible. Three weights per level — Bold, Regular, Light — never more. Poppins never used below 20px.

H1 Work records Poppins · 40/48 · 600
H2 Work records Poppins · 32/40 · 600
H3 Work records Poppins · 24/32 · 600
H4 Work records Poppins · 20/28 · 500
Headline Work records Inter · 17/24 · 600
Body Work records that travel with the employee. Inter · 15/24 · 400
Subtitle Work records that travel with the employee. Inter · 13.5/20 · 400
Caption Issued 14 Mar 2026 · Ref EL-20893 Inter · 12/16 · 400
Footnote Verified by eLockr Inter · 11/14 · 500 · caps

Spacing — one scale, no exceptions

A single number scale — 2, 4, 6, 8, 12, 16, 20, 24, 32, 40 — drives all padding, gaps, and margins. If a measurement isn't on the scale, it's wrong. The scale maps 1:1 to engineering CSS variables, so space-16 is always 16px with no lookup.

space-22px
space-44px
space-88px
space-1212px
space-1616px
space-2020px
space-2424px
space-3232px
space-4040px
T-shirt sizing and spacing scale visual

Corner radius — T-shirt sized for optical consistency

Smaller elements get smaller radii so curvature looks optically consistent across scales. M (8px) is the workhorse for buttons and inputs. Full (999px) for pills, badges, and avatars.

XS4px
S6px
M8px
L12px
XL16px
Full999px

Elevation — reserved for things that float

Five levels. Most of the UI lives flat at level 0 with borders. Shadows are reserved for elements that genuinely float: dropdown menus (M), toasts (L), modals (XL). Elevation communicates hierarchy — not decoration.

XS
S
M
L
XL

18 components, built from tokens up

Every component is built entirely from semantic tokens — no local overrides, no detached instances. Variants cover state, size, and content type. If a pattern appears twice in the product, it becomes a component with a changelog entry.

18 components 4 button variants × 3 sizes × 5 states 4 application templates WCAG 2.1 AA throughout

Button — one primary per view, max

Hierarchy rule: one Primary per view maximum. Secondary for alternatives (white, grey-bordered, turns cyan on hover). Tertiary for low-emphasis text actions. Danger only for destructive confirmation — always triggers a modal first. Size M is default; S is desktop-only (below 44×44px touch target). Focus ring: 3px blue/200 outline, baked in.

Input field — label always on top

Found on the employee's eLockr profile.
Enter a valid email, like ravi@company.com.
Reference verified.
States: default → hover (darker border) → focus (brand border + 3px ring) → error/success (status border + helper text). Labels are never replaced by placeholders. Error messages state the problem and how to fix it — never just "invalid input".

Badge & status — colour never the only signal

Verified Pending Revoked Processing
Accessibility rule: status is never communicated by colour alone. Every badge pairs a subtle surface with a dot + label — readable without colour perception. Status colours (green, red, yellow) are never used decoratively.

Alert — contextual, explicit feedback

Record issued

This work record has been issued to Sravan Kumar and is now live.

Verification failed

We couldn't verify this ID. Check the reference number and try again.

Voice rule: error messages state what happened and how to fix it. Never "Oops!" Never blame the user. The platform handles people's livelihoods — every error message is written with that weight in mind.

Supporting components

Steps / Progress

1
Upload
Analyse
Report

Avatar

SK
RK

Card

Employment Record
Horizon Logistics · 14 Mar 2026
Verified

Governance — the system as a product

Semantic versioning governs how changes propagate. Patch versions auto-adopt; minor versions are opt-in; major versions ship with a migration guide and a deprecation window. The contribution flow: propose in #design-system → build in a branch → review against the four principles → publish with a changelog entry.

VersionScopeWhat it means for teams
Patch · 1.0.xBug fixes, token value tweaksAuto-adopted, nothing to do
Minor · 1.x.0New components or variantsOpt-in, announced in changelog
Major · x.0.0Breaking renames or removalsMigration guide + one-cycle deprecation window

View the living design system →

What actually changed

Measuring a design system's value is harder than shipping it. These numbers come from sprint retrospectives and team check-ins 8 weeks after v1.0 launched.

v1.0 · Aug 2025
6 colour ramps · 60 primitives 40+ semantic tokens 18 components 4 application templates WCAG 2.1 AA
~40%
Faster design reviews

30–40% of review time was going to "which grey?" debates. That dropped to near-zero after tokens shipped.

3 days
New designer onboarding

Down from ~2 weeks. Documentation replaced verbal handoffs I used to give individually every time.

Zero
Engineering re-queries

Engineers mapped tokens directly to CSS variables. The spacing and radius guesswork at handoff stopped.

1 source
Single rebrand target

Updating a semantic token cascades to all 18 components. No 200-screen update needed for brand changes.

3 designers
Zero visual drift

All screens pass quarterly consistency audits. Three designers — looks like one person built it.

1 afternoon
Admin mode shipped

Figma Variables multi-mode meant the admin portal was a token-mapping and chrome exercise — not a full-sprint redesign.

What I'd do differently

Shipping the system was the straightforward part. Understanding what slowed it down came after.

01
Start with tokens, not components

The instinct is to build visible things first — buttons, cards, badges. The right order is primitives → semantic tokens → components. Visible things are the last 30%, not the first 70%.

02
Document the why, not just the what

The spec explained token values and component anatomy. It didn't explain why this naming convention, this scale, this mapping choice. That gap brought back the same clarification questions I thought the documentation had eliminated.

03
Involve engineering in naming from week one

The CSS token naming required a partial rework post-launch because of mismatches I could have caught in a single week-one session with the engineering lead. Late alignment is expensive alignment.

04
Treat the system as a product from day one

The governance model — semantic versioning, changelog, deprecation windows — was added after v1.0. It should have been in the brief from the start. Systems without governance drift back into the chaos they were built to replace.

Based in Hyderabad · open to hybrid and remote.