violet / 600I designed the language before the product learned to speak.
Building a quote-management platform from zero meant every new screen could introduce another local decision. I built Revora's system early so the product could grow without losing its meaning.
- Role
- Product designer and system owner
- Scope
- Foundations, tokens, components and patterns
- System
- Figma variables connected to a shipped SaaS product
action / primaryA stable purpose, independent of its raw value.
Hierarchy inherited by default.
The system becomes a product decision.
01BackgroundChapters
This was a product decision—not a cleanup project.
Revora had no inherited UI debt. The risk was subtler: products, pricing, templates, customers and quotes would each solve the same interaction questions locally.
What is the primary action? What does warning mean? How dense can a table become? Where should guidance appear? If those answers lived inside screens, the interface could look polished and still behave unpredictably.
“I was not repairing design debt. I was designing against the conditions that create it.”
action / primary#6366F1Four rules gave the system a point of view.
Each principle had to help me choose between two plausible directions. If it could not change a design decision, it was too generic.
Before defining principles, I named the four tensions the product would repeatedly have to resolve.
Meaning
Names had to preserve intent when raw values changed.
Behaviour
Components had to explain response, not only appearance.
Density
Operational views needed to compress without losing hierarchy.
Risk
Focus, status and error meaning had to survive color alone.
Name purpose, not appearance
A role such as content/primary survives a palette change. A label such as dark-grey does not.
neutral / 900→Product intentcontent / primaryThe alias keeps its meaning even when the palette changes.
Encode behaviour, not screenshots
Properties describe what a component can do; states describe how it responds. Screens are only compositions.
Make density deliberate
Operational software needs compact views, but hierarchy, focus and consequence cannot disappear with row height.
Build accessibility into the default
Focus, contrast and redundant status cues belong in the component contract—not in a checklist at the end.
A raw value should never explain itself inside a screen.
Five layers connect implementation to intent. A palette can change without every component and workflow being reconsidered.
neutral / 900Controlled raw material
content / primaryPurpose that survives change
table / cell / contentContext without local choices
quote / product tableRepeatable interaction logic
quote / reviewA coherent workflow
space / 48→table / row-height / defaultA number becomes a density decision another designer can understand.
Foundations are the product’s smallest decisions—and its longest-lived ones.
The goal was not to offer every possible value. It was to turn raw material into a controlled language for action, content, feedback, density and hierarchy.
The palette is broad. Product choices stay narrow.
Primitives preserve a complete tonal range; semantic aliases decide when a value may enter the interface. This keeps states consistent without removing flexibility from the system.
#EEF2FF#E0E7FF#C7D2FE#A5B4FC#818CF8#6366F1#4338CA#3730A3#312E81#F9FAFB#F3F4F6#E5E7EB#D1D5DB#9CA3AF#6B7280#4B5563#374151#1F2937#111827#DCFCE7#16A34A#15803D#FEE2E2#DC2626#B91C1C#FEF3C7#D97706#B45309#DBEAFE#2563EB#1D4ED8neutral / 900→content / primaryHeadings and key values
neutral / 500→content / secondaryLabels and supporting copy
primary / 500→action / primaryDecisive product actions
error / 500→content / errorValidation and destructive risk
info / 500→border / focusVisible keyboard focus
One family. Twelve intentional text styles.
Inter keeps the application neutral; a compact hierarchy uses scale, weight and line-height to separate orientation, action and dense product data.
36 / 44 · Semi BoldComplex workflows,
made clear.
22 / 30 · Semi BoldQuote configuration
18 / 26 · Semi BoldPricing rules
16 / 26 · RegularSales users can adjust quantity and permitted discounts without editing commercial policy.
15 / 24 · RegularUsed for product copy, form guidance, table descriptions and supporting information.
14 / 20 · MediumMaximum discount
text / display/lgtext / heading/h1text / heading/h2text / heading/h3text / body/lgtext / body/mdtext / body/smtext / body/microtext / label/mdtext / label/smtext / button/mdtext / caption/smA small scale creates rhythm—and named aliases create intent.
The primitive scale handles proportion. Component aliases explain why a specific distance exists.
space / 44pxspace / 88pxspace / 1212pxspace / 1616pxspace / 2424pxspace / 3232pxspace / 4848pxspace / 24→padding / card / xspace / 16→padding / card / yspace / 48→table / row-height / defaultspace / 32→table / row-height / compactRadius, border and elevation share one quiet voice.
Containers should explain hierarchy without turning an operations product into a stack of floating cards.
Control · surface · dialog · pill
Structure strengthens only with interaction or risk.
Canvas · card · popover · modal
Layout changes by priority, not by shrinking everything.
Revora's responsive rules collapse navigation, stack workspaces and preserve primary actions as width disappears.
≥ 1100Persistent navigation and side-by-side work areas.
1000–820Reduced columns; supporting panels move below the task.
≤ 760Navigation becomes a drawer and actions stay reachable.
The table became the hardest test of the system.
Buttons are easy to showcase. A configurable table reveals whether foundations, properties, states and product behaviour actually work together.
- Which cells are structural—and which stay optional?
- How do editing, selection and row actions coexist?
- What changes across default, dense and compact modes?
- How can status scan quickly without dominating the row?
Compose cells
Checkbox, status, editable value and row action can be included without rebuilding the row.
Keep states independent
Selection, hover and editing describe different behaviours—not one oversized variant list.
Let density inherit
Rows reference named height variables, keeping compact views deliberate and reversible.
The system disappears when the workflow starts making sense.
A library proves little in isolation. I tested the language in one demanding composition that combines navigation, analytics, data density and review states.
Quote performance
Track pipeline health, review risk and keep sales moving.
$31.4K August
Semantic surfacesCanvas, sidebar and cards separate context without excess elevation.
Shared action hierarchyViolet is reserved for the page's decisive next step.
Reusable filteringDate and status controls share one predictable pattern.
Compact data densityRows stay scannable while preserving useful context.
Status languageText, shape and color carry meaning together.
A state is only useful when its meaning survives the color.
Accessibility was encoded at foundation and component level: contrast pairs, visible focus, redundant error cues and readable density.
Version 1.0 is a foundation—not a finished institution.
I built the system as the sole product designer. The next phase is about making its logic easier to maintain, share and connect to production code.
Shared product language
- Primitive, semantic and component variables
- 12 text styles and core foundations
- Buttons, inputs, tables and navigation
- Responsive product compositions
Make the source of truth stronger
- Normalize naming and variable scope
- Complete usage and accessibility guidance
- Add code syntax and token export
- Introduce release notes and deprecation rules
Early labels still contain naming and spelling drift; descriptions are incomplete; token-to-code handoff is not yet automated. Showing those gaps matters more than pretending a first version has mature governance.
AI can generate a screen. The system decides whether it belongs.
As interface generation becomes easier, the durable skill shifts toward defining the product language AI must work inside: intent, semantics, accessibility and behaviour.
Exploring compositions, drafting documentation and automating repetitive specification work.
What a component means, when it should exist, how risk is communicated and which trade-offs fit the product.
I built the system so every screen could make a different decision in the same language.