Elitea AIBRAND GUIDE · V3.0.0

llms.txt BRAND.md

Brand guide · v3.0.0

The Elitea AI brand guide.

Version 3.0.0. The identity of Elitea AI, the unified AI platform: the name, the LE-03 mark, colour, type, voice and the design tokens products read. Written for people and for agents: every rule here is something you can check, and every value comes from one file, tokens.json.

The guide is restraint, not more colour: one primary, signals that each have a single job, and neutrals doing the work.

01

Name

  • Write Elitea AI: two words, capital E, "AI" in capitals. Never "EliteaAI", "elitea ai", "ELITEA" or "Elitea.ai".
  • Elitea alone is fine in running text once the full name has appeared ("Open Elitea", "Elitea keeps…"), and as the short name where space is tight (app menus, the dock, the home screen).
  • Domains are always lowercase: elitea.ai.
  • The mark is LE-03: three stacked layers hinting at an E, the middle layer split into a bar and a dot. It replaced the gradient loop and the gradient orb; both are retired everywhere.

The lockup

The mark plus the wordmark "Elitea AI", set in Sora 700 and supplied as outlines. Use the supplied lockup files and never re-typeset the wordmark. The wordmark takes the text colour of its surface (Ink on Paper, #F2F4FA on Ink); the mark keeps its colours.

  • Minimum lockup width: 96 px. Below that, use the mark alone.
  • Gap between mark and wordmark: 0.4 × the mark's height. It's built into the file.

03

Colour

Four colours, taken from the mark in layer order, and each one has exactly one job. These are rules, not suggestions: they stop the product drifting back into a different accent family per theme.

Model · gpt-5
Hello, Sam.What can I do for you today?
Message Elitea…
Open the toolkit catalogueSavedToken expires in 3 days
Model · gpt-5
Hello, Sam.What can I do for you today?
Message Elitea…
Open the toolkit catalogueSavedToken expires in 3 days
ColourHexJob
Base Indigo#4A4DE8The one primary action colour, both themes.
Signal Cyan#00BFE6Dark-theme signal: links, focus, active navigation. On light it lives only inside the mark.
Layer Violet#7A5CFFAI presence only: model badges, AI feature markers.
Dot Orange#FF6B1AThe dot: one notification or live marker per view.
Ink#0B0B18Dark canvas and light-theme text.
Paper#FFFFFFLight canvas and dark-theme on-primary text.

One colour, one job

  • Indigo is the single primary action colour in both themes: buttons, primary actions, selected states, toggles on. White text on it is 5.97:1.
  • Cyan is the dark-theme signal: links, active navigation, focus rings on Ink (8.92:1). On light, the signal role is Indigo and cyan appears only inside the mark.
  • Violet is the AI accent only: model badges, AI feature markers, assistant presence. Never buttons, never large fills. Text in the AI role uses aiText.
  • Orange is the dot only: a notification dot or a live/run marker. At most one per view. Counts and badges are Indigo or danger, never orange. If orange appears twice, it means nothing.
  • Neutrals carry the interface. Sidebars, cards, inputs and text are Ink/Paper steps, never tinted brand colour.
  • At most two brand hues per screen besides the mark, plus the one orange dot. A screen that needs a third hue has too much happening. Charts are the exception and follow the chart order below.
  • Flat fills only. No gradients in UI chrome: no gradient buttons, text, borders, avatars, cards or orbs.
  • Semantic colours are not brand colours. Success is green, warning is amber (never orange), danger is red, and each has a per-theme value that passes AA as text.

Proportion

Neutrals about 78%, Indigo 12%, Cyan 5% (dark), Violet 3%, Orange 2%: the dot, almost never.

Charts

Series take, in order: Indigo, Signal (cyan on dark, #0E7490 on light), Violet, then textMuted. Semantic colours only for semantic series (errors, budget exceeded). Never orange.

Banned pairs

PairRatioWhy
#FFFFFF on #00BFE62.19:1White on cyan, 2.19:1.
#FFFFFF on #FF6B1A2.85:1White on orange, 2.85:1. Orange is a dot, not a text background.
#00BFE6 on #FFFFFF2.19:1Cyan text on white, 2.19:1. On light, links and focus are indigo.
#7A5CFF on #FFFFFF4.37:1Violet body text on white, 4.37:1. Use aiText (#6447F0).
#22C55E on #FFFFFF2.28:1Bright green text on white, 2.28:1. Light success is #15803D.
#F59E0B on #FFFFFF2.15:1Amber text on white, 2.15:1. Light warning is #B45309.
#EF4444 on #FFFFFF3.76:1Red text on white, 3.76:1. Light danger text is #B91C1C.

Kill list: retired, do not reintroduce

RetiredValues
Lavender wash#EDEAFA #F0EEFE
Magenta accents#B333D5 #B12ED4 #E04BF0 #C428DD #F47CFF #F551F9
Periwinkle#6878F8
Muted teal#284858 #3F7F8A
Old pale cyan accent#6AE8FA #83EFFF

Also retired: the gradient orb, the rainbow loop logo, gradient text, and any per-theme accent swap. If one of these shows up in a build or a template, it's a bug against this guide.

04

Type

Three families with three jobs. All are SIL Open Font License and self-hosted (no font CDN: the desktop app works offline and the app's font policy is same-origin only).

Elitea AI · type specimen

Agents that do the work.
Data that stays yours.

Create and edit agents and pipelines from the chat. Connect a toolkit, give it credentials, and Elitea keeps everything inside your project.

project_user_1024 · https://elitea.example/llm/v1 · #4A4DE8

FamilyJobWeights
SoraDisplay and headings, the wordmark700, 800
ManropeInterface and body text400, 600
JetBrains MonoAnything a machine produced or will parse: IDs, URLs, hex, code, eyebrows400, 500
RoleFamilyWeightSizeTrackingLine height
DisplaySora80040-64px-0.025em1.05
HeadingSora70020-36px-0.02em1.15
BodyManrope40014-16px01.55
LabelManrope60013-14px01.4
EyebrowJetBrains Mono, uppercase50011-12px0.16em1.4
CodeJetBrains Mono40013px01.55
  • Sentence case everywhere: "Choose the toolkit type", not "Choose The Toolkit Type". Headings, buttons, menu items, tabs.
  • Two weights per family, maximum. Hierarchy comes from size and colour role, not five weights competing.
  • Uppercase is reserved for mono eyebrows, tracked +0.16em.

05

Voice

Calm, precise and on the user's side. Elitea AI is infrastructure people trust with their data and credentials, and the words should sound like it.

  • Plain over playful. Understatement beats exclamation marks.
  • Accurate first: name the thing, name what happens next.
  • No hype words: "supercharge", "revolutionary", "magic", "10x", "unleash". The pitch is control and competence.
  • Empty states name the state and the way out: "No tags yet. Tags you add will appear here." Not "No tags to display."
  • Placeholders say what the box does: "Search agents, chats, toolkits…", not "Let's find something amazing!"
  • Errors say what happened and what to do, without blame and without exclamation marks: "Couldn't save the toolkit. Check the token and try again."
  • No emoji in UI labels.

06

Tokens

Products read these tokens. One token set, same names in both themes: only the neutrals invert, and the brand roles keep their jobs. In the web app they are the default brand pack (apps/elitea-web/src/shared/brand/tokens/default.pack.json); a workspace brand pack (white-label, ADR-0024) replaces them at run time.

TokenDark "Ink"Light "Paper"
bg#0B0B18#FFFFFF
surface#12172B#F4F6FB
elevated#1A2036#FFFFFF
border#232A45#E2E6F0
borderStrong#6B7590#7C86A0
text#F2F4FA#0B0B18
textMuted#9AA3B8#5A6478
textDisabled#5F6880#9AA3B8
primary#4A4DE8#4A4DE8
primaryHover#5D60F0#3D40D6
primaryPressed#3D40D6#3336C0
onPrimary#FFFFFF#FFFFFF
signal#00BFE6#4A4DE8
onSignal#0B0B18#FFFFFF
ai#7A5CFF#7A5CFF
aiText#9A8CFF#6447F0
dot#FF6B1A#FF6B1A
success#22C55E#15803D
warning#F59E0B#B45309
danger#F87171#B91C1C
dangerFill#DC2626#DC2626
onDangerFill#FFFFFF#FFFFFF
selectedrgba(74, 77, 232, 0.22)rgba(74, 77, 232, 0.10)
hoverrgba(242, 244, 250, 0.06)rgba(11, 11, 24, 0.04)
scrimrgba(11, 11, 24, 0.72)rgba(11, 11, 24, 0.48)
codeBg#07070F#0B0B18
codeText#D9F5FC#E8EAF6
TokenValueUse
radiusSm / radiusMd / radiusLg6 / 10 / 14 pxchips and small controls / buttons and inputs / cards, dialogs
space0, 4, 8, 12, 16, 24, 32, 48, 644 px grid
focus ring2px signal, 2px offsetevery interactive element, both themes
motion120ms / 200ms, cubic-bezier(0.2, 0, 0, 1)removed under prefers-reduced-motion
elevation (light)0 1px 2px rgba(11, 11, 24, 0.06), 0 4px 16px rgba(11, 11, 24, 0.06)cards, menus, dialogs
elevation (dark)surface steps, no shadowbg → surface → elevated
/* Elitea AI design tokens v3.0.0. Generated from tokens.json; https://elitea-ng.github.io/elitea-platform/brand/ */
:root {
  --elitea-indigo: #4A4DE8;
  --elitea-cyan: #00BFE6;
  --elitea-violet: #7A5CFF;
  --elitea-orange: #FF6B1A;
  --elitea-ink: #0B0B18;
  --elitea-paper: #FFFFFF;
  --elitea-font-display: "Sora", "Manrope", system-ui, sans-serif;
  --elitea-font-ui: "Manrope", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --elitea-font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Consolas, monospace;
  --elitea-radius-sm: 6px;
  --elitea-radius-md: 10px;
  --elitea-radius-lg: 14px;
  --elitea-radius-pill: 9999px;
  --elitea-focus-width: 2px;
  --elitea-focus-offset: 2px;
  --elitea-motion-fast: 120ms;
  --elitea-motion-base: 200ms;
  --elitea-motion-easing: cubic-bezier(0.2, 0, 0, 1);
}
:root,
[data-theme="light"] {
  color-scheme: light;
  --elitea-bg: #FFFFFF;
  --elitea-surface: #F4F6FB;
  --elitea-elevated: #FFFFFF;
  --elitea-border: #E2E6F0;
  --elitea-border-strong: #7C86A0;
  --elitea-text: #0B0B18;
  --elitea-text-muted: #5A6478;
  --elitea-text-disabled: #9AA3B8;
  --elitea-primary: #4A4DE8;
  --elitea-primary-hover: #3D40D6;
  --elitea-primary-pressed: #3336C0;
  --elitea-on-primary: #FFFFFF;
  --elitea-signal: #4A4DE8;
  --elitea-on-signal: #FFFFFF;
  --elitea-ai: #7A5CFF;
  --elitea-ai-text: #6447F0;
  --elitea-dot: #FF6B1A;
  --elitea-success: #15803D;
  --elitea-warning: #B45309;
  --elitea-danger: #B91C1C;
  --elitea-danger-fill: #DC2626;
  --elitea-on-danger-fill: #FFFFFF;
  --elitea-selected: rgba(74, 77, 232, 0.10);
  --elitea-hover: rgba(11, 11, 24, 0.04);
  --elitea-scrim: rgba(11, 11, 24, 0.48);
  --elitea-code-bg: #0B0B18;
  --elitea-code-text: #E8EAF6;
  --elitea-shadow: 0 1px 2px rgba(11, 11, 24, 0.06), 0 4px 16px rgba(11, 11, 24, 0.06);
}
[data-theme="dark"] {
  color-scheme: dark;
  --elitea-bg: #0B0B18;
  --elitea-surface: #12172B;
  --elitea-elevated: #1A2036;
  --elitea-border: #232A45;
  --elitea-border-strong: #6B7590;
  --elitea-text: #F2F4FA;
  --elitea-text-muted: #9AA3B8;
  --elitea-text-disabled: #5F6880;
  --elitea-primary: #4A4DE8;
  --elitea-primary-hover: #5D60F0;
  --elitea-primary-pressed: #3D40D6;
  --elitea-on-primary: #FFFFFF;
  --elitea-signal: #00BFE6;
  --elitea-on-signal: #0B0B18;
  --elitea-ai: #7A5CFF;
  --elitea-ai-text: #9A8CFF;
  --elitea-dot: #FF6B1A;
  --elitea-success: #22C55E;
  --elitea-warning: #F59E0B;
  --elitea-danger: #F87171;
  --elitea-danger-fill: #DC2626;
  --elitea-on-danger-fill: #FFFFFF;
  --elitea-selected: rgba(74, 77, 232, 0.22);
  --elitea-hover: rgba(242, 244, 250, 0.06);
  --elitea-scrim: rgba(11, 11, 24, 0.72);
  --elitea-code-bg: #07070F;
  --elitea-code-text: #D9F5FC;
  --elitea-shadow: none;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --elitea-bg: #0B0B18;
    --elitea-surface: #12172B;
    --elitea-elevated: #1A2036;
    --elitea-border: #232A45;
    --elitea-border-strong: #6B7590;
    --elitea-text: #F2F4FA;
    --elitea-text-muted: #9AA3B8;
    --elitea-text-disabled: #5F6880;
    --elitea-primary: #4A4DE8;
    --elitea-primary-hover: #5D60F0;
    --elitea-primary-pressed: #3D40D6;
    --elitea-on-primary: #FFFFFF;
    --elitea-signal: #00BFE6;
    --elitea-on-signal: #0B0B18;
    --elitea-ai: #7A5CFF;
    --elitea-ai-text: #9A8CFF;
    --elitea-dot: #FF6B1A;
    --elitea-success: #22C55E;
    --elitea-warning: #F59E0B;
    --elitea-danger: #F87171;
    --elitea-danger-fill: #DC2626;
    --elitea-on-danger-fill: #FFFFFF;
    --elitea-selected: rgba(74, 77, 232, 0.22);
    --elitea-hover: rgba(242, 244, 250, 0.06);
    --elitea-scrim: rgba(11, 11, 24, 0.72);
    --elitea-code-bg: #07070F;
    --elitea-code-text: #D9F5FC;
    --elitea-shadow: none;
  }
}

07

Accessibility

Every text pair below is measured (WCAG 2.2 relative luminance), not guessed; the build and the test suite recompute them from tokens.json and fail when one drops below its minimum.

ThemePairRatioMinimumVerdict
Darktext #F2F4FA on bg #0B0B1817.76:14.5:1AAA
Lighttext #0B0B18 on bg #FFFFFF19.53:14.5:1AAA
Darktext #F2F4FA on surface #12172B16.14:14.5:1AAA
Lighttext #0B0B18 on surface #F4F6FB18.06:14.5:1AAA
Darktext #F2F4FA on elevated #1A203614.65:14.5:1AAA
Lighttext #0B0B18 on elevated #FFFFFF19.53:14.5:1AAA
DarktextMuted #9AA3B8 on bg #0B0B187.72:14.5:1AAA
LighttextMuted #5A6478 on bg #FFFFFF5.95:14.5:1AA
DarktextMuted #9AA3B8 on surface #12172B7.02:14.5:1AAA
LighttextMuted #5A6478 on surface #F4F6FB5.50:14.5:1AA
DarktextMuted #9AA3B8 on elevated #1A20366.37:14.5:1AA
LighttextMuted #5A6478 on elevated #FFFFFF5.95:14.5:1AA
DarkonPrimary #FFFFFF on primary #4A4DE85.97:14.5:1AA
LightonPrimary #FFFFFF on primary #4A4DE85.97:14.5:1AA
DarkonPrimary #FFFFFF on primaryHover #5D60F04.78:14.5:1AA
LightonPrimary #FFFFFF on primaryHover #3D40D67.23:14.5:1AAA
DarkonPrimary #FFFFFF on primaryPressed #3D40D67.23:14.5:1AAA
LightonPrimary #FFFFFF on primaryPressed #3336C08.64:14.5:1AAA
Darksignal #00BFE6 on bg #0B0B188.92:14.5:1AAA
Lightsignal #4A4DE8 on bg #FFFFFF5.97:14.5:1AA
Darksignal #00BFE6 on surface #12172B8.11:14.5:1AAA
Lightsignal #4A4DE8 on surface #F4F6FB5.52:14.5:1AA
Darksignal #00BFE6 on elevated #1A20367.36:14.5:1AAA
Lightsignal #4A4DE8 on elevated #FFFFFF5.97:14.5:1AA
DarkonSignal #0B0B18 on signal #00BFE68.92:14.5:1AAA
LightonSignal #FFFFFF on signal #4A4DE85.97:14.5:1AA
DarkaiText #9A8CFF on bg #0B0B187.04:14.5:1AAA
LightaiText #6447F0 on bg #FFFFFF5.67:14.5:1AA
DarkaiText #9A8CFF on elevated #1A20365.81:14.5:1AA
LightaiText #6447F0 on elevated #FFFFFF5.67:14.5:1AA
Darkai #7A5CFF on bg #0B0B184.47:13:1Non-text
Lightai #7A5CFF on bg #FFFFFF4.37:13:1Non-text
Darksuccess #22C55E on bg #0B0B188.57:14.5:1AAA
Lightsuccess #15803D on bg #FFFFFF5.02:14.5:1AA
Darksuccess #22C55E on surface #12172B7.79:14.5:1AAA
Lightsuccess #15803D on surface #F4F6FB4.64:14.5:1AA
Darkwarning #F59E0B on bg #0B0B189.09:14.5:1AAA
Lightwarning #B45309 on bg #FFFFFF5.02:14.5:1AA
Darkwarning #F59E0B on surface #12172B8.26:14.5:1AAA
Lightwarning #B45309 on surface #F4F6FB4.64:14.5:1AA
Darkdanger #F87171 on bg #0B0B187.06:14.5:1AAA
Lightdanger #B91C1C on bg #FFFFFF6.47:14.5:1AA
Darkdanger #F87171 on surface #12172B6.42:14.5:1AA
Lightdanger #B91C1C on surface #F4F6FB5.98:14.5:1AA
Darkdanger #F87171 on elevated #1A20365.82:14.5:1AA
Lightdanger #B91C1C on elevated #FFFFFF6.47:14.5:1AA
DarkonDangerFill #FFFFFF on dangerFill #DC26264.83:14.5:1AA
LightonDangerFill #FFFFFF on dangerFill #DC26264.83:14.5:1AA
DarkborderStrong #6B7590 on bg #0B0B184.25:13:1Non-text
LightborderStrong #7C86A0 on bg #FFFFFF3.64:13:1Non-text
DarkborderStrong #6B7590 on surface #12172B3.86:13:1Non-text
LightborderStrong #7C86A0 on surface #F4F6FB3.36:13:1Non-text
DarkborderStrong #6B7590 on elevated #1A20363.51:13:1Non-text
LightborderStrong #7C86A0 on elevated #FFFFFF3.64:13:1Non-text
DarkcodeText #D9F5FC on codeBg #07070F17.60:14.5:1AAA
LightcodeText #E8EAF6 on codeBg #0B0B1816.30:14.5:1AAA
  • Focus is always visible: a 2 px ring in signal with a 2 px offset in the page colour. The offset matters on light, where signal and primary are the same Indigo: a ring flush on an Indigo button would vanish.
  • Control boundaries use borderStrong (3:1 or better against every surface, WCAG 1.4.11). Hairline border is for dividers only, never the only edge of an input.
  • Indicators on dark surfaces: Indigo on surface is 2.97:1, under the 3:1 non-text bar. A selected nav item therefore pairs the Indigo fill with white text, or uses a signal indicator bar; a toggle's "on" state relies on its white thumb, not the track alone.
  • Never colour alone: status carries an icon or a word as well as a hue.
  • Interactive targets are at least 24 × 24 px.
  • Motion is removed under prefers-reduced-motion: reduce.

08

Guardrails

Always

  • One primary: Indigo in both themes, for every primary action.
  • Let neutrals carry the interface; reach for a brand hue only when it has its one job to do.
  • Before shipping a screen: at most two brand hues besides the mark, orange at most once.
  • Use the supplied mark files and tokens. Never redraw, recolour or re-tokenise locally.
  • Warnings in amber, errors in red: semantic colours, per-theme values.

Never

  • Reintroduce a kill-list colour.
  • Use a banned pair.
  • Put a gradient in UI chrome.
  • Make orange a button, a warning, a badge or a large fill. It's the dot.
  • Swap the accent family per theme. Dark and light are one system; only neutrals invert.

09

For agents

This guide is built to be read by machines as well as people. If you are an agent producing anything that carries the Elitea AI brand (UI, a slide, a page, an e-mail, a diagram):

  1. Read this file, BRAND.md, first. llms.txt indexes every resource here.
  2. Take colours, type and radii from tokens.json (W3C design-token format) or tokens.css (--elitea-* custom properties, light by default, dark under [data-theme="dark"] or the system preference). Never sample colours from screenshots.
  3. Use the logo files under assets/ as they are. The coloured mark needs Ink, Paper or white behind it.
  4. Check your output against section 08: one primary, at most two brand hues, orange once, no gradients, no kill-list colours, sentence case, AA contrast.
  5. In the Elitea platform repository the canonical sources are libs/ts/client-core/src/brand/ (tokens.json, logo-mark.svg, logo-full.svg). Edit there and run node libs/ts/client-core/scripts/gen-brand.mjs. Never edit a generated copy.

10

Changes from v2

The v2 proposal was reviewed against WCAG 2.2, the running product and its own rules before it became this guide. The decisions it made stand; these are the gaps that were closed.

  • Semantic colours failed as text on light. Success #22C55E (2.28:1), warning #F59E0B (2.15:1) and danger #EF4444 (3.76:1) on white fail AA. Light now uses #15803D, #B45309 and #B91C1C; dark keeps the bright values, with danger raised to #F87171 (#EF4444 is 4.28:1 on elevated).
  • White on danger fails (3.76:1). Destructive buttons use dangerFill #DC2626 (4.83:1) in both themes.
  • Input borders were invisible to the contrast rule. #E2E6F0 on white is 1.25:1 and #232A45 on Ink 1.38:1, against the 3:1 that WCAG 1.4.11 asks of a control's edge. Added borderStrong.
  • The focus ring vanished on light primary buttons, because signal = primary = Indigo there. The ring now has a 2 px offset.
  • Violet text was below AA in both themes (4.37:1 on white, 4.47:1 on Ink). Added aiText: #6447F0 on light, #9A8CFF on dark.
  • Indigo indicators on dark surfaces (2.97:1 on surface) now have a written rule.
  • States were missing: hover, pressed, disabled, selected, scrim and code tokens were added, all measured.
  • Internal contradictions were resolved: "two weights per family" against a scale that used three Manrope weights; a 96 px lockup minimum against "below 24 px, drop the wordmark"; eyebrow tracking given as both 0.22em and 0.16em; 16.5 px body text against a 13–16 px scale.
  • Fonts came from a CDN. They are now self-hosted, because the app's policy is same-origin only and the desktop app must work offline.
  • Missing foundations were added: spacing, motion, elevation, chart order and icon-surface rules, so that agents don't have to invent them.
  • Personal and sample data was removed: reviewer names, a real project id and a city.

11

Downloads