Logo System
Our identity is one SVG: logo-vela-intelligence.svg — the star and the wordmark locked together as a single file. The wordmark carries specific kerning, optical sizing, and forced uppercase that can only be preserved by using the vector file. Treat it as one unit. The icon-only star exists only as a fallback for square contexts (favicons, avatars).
The primary lockup on backgrounds
Same SVG, four contexts. The lockup is colored by currentColor — the surface chooses, the mark adapts.
Alternate lockups
For contexts where the horizontal lockup doesn't fit — narrow columns, square avatars with the wordmark beneath, headers where only the name needs to appear. Each is shipped as its own SVG with the same locked spacing and all-caps wordmark as the primary lockup. Use these instead of the primary, never combined with it.
Icon-only fallback
The star may appear alone only when the surface is square and too small to read the wordmark — favicons, profile avatars, app icons, social chips at < 32 px. Anywhere larger, use the full lockup.
Usage
- Always use the full lockup SVG (
logo-vela-intelligence.svg) whenever there is room for the wordmark to be read. - Keep the star and "VELA INTELLIGENCE" together as one unit — they ship as one SVG for a reason.
- Preserve minimum clear space equal to the height of one star-point (≈ 25% of the lockup height) on all sides.
- Render the file in
currentColorwhen embedded in product code, so theme switches "just work" between light and dark mode. - Pair the white-on-brand variant with the primary 600/700 shades — not the lighter 50–300 shades.
- Don't separate the star from the wordmark — they belong together. The star alone is only for square contexts under 32 px.
- Don't re-typeset "Vela Intelligence" in Montserrat or any other font. The wordmark has its own kerning and forced uppercase — use the SVG.
- Don't change the case — the wordmark is always all-caps. No "Vela Intelligence" in mixed-case as a graphic.
- Don't change the spacing between the star and the wordmark, or rearrange them vertically as a custom stack.
- Don't recolor the star and wordmark independently — they are one mark, one color.
- Don't rotate, skew, outline, or stretch the lockup. Don't add drop shadows beyond the brand-supplied hero treatment.
Color Palette
Three primary families — Brand Primary, Brand Secondary, Brand Accent — plus two tertiary families: Slate (cool gray for text) and Gold (warm contrast). Each ramps across 11 shades. The canonical brand shades in practice are Brand Primary 900 (the dark canvas), Brand Secondary 600 (voice / trust), and Brand Accent 400 (action / CTA) — that last one is intentionally lighter than the 600 default because Brand Accent at 600 reads as muddy, and the brand needs its accent bright. Hover any swatch and pick T to copy the CSS-variable token (e.g. --brand-primary-600), H for hex, O for the oklch() value — ready to paste into CSS or HTML.
Tertiary palettes
Two supporting families for roles the primary brand colors don't carry alone. They fill specific functional jobs — they don't compete with Brand Primary/Brand Secondary/Brand Accent for brand expression. Surfaces and borders are not in here: they use Brand Primary 800–950 directly, because the brand canvas IS Brand Primary.
Paper is the counterpart to Slate. Slate is the cool neutral — Brand Primary's side of the wheel with the chroma pulled out, carrying text on the dark canvas. Paper is the warm neutral — Gold's hue with the chroma pulled out, carrying surfaces in the contexts that get read rather than presented on a screen. It stops at 300 deliberately: it is a surface family, not a colour family, and anything darker would just be a warm black that Brand Primary 950 already does better.
- Paper 25 — a raised surface above the canvas: cards, callouts, pull-quotes. On paper, raised means lighter, not darker.
- Paper 50 — the canvas itself. Document pages and deck content slides.
- Paper 100 — a recessed band: table stripes, sidebars, code blocks.
- Paper 200 — hairlines, rules, table borders.
- Paper 300 — the warm rest ground: section breaks, the sand slide in a deck cadence.
- As a data-series colour, a text colour, or an accent. Paper is a ground — it has no voice.
- Behind a chart at Paper 300. The warm rest ground drops the series palette to 2.7–3.2 contrast and it fails. Data goes on Paper 50 or 25.
- With Slate 500 as muted text — it measures 4.4 on Paper 50 and misses AA. Step to Slate 600.
- With Brand Accent 400 as type — 3.4 on Paper 50, fails. Accent 600 for text; 400 stays a fill.
| Foreground on Paper 50 | Ratio | Verdict |
|---|---|---|
| Brand Primary 900 — the default type colour on paper | 14.4 | AAA |
| Slate 700 — secondary copy | 9.5 | AAA |
| Brand Secondary 700 — accent text | 8.9 | AAA |
| Brand Accent 600 — emphasis, the paper CTA | 7.3 | AAA |
| Slate 600 — muted copy, metadata | 6.8 | AA |
| Slate 500 | 4.4 | fails AA — use Slate 600 |
| Brand Accent 400 | 3.4 | fails AA as text — fill only |
- Slate 50 — primary body text on the dark navy canvas (near-white with a cool cast). Replaces a generic
#F4F4F4off-white. - Slate 200 — secondary text. Subheadings, descriptions under headlines, less-prominent paragraphs.
- Slate 400 — tertiary text. Captions, metadata, timestamps ("Updated 2h ago"), source citations, helper text under form fields, disabled-state labels.
- Slate 700–950 — extremely rare; used only when an element specifically needs a desaturated dark variant the Brand Primary ramp can't supply.
- Gold 100–200 — warm contrast slide backgrounds in formal pitch decks. The sand-coloured rest from the navy → green cadence.
- Gold 300–500 — the "Social" pillar dot in ESG contexts, and similar single-purpose semantic markers.
- Never as a brand voice or CTA color — Gold supports a moment of warmth, then steps back.
Status tones
Four tones — Info, Success, Warning, Danger — for client-facing demos, pitch slides, roadmap labels, diagram pips ("live / planned / deprecated"), status pages, release notes. They share hue, peak chroma, and the same Gaussian curve as the in-product design system's status tokens, so anything that moves between a brand surface and the console reads as the same colour family.
Boundary — this is not a replacement for the design system's full status-token matrix (hover, border, light-fill, dark-fill, surface-adaptive variants). For interactive UI — alerts, toasts, badges, table-row status — pull from @vela/ds-tokens directly. The brand kit gives you one canonical shade per tone for non-interactive use, plus the full ramp for diagrams and charts.
Danger vs Brand Accent 600 — Brand Accent 600 (#873D00) remains the brand-side default for "danger / urgent" (see §4.2). The Danger ramp below exists so the four tones live as a coherent set, and for the rare demo where a vivid red is genuinely required (e.g. a "critical risk" pip where Brand Accent's burnt-orange reads as warning not stop).
The marked default (●) is the canonical step on the dark navy canvas — Info 400, Success 400, Warning 300, Danger 400. On light surfaces, step one down (Info 500, Success 600, Warning 400, Danger 600). Warning sits a step lighter than the others because yellow at L ≤ 0.55 reads as olive / muddy.
Typography
Three type families. Manrope carries the headings and the numbers we want to feel confident. Inter handles everything that needs to read like a sentence. JetBrains Mono does the specific monospace work — eyebrows, code, token names, hex values, metadata.
Getting the fonts
All three families are SIL Open Font License and ship inside this repository — nothing to buy, nothing to sign. There are three ways to load them. Pick by what you're making; never mix two in one document.
| What you're making | How to load the fonts |
|---|---|
| A page or artifact served from this repo | styles/fonts/vela-fonts.css — self-hosted, no network, exact TTFs the brand is specified against. Preferred. |
| A standalone HTML file that gets hosted elsewhere or emailed around | packages/vela-tokens/vela-fonts-remote.css — all three families from Google Fonts in a single @import. |
| A PDF, Keynote, Word doc, Figma file — anything native | Install onto the machine. CSS can't help you here — the app renders against the system font library. See below. |
Installing onto a Mac
From the repository root:
./scripts/install-fonts.sh
Copies five variable TTFs into ~/Library/Fonts. Per-user — no sudo, no password, nothing outside your home folder is touched. Safe to run again any time: identical files are skipped, changed files are replaced, and older hand-installed duplicates are retired only when the bytes prove they're redundant. Run ./scripts/install-fonts.sh --check to see the status without changing anything.
- Open Font Book. You should see Manrope, Inter and JetBrains Mono — one entry each, no duplicates.
- Quit and reopen any app that was already running. Most macOS apps only scan the font library at launch, so a font installed mid-session won't show up in Keynote or Word until you restart them.
- Open
styles/fonts/files/in Finder. - Select the five
.ttffiles — Manrope, Inter (×2), JetBrains Mono (×2). Ignore the.txtlicence files. - Double-click, then click Install in Font Book.
wght axis falls back to that instead of the Bold you asked for. Inter and JetBrains Mono both default to 400, so they degrade gracefully — Manrope is the only one that fails visibly. The fix: install the static cuts from fonts/Manrope.zip → static/ (SemiBold 600, Bold 700, ExtraBold 800) alongside the variable file.~/Library/Fonts first — that is the only place that matters.Type scale
Gradient & Color Behavior
How the brand colors actually live on a page. Observed from the marketing site: a dark navy atmosphere, two-color pairings only, and "gradient" expressed more often as a colored glow than a literal fill. The working anchors below (navy, green, orange, sand) are pulled directly from the site CSS — they sit alongside the OKLCH brand palettes and are a candidate for a deeper color reconciliation pass.
A · The atmosphere
The brand's native habitat is dark navy, not white. Off-white type, green glow, orange singular CTA. Every page on the marketing site obeys this composition.
to Decisions.
B · Working anchors & roles
Every working color the brand uses, mapped to its canonical palette swatch. The hex is what currently ships; the palette name is the source of truth.
C · Pairing rules
linear-gradient(), radial-gradient(), conic-gradient(). Never a raster image (no background-image: url('gradient.png')) and never an SVG used as a page backdrop. Image-based gradients band visibly, leave hard seams where the image ends when users scroll or resize, and break on retina / ultra-wide / dark-mode. The single exception is inside SVG asset files — the Brand Secondary → Brand Accent labs gradient lives inside labs/zephlyn-icon.svg and labs/vaelth-icon.svg because those are vector icons, not page backdrops.Gradients pair exactly two colors. There are four allowed recipes and one explicit "never".
D · Glow as a brand technique
The site does most of its "colored light" with box-shadow, not with gradient fills. Hover any element below to see it.
E · Translucency
Brand color at reduced alpha is the third "gradient" technique. Use these target alphas for tinted glassmorphic surfaces.
F · Gradient angles
Where direction matters, only these angles appear in brand-approved usage.
G · Accents for data — charts, graphs, multi-series
When you need more than the brand triad — bar charts, line series, donut segments, any data split into groups — extend the palette from the token families in the original brand tokens.
Recommended chart palette · all at L = 0.63
The same palette on three contexts — see how each colour holds up
Picking order — what to reach for, in what scenario
| Scenario | Palette |
|---|---|
| 1–3 categorical series | Brand Primary 400, Brand Secondary 400, Brand Accent 400 — brand triad at the chart lightness |
| 4–6 categorical series | Brand triad + Lime 400, Pool 400, Plum 400 — fill the gaps between brand hues |
| 7–8 categorical series | Above + Amber 400, Teal 400 |
| > 8 categorical series | Reconsider — aggregate, facet, or split the view; more than 8 hues stops being legible |
| Sequential (low → high) | One brand or tertiary ramp end-to-end: Brand Secondary 100 → 800 (growth), Brand Primary 100 → 800 (concentration), Slate 100 → 800 (neutral) |
| Diverging (neg ← 0 → pos) | Brand Accent 400 ← Slate 200 → Brand Secondary 400 — brand contrast through a neutral midpoint |
| ESG pillars | E = Brand Secondary 300 · S = Gold 300 · G = Slate 400 — codified; Brand Secondary 300 reads brighter than 400 on dark, which is the actual rendering context |
On a paper ground — step down to the 500 row
Everything above is pinned at L = 0.63 because it was tuned for the navy canvas. On Paper it is too light. Measured against Paper 50, the 400 row lands at 3.02–3.44 — technically over the 3.0 minimum for non-text graphics, but with no margin at all, and print shifts colour. Teal and Brand Secondary sit at 3.02 and 3.03; one press variation puts them under.
Step down one stop. The 500 row measures 4.07–4.81 on Paper 50 — comfortable, still vivid, and it needs no new values because every family already defines its 500.
| Series | OKLCH | HEX | On Paper 50 |
|---|---|---|---|
| Brand Primary 500 | oklch(0.550 0.160 260) | #346ECD | 4.53 |
| Brand Secondary 500 | oklch(0.550 0.120 163) | #00875D | 4.18 |
| Brand Accent 500 | oklch(0.550 0.185 50) | #B25200 | 4.75 |
| Lime 500 | oklch(0.550 0.160 120) | #687C00 | 4.26 |
| Pool 500 | oklch(0.550 0.110 205) | #00818C | 4.14 |
| Plum 500 | oklch(0.550 0.160 312) | #9050B4 | 4.81 |
| Amber 500 | oklch(0.550 0.160 75) | #986600 | 4.54 |
| Teal 500 | oklch(0.550 0.120 178) | #008472 | 4.07 |
brand-kit.md — the canonical source. Slate is hue 240, Gold is hue 85, the chart extras are Lime 120 · Pool 205 · Plum 312 · Amber 75 · Teal 178, and every 50-step sits at L 0.970. If you change a colour, change it there first and mirror it here.Swatch hexes on this page are generated at runtime by reducing chroma to the sRGB gamut boundary — the same mapping
brand-kit.md's tables were built with, which is why a saturated stop like Brand Accent 600 resolves to #873D00 rather than the #9B2400 you get from clamping each channel. Six of the 55 published swatches still differ by ±1 in one channel; that is float rounding at the gamut boundary between two implementations, not a drift worth chasing. OKLCH is canonical — prefer the O button over H.Icons
Vela uses two Font Awesome styles, picked by purpose — not by where the icon appears. Sharp Duotone (fa-sharp-duotone fa-solid) when the icon enhances — feature emphasis, illustration, decorative depth. Solid (fa-solid) when the icon is informational — bullets, button glyphs, chevrons, arrows, status pips, anything functional or directive. The signature feature-icon treatment is a 42 × 42 Brand Secondary 600 tile with a Slate 50 icon at 18 px (1.125 rem).
b122b96a8f) is licensed under our account. velaintelligence.com and our approved related domains are enabled on the kit. Don't load it from a non-approved domain — license violation.<!-- in <head> --> <link rel="preconnect" href="https://kit.fontawesome.com" crossorigin> <link rel="preconnect" href="https://ka-f.fontawesome.com" crossorigin> <script src="https://kit.fontawesome.com/b122b96a8f.js" crossorigin="anonymous"></script> <!-- usage --> <i class="fa-sharp-duotone fa-solid fa-shield-halved"></i> <!-- enhancement: feature icon --> <i class="fa-solid fa-arrow-right"></i> <!-- informational: button arrow -->
Vela Labs
A distinct visual language for experimental work and internal tools. Labs uses an green crystal mark and the green → orange diagonal gradient on its product icons — the only place this two-hue blend is approved. Labs borrows the navy atmosphere from the main brand, but speaks with a brighter, more playful voice on top of it.
#2D6A4F) at three opacities — 1.0, 0.6, 0.4. The three facets create depth without ever leaving the green hue. Use this mark wherever Labs is named or branded; it replaces (never accompanies) the Vela Intelligence lockup.Labs product icons
Each Labs product gets its own glyph drawn in stroke, filled with the green → orange diagonal gradient. Same gradient, different shape. This is the only sanctioned use of the two-hue blend.
Deal Intelligence
Deal Intelligence is the first product-vertical sub-brand under Vela Intelligence. Where Labs is for experiments, this is a full product line — and the pattern future siblings will follow (Risk Intelligence, ESG Intelligence, etc.). It uses its own mark (the jack) and its own DEAL INTELLIGENCE wordmark drawn in Figtree 700 with hand-tuned spacing — the same custom-spacing recipe as the parent VELA INTELLIGENCE wordmark, with the INTELLIGENCE half lifted verbatim from the parent. The shared "Intelligence" word is the cue that this is a Vela family product. The Deal Intelligence lockup replaces the Vela Intelligence lockup in its own context — the two never appear together.
VELA INTELLIGENCE and DEAL INTELLIGENCE are Figtree 700 letterforms with custom per-letter spacing — outlining the text fresh from Figtree (or any other font) will lose that spacing and produce a regression. The canonical SVGs in logos/wordmark/ and logos/sub-brands/<name>/wordmark/ are the source of truth; treat them as immutable. New sub-brand wordmarks must be drawn by a designer.App-icon tile
Jack at 38% of tile width, Slate 50 fill, on a Brand Primary 900 (#07214D) rounded square (256 × 256, corner radius 56). Use for native app icons, web favicons at large sizes, splash screens, and product surfaces.
logos/sub-brands/deal-intelligence/mark/
deal-intelligence-mark.svg /* currentColor */
deal-intelligence-mark-black.svg
deal-intelligence-mark-white.svg
deal-intelligence-app-icon.svg /* navy tile */
Wordmark
DEAL INTELLIGENCE, drawn in Figtree 700 all-caps with custom per-letter spacing. The INTELLIGENCE half is lifted verbatim from the parent wordmark; only DEAL is new. (Figtree's G with its near-45° terminal is the distinguishing tell — compare Manrope's straight-cut G.)
Primary lockup
Jack mark + wordmark, horizontal. Default whenever the full name fits. Caps vertically centered on the mark.
Usage
- Primary lockup wherever the full name fits horizontally — this is the default.
- Wordmark only in formal / legal contexts, footers, places where the mark would feel redundant.
- Mark only for favicons, avatars, and contexts below ~32 px where the wordmark is illegible.
- App-icon tile for native app icons, web favicons at large sizes, splash screens, product surfaces.
- Use the hard-fill
-white.svg/-black.svgwhen the consuming surface has a fixed theme.
- Don't show the Deal Intelligence lockup alongside the Vela Intelligence lockup — pick one per surface.
- Don't use the parent Vela four-point star as the Deal Intelligence mark; the jack replaces it.
- Don't add gradients, outlines, opacity layers, or drop shadows to the jack — single filled path only.
- Don't rotate, skew, stretch, or recolor outside the Slate 50 / Brand Primary 950 pairing.
- Don't substitute the wordmark font — Figtree 700 all-caps with custom spacing, no exceptions, no programmatic regeneration.
<NAME> INTELLIGENCE wordmark drawn by a designer in Figtree 700 with custom spacing (reusing the parent's INTELLIGENCE half verbatim), file layout mirroring logos/sub-brands/deal-intelligence/, and the same "replaces, never accompanies" rule against the parent lockup.The Four Contexts
The brand has one identity and four habitats. All four share the same hue families, the same accent green, the same singular action orange — what changes is which stops get picked and which one carries the ground. No new hues are introduced anywhere. Screen is canonical and stays dark. Product is dark by default with an opt-in light surface. Deck and Document are the two contexts that live on paper, and they exist because a navy canvas that works beautifully for a landing page becomes exhausting across forty slides or twenty minutes of dense reading.
| Context | Canvas | Primary type | What it's for |
|---|---|---|---|
| Screen · canonical | Brand Primary 900 | Slate 50 | Marketing site, hero sections, social, brand-asset previews, partner collateral |
| Product | Brand Primary 900 · Slate 50 opt-in | Slate 50 · Brand Primary 900 | The console, dashboards, internal tools — long-session UI |
| Deck | A cadence | varies by slide | Pitch decks, sales decks, six-slide explainers — anything presented |
| Document | Paper 50 | Brand Primary 900 | Consulting reports, PDFs, Markdown→PDF deliverables — anything read |
The navy migration
The defining trick is that Brand Primary 900 stays the brand's structural anchor in both modes — it just changes role. On dark, it is the canvas; on light, it becomes the primary text. The eye reads the same hue in both modes; only the figure-ground inverts. This is what keeps both modes recognisably Vela Intelligence.
Deck — a cadence, not a canvas
The mistake that makes a deck exhausting is picking one ground and using it for forty slides. A deck alternates. Its unit of design is the sequence, not the slide. Seven archetypes, each with a fixed ground:
A well-shaped section, read left to right — the navy returns often enough to feel like the brand, and leaves often enough that nobody gets tired:
Document — paper, and restraint
A report is read alone for twenty minutes. It wants consistency, not rhythm. Paper 50 is the canvas for essentially the whole document — the cover is the one dark page.
Review 2026
- Tables — Paper 100 header · Paper 25 body · Paper 200 borders · Paper 100 stripes.
- Callouts, pull-quotes — Paper 25 card, Paper 200 hairline, Brand Secondary 600 left rule.
- Code blocks — Paper 100 ground, JetBrains Mono, Brand Primary 900.
- Section openers — a Brand Secondary 600 rule above a navy heading.
- Emphasis — Brand Accent 600. Accent 400 stays a fill colour only.
- No full-bleed navy in the body. The cover earns it; interior pages do not. A dark page inside a report reads as a slide that wandered in — and in print it is a solid block of ink.
- No atmospheric glow. The two-radial technique in §04 belongs to screens. On paper it renders as a muddy smear, and in print it bands.
- Do not paginate a report like a deck. Section openers are a rule and a heading, not a dark page.
Producing a document — the report stylesheet
Most Vela reports and client-facing PDFs are written as Markdown and rendered to PDF by Vaelora, a Mac app that paginates properly — headings never split from their content, the table of contents carries real page numbers, and the PDF gets a clickable outline. Everything above in the Document context is available as a ready-made Vaelora stylesheet, so a report comes out brand-correct without anyone styling it by hand.
- Get the app — vaelora.app. macOS only. Use 0.2.17 or newer: earlier builds ignore the page-background setting and render the report on a white sheet instead of the Paper canvas.
- Install the brand fonts first (§03). Vaelora renders against the fonts on your machine — without them the PDF silently falls back to a system face.
- In the app — open Settings → Styles and import the downloaded
.mdpdfstyle. - Or from a terminal —
vaelora styles install vela-report.mdpdfstyle. Add--forceto update an existing copy in place. - Then pick Vela Intelligence — Report as the style when you export.
- That's fine. Vaelora is what we happen to use — it is not part of the brand. Word, Google Docs, InDesign, LaTeX, or another renderer are all acceptable.
- What is not optional is the result. Whatever tool you use, build the document to the Document context above: Paper 50 canvas, Brand Primary 900 headings, Slate 700 body, Slate 600 for muted text, Brand Accent 600 for emphasis.
- The treatments table above covers tables, callouts, code and section openers. The stylesheet is simply that table expressed as CSS — read it as a reference implementation, not as a dependency.
pdf/vela-report.css in the brand repository — that CSS is the thing to edit, and npm run build:pdf-style regenerates the downloadable file. The two are checked against each other by npm run audit, so the download can never quietly fall behind the source.Semantic tokens
The brand kit publishes raw OKLCH ramps in §02. Semantic tokens sit on top and name colours by their UI role, so component CSS doesn't reach into raw --brand-primary-800 directly, and so a single component file can serve both modes by aliasing the same role to different stops. See the canonical CSS-variable definitions in brand-kit.md §7.
| Token | Role | Dark | Light | Document |
|---|---|---|---|---|
| Surfaces | ||||
--canvas | Page background | Brand Primary 900 | Slate 50 | Paper 50 |
--surface-deep | Most-emphatic surface (table headers, menu) | Brand Primary 950 | Slate 100 | Paper 100 |
--card-bg | Raised card surface | 80/20 P800 + S800 @ 85% | 94/6 white + S100 @ 96% | Paper 25 |
--hairline | Subtle dividers | Slate 50 / 15% α | Brand Primary 900 / 12% α | Paper 200 |
| Accents | ||||
--accent | Structural decoration | Brand Secondary 500 | Brand Secondary 600 | Brand Secondary 600 |
--accent-emphasis | Interactive states (hover, focus, link) | Brand Secondary 300 | Brand Secondary 700 | Brand Secondary 700 |
--cta | Singular call-to-action | Brand Accent 400 | Brand Accent 400 | Brand Accent 600 |
| Text | ||||
--text-primary | Primary body text | Slate 50 | Brand Primary 900 | Brand Primary 900 |
--text-secondary | Secondary copy, captions, nav | Slate 200 | Slate 700 | Slate 700 |
--text-muted | Metadata, timestamps | Slate 400 | Slate 500 | Slate 600 |
--white | Text on coloured fills | Slate 50 — unchanged across modes | ||
| Status (aliases §02c ramps) | ||||
--status-info | Neutral information | Info 400 | Info 500 | Info 500 |
--status-success | Healthy, done, positive | Success 400 | Success 600 | Success 600 |
--status-warning | Caution, needs attention | Warning 300 | Warning 400 | Warning 400 |
--status-danger | Critical, blocked (text + borders) | Danger 400 | Danger 600 | Danger 600 |
--status-danger-fill | Solid danger fills | Brand Accent 600 — unchanged across modes | ||
| Logo | ||||
--logo-color | Mark / wordmark fill (currentColor source path only) | Slate 50 | Brand Primary 900 | Brand Primary 900 |
Naming note — --accent-emphasis means the more emphatic of the two accent tokens, not the literally brighter one. On dark, it's lighter (Brand Secondary 300); on light, it's darker (Brand Secondary 700). The role is preserved; the lightness inverts.
Danger note — on dark surfaces, Brand Accent 600 (the brand-side danger voice) reads as muddy when used as text. --status-danger therefore points at Danger 400 on dark and Danger 600 on light for text and border roles. Solid danger fills stay at Brand Accent 600 in both modes — the colour reads as "stop" on either canvas, and --white provides the on-fill text.
Light-mode body atmosphere
The optional two-radial-glow atmosphere from §4 has a light-mode counterpart. Both glows use Brand Secondary 300 at very low alpha — same family as the dark mode's Brand Secondary 600 glow, lifted to the lighter stop because we're glowing on white rather than on navy. No Gold corner — Gold's role is warm contrast on specific surfaces, pulling it into an atmospheric layer would dilute that specificity.
body[data-mode="light"] {
background:
radial-gradient(circle at 22% 18%, oklch(0.730 0.107 163 / 0.08) 0%, transparent 38%),
radial-gradient(circle at 82% 78%, oklch(0.730 0.107 163 / 0.06) 0%, transparent 40%),
linear-gradient(160deg, var(--canvas) 0%,
color-mix(in srgb, var(--surface-deep) 70%, var(--canvas)) 100%);
}
<body data-mode="dark|light">. The product persists per-user preference. Default is dark. Light mode never auto-mirrors prefers-color-scheme — switching is always an explicit user choice inside the product, so a user's OS theme flip never surprises them with a brand switch.