Elenxia
Violet glass, hollow rings, two languages.
A dark violet glass design system for any web product: a deep violet ground, frosted dialogs, hollow ringed controls and one violet hue for the way forward, in English and Persian, dark and light.
Used by QA Intelligence and FEC One · Updated
Open the live demoGuidelines
Voice and content
- Name things by what people recognize, not by how the system works: "Notifications", not "Webhook config".
- Buttons say exactly what happens: "Save changes", "Send invite", "Delete". The result says the same thing back: "Changes saved".
- Short, plain words and one action at a time: "Enter their email and choose what they can do."
- Confirm only what really happened: a toast appears for a real outcome, never for an attempt.
- Errors say what went wrong and what to do next, in one line: "Wrong code — 4 tries left", "The connection dropped at 18 of 42 files", then a way forward (Try again, Use another way).
- Second person, sentence case, no emoji, no exclamation marks. A status word sits beside every colour.
- Two languages, equal. Every string exists in English and Persian. Persian sets
dir="rtl"on<html>; emails, links and codes stay left-to-right (.ltrordir="ltr"). In Persian, eyebrows and chips drop uppercase and letter-spacing, digits use the Persian locale, and a dot separator is drawn rather than typed, because "·" next to a digit reads as zero.
Colour
- Dark is the default theme, light the alternative. Put
bgon the page,inkfor text,mutedfor secondary text.surfaceandsurface-2are quiet fills, not cards. violetis the only brand hue in the UI. Use it for the main action's ring, the current navigation item, focus outlines, selection, progress and reached steps.indigoonly joins it in the progress gradient.cosmic,deepandspaceare the deep brand steps for marketing and share images.- In dark,
violettext is 3.9:1 onbg: use it at 14px medium or larger (button labels, active links), not for small body copy. - State colours always come with a word.
success,warninganderror(with their-solidand-foreground) for chips and messages. Status lamps uselamp-online,lamp-warnandlamp-offline; offline is orange, never red. Priority usessev-s0tosev-s2. Workflow statuses use the colour-blind-checkedfs-*set. - Categorical hues (
spec-*) tell people, groups or services apart, for example an avatar's ring or a chart's slice. warningis never text in light (2.1:1); usewarning-foregroundthere.
Type
- Set text in
sans: Inter Variable, with Vazirmatn Variable covering Persian glyph by glyph. Set titles, the brand name and big numbers indisplay: Space Grotesk 500–700 with 0.02em letter-spacing (normal in Persian). Codes and logs go inmono. - The scale is shifted one step down. Body text is 14px (
body), small text 12px (body-sm), labels 11px (label). Most of the UI lives at 11–14px. - Styles:
display-hero,display-title(dialog title),popup-title,body,body-sm,label(field labels and section heads,muted),eyebrow(uppercase, 0.18em),chip,menu-label,display-numberandmono(both with tabular figures).
Shape, edges and depth
- Borders are switched off globally (
* { border-style: none !important }). Draw every edge as a ring or an insetbox-shadow(hairlineline, or ink at 14–45%). Only.keep-borderopts back in. - Radii:
radius-fullfor every button, chip, pill, toggle and lamp;radius-xlfor tiles, dialogs, menus and toasts;radius-glassfor glass fields and option tiles;radius-lgfor inputs and rows;radius-card(2px) for flat cards. - Glass is the depth. Dialogs and drawers use
blur-modalandshadow-modalover a lightscrim, and the page behind blurs (blur-page). Menus and the navigation pill useblur-menuandshadow-menu. Write-webkit-backdrop-filterbeforebackdrop-filter, or some production builds drop the blur. - Spacing follows a 4px scale:
space-2between siblings,space-3/space-4inside controls and tiles,space-6/space-8around dialogs and pages. Pages are at most 1280px wide with a 16px gutter (24px on larger screens). - Layers:
z-topband<z-nav<z-drawer<z-menu<z-search<z-lightbox.
Controls
- Buttons are hollow and ringed, never filled. The one main action has a 2px
violetring; every other action a 1pxlinering withmutedtext; danger a 2pxerrorring. Anything clickable is a button, never bare text. One main action per view. - Focus is a solid 2px
violetoutline, offset 1px, on every control in both themes. - Status is shown with a Chip or a StatusLamp and its word. Progress uses the 6px ProgressBar with the number beside it.
Layout rules
- Nothing moves when you switch. Changing a step, tab or mode never resizes, rescales or shifts anything: reserve the tallest state's height.
- Working screens fit without scrolling at 100%, 120% and 150% browser zoom: compact first, then scale. Check at about 1215×580 CSS pixels as well as full width.
- Dashboards are a grid of transparent tiles (Bento); each tile opens its detail in a dialog.
- Live-activity animations run while the activity is live, even when reduced motion is on, and stop when it ends. Everything else respects
prefers-reduced-motion.
Motion
- Fields and options: 120ms ease. Fades: 420ms ease-out with a 3px rise. Status lamps ping every 1.4s. Toasts live 8s, at most 4 on screen.
- Springs: tiles stiffness 100 / damping 10 with a 0.1s stagger; the navigation pill stiffness 250–300 / damping 18–20.
Iconography
- lucide icons, 16px, stroke 2,
currentColor. Arrows and chevrons mirror in right-to-left layouts. - No emoji in the UI. Charts, image annotations (
mark-now,mark-should,mark-info) and badges are drawn as inline SVG.
Code
- Component classes start with
el-; their colours and sizes come from the tokens (var(--violet),var(--radius-xl)…), so a theme switch changes everything at once.
Logo
There is no logo file yet. Set the product name in the display face until a mark exists.
Colors
55 colour tokens. Values shown for the dark theme; switch the theme above to see the other.
Brand
violet#7b4df2The one brand hue: the main action's ring, the current navigation item, focus outlines, selection, progress. Reads on bg and surface in light; in dark it is 3.9:1 on bg and 3.6:1 on surface, so use it for 14px+ medium labels and rings, not small body copy.
violet-bright#9366f8Brighter violet for lines and marks on dark grounds (maps, charts).
violet-hover#6a3ce0Fixed hover shade of violet (brand scale).
primary-hover#8d63f6Hover and pressed state of anything violet; lightens in dark, darkens in light.
indigo#4a2cc4Gradient partner of violet: the progress bar fill, share images.
cosmic#1b1568Deep brand step; dark surface-2 is the same value.
deep#100c40Brand ink; the light theme's text colour.
space#08061cDarkest brand step; the browser theme colour in dark.
Surfaces and text
bg#0b0a1aPage background. Everything sits on it; most components are transparent over it.
surface#14113cRaised plain surface: toasts, select options.
surface-2#1b1568Quiet fill: input background (at 50%), hovered rows, segmented-control track, skeleton, toggle off.
ink#f3f1ffPrimary text and icons on bg, surface and surface-2.
muted#a49fceSecondary text: labels, hints, idle nav items, neutral button text. 4.5:1 or more on bg and surface in both themes.
line#2a2660Hairlines drawn as box-shadow or ring (borders are globally off): neutral button ring, dividers, separators. Decorative only; never the sole edge of a control.
card#18181bThe active segment's fill in Segments.
scrimrgba(0,0,0,0.38)Dialog scrim (the page behind also blurs 14px).
States
success#1f9d6bGood/passed fills and dark-theme good text.
success-solid#17805aGood text on light grounds; solid good chips.
success-foreground#ffffffText on a solid success fill.
warning#e0a020Warn fills, warn text in dark theme only (2.1:1 on light bg: never text in light, use warning-foreground).
warning-foreground#2b1d00Text on warning fills; warn chip text in light.
error#e24868Danger ring/text (danger button), critical chips in dark, error messages.
error-solid#c93a58Critical text on light grounds; solid error fill.
error-foreground#ffffffText on a solid error fill.
info#7b4df2Info tone = violet (info chips, info toasts).
Status lamps
lamp-online#10b981Status lamp: online, done. Always paired with its word.
lamp-warn#facc15Status lamp: degraded, needs attention.
lamp-offline#f97316Status lamp: offline, failed or blocked. Orange, never red.
Priority
sev-s0#f87171Critical priority text (red-400 dark, red-600 light) on a 15% tint of itself; always beside the word Critical.
sev-s1#fb923cHigh priority text (orange) on a 15% tint; beside the word High. In light, orange-600 is 3.3:1 on bg, below 4.5:1 for 10px text.
sev-s2#facc15Medium priority text (yellow) on a 15% tint; beside the word Medium. Low uses muted on ink 10%.
Workflow statuses
fs-review#9085e9Workflow status palette, checked for colour-blind readers, 1 of 6: backlog / to review.
fs-failing#e66767Workflow status 2 of 6: blocked / failing.
fs-selected#3987e5Workflow status 3 of 6: planned / selected.
fs-verify#c98500Workflow status 4 of 6: in review / checking.
fs-fixed#199e70Workflow status 5 of 6: done.
fs-aside#5d5d75Workflow status 6 of 6: archived / set aside.
Categorical hues
spec-functional#7b4df2Categorical hue 1 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-backend#3b82f6Categorical hue 2 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-security#e24868Categorical hue 3 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-ux#14b8a6Categorical hue 4 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-mobile#f59e0bCategorical hue 5 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-performance#22c55eCategorical hue 6 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-chaos#f97316Categorical hue 7 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-visual#ec4899Categorical hue 8 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-localization#06b6d4Categorical hue 9 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-privacy#8b5cf6Categorical hue 10 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-dependency#64748bCategorical hue 11 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-explorer#eab308Categorical hue 12 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
spec-infrastructure#0ea5e9Categorical hue 13 of 13 (the same in both themes): tells people, groups or services apart, e.g. an avatar ring or a chart slice.
Annotations and console
mark-now#ef4444Image annotation: the problem.
mark-should#22c55eImage annotation: what it should be.
mark-info#3b82f6Image annotation: information.
terminal-bg#05090aLog console background (the same in both themes).
terminal-ink#4ade80Log console text on terminal-bg.
Typography
Inter for text, Space Grotesk for display, Vazirmatn for every Persian glyph. The scale is shifted one step down: body text is 14px.
Display
display-hero20px / 28px · 500 · 0.02em
Build with fewer surprises
Landing-screen heading (24px on larger screens, 20px below). Letter-spacing normal in Persian.
display-title16px / 24px · 500 · 0.02em
Invite a teammate
Dialog title.
display-number22px / 22px · 700
1,240
Big readouts and meters. Always tabular figures.
Text
popup-title14px / 20px · 500
Project details
Dialog header title (truncates).
body14px / 20px · 400
Enter their email and choose what they can do.
Default text (text-base is 14px: the whole scale is shifted one step down).
body-sm12px / 16px · 400
Updated 2 hours ago
Dense rows, button text at size sm, hints.
label11px / 16px · 500
Email address
Field labels, section headings (text-xs font-medium, muted).
eyebrow11px / 16px · 600 · 0.18em
STEP 3 OF 6
Eyebrows: uppercase, 0.18em. In Persian: no uppercase, normal spacing.
chip10px / 10px · 600 · 0.025em
ACTIVE
Chip text, uppercase. Persian: 11px, normal case.
menu-label10.5px / 14px · 600 · 0.05em
ACCOUNT
Menu group label, uppercase, muted at 70%.
Mono
mono11px / 16px · 400
GET /checkout 500
Logs, codes, numbers in columns, with tabular figures.
ایمیل همکارتان را بنویسید تا دعوتنامه برایش فرستاده شود.
Spacing & radius
The 4px scale in use, and the radii every component draws from.
space-0.52px · Segmented track padding (p-0.5).space-14px · Icon-to-text in chips, tight gaps.space-1.56px · Nav link gap, input bar inner padding.space-28px · Default gap between siblings (most used).space-312px · Input/row horizontal padding, button sm padding.space-416px · Bento padding, page side gutter, button padding.space-520px · Primary button horizontal padding, drawer header.space-624px · Modal padding (mobile), page gutter md+.space-832px · Modal padding sm+, page top padding, empty-state padding.
radius-card2px
radius-md6px
radius-lg8px
radius-glass10px
radius-xl12px
radius-2xl16px
radius-fullfull
Components
43 components and foundations, each drawn in its real styles with its states side by side and its motion running. Open Code for the markup and CSS, Guidelines for when to use it.
Foundations
Elevation
Shadows in Elenxia are few and named; each belongs to one kind of element.
Foundations
Glass
Glass is how Elenxia shows depth: dialogs, menus and side sheets are frosted panels over the page, never solid cards.
Foundations
Motion
Motion says something is alive or has just changed; it is never decoration.
Actions
Button
Every action is a hollow pill with a ring: a violet ring for the one main action, a line ring for everything else, a red ring for danger.
Actions
IconButton
A round icon-only button for close, back, theme and other tool actions; it always carries an accessible label.
Inputs
Checkbox
A labelled checkbox with an optional description line.
Inputs
ChoiceGroup
Radio-like options drawn as glass tiles; the chosen one gets a violet ring and a 14% violet wash.
Inputs
Select
A native <select> styled like the filled text field.
Inputs
TextField
A labelled single-line input (and a multi-line TextArea), in two looks: the quiet filled field on pages and the glass field inside dialogs.
Inputs
Toggle
An on/off switch (role="switch") for settings that take effect at once.
Status
Chip
A small uppercase status pill.
Status
Delta
A change in a number, its direction said three ways: an arrow, a sign and colour.
Status
ProgressBar
A thin 6px bar for progress and quotas.
Status
StatusLamp
A single blinking lamp with its word, for live states of a service, a device or a person.
Status
Stepper
The steps of a flow as numbered dots joined by lines: done, current, needs attention, and later.
Status
UsageMeter
A compact readout of what is left (balance, quota), each number in the colour of how much is used.
Charts
Donut
A donut of parts (their counts) with the total in the middle.
Charts
Gauge
A half-circle gauge for a score out of 100: the scale's bands outside, the value's arc and needle, the number in the middle.
Charts
LevelLadder
Four levels as seals on a line: the ones reached lit, the line filled as far as you have come, the current one ringed.
Charts
Ring
A ring filled to a share (0–100), its number inside; used for scores in rows and cards.
Charts
Seismograph
A strip that stays quiet while things run well and jolts where something happened: one jolt per event, its height its weight.
Charts
Sparkline
A small trend line for a list row; decorative, its numbers are said next to it.
Charts
Speedometer
A score as a speedometer: a half circle of ten segments, labels every tenth, a needle on a pivot.
Charts
StackBar
A bar of parts side by side, each its share of the whole: the compact form of the Donut.
Charts
TrendChart
A value over time: a violet line with a soft area under it, a dot per point, the latest labelled; hovering shows the point's date, value, change and detail.
Charts
VUMeter
A level as a VU meter: a 90° arc whose needle rises from the bottom edge, red, yellow and green bands over the scale.
Navigation
Breadcrumbs
A small trail of where you are.
Navigation
Segments
The segmented control for tabs and view switches (list or grid, all or some).
Patterns
Bento
A transparent tile in a dashboard grid; each tile opens its detail in a dialog.
Patterns
ImageAnnotations
Marks drawn on an image: what is wrong in red, what it should be in green dashes, information in blue, with a numbered note.
Patterns
InputBar
A wide pill with one input and its actions, for the first thing a screen asks: search, paste a link, start something.
Patterns
LogConsole
A live log: a black screen in both themes, green text, the newest line brighter, errors red, a blinking caret.
Patterns
Report
A shareable report anyone with the link can read: the verdict, the score and its trend, what changed, and the open items in the order to handle them.
Overlays
Drawer
A side sheet from the end edge (right in left-to-right layouts, left in right-to-left) for long detail beside the page.
Overlays
Menu
A dropdown anchored to a button, on menu glass: items, group labels and separators.
Overlays
Modal
A centred glass dialog for one task, with a display-face title, a close button and a footer; the page behind blurs and goes inert.
Overlays
Popup
The main detail dialog (and Modal / Drawer, which share its glass): a glass panel over a light scrim, with the page behind blurred 14px.
Overlays
Toast
A short confirmation at the bottom end corner, shown only for an outcome that really happened.
Overlays
Tooltip
A small hover card that explains a term or a number.
Data
Avatar
A round photo or initials, alone or stacked.
Data
DataTable
A dense table for lists of records.
Data
EmptyState
What a list shows before it has anything, and the skeleton shown while it loads.