Design Brand Kit
OlyRetail OlyRetail

The design system behind OlyRetail's retail operations dashboard.

Version1.0
PlatformWeb · Vanilla HTML/CSS/JS
TypefaceNeue Haas Grotesk Pro
Icon setTabler Icons 3.19
Foundations

Color system

Every color in the product is a CSS custom property with a light and dark value, so the whole UI re-themes by flipping data-theme. Toggle the switch in the side rail to see it in action.

Neutrals & surfaces
Page
Surface
Surface Alt
Border
Text / Primary
Text / Secondary
Text / Tertiary

Page sits behind every surface; Surface and Surface Alt stack panels and cards on top of it. The three text tones step down in emphasis — Primary for content, Secondary for labels, Tertiary for captions and metadata.

Brand
Primary
Primary Tint
Gradient Stop
Brand Gradient

Primary carries interactive intent — active nav, primary buttons, links, focus rings, selection highlight.

Semantic
Success — --gr / --gr2
Warning — --am / --am2
Danger — --re / --re2

Semantic colors always ship as a base/tint pair: the tint fills badge and banner backgrounds, the base colors the icon or label text on top of it.

Data visualization
Series A
Series B
Live / Online

Series A / B is reserved for two-way comparisons in analytics charts (e.g. demographic splits). It never doubles as a semantic success/danger color.

Foundations

Typography

Neue Haas Grotesk Pro is the system typeface — a clean, high-legibility grotesque suited to dense, numbers-heavy dashboards. It falls back to Helvetica Neue / Arial Nova / Arial where the licensed font isn't installed.

Type scale
Display 44
44 / 800KPI hero figures, empty-state numerals
Heading 1
28 / 800Page-level headings
Heading 2
24 / 800Section headings, modal titles
Heading 3
20 / 700Card and widget titles
Heading 4
17 / 700Compact headers, top bar title
Subtitle
15 / 600Secondary emphasis text
Body — base UI size
14 / 500Default body copy, nav labels
Body small
13 / 500Table cells, list rows, form labels
Caption
12 / 600Metadata, timestamps, helper text
Label
11 / 700Uppercase field & column labels
Micro
9.5 / 700Sidebar group labels, tiny badges
Weight scale
Aa
400 · Regular
Aa
500 · Medium — default body
Aa
600 · Semibold — labels
Aa
700 · Bold — most-used UI weight
Aa
800 · Extrabold — headings
Aa
900 · Black — hero numerals
Foundations

Spacing & layout

Spacing is built on a 4px base unit, nudged by 1–2px where optical balance matters in dense table and pill layouts. Structural chrome uses a fixed set of measurements across every view.

Base spacing unit
4
micro gap
8
tight gap
12
default gap
16
section gap
24
block gap
32
layout gap
Structural chrome
218px
Sidebar width
60px
Top bar height
22px
Content gutter
14px
Card padding, standard
Foundations

Corner radius

Radius scales with the size and prominence of the surface — small tight controls stay crisp, primary containers get the signature 14px rounding, and anything pill-shaped goes fully round.

xs · 4px
checkboxes, micro chips
sm · 8px
buttons, inputs
md · 10px
nav items, icon tiles
lg · 14px
the --r default token
16px
widget cards (hardcoded)
xl · 20px
modals, large surfaces
pill · 999px
badges, avatars

The widget card doesn't reference the --r token — it hardcodes 16px directly. A small real inconsistency, left as-is here rather than smoothed over.

Foundations

Elevation

Shadows are soft and low-contrast at rest, growing in size and spread as a surface lifts further off the page — never darker or harder-edged.

sm
hover lift
md
raised card, focus glow
lg
dropdown, tooltip
xl
popover menu
2xl
modal
Foundations

Motion

Most interactions resolve in under 200ms. A single spring easing is reserved for a few moments of character — the active nav indicator, a badge settling into place — everything else uses a standard ease. Hover a row to preview.

Fast · 120ms
micro hover / color & opacity
Base · 180ms
standard UI transition
Slow · 320ms
panel slides, drawers
Spring
cubic-bezier(.34,1.56,.64,1)
Foundations

Iconography

Tabler Icons — outline style, 1.5px stroke. Used at 14–16px inline with text, 18–19px in navigation, always inheriting the surrounding text color.

home
analytics
live feed
reports
routines
users
settings
notify
search
location
alert
chevron
Components

Buttons

One primary action per view. Secondary and ghost buttons handle everything else; danger is reserved for destructive, hard-to-reverse actions.

Components

Badges & status pills

Status is always color + label, never color alone — every pill carries text so meaning survives for colorblind users and in monochrome exports.

Active Pending Offline New Draft North Zone
Components

Form fields

Inputs rest on the alt surface tint so they read as recessed; focus swaps to the primary surface with a border + glow ring.

Checkable chip & checkbox row

The product has no custom toggle switch — native checkboxes are simply tinted with accent-color, and multi-select filters use this bordered chip that fills purple when checked.

Range slider
9AM12PM3PM6PM
Components

Avatars & cards

The widget card is the workhorse container — nearly every chart and panel in the app lives inside one. KPI and stat cards lead with a number instead of a chart; avatars carry the brand gradient by default.

Widget card

The primary content container used across Analytics, Reports and Home — a plain surface, 16px radius (not the default 14px card radius), with an eyebrow + title on the left and icon actions on the right.

This Week Overall Footfall & Demographics
Male
Female
Stat card (neutral)

Used in list-heavy views like User Management — an icon chip on the left, no gradient. Reach for this when a stat sits beside a table rather than leading a dashboard.

248
Total Users
12
Super Admins
Avatars
AK
AK
AK
KPI card — Home view

The signature Home-screen card: a colored gradient, an icon chip, a large number, a trend pill, and a one-line AI insight underneath.

Today's Footfall
15,234
8.2% vs last mon
MBS hit a record today
Avg Walk-In Rate
12.4%
1.2% vs last mon
VivoCity dragging avg down
Table
StoreRegionStatusFootfall
Indiranagar FlagshipSouth ZoneActive1,204
Changi CorridorCentral HubPending842
West DistrictWest DistrictOffline
Components

Tabs & segmented controls

Tabs mark the active item with a bottom border, never a filled background. Segmented controls (period switches, grid-density toggles) use a raised white chip on a tinted track instead.

Tabs
Overview
Demographics
Queue3
Zones
Segmented control
Components

Progress & status

A thin rounded track for completion state, compact status pills for at-a-glance state, and a compound pill that fuses an icon cell to a colored status — used for camera/device health.

Progress bar
Progress status pills
On track In progress Missed
Compound status pill
1 Down
All Online
Metric chips

Icon-metric chips used in the live-feed camera grid. On hover, the product shows a floating tooltip near the cursor — not an inline expanding label.

Chart legend
This Week
Last Week
Components

Empty & loading states

Empty states use a single large icon at reduced opacity — never a custom illustration — plus a bold title, muted subtext, and an optional primary CTA. Loading states shimmer generic gray blocks shaped like the content they'll become.

Empty state
No Location Groups Yet
Group stores into regions, zones, or clusters to simplify scope assignment for managers.
Skeleton loading
Components

Dropdowns & modals

Overlays float in the "lg"/"xl" elevation tiers, sit on the primary surface regardless of page background, and dismiss on outside click or Escape.

Dropdown menu
Modal
Components

Date range picker

A preset row (Today / 7d / 30d) sits above a month grid — presets cover the common cases so the grid is rarely needed for anything but a custom range.

Today Last 7 days Last 30 days This month
SMTWTFS 293012345 6789101112 13141516171819 20212223242526 27282930123
Components

Filter drawer

A right-side panel that slides in over a dimmed backdrop — reused across Analytics, Live Feed, Reports and User Management for advanced filtering, rather than building a bespoke filter UI per view.

The darkened area is the dimmed backdrop (25% black) that sits behind the panel while it's open — not empty space.

Advanced Filters
Region
All Regions
Store type
Flagship, Outlet
Principles

Usage guidelines

A few rules that keep the system coherent as new surfaces get built.

Do

Pull colors, radius and shadow values from the tokens on this page — never hard-code a one-off hex or pixel value in a new screen.

Don't

Don't introduce a new accent color for a single feature. If none of the semantic or brand colors fit, that's a signal to raise it with design first.

Do

Pair every status color with a text label and, where space allows, an icon.

Don't

Don't rely on color alone to communicate state, and don't use the spring easing for more than one element on screen at a time.

Known accessibility gap

Audited against WCAG AA: white text on the dark-mode primary (#8A87FF) measures ~3.0:1 — below the 4.5:1 minimum for normal text. It's an existing production value, carried here as-is rather than silently corrected. Until it's revisited, keep dark-mode primary-button labels bold and ≥14px, and don't use primary-on-white for long-form text. Tertiary text and status-pill labels also sit in the ~2.9–4.4:1 range by design, intended for de-emphasized captions and badges only — never for primary body copy.