Brand Book

The identity, the interface, and the rules that keep the second one from looking machine made.
Public edition  ·  RevEngine Samora Private Limited  ·  Version 1.1  ·  September 2026
01

The premise

A brand book is usually a colour chart with opinions attached. This one starts from a measurement, because the measurement turned out to be the whole system.

The gold in the mark and the beige it sits on are not two colours that happen to go together. Converted to Oklch, they share a hue to within a fifth of a degree: the gold sits at 81.57 degrees and the beige at 81.78 degrees. They are the same colour at different lightness and chroma. Metal and paper, one hue.

Gold #B8860B
L 0.652   C 0.1322   H 81.6°
Beige #F0E8DA
L 0.933   C 0.0206   H 81.8°

So every neutral in the product is built on that one hue at twelve lightness steps. Nothing is grey. Nothing is imported. A card, a table rule, a disabled label and the logo are all relatives, which is why the interface can look like the identity without ever repeating it.

Two caveats, stated rather than buried. The lightness steps are not evenly spaced: they are deliberately compressed at both ends so the palest steps stay paper and the darkest stay ink. And at the top of the ramp, where chroma is under 0.015, eight-bit rounding moves the hue by a few degrees. Neither is visible. Both are in the source.

Everything downstream of that is restraint: one typeface, two corner radii, one border width, two durations. The character comes from the mark and from the warmth of the ramp. The interface itself gets out of the way.

02

The mark

One continuous ECG trace running a single cardiac cycle. P wave in from the left, the S of Samora sitting where the PR segment runs, QRS complex out to the right. Both tails run into the ring.

Behaviour at size

128px
96px
64px
48px
32px

Rules

Clear space
On every side, keep a margin equal to the ring's band width. Nothing crosses it, including page edges.
Minimum size
Badge on beige: 48px. Badge reversed on the dark ground: 32px. Full stacked lockup: 480px wide. Below those, the trace closes up.
Ground
Beige for warm contexts, the deep brown reversal for anything small or anything dark. Flat gold on white is acceptable for a single-colour print.
Never
Do not recolour the trace separately from the ring, do not remove the ring, do not stretch, do not rotate, do not add a drop shadow, and do not place the stacked lockup in a square avatar slot.

Construction, for reference

S box width0.60 of its height
Trace stroke0.154 of the S box height
Ring band0.150 of the outer radius
P wavedepth 0.085, width 0.560, raised cosine
Interior clearance0.84 of the inner radius
Tail burial0.60 into the band, so the cap leaves no crescent
Joinsmiter, limit 6
03

Colour

Twelve neutrals on one hue, four status colours rotated off the gold, and nothing else. There is no blue in this brand unless it is carrying information, and even then it is desaturated to the point of being a slate.

The sand ramp

sand 00
#FDFAF4
sand 05
#F6F0E7
sand 10
#F0E8DA
sand 20
#E0D6C5
sand 30
#C8BCA9
sand 40
#A99D88
sand 50
#8A7F6B
sand 60
#6D624F
sand 70
#504635
sand 80
#382F1F
sand 90
#261E10
sand 95
#171005

sand 10 is the brand beige exactly. That is not a coincidence, it is the anchor the ramp was solved around.

Roles

LightValue
--c-canvas#F6F0E7
--c-surface#FDFAF4
--c-surface-2#F0E8DA
--c-surface-3#E0D6C5
--c-line#C8BCA9
--c-line-strong#A99D88
--c-text#171005
--c-text-2#504635
--c-text-3#6D624F
--c-accent#B8860B
--c-accent-text#886100
--c-accent-solid#926B14
--c-on-accent#FDFAF4
--c-focus#AB8230
DarkValue
--c-canvas#171005
--c-surface#261E10
--c-surface-2#382F1F
--c-surface-3#504635
--c-line#504635
--c-line-strong#6D624F
--c-text#F6F0E7
--c-text-2#C8BCA9
--c-text-3#A99D88
--c-accent#E8B84B
--c-accent-text#DEB771
--c-accent-solid#E8B84B
--c-on-accent#171005
--c-focus#DEB771

Always use the role, never the ramp step. The role is what makes light and dark mode a single decision instead of two stylesheets.

Status

Verified Partial At risk Info Unverified

Olive for verified, the brand gold for partial, terracotta for risk. Each is a rotation off the gold's own hue rather than a colour borrowed from somewhere else, which is why they sit on the beige without arguing with it.

Contrast, measured

Every pairing below is computed, not assumed, and the build fails if any row fails. Two of these are worth pointing at. The filled gold button is measured against --c-accent-solid rather than --c-accent, because the display gold only manages 3.1:1 behind text and cannot be a button. And each status colour is measured against its own ten percent wash rather than the bare card, because the wash is what the text actually sits on. Measuring against the card overstates every one of them.

ModeForegroundBackgroundMeasuredMinimumResultWhere
lighttextcanvas16.66:17.0passbody text
lighttextsurface18.11:17.0passbody text on a card
lighttext-2canvas8.17:14.5passsecondary text
lighttext-2surface8.89:14.5passsecondary text on a card
lighttext-3canvas5.28:13.0passmicro labels, 11px uppercase
lightaccent-textcanvas4.93:14.5passgold used as text
lightaccent-textsurface5.37:14.5passgold used as text on a card
lightlinecanvas1.65:11.3passhairline must be visible but quiet
lighton-accentaccent-solid4.65:14.5passlabel on a filled gold button
lightfocuscanvas3.11:13.0passfocus ring, WCAG 2.2 non-text contrast
lightfocussurface3.38:13.0passfocus ring on a card
darktextcanvas16.66:17.0passbody text
darktextsurface14.53:17.0passbody text on a card
darktext-2canvas10.09:14.5passsecondary text
darktext-2surface8.80:14.5passsecondary text on a card
darktext-3canvas7.07:13.0passmicro labels, 11px uppercase
darkaccent-textcanvas9.99:14.5passgold used as text
darkaccent-textsurface8.72:14.5passgold used as text on a card
darklinecanvas2.04:11.3passhairline must be visible but quiet
darkon-accentaccent-solid10.24:14.5passlabel on a filled gold button
darkfocuscanvas9.99:13.0passfocus ring, WCAG 2.2 non-text contrast
darkfocussurface8.72:13.0passfocus ring on a card
lightverifiedits own wash4.66:14.5passverified tag text on its 10 percent wash
lightpartialits own wash4.65:14.5passpartial tag text on its 10 percent wash
lightriskits own wash4.66:14.5passrisk tag text on its 10 percent wash
lightinfoits own wash4.66:14.5passinfo tag text on its 10 percent wash
darkverified_dkits own wash4.64:14.5passverified tag text on its 10 percent wash
darkpartial_dkits own wash4.65:14.5passpartial tag text on its 10 percent wash
darkrisk_dkits own wash4.64:14.5passrisk tag text on its 10 percent wash
darkinfo_dkits own wash4.65:14.5passinfo tag text on its 10 percent wash
04

Typography

One family: Archivo. It carries the wordmark, the product and print. Three weights are loaded, so three weights are all that can be used.

Archivo is a grotesque drawn for high performance at small sizes, with unambiguous figures and a real tabular set. That matters more here than in most products, because Samora is mostly numbers in columns. It is also not one of the faces that ships as a framework default, which is half the reason an interface reads as generic.

The scale

Display
44px / 600 / -0.01em / 1.15
var(--t-3xl)
Verified pipeline, not self-reported
One per page at most. Covers, hero, the number that matters.
H1
34px / 600 / -0.01em / 1.15
var(--t-2xl)
Verified pipeline, not self-reported
Page title.
H2
26px / 600 / -0.01em / 1.2
var(--t-xl)
Verified pipeline, not self-reported
Section.
H3
20px / 600 / 0 / 1.25
var(--t-lg)
Verified pipeline, not self-reported
Subsection, card title.
Body large
16px / 400 / 0 / 1.55
var(--t-md)
Verified pipeline, not self-reported
Intro paragraphs, empty states.
Body
14px / 400 / 0 / 1.55
var(--t-sm)
Verified pipeline, not self-reported
Default. Everything unless stated.
Dense
13px / 400 / 0 / 1.45
var(--t-xs)
Verified pipeline, not self-reported
Buttons, form labels, dense panels.
Table
12px / 400 / 0 / 1.35
var(--t-2xs)
Verified pipeline, not self-reported
Table cells. Tabular numerals always on.
Micro
11px / 600 / 0.10em / 1.2
var(--t-3xs)
Verified pipeline, not self-reported
Uppercase labels. The only place caps are allowed.

Rules

Tabular figures are always on
Set at the body level, not per component. Money and scores must line up in a column without anybody remembering to ask.
Uppercase only at 11px
With 0.10em tracking, for labels and table headers. An uppercase heading is the fastest way to make a page look like a template.
Running text stops at 68 characters
Set on the paragraph, not on the container, so it holds regardless of what the layout does.
Never more than three weights on one screen
And 600 is a heading weight. If a body paragraph needs 600 to be noticed, the layout is wrong, not the type.
05

Space, radius, line

A 4px grid, eight steps, no exceptions. Two corner radii. One border width. This is the part of the system that most changes how deliberate a product feels.

Spacing

--s-1
4px
--s-2
8px
--s-3
12px
--s-4
16px
--s-5
24px
--s-6
32px
--s-7
48px
--s-8
64px

Radius

--r-sm 2pxbuttons, inputs, chips, tags
--r-md 3pxcards, panels, menus, dialogs
--r-roundavatars and the 6px status dot. Nothing else.

Density

Control height32px
Small control26px
Table row36px
Border width1px, one colour
Text measure68ch

Elevation

Two levels, both nearly invisible, both tinted with the ink rather than pure black. Shadows are for things that genuinely float. A card does not float.

Flat. The default.
Level 1. Menus.
Level 2. Dialogs.
06

Motion

Two durations, one curve, and a named property every time.

TokenValueUse
--dur-fast120mshover, focus, colour change
--dur-slow200msenter, exit, size change
--easecubic-bezier(0.2, 0, 0, 1)everything
/* wrong */
transition: all 0.2s;

/* right */
transition: background-color var(--dur-fast) var(--ease),
            border-color var(--dur-fast) var(--ease);

The fast duration belongs to hover, focus and colour. The slow one belongs to things that enter and leave, which in this system is exactly one component: .pop, used for menus and dialogs. If a third duration seems necessary, the interaction is wrong, not the scale.

Everything respects prefers-reduced-motion. That is handled once in the token file, so no component has to think about it.

07

Components

Live, not pictures. Everything below is rendered by the same token file you will paste into the product, so what you see here is what ships.

Pipeline healthLight
Verified pipeline
1,735,500
62 percent of total, up from 54
Deals at risk
7
Single threaded for over 21 days
Coverage
2.4×
Against a 4,200,000 target
AccountTierHealth StakeholdersCloseValue
Acme ManufacturingVerified 82412 Sep1,180,000
Northgate LogisticsPartial 61230 Sep465,500
Illinois Bell HoldingsAt risk 38110 Oct90,000
Fairweather GroupUnverified –0–240,000

The same panelDark
Verified pipeline
1,735,500
62 percent of total, up from 54
Deals at risk
7
Single threaded for over 21 days
Coverage
2.4×
Against a 4,200,000 target
Verified Partial At risk Unverified
08

The ten rules

If you only read one section, read this one. These are the decisions that separate a product that looks authored from one that looks assembled.

01
No emoji anywhere in the interface
Not in buttons, not in empty states, not in alerts, not in menu items. If a thing needs an icon, it gets a drawn icon on a 20px grid with a 1.5px stroke, matching the weight of the ECG trace in the mark. If no such icon exists, the thing gets a word instead. A word is always better than a rocket.
02
Two radii, and one of them is reserved
2px for anything you click or type into. 3px for anything that contains other things. 999px exists for avatars and the 6px status dot, and for nothing else. There are no pills in Samora. A status is a small rectangle with a hairline, because a rectangle looks decided and a pill looks decorative.
03
Borders do the work that shadows usually do
One hairline, one colour, one pixel. Two elevation levels exist and both are almost invisible: they are for things that genuinely float, which is menus and dialogs and nothing else. A card does not float. Stacked soft shadows are the visual signature of a component library, not of a product.
04
Never write transition: all
Two durations. 120ms for anything that responds to the pointer, 200ms for anything that enters or leaves. One curve, cubic-bezier(0.2, 0, 0, 1), which starts fast and settles. Name the property you are animating. If you cannot name it, do not animate it.
05
No colour that is not a token
If a hex code appears anywhere outside the token file, it is a bug. This is the rule that keeps a framework default from creeping back in, because a framework default has no token to live in. There is exactly one white in the system, --c-print-paper, and it only applies on paper.
06
The gradient belongs to the logo and to paper
The gold ramp is for the mark, the letterhead and print. In the product, gold is one flat value. A gradient button is the most recognisable machine-made detail there is.
07
Three weights, and caps only below 12px
400, 500, 600. Nothing else is loaded, so nothing else can be used. Uppercase with letterspacing is permitted at 11px for labels and at nothing larger. Uppercase headings look like a template.
08
Numbers are tabular, right aligned, and never coloured alone
Money and scores line up in columns because the figures are the same width. Colour is never the only carrier of meaning: a status has a label as well as a colour, so it survives being printed, screenshotted, or read by someone colourblind.
09
Density is a decision, not an accident
Controls are 32px tall. Table rows are 36px. Running text stops at 68 characters. These are fixed so that two screens built by two people on two days still look like one product.
10
Empty states and errors are sentences
Write what happened and what to do next. No shrugging, no exclamation marks, no apologies with emoji. The house rule on em dashes applies here as everywhere: Samora does not use them.
09

Voice

Samora sells certainty about numbers. The writing should sound like someone who has already checked.

Specific over enthusiastic. A count, a date, a name. Never a promise, never an exclamation mark, never an apology dressed up as a mascot. When something fails, say what failed and what the user is looking at instead.

This

Three deals need multithreading before Friday.

Illinois Bell Holdings has had one stakeholder for 31 days.

Pipeline verified against 412 emails and 18 meetings.

We could not reach Gmail. Showing intelligence from 9:04 this morning.

Not this

🚀 Your pipeline is looking great!

Oops! Something went wrong.

AI-powered insights, supercharged for your revenue team.

No data available.

House rules

No em dashes, ever
In any Samora content, anywhere. Use a comma, a full stop, or restructure the sentence.
Sentence case for everything except 11px labels
Button text, menu items, headings. Title Case Everywhere reads as a template.
RevEngine is one word, camel case
The legal entity is RevEngine Samora Private Limited. Never all caps, never two words.
The product is Samora, the platform is SamoraTrack
Use Samora when speaking as a company, SamoraTrack when naming the software.
10

How to adopt this

The token file does most of the work. The rest is deletion.

  1. Load Archivo at 400, 500 and 600. Nothing else.
  2. Paste samora-tokens.css in place of the current :root block and the light and dark overrides.
  3. Run the mapping table below and replace every old variable.
  4. No emoji in the markup. Where an icon is needed, draw one; where it is not, use a word.
  5. No colour literal outside the token file. A stray # or rgba( is a bug.
  6. No transition:all. Name the properties you animate.
  7. Every border-radius is var(--r-sm) or var(--r-md).

Variable mapping

TodayReplace withNote
--bg--c-canvaspage ground
--surface--c-surfacecards
--surface2--c-surface-2hover, inset
--surface3--c-surface-3wells, tracks
--border--c-lineone width, one colour
--border2--c-line-strongcontrols only
--text--c-text
--text2--c-text-2
--text3--c-text-3
--gold, --gold-lt, --gold-pl--c-accent three golds collapse to one
--green, --green-lt--c-verified, --c-verified-wash
--amber, --amber-lt, --miss--c-partial, --c-partial-wash
--coral, --coral-lt--c-risk, --c-risk-wash
--radius-sm, --radius, --radius-lg, --radius-xl --r-sm, --r-mdfour collapse to two
--serif, --sans--fontone family
--ease--easevalue changes, name stays

Icons

Emoji come out. In their place, use a single stroke set at 1.5px on a 20px grid so the icons carry the same line weight as the ECG trace. Phosphor Icons at regular weight is a good fit and is MIT licensed. Avoid Lucide: it is the default that ships with the component library everyone recognises, which puts you back where you started.

Files

FileWhat it is
samora-tokens.cssthe drop-in token and component layer
palette.pygenerates the colour, with the contrast audit
marks/logo lockups, SVG and PNG, on the single family
samora-brand-book.htmlthis document
samora-brand-book.pdfthe sendable version