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
Guidelines
Taken from the running app
- Every component on this page is the QA app's own markup, cut from the running screens, with its own compiled stylesheet (
components.css: Tailwind v4 + the app's base styles, unchanged). Only the words are made general; nothing is redrawn. - The ground is the app's own
bg(#0b0a1a in dark): regions are transparent on it, never cards. Edges are rings and inset shadows; the few framed tiles (figures, a run's cards) are the app's own. - Dark is the
.darkclass on<html>; right-to-left isdir="rtl". - Meters have needles (the VU meters 90°, the score dial 180°), status lights are 7px dots with a 5px glow that blink, and the team is real photos on rings — exactly as in the app.
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
65 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.
Navigation
AccountMenu
The account menu under the avatar: who is signed in, the account's pages, language, theme and sign out.
Navigation
Breadcrumbs
A small trail of where you are.
Navigation
SearchPalette
Everything in one search (Ctrl K or /): places, settings and actions, in groups, with "Opens here" on what opens in place.
Navigation
Segments
The segmented control for tabs and view switches (list or grid, all or some).
Navigation
StepArrows
The previous and next step at the stage's two edges: a 36px circle with a 2px violet ring and a chevron, the step's name in 10px upper-case under it.
Navigation
StepHeader
Where a multi-step screen stands: the current step large, the next step small, Back / Next as line rings and Go to in the violet ring.
Navigation
StepStrip
A journey's steps as numbered circles joined by arrows: green with a check when done, orange to do, violet ring on the one you are at, a "Start here" tag on the first to do.
Navigation
TopBar
Back, forward and where you are: the project's name, a slash, the item open.
Actions
Button
Every button is hollow with a ring — never filled.
Actions
IconButton
A 36px round icon button, muted; a soft surface wash and ink on hover; 30% when it cannot be used.
Inputs
AddressBar
One field and its two actions in a rounded line ring: type an address, Save (muted) or Start (violet ring).
Inputs
Checkbox
A labelled checkbox with an optional description line.
Inputs
Chip
Filter chips: a check on what is on, a lock on what is closed.
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
Counter
What is left, beside the navigation: a large green number in the display face and what it counts in 11px upper-case.
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
StatusLights
One lamp per subject, in a single row across the screen: a 7px dot in its colour with a 5px glow, blinking, and the subject's name in 9px upper-case.
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 score from 0 to 100 on a 180° dial: ticks every 10 with numbers, a red → amber → green band, and a needle from the centre.
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
PowerGauge
How much power a step adds: a speedometer from 0 to 100 with ticks, a green zone at the top end, and a thin needle.
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
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
Analog meters with a needle, in a row: 0–100 on a 90° scale with five numbered ticks, minor ticks between, a coloured zone at the top end, and a filled needle that swings to the value.
Team
TeamCarousel
Meet the team: one large photo at a time, an iris that opens from where you click, previous / next under it, and what that person does beside it.
Team
TeamMember
A person on the team: a round photo with a ring in their colour, a small badge on it, the name, the role, and where they stand (Chosen, Finished, locked).
Team
TeamOrbit
The whole team around its lead: the lead's photo in the centre, everyone else on two dashed circles.
Patterns
ChoiceFlow
One choice among several, drawn as branches: the chosen one violet with a check, then the action it leads to (a violet-ring button with a note under it).
Patterns
ConfirmFlow
Confirm, choose what to redo, then redo: a two-step guard before a costly action, with its cost said under the choice.
Patterns
FlowView
A step drawn as a flow: groups of choices in columns, joined by curved lines that run from what is chosen to what it leads to.
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
JourneyHeading
The whole job in one line: three numbered steps joined by arrows, the last in violet.
Patterns
LevelFlow
Where you stand, how to get the badge (free or with credit), and sharing it — dim until the step before is done.
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.
Patterns
ReviewFlow
Results at a glance: the health gauge, a strip of file kinds to open, and the problem / warning counts.
Patterns
RunBoard
A live run on one screen, in four columns: the people at work (orbit), the activity list, the system's parts (interface, backend, terminal, ops, infrastructure) and the run's figures with a map of its servers.
Patterns
StartFlow
The last check before a start: plan and access, the profile, and the big play button — green when all is ready, otherwise orange with what is missing.
Patterns
SystemParts
A system shown as its parts, one transparent tile each: interface (latest image), backend (browser → API → data, with requests flowing), a terminal, ops, infrastructure (the earth, pings and latency).
Patterns
TeamFlow
FlowView with people: the team's orbit, then the tool level, then the power it adds.
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
GuideDialog
How the whole thing goes, in one dialog: the step strip on top, the chosen step drawn below it, and a legend of the dots.
Overlays
LightPopup
A status light's pop-up with a full choice inside it: levels as columns, a table of who uses what, and the total.
Overlays
Modal
A pop-up for one subject: its title and state at the top, its content, and at the foot the subject before and after it by name, with where it stands (3 / 12).
Overlays
PlanPanel
Plan and usage: today's use as meters, then the plans side by side, monthly / annual switch, and the fine print.
Overlays
SummaryDialog
A run's summary: the result with an icon, the figures, a note, who did what, and the downloads with a violet-ring action at the foot.
Overlays
Toast
A short notice at the bottom end: a coloured bar at the start edge (green good, amber warn, red bad, violet info), a title, one line, a dismiss.
Overlays
Tooltip
A small hover card that explains a term or a number.
Data
ActivityList
What happened, newest first: who, what, and a status at the end — Finished (violet chip), Started, Starting (gray chip), Passed (green check), Couldn't run (amber dashed circle).
Data
Avatar
A round photo or initials, alone or stacked.
Data
EmptyState
What a list shows before it has anything, and the skeleton shown while it loads.
Data
ProjectsTable
Projects as rows: each row a soft band (surface at 60%, rounded ends), no grid lines.
Data
ResultList
One row per person: photo, role, name, a one-line result; it opens in place for the detail.
Data
StatTiles
A row of figures: the number in 18px, its name in 11px upper-case under it, each in a hairline tile (the one place a frame is drawn).
Data
Terminal
A terminal tile: near-black (#05090a), green mono text, the prompt in bright green, results fading from the bottom up.