Foundations

The values
behind the roles.

Colour, type, space, motion, and icons. Then the four surfaces that consume them, and the full token reference. If you are about to type a hex, the answer is on this page.

02 — Foundations

Colour

Two families: a nine-step neutral ramp from --ink to --paper, and a single brand accent --signal. Signal is never used as body text — only buttons, accents, and graphic highlights.

Neutral scale — ink → paper
ink #0b0b07
ink-2 #07080A
charcoal #3F4157
slate #6F7287
mid #9E9F9B
light #E2E3DE
vlight #F3F4F4
paper #FFFFFF
signal #E7FF00

The neutral ramp traces Rift Valley light: deep basalt of Mount Longonot at dusk → bleached silt of Lake Naivasha at noon. Signal is East African sunrise — deployed only where attention is earned.

Signal — usage rules
Button fill
Card hover
Subtle bg
Glow shadow
Dot / mark

Signal is never used as text colour. Use it for buttons, decorative dots, top-border accents, hover glows, and the selection highlight. Body copy stays --paper, --light, or --mid.

Structural overlays
--line

rgba(255,255,255,0.08) — default borders, dividers

--line-2

rgba(255,255,255,0.14) — scrolled nav, active card borders

02 — Foundations

Typography

Two typefaces only. Space Grotesk for all editorial and display text. JetBrains Mono for labels, metadata, code, and eyebrows — never for body paragraphs.

Display scale — Space Grotesk
Hero
clamp(56px, 9vw, 128px)
Navon
.hero-headline
Page title
clamp(48px, 8vw, 120px)
Africa
.page-title
Section title
clamp(36px, 4.6vw, 64px)
Four layers.
.section-title
Card heading
18–24px
Sovereign cloud
h3 / h4
Body
16–17px
Navon provides AI compute, sovereign cloud, and quantum-safe security to enterprises across Africa.
.page-lede / p
Small body
13–14px
Supporting detail text — card descriptions, footnotes, helper copy.
.desc / small
Mono scale — JetBrains Mono
Eyebrow
11px / 0.24em
Infrastructure
.eyebrow
Label / nav
11px / 0.22em
NAVON · 2026
.mono
Wordmark
13–14px / 0.22em
NAVON.
.wordmark
Spec / data
10–11px
PUE 1.29
.spec-card-num
Accent — italic + signal
Four layers.
One sovereign stack.

Italic + signal weight 400 is used for the highlighted line in section titles. .accent class on a <span> inside .section-title or .page-title.

Language specimen — Kiswahili
Kujenga.
to build · Kiswahili

Space Grotesk carries Swahili copy without modification — clean Latin-Supplement coverage supports the full Kenyan and East African character set. All Navon display headlines work bilingually. Secondary test words: Ujenzi · Mazingira · Baadaye (construction · environment · future).

02 — Foundations

Spacing & Layout

All spacing is token-driven. The two most important are --px (horizontal page padding) and --section-y (vertical section rhythm) — both are fluid clamps.

Core layout tokens
--nav-h
68px
--px
clamp(20px, 4vw, 56px)
--section-y
clamp(96px, 12vw, 160px)
Max width
1280px
Grid system
1-col

Full-width

Hero sections, photography, maps. No max-width constraint below 1280px.

2-col

Section header

Title left, lede/meta right. Collapses to 1-col at 820px. Used in .section-head.

3–5-col

Feature grids

.numbered.cols-3 / cols-5. Collapses to 2-col at 1100px, 1-col at 640px.

Border radius
2px — buttons, cards, inputs
999px — tags, pills, badges
0 — SVG shapes, lines, dividers
02 — Foundations

Motion

All transitions use a single shared easing curve. Motion is purposeful and restrained — it guides attention, not decorates.

Easing curve — --easing · hover to play
cubic-bezier(0.65, 0, 0.35, 1)

Smooth deceleration — fast in, eases out. Used for nav, buttons, dropdowns, hero reveals, and card transitions.

Standard durations: 0.2s for hover states, 0.4–0.5s for structural transitions (nav slide, card reveals), 0.8s for scroll-reveal animations.

Scroll reveal — .reveal

Elements enter with opacity: 0 → 1 and translateY(16px → 0). Stagger delays available via .d1–.d6 (0.08s increments). Triggered by IntersectionObserver in shared.js.

.reveal — no delay
.reveal.d1 — 80ms
.reveal.d2 — 160ms
.reveal.d3 — 240ms

Scope rule: .reveal is for section-level elements only — .section-title, .section-lede, and the delivery banner. Never on individual child items (.pillar, .delivery-card, .phase). Animate-on-scroll on every child card is an AI-slop tell.

SVG draw animation — .draw

SVG paths on technical illustrations animate from stroke-dashoffset: 1200 → 0 over 2.2s. Used for the fin.ai-style orthographic diagrams on product detail pages. Staggered with .d2, .d3, .d4 classes.

02 — Foundations

Icons & Diagrams

No icon library. All illustration is hand-coded inline SVG following a strict three-layer grammar: .line for primary form, .hair for structure, .signal for the single active element. The same vocabulary scales from a 24px mark to a full-page schematic.

Mark vocabulary — geometric primitives used as icons
Signal dot
8×8 · square
Section dash
16×1 · ::before
→
CTA arrow
.arrow in .cta
Pulse node
.signal.pulse
Callout line
.signal polyline
Stroke weight system — .tech · vector-effect="non-scaling-stroke" mandatory on all elements
.line 1.2px · #E2E3DE · primary form .hair 0.7px · #9E9F9B · structural 12.2 M .thin 0.6px · #6F7287 · dimension .dashed 0.8px · 3 4 · projected / secondary SIGNAL OPACITY 0.85 · active 0.15 · hover 0.06 · bg tint stroke · callout ACTIVE
Live specimen — .tech .draw · signal appears first, structure draws in · reload to replay
400 KW MODULE · HELL'S GATE SEZ IT LOAD · 10 RACKS PWR + COOLING GPU ACTIVE · INFERENCE NODE ONLINE 00°42′S 36°26′E · NAVON COMPUTE · NAIVASHA

Signal active zone renders first — context before structure. The .d2–.d4 stagger (0.3s increments) builds the diagram layer by layer: outer shell → internal structure → annotation callout.

01
No icon library

All marks and diagrams are hand-coded inline SVG. No Lucide, Heroicons, or any external library — this keeps visual weight consistent with the diagram grammar and eliminates a dependency axis.

02
One signal element per diagram

Each diagram highlights exactly one active zone in signal yellow. If multiple elements compete for .signal, the diagram is carrying too many ideas. Split it.

03
No fills except signal

All geometry uses fill="none". Fills are reserved for .signal highlights and text. No gradients, no pattern fills, no drop shadows.

04
vector-effect="non-scaling-stroke" on every element

The stroke hierarchy (0.6 → 0.7 → 0.8 → 1.2) only holds if strokes don't scale with the SVG. Without this attribute, a thin line on a large viewBox becomes a hairline on mobile. Apply it to every line, rect, path, polyline, and polygon.

05
Token classes on all SVG text — no inline font-family or fill attributes

The .tech text CSS rule sets JetBrains Mono and --mid fill automatically. Use class="label-signal" for signal-yellow text. For map city names use class="city-label" (Space Grotesk, --paper, weight 600) and class="city-phase" (--slate, mono) for sub-labels. Never write font-family="Space Grotesk" or fill="#FFFFFF" directly on SVG elements — that bypasses the token system.

06
Diagrams are for technical pages only

Products, Platform, Quantum Security, Hell's Gate detail. On customer-facing pages (Home, About, Who We Serve, Futures) replace diagrams with photography of Kenyan faces and landscape. The diagram language is a signal of depth — not decoration.

07
Use CSS .pulse — never SVG <animate> tags

SVG <animate> elements do not respect prefers-reduced-motion. The CSS .pulse class uses a keyframe animation guarded by @media (prefers-reduced-motion: reduce). Always write <circle class="signal pulse" opacity="0.4"/> — never nest <animate> children.

02 — Foundations

Surfaces & Modes

Four media, one contract. Core owns the 16 required roles. Each surface supplies the values that make sense for its medium, and may add extension tokens, but may never drop a required role.

Website

screen · default dark

Uses the core values unchanged.

public/assets/shared.css

  • default The default. Body is --ink, text is --paper.
  • .section--light A light band inside a dark page. Flips text and wordmark by cascade, and inverts the whole foreground ramp: --paper becomes near-black. Panels inside it use --card and --on-card.
  • body.theme-light Whole light page. Used for legal, docs, and dense product surfaces. Supplies --card and --on-card the same way a light band does.
Extension tokens
--card--on-card

Deck

screen, full-bleed scroll · default dark

A deck has no site nav or footer. It supplies its own fixed nav, scroll-spy, and progress hairline.

public/<deck>/assets/deck.css (standalone) · src/styles/deck.css (in-site)

Extension tokens
--maxw--line-d--line-d2--px--deck-oncard--logo-plate

Document / PDF

print, A4 · default paper

Print inverts the default. The tonal rhythm on paper comes from hairlines and white space, not from bands.

.claude/skills/navon-brand-doc/assets/style.css

Email

inbox · default dark

Email cannot use CSS custom properties reliably. Inline the resolved hex values from the primitives above.

newsletters/dispatch-01-investor.html

Verify it

npm run ds -- --check reads every surface's stylesheet and fails if one has dropped a required role. Run it before you ship a change to any of the four.

02 — Foundations

Token Reference

The required semantic roles, their web values, and what each one is for. Generated from design-system/tokens.json. Never hardcode a value that has a token.

Required roles · 16
RoleWeb valueWhat it is for
--ink #0b0b07 Page background on dark surfaces.
--ink-2 #07080A Deeper background for ink bands and always-dark cards.
--charcoal #3F4157 Secondary text on light surfaces.
--slate #6F7287 Mono label and meta text colour.
--mid #9E9F9B Description and eyebrow text on dark.
--light #E2E3DE Body text on dark.
--vlight #F3F4F4 Light band background.
--paper #FFFFFF Headline colour on dark; page background on light. Inverts on a light band, so never a panel background.
--signal #E7FF00 The accent. One per view.
--font-display 'Space Grotesk', system-ui, sans-serif Display and body typeface.
--font-mono 'JetBrains Mono', ui-monospace, monospace Label and figure typeface.
--line rgba(255,255,255,0.08) Default hairline colour.
--line-2 rgba(255,255,255,0.14) Emphasised hairline: active cards, scrolled nav.
--px clamp(20px, 4vw, 56px) Horizontal page padding on every section.
--section-y clamp(96px, 12vw, 160px) Vertical section rhythm.
--easing cubic-bezier(0.65, 0, 0.35, 1) The one transition curve.
Type scale
StepSizeWeightTrackingUse
h-xlclamp(38px, 6.2vw, 78px)600-0.025emDeck cover, page hero.
h-lgclamp(28px, 3.6vw, 50px)600-0.025emSection headline.
h-mdclamp(22px, 2.4vw, 32px)600-0.02emCard and slide sub-head.
ledeclamp(17px, 1.7vw, 21px)4000Standfirst under a headline. Max 60ch.
body16px4000Default paragraph.
small13px5000.01emButtons, nav links, dense UI.
eyebrow11px5000.24emMono uppercase section label.
mono11px4000.18emMono uppercase meta label.
Icon set · 22 glyphs

One line-icon set: 24×24 viewBox, 1.5 stroke, currentColor, round caps and joins, no fill. Icons inherit theme colour and are structural signposts, not decoration.

sparkdocflagalerttargetclocklayersshieldcoinspintrendgemcheckboltusersservercloudlockcodecpuleafglobe

New glyphs are drawn to match, or adapted from Heroicons or Tabler. Duotone and soft-filled sets (Phosphor, Solar, Iconoir) are rejected — they break the single-accent rule and the tonal rhythm.

Navon Design System
Signal · v2.2.0 · 2026-10-02 · Naivasha, Kenya
00°42′S 36°26′E
← Back to site