Rebrand the whole CRM by editing ten values.
Every colour, surface and state below is computed from ten brand inputs. Change the hue, the fonts and the corner radius, and the whole CRM changes with it, including contrast, hover states and dark mode.
Convert the brand hex at oklch.com and set --brand-l / -c / -h. Ramps, neutrals, focus and dark mode follow.
Display for titles, UI for everything you read in a table, mono for IDs, phone numbers and CIN.
One --radius-base drives every corner. --density scales controls and rows together.
How it is layered
--text-2, --action, --danger-bg… Light and dark map here.Try a brand
Sample values. Counts are illustrative.
Principles
Eight rules that decide arguments. Each is tied to the Law of UX it serves, so a design review can point at the law instead of at taste.
A list is a queue, not a database
Sort by what is due. Show what happened last and what happens next before any company fact.
Law · Goal-Gradient, ZeigarnikOne filled button per view
The filled button is the job. Everything else is outlined, ghost or tucked in More.
Law · Von Restorff, HickScope before filter
Pick the project first, and keep it visible. Per-project fields never appear without their project.
Law · Mental model, TeslerOne word per idea
Disposition is per call, status is per record, DNC is a block. Never two words for one idea.
Law · Jakob, SimilarityDot for state, badge for a block
States show as quiet dots. Only things that stop work (DNC, overdue) get a filled badge. Colour is never the only signal.
Law · Von Restorff, Selective attentionData starts within 160px
Top bar, one toolbar, table header. Filters open on demand; they do not stack as permanent bands.
Law · Cognitive load, PrägnanzEvery empty state names a next step
Say which filter is hiding rows, and offer the one action that fixes it.
Law · Peak-End, PostelReadable, reachable, quick
Text ≥12px at AA contrast, targets ≥28px, feedback within 400ms, motion 120–260ms.
Law · Fitts, DohertyColor
Ramps sit at fixed lightness steps, so any hue you paste keeps the same contrast. Status hues are fixed on purpose: red must mean danger in every brand.
Brand ramp
Neutral ramp (tinted with the brand hue)
Semantic roles
| Token | Use it for | Contrast on surface |
|---|
Status
Data visualisation
Typography
Display face for titles only. A UI face built for tables and numbers for everything you read. Mono for identifiers people copy. Nothing below 12px except uppercase overlines.
Space, shape, motion
A 4px grid, one radius dial, three shadows that mean three heights, and motion that confirms rather than decorates.
Space
Radius
Motion (hover each)
Elevation
Chrome budget
Active filters live as chips inside the toolbar. The selection bar replaces the toolbar while rows are selected, so it never adds height.
Icons
One family, 24px grid, 1.75 stroke, drawn at 16px beside text. Icons label actions; they never replace a word the user needs to read. No emoji, no Unicode glyphs.
Components
Every state is shown side by side. Hover moves the background, never dims the text. Focus is always visible.
Buttons
Inputs
Navigation
Chips, status, badges, people
Overlays and feedback
Nobody on HungerBox can call its 6 contacts until you lift it. Other projects are not affected.
Two things are hiding them: City · Pune and Owner · Me.
CRM patterns
Components assembled into the pieces every list and record reuses. This is the grammar the Companies module will be built from.
List toolbar: one line, five zones
Work-first table
| Company | Last outcome | Next step | Reachable | Owner |
|---|
Sample data for the specimen only. Company facts (industry · city · size) collapse into one line under the name. Blocked rows stay visible but cannot be called.
Contact channel with verification
Do and don't
Most of the "looks old" feeling came from these. Hold every screen to them.
- Read colour only from Layer 3 roles in components.
- Show status as a dot plus a word; the word carries the meaning.
- Put the next step in the row; hide rarely used actions in More.
- Right-align and tabular-align every number column.
- Show the project scope on every screen with per-project data.
- No raw hex in components, no second accent colour.
- No filled pills for every status; five colours in one row is noise.
- No actions that only appear on hover for the primary job.
- No text under 12px, no grey that fails 4.5:1, no emoji as icons.
- No permanent filter bands stacked above the table.
Copy the file
One stylesheet: tokens and components. Paste it into any project, wrap the app in class="ds", then edit Layer 1. Set data-theme="dark" on any ancestor for dark mode.