All design systems
Design system

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 demo

Guidelines

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 (.ltr or dir="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 bg on the page, ink for text, muted for secondary text. surface and surface-2 are quiet fills, not cards.
  • violet is 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. indigo only joins it in the progress gradient. cosmic, deep and space are the deep brand steps for marketing and share images.
  • In dark, violet text is 3.9:1 on bg: use it at 14px medium or larger (button labels, active links), not for small body copy.
  • State colours always come with a word. success, warning and error (with their -solid and -foreground) for chips and messages. Status lamps use lamp-online, lamp-warn and lamp-offline; offline is orange, never red. Priority uses sev-s0 to sev-s2. Workflow statuses use the colour-blind-checked fs-* set.
  • Categorical hues (spec-*) tell people, groups or services apart, for example an avatar's ring or a chart's slice.
  • warning is never text in light (2.1:1); use warning-foreground there.

Type

  • Set text in sans: Inter Variable, with Vazirmatn Variable covering Persian glyph by glyph. Set titles, the brand name and big numbers in display: Space Grotesk 500–700 with 0.02em letter-spacing (normal in Persian). Codes and logs go in mono.
  • 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-number and mono (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 inset box-shadow (hairline line, or ink at 14–45%). Only .keep-border opts back in.
  • Radii: radius-full for every button, chip, pill, toggle and lamp; radius-xl for tiles, dialogs, menus and toasts; radius-glass for glass fields and option tiles; radius-lg for inputs and rows; radius-card (2px) for flat cards.
  • Glass is the depth. Dialogs and drawers use blur-modal and shadow-modal over a light scrim, and the page behind blurs (blur-page). Menus and the navigation pill use blur-menu and shadow-menu. Write -webkit-backdrop-filter before backdrop-filter, or some production builds drop the blur.
  • Spacing follows a 4px scale: space-2 between siblings, space-3/space-4 inside controls and tiles, space-6/space-8 around 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 violet ring; every other action a 1px line ring with muted text; danger a 2px error ring. Anything clickable is a button, never bare text. One main action per view.
  • Focus is a solid 2px violet outline, 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#7b4df2

    The 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#9366f8

    Brighter violet for lines and marks on dark grounds (maps, charts).

  • violet-hover#6a3ce0

    Fixed hover shade of violet (brand scale).

  • primary-hover#8d63f6

    Hover and pressed state of anything violet; lightens in dark, darkens in light.

  • indigo#4a2cc4

    Gradient partner of violet: the progress bar fill, share images.

  • cosmic#1b1568

    Deep brand step; dark surface-2 is the same value.

  • deep#100c40

    Brand ink; the light theme's text colour.

  • space#08061c

    Darkest brand step; the browser theme colour in dark.

Surfaces and text

  • bg#0b0a1a

    Page background. Everything sits on it; most components are transparent over it.

  • surface#14113c

    Raised plain surface: toasts, select options.

  • surface-2#1b1568

    Quiet fill: input background (at 50%), hovered rows, segmented-control track, skeleton, toggle off.

  • ink#f3f1ff

    Primary text and icons on bg, surface and surface-2.

  • muted#a49fce

    Secondary text: labels, hints, idle nav items, neutral button text. 4.5:1 or more on bg and surface in both themes.

  • line#2a2660

    Hairlines 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#18181b

    The active segment's fill in Segments.

  • scrimrgba(0,0,0,0.38)

    Dialog scrim (the page behind also blurs 14px).

States

  • success#1f9d6b

    Good/passed fills and dark-theme good text.

  • success-solid#17805a

    Good text on light grounds; solid good chips.

  • success-foreground#ffffff

    Text on a solid success fill.

  • warning#e0a020

    Warn fills, warn text in dark theme only (2.1:1 on light bg: never text in light, use warning-foreground).

  • warning-foreground#2b1d00

    Text on warning fills; warn chip text in light.

  • error#e24868

    Danger ring/text (danger button), critical chips in dark, error messages.

  • error-solid#c93a58

    Critical text on light grounds; solid error fill.

  • error-foreground#ffffff

    Text on a solid error fill.

  • info#7b4df2

    Info tone = violet (info chips, info toasts).

Status lamps

  • lamp-online#10b981

    Status lamp: online, done. Always paired with its word.

  • lamp-warn#facc15

    Status lamp: degraded, needs attention.

  • lamp-offline#f97316

    Status lamp: offline, failed or blocked. Orange, never red.

Priority

  • sev-s0#f87171

    Critical priority text (red-400 dark, red-600 light) on a 15% tint of itself; always beside the word Critical.

  • sev-s1#fb923c

    High 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#facc15

    Medium priority text (yellow) on a 15% tint; beside the word Medium. Low uses muted on ink 10%.

Workflow statuses

  • fs-review#9085e9

    Workflow status palette, checked for colour-blind readers, 1 of 6: backlog / to review.

  • fs-failing#e66767

    Workflow status 2 of 6: blocked / failing.

  • fs-selected#3987e5

    Workflow status 3 of 6: planned / selected.

  • fs-verify#c98500

    Workflow status 4 of 6: in review / checking.

  • fs-fixed#199e70

    Workflow status 5 of 6: done.

  • fs-aside#5d5d75

    Workflow status 6 of 6: archived / set aside.

Categorical hues

  • spec-functional#7b4df2

    Categorical 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#3b82f6

    Categorical 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#e24868

    Categorical 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#14b8a6

    Categorical 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#f59e0b

    Categorical 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#22c55e

    Categorical 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#f97316

    Categorical 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#ec4899

    Categorical 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#06b6d4

    Categorical 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#8b5cf6

    Categorical 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#64748b

    Categorical 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#eab308

    Categorical 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#0ea5e9

    Categorical 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#ef4444

    Image annotation: the problem.

  • mark-should#22c55e

    Image annotation: what it should be.

  • mark-info#3b82f6

    Image annotation: information.

  • terminal-bg#05090a

    Log console background (the same in both themes).

  • terminal-ink#4ade80

    Log 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-hero

    20px / 28px · 500 · 0.02em

    Build with fewer surprises

    Landing-screen heading (24px on larger screens, 20px below). Letter-spacing normal in Persian.

  • display-title

    16px / 24px · 500 · 0.02em

    Invite a teammate

    Dialog title.

  • display-number

    22px / 22px · 700

    1,240

    Big readouts and meters. Always tabular figures.

Text

  • popup-title

    14px / 20px · 500

    Project details

    Dialog header title (truncates).

  • body

    14px / 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-sm

    12px / 16px · 400

    Updated 2 hours ago

    Dense rows, button text at size sm, hints.

  • label

    11px / 16px · 500

    Email address

    Field labels, section headings (text-xs font-medium, muted).

  • eyebrow

    11px / 16px · 600 · 0.18em

    STEP 3 OF 6

    Eyebrows: uppercase, 0.18em. In Persian: no uppercase, normal spacing.

  • chip

    10px / 10px · 600 · 0.025em

    ACTIVE

    Chip text, uppercase. Persian: 11px, normal case.

  • menu-label

    10.5px / 14px · 600 · 0.05em

    ACCOUNT

    Menu group label, uppercase, muted at 70%.

Mono

  • mono

    11px / 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.5
    2px · Segmented track padding (p-0.5).
  • space-1
    4px · Icon-to-text in chips, tight gaps.
  • space-1.5
    6px · Nav link gap, input bar inner padding.
  • space-2
    8px · Default gap between siblings (most used).
  • space-3
    12px · Input/row horizontal padding, button sm padding.
  • space-4
    16px · Bento padding, page side gutter, button padding.
  • space-5
    20px · Primary button horizontal padding, drawer header.
  • space-6
    24px · Modal padding (mobile), page gutter md+.
  • space-8
    32px · Modal padding sm+, page top padding, empty-state padding.
  • radius-card

    2px

  • radius-md

    6px

  • radius-lg

    8px

  • radius-glass

    10px

  • radius-xl

    12px

  • radius-2xl

    16px

  • radius-full

    full

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

    FloatingNav

    The navigation pill at the top of every page: brand, a few main links, search and account, on menu glass.

  • 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.