Portfolio β€Ί Case Studies β€Ί Agni Design System
πŸ”₯ Agni Β· Sanskrit for Fire

Agni
Design System

A token-first design system built from first principles β€” not adapted, not borrowed. Designed from scratch.

Most design systems inherit their colour logic from existing products. Agni was different: the colour architecture came first, the product came second. Named after the Sanskrit word for fire, it's anchored by a warm amber brand palette that scales from near-white to near-black β€” with WCAG AAA compliance at every step.

My Role
Lead Designer
Tool
Figma + Variables API
Accessibility
WCAG AAA
Architecture
Primitive β†’ Semantic tokens
Brand Palette Β· 11 steps
Success Β· 11 steps
Rose Β· Indian Accent Β· 11 steps
View in Figma β†’
01 β€” Why Build From Scratch

Adapting an existing system
was the wrong answer.

The product needed a visual identity that felt distinctly Indian β€” warm, grounded, culturally aware β€” without relying on clichΓ©s. Every major design system (MUI, Carbon, Ant, Radix) starts from Western-neutral palettes. Agni needed to start somewhere different.

01
Cultural Identity

Indian digital products often use Western-neutral colour systems and layer Indian aesthetic over it. Agni reversed that β€” the warmth and the Indian cultural accent are baked into the foundation, not added on top.

02
WCAG AAA from Day One

Most teams retrofit accessibility. Every palette step in Agni was defined with its contrast ratio as a constraint, not an afterthought. WCAG AAA (7:1 minimum) meant the system is usable for users with low vision β€” and simply more readable for everyone.

03
Semantic Token Architecture

Primitive variables define what a colour is. Semantic tokens define what it means. Day/Night mode isn't a "dark theme" β€” it's a single token layer switching the semantic meaning of each primitive at runtime.

02 β€” Colour Architecture

7 palettes.
81 primitive variables.
One system.

7
Colour palettes
(Mono, Brand, Error, Success,
Warning, Info, Rose)
81
Primitive colour variables
across all palettes
AAA
WCAG compliance
(7:1 contrast ratio β€” highest standard)
🟀 Mono β€” 13 steps
Warm neutral grays Β· backgrounds, text, surfaces, separators

13 steps instead of the standard 11 gives finer control at the critical near-black end β€” essential for dark mode where small differences in background shade matter most. The key design decision: these are warm neutrals (#FAF8F5 leans cream, not grey) β€” making the system feel human rather than clinical.

🟑 Brand β€” 11 steps
Primary brand Β· CTAs, links, active states, focus rings

Amber-gold. Fire. The step-500 (#F6A020) is the default interactive action colour. Step-600 (#D97706) provides depth for hover states. The name "Agni" and the amber brand colour are inseparable β€” this wasn't an arbitrary colour choice, it's the product's identity.

πŸ”΄ Error β€” 11 steps
Warm terracotta Β· errors, destructive actions, critical alerts

Deliberate choice to use warm terracotta for errors rather than a cold red. In the context of Indian UX, warm reds read as urgent without the clinical harshness of pure red. Distinct enough from the Brand amber to never be confused, but harmonious enough to feel like the same family.

🌸 Rose β€” 11 steps
Indian accent Β· badges, notifications, cultural highlights

The most distinctive decision in the entire system. Most enterprise design systems have no cultural accent palette β€” they use semantic colours only. Rose is explicitly labelled "Indian accent" in the Figma documentation: used for badges, notifications, and cultural celebrations. This is design systems work acknowledging the cultural context of its users, not pretending to be neutral.

03 β€” Token Architecture

Primitives define what.
Semantics define why.

The two-layer token architecture separates colour definition from colour intent β€” making theme switching (Day/Night) possible without duplicating any design decisions.

Layer 1 β€” Primitive Tokens

Each colour in each palette is defined as a primitive. These never appear in components β€” only in semantic tokens.

Colors/Brand/500 #F6A020
Colors/Brand/600 #D97706
Colors/Mono/50 #FAF8F5
Colors/Mono/1100 #110E08

Layer 2 β€” Semantic Tokens

Semantic tokens reference primitives and carry intent. Day mode and Night mode use the same semantic tokens but resolve to different primitives.

interactive/default β†’ Brand/500
interactive/hover β†’ Brand/600
surface/primary Day β†’ Mono/50 Β· Night β†’ Mono/1100
text/primary Day β†’ Mono/1100 Β· Night β†’ Mono/50
Why this matters: A component using interactive/default automatically gets the right amber in day mode and a lighter or adjusted amber in night mode β€” without any developer touching the component. The theme switch happens entirely at the token resolution layer.
04 β€” Accessibility

Not WCAG AA.
WCAG AAA.

WCAG AA (4.5:1 contrast ratio) is the minimum standard. Agni was built to WCAG AAA (7:1) β€” which is 55% higher. This wasn't the easiest constraint to work within, but it was non-negotiable.

Why AAA matters for Indian products

India has approximately 8 million people with visual impairments. Products built for India β€” and designed to WCAG AAA β€” are accessible to a meaningfully larger audience than those built to AA. Accessibility isn't a Western concept applied to Indian products. It's a basic design responsibility.

The constraint that improved the palette

The AAA requirement forced step-level decisions that made each palette better. Colours that "looked good" but failed 7:1 were adjusted. The warm terracotta for errors was chosen partly because it maintained AAA compliance at step 600 in both day and night modes β€” something pure reds struggle with.

All swatches bound to tokens

Every swatch in the Figma documentation is bound to its colour token, not a local colour fill. This means the documentation stays in sync with the system automatically. If a token value changes, the documentation updates β€” preventing the common drift between design system docs and implementation.

05 β€” Design Decisions

The choices that
defined the system.

Decision 01
Warm neutrals over cold greys

The standard approach for neutral palettes uses cool (blue-tinted) or true-neutral greys. Agni uses warm greys (#FAF8F5 has a slight cream undertone). This was a deliberate departure β€” warm neutrals feel more human, age more gracefully, and pair naturally with the amber brand colour without requiring compensation.

Impact: The entire interface feels warmer and more inviting without a single warm colour in the UI itself β€” the warmth comes from the neutral layer.
Decision 02
13 Mono steps instead of 11

Standard Radix/Tailwind-style palettes have 11 steps. Mono has 13 (adding steps 1150 and expanding near-black coverage). Dark mode requires finer control in the near-black range β€” the difference between a sidebar background and a card background in dark mode is often just one palette step. More steps gave developers more precision without requiring custom colour values.

Impact: Dark mode UI has richer depth and visual hierarchy with no one-off colour values.
Decision 03
Rose as an explicit cultural palette

No major design system I reviewed had a palette explicitly named and documented for cultural accent use. I added Rose β€” not because the product needed more colours, but because honest documentation of intent matters. When a designer uses Rose for a Diwali celebration notification or a festival badge, the system should acknowledge that this is what the colour is for.

Impact: Designers using the system have explicit guidance on cultural accent use β€” no more guessing which semantic colour to use for culturally-specific moments.
06 β€” The Work

See the full system
in Figma.

The Agni Design System is publicly viewable in Figma. The colour system documentation page alone shows all 7 palettes with their full step ranges, semantic descriptions, and WCAG compliance notation.

Open Agni Design System in Figma β†’

Public view access Β· No login required

What you'll see: The full colour system documentation with all 7 palettes (Mono, Brand, Error, Success, Warning, Info, Rose), each showing hex values, token names, and step labels β€” with every swatch bound to its design token.
More Work

See what else I've built.