Design System

Brand Guidelines

Visual identity system for Haleiki -- covering the brand mark, colour architecture, typography, spacing, and implementation. Built in OKLCH, scaled with a perfect fourth, fluid from phone to ultrawide.

OKLCH Perfect Fourth Scale Day & Night Themes Version 1.0 March 2026

Brand Identity

The Haleiki brand mark is a single geometric letterform -- the "H" -- rendered in the accent colour against a rounded rectangle. It functions at every scale: favicon, topnav, footer, and documentation.

Brand Mark

Shown at 120px on both surface treatments. The mark uses --accent-primary as its background, which shifts from terracotta (day) to amber (night) with theme switching.

H
Day Surface
H
Inverted Surface
Haleiki
House of Knowledge -- a read-only wiki for structured knowledge

Personality

Haleiki communicates scholarly warmth, navigational clarity, and the quiet confidence of a well-organized library. The design language draws from Wikipedia's information architecture, modernized with perceptually uniform colour, geometric type scale, and intrinsic layout composition.


Warm Ochre, Sandstone, Terracotta

Day theme colour tokens. All values defined in OKLCH for perceptual uniformity -- equal lightness steps produce equal perceived brightness.

Surfaces
ground
0.97 0.01 80
primary
0.99 0.005 80
secondary
0.95 0.015 75
tertiary
0.92 0.02 72
invert
0.25 0.03 55
Borders
subtle
0.88 0.025 75
default
0.82 0.03 72
strong
0.70 0.04 65
Text
primary
0.22 0.02 55
secondary
0.40 0.03 60
tertiary
0.55 0.025 65
on-invert
0.97 0.01 80
Accent
primary
0.55 0.14 45
hover
0.48 0.15 42
subtle
0.92 0.04 50
text
0.45 0.12 40
Info & Code
info-srf
0.94 0.03 80
info-bdr
0.82 0.05 75
info-txt
0.40 0.06 65
code-srf
0.95 0.01 80
code-bdr
0.88 0.02 75
code-txt
0.38 0.08 40

Deep Oxide, Amber

Night theme colour tokens. The palette shifts to deep oxide surfaces with amber accents, maintaining the same semantic structure as the day theme.

Surfaces
ground
0.16 0.02 55
primary
0.20 0.02 55
secondary
0.24 0.025 52
tertiary
0.28 0.03 50
invert
0.92 0.02 75
Borders
subtle
0.30 0.03 50
default
0.36 0.035 48
strong
0.48 0.04 50
Text
primary
0.90 0.015 75
secondary
0.72 0.02 65
tertiary
0.55 0.025 58
on-invert
0.20 0.02 55
Accent
primary
0.72 0.14 70
hover
0.78 0.15 72
subtle
0.28 0.06 60
text
0.78 0.12 72
Info & Code
info-srf
0.24 0.03 55
info-bdr
0.36 0.04 52
info-txt
0.72 0.04 68
code-srf
0.22 0.02 55
code-bdr
0.32 0.03 52
code-txt
0.78 0.1 72

Semantic Token Mapping

How each semantic token resolves across themes. The token name stays constant; the OKLCH value shifts to maintain contrast and legibility in each context.

Token Day (OKLCH) Night (OKLCH) Purpose
surface-ground 0.97 0.01 80 0.16 0.02 55 Page background
surface-primary 0.99 0.005 80 0.20 0.02 55 Card / panel background
surface-secondary 0.95 0.015 75 0.24 0.025 52 Sidebar, input fields
surface-tertiary 0.92 0.02 72 0.28 0.03 50 Hover states, zebra rows
surface-invert 0.25 0.03 55 0.92 0.02 75 Inverted sections, card headers
border-subtle 0.88 0.025 75 0.30 0.03 50 Soft dividers
border-default 0.82 0.03 72 0.36 0.035 48 Standard borders
border-strong 0.70 0.04 65 0.48 0.04 50 Prominent borders
text-primary 0.22 0.02 55 0.90 0.015 75 Body text, headings
text-secondary 0.40 0.03 60 0.72 0.02 65 Subtitles, descriptions
text-tertiary 0.55 0.025 65 0.55 0.025 58 Captions, metadata
accent-primary 0.55 0.14 45 0.72 0.14 70 Brand mark, buttons, links
accent-hover 0.48 0.15 42 0.78 0.15 72 Interactive hover state
accent-subtle 0.92 0.04 50 0.28 0.06 60 Active TOC item background
accent-text 0.45 0.12 40 0.78 0.12 72 Accent-coloured text
info-surface 0.94 0.03 80 0.24 0.03 55 Callout background
code-surface 0.95 0.01 80 0.22 0.02 55 Code block background
code-text 0.38 0.08 40 0.78 0.1 72 Code text

Three Voices, One Ensemble

Each typeface serves a distinct role. Together they create a reading experience that is structured yet warm -- navigational without being mechanical, scholarly without being cold.

Display & Headlines

Red Hat Display

Variable weight 300--900 | Geometric sans with humanist touches

Clean geometric sans-serif designed by Jeremy Mickel for Red Hat. Open counters, slightly rounded stroke endings, and generous x-height make it legible at every scale -- from navigation labels to hero headings. The variable weight axis provides fine control over visual hierarchy.

The geometric clarity of Red Hat Display communicates the structured, navigational quality of a knowledge base. Its humanist touches -- the slightly rounded stroke endings, the open counters -- keep it warm rather than clinical.

Body & Long-form

Newsreader

Variable weight 200--800 | Optical size 6--72 | Transitional serif

Production Type's Newsreader is a variable serif with optical sizing. Transitional old-style roots designed for sustained reading. The editorial energy fits a knowledge base -- it says "here is something worth reading carefully."

The opsz axis is key: at 72, Newsreader is elegant and refined for headlines; at 14, the letterforms are sturdier, with more open spacing and thicker thin strokes for comfortable body reading.

Code & System

IBM Plex Mono

Weights 300, 400, 500 | Monospace with human warmth

Monospace with human warmth. Used for code blocks, inline code, metadata, tags, section labels, and system-level information. IBM Plex Mono avoids the cold, mechanical quality of many monospace faces -- its curves and proportions echo the warmth of the rest of the type stack.

The Modular Scale -- Perfect Fourth (4:3 = 1.333)

Step 4 -- Red Hat Display 700
Haleiki
Step 3 -- Red Hat Display 700
House of Knowledge
Step 2 -- Red Hat Display 700
Ownership in Rust
Step 1 -- Newsreader opsz 24
Ownership is the foundational concept in Rust's approach to memory safety. Where languages like Java and Go rely on a runtime garbage collector, Rust takes a third path.
Step 0 -- Newsreader opsz 14 (body)
In Dzogchen, the natural state of mind is described as the union of awareness and emptiness. Rigpa -- intrinsic awareness -- is not something to be created or achieved, but rather recognized as already present. The practice involves relaxing into this recognition without grasping, allowing thoughts and perceptions to arise and dissolve without interference. This non-dual awareness is considered the basis of all experience, prior to the conceptual divisions of subject and object.
Step -1 -- Newsreader opsz 10 (caption)
Caption text for images, figures, and supplementary information. Slightly reduced size for secondary content.
Step -2 -- IBM Plex Mono 400 (metadata)
Last updated: 2026-03-18 · Category: Language Concepts · Status: Stable
Step Min Max Usage
step 4 50.5px 56.8px Hero / page title (Red Hat Display)
step 3 37.9px 42.6px Article title, section heading (Red Hat Display)
step 2 28.4px 32px Subsection heading (Red Hat Display)
step 1 21.3px 24px Lead paragraph, subtitle (Newsreader)
step 0 16px 18px Body text (Newsreader)
step -1 12px 13.5px Caption, TOC links (Newsreader)
step -2 9px 10.1px Metadata, labels (IBM Plex Mono)

Spacing System

Fluid spacing tokens generated from the same perfect fourth ratio. All values interpolate between min and max using CSS clamp() with the vi unit.

Base Tokens

Token Min Max Typical Use
space-3xs 4px 5px Tight inline gaps, tag internal padding
space-2xs 8px 9px Icon-to-label, compact gaps
space-xs 12px 13.5px Label-to-input, list item spacing
space-s 16px 18px Default component padding
space-m 24px 27px Card padding, paragraph spacing
space-l 32px 36px Section padding
space-xl 48px 54px Major section gaps
space-2xl 64px 72px Hero padding, page-level rhythm
space-3xl 96px 108px Full-page vertical breathing room

Space Pairs

Steeper interpolation between two named sizes. Used where spacing should grow more aggressively on wider viewports.

Token Min Max Typical Use
space-s-m 16px 27px Component-to-component within a region
space-s-l 16px 36px Responsive page padding
space-m-l 24px 36px Column gap in layout primitives
space-m-xl 24px 54px Section top margin (prose h2)
space-l-xl 32px 54px Footer top margin, major breaks

The Proximity Principle

Intra-group spacing must always be tighter than inter-group spacing. This activates gestalt proximity grouping -- the perceptual mechanism that makes related elements feel connected. A card with uniform 16px everywhere destroys all spatial information. Title-to-subtitle at 4px, subtitle-to-meta at 8px, card padding at 16px, between cards at 24px -- four scales communicating four relationships.


Layout System

Intrinsic layout using Every Layout primitives and Utopia fluid spacing. Zero media queries for column arrangement -- the layout adapts by measuring its own available space.

Three-Column Structure

The article page uses a nested Sidebar pattern: a left navigation column (table of contents), a main article column, and a right sidebar (taxonomy card). The columns wrap intrinsically when there is not enough space -- the left nav disappears first, then the right sidebar stacks above the article.

Layout Tokens

Token Value Purpose
--content-max 58ch Prose line length (optimal readability)
--sidebar-width 280px Right sidebar (taxonomy card)
--nav-width 220px Left navigation (TOC)
--page-max 1320px Outer page container

Design Principles

No media queries for layout. The flexbox-based Sidebar primitives use min-inline-size and flex-grow to decide when columns should wrap. This means the layout works at every viewport width, including sizes that media queries would miss (split-screen, embedded views, print).

Content decisions use media queries. Hiding the left nav on narrow viewports is a content decision (removing a component), not a layout decision. This is the one place a breakpoint is used: @media (max-width: 60rem).


Implementation

Token Architecture

Three tiers: Primitive tokens (OKLCH values) map to semantic tokens (--surface-primary, --accent-text) which feed component tokens (.topnav background, .info-card-header colour). This indirection enables theme switching: swap the primitive-to-semantic mapping, and every component updates automatically.

CSS Cascade Layers

The stylesheet is organized into cascade layers to eliminate specificity conflicts:

@layer tokens, reset, base, layout, components, utilities

Tokens define custom properties. Reset normalizes elements. Layout handles structural positioning. Components style individual UI pieces. Utilities provide overrides. Each layer has strictly higher priority than the one before it.

Fluid Type & Space

All type and spacing values use CSS clamp() for fluid interpolation. The vi unit (viewport inline) is used instead of vw to respect writing direction. No breakpoints are needed for sizing -- values scale continuously between their min and max bounds.

Build Pipeline

Cobalt static site generator with Liquid templates. Pagefind for client-side search indexing. Content authored in Markdown, compiled to static HTML. No JavaScript frameworks, no build-time CSS processing -- just clean CSS custom properties and cascade layers.

Seven Design Principles

Geometric scale. Every size derives from one ratio (4:3). No magic numbers.

Perceptual uniformity. OKLCH ensures equal lightness steps look equal to human eyes.

Semantic naming. Tokens describe purpose, not appearance. --accent-primary, not --terracotta.

Constraint. Fewer choices, made well. Three typefaces. One ratio. Two themes.

Unity not uniformity. Day and night themes share structure but differ in expression.

Proximity as syntax. Spacing communicates relationships. Tighter = more related.

Design the invariants. Build the system that survives content changes, not a page that looks good with today's content.