Cowboys & Beans — Back to home

A Colour Token Architecture

Colour Token System

The colour system for cnbb.pub, books.cnbb.pub, and art.cnbb.pub. Built in OKLCH for perceptual uniformity — equal lightness steps produce equal perceived brightness across all hues.
OKLCH DTCG-aligned 3 sites, 1 system
Primary Scale

Brand Brown

Extracted from your logo palette. Hue anchored at ~50° (warm amber-brown), chroma peaks in the midtones at 700 — natural for earth tones. The hue shifts slightly warmer (toward golden) at lighter values, mimicking how your logo's creams and tans naturally drift.

950L:15
900L:25
800L:35
700L:45
600L:53
500L:60
400L:68
300L:76
200L:85
100L:90
50L:95

Neutral Scale

Warm Neutrals

Very low chroma at hue 55° — these read as grey but carry a warm undertone. For body text, surfaces, borders, and any element that shouldn't call attention to itself. A pure grey (chroma 0) would feel cold against the brand browns.

950L:12
900L:22
800L:32
700L:42
600L:52
500L:62
400L:72
300L:82
200L:90
100L:95
50L:97.5

Per-Site Accents

Three Sites, Three Personalities

Each site gets its own accent hue. Ink blue for editorial gravitas (books), muted sage for gallery restraint (art), and terracotta for warmth and welcome (parent brand). All three share the brand browns and warm neutrals.

books.cnbb.pub · Ink Blue · 255°

900
700
500
300
100

art.cnbb.pub · Sage Green · 155°

900
700
500
300
100

cnbb.pub · Terracotta · 35°

900
700
500
300
100

Semantic Layer

Semantic Tokens

Role-based aliases that all three sites share. The primitive tokens (brand-700, neutral-200) get mapped to purpose-based names. This is the DRY layer — change one mapping, every site updates.

Surfaces

surface-primary
Page background → brand-50
surface-secondary
Cards, sections → neutral-100
surface-elevated
Modals, dropdowns → neutral-50
surface-inverse
Dark sections, footer → brand-950

Text

text-primary
Body, headings → neutral-950
text-secondary
Captions, metadata → neutral-700
text-tertiary
Placeholder, disabled → neutral-500
text-brand
Brand-coloured text → brand-700

Borders

border-subtle
Soft dividers → neutral-200
border-default
Standard borders → neutral-300
border-strong
Emphasis → brand-400

Interactive

interactive-primary
Buttons, links → brand-700
interactive-hover
Hover → brand-800
interactive-active
Pressed → brand-900

In Context

How the Three Sites Feel

Same brand foundation, different accents and surface treatments. Each card previews the dominant mood of its site.

books.cnbb.pub

Editorial · Literary · Structured

Featured Title

The Weight of Stars

A blend-genre science fiction novel

art.cnbb.pub

Gallery · Restrained · Visual-first

Current Exhibition

Landscapes in Ink

Traditional drawings, new perspectives

cnbb.pub

Brand · Warm · Welcoming

Welcome

Cowboys & Beans

Art · Music · Film · Publishing


Design Rationale

Why OKLCH? Equal lightness steps in OKLCH produce equal perceived brightness — so brand-300 to brand-400 feels the same "jump" as brand-700 to brand-800. This is the perceptual uniformity property the Phase 0 research identifies as analogous to equal temperament in music: both uniformise a space that is inherently non-uniform.

Why warm neutrals instead of pure greys? A chroma of 0.01 at hue 55° reads as grey to the eye but doesn't create a cold/clinical dissonance against the warm brand browns. This is Albers's principle of colour relativity in practice — the "grey" changes character based on what's next to it.

Why only 5 accent steps instead of 11? The accents are supporting cast, not leads. Five steps (900/700/500/300/100) give you a dark for text, a medium for buttons, a light for backgrounds, and two intermediaries. If any accent needs the full 11-step treatment later, we can extend — but starting lean keeps the system governable.

The token architecture follows DTCG: Primitive tokens (brand-700) → semantic tokens (interactive-primary) → component tokens (to come, e.g. button-primary-bg). This three-tier stack is what Material Design, Carbon, and Polaris converge on.