Colour System

Colour

Two systems. One for the product UI (Socarrat), one for marketing & communications (Albufera). They serve different uses but bleed into each other.

Rationale

A colour language with weight

The system is anchored in a high-energy violet (Grape, #4E00EB): a colour that reads as technical authority in the European SaaS context, is categorically distinct from the dominant palettes in the European private markets sector, and carries enough saturation to own every surface it occupies.

"The neutral spine is built from cool blue-greys (Midnight through Air), calibrated for information-dense interfaces where colour competes with data."
Colour System Rationale

Colour construction methodology

How the palette is built

Colour systems built by adjusting hex values on the fly produce unintended variation. These seven principles govern every colour decision in the Latency system, from new shade generation to text-on-coloured-background treatment.

Work in HSL

HSL (hue 0°–360°, saturation 0–100%, lightness 0–100%) maps to human colour perception. Two violets with similar hue and saturation are recognisably related in HSL; in hex they are arbitrary strings. Use HSL for all colour reasoning. Note: HSL and HSB are different models.

Saturation flattens at the extremes

In HSL, equal saturation has less visible effect as lightness approaches 0% or 100%. Increase saturation at both ends of any scale to prevent washout. Build scales from the extremes inward: fix the darkest shade (test as text on light) and lightest shade (test as tinted background) first, then fill the middle.

Hue rotation controls brightness

Each hue has an inherent brightness. Yellow, cyan, magenta are brightest; red, green, blue are darkest. To create a lighter shade without losing saturation, rotate toward a bright hue (60°, 180°, 300°). For darker, rotate toward a dark hue (0°, 120°, 240°). Max rotation: 20–30° before the colour reads as a different hue entirely.

Example: Amethyst (#824DFF, ≈292°) is Grape (#4E00EB, ≈248°) rotated 12° toward 300°.

Saturate the neutral scale

Pure grey (0% saturation) looks flat in UI contexts. The Latency neutral scale uses a consistent cool blue-grey temperature to maintain chromatic coherence with Grape. Do not introduce warm or pure-grey neutrals into any Latency context.

Colour never communicates alone

Colour-blind users cannot reliably distinguish certain combinations. Red/green failure affects ~8% of male users. Every colour-coded signal in the system must have a second channel: icon shape, text label, line style, or luminance contrast. Colour reinforces information — it does not replace it.

Gradients stay within 30° of hue

A gradient spanning more than ~30° reads as garish and unintentional. The Latency Gradient (Grape 248° → Deep Royal 262°) spans 14°. The Deep Horizon Gradient collapses toward near-black on the same hue axis. Any new gradient must demonstrate the same constraint.

"Text on coloured backgrounds requires a new colour, not a grey. Grey text that reads clearly on white fails on coloured surfaces — it looks flat and disconnected."
Colour construction methodology

On light surfaces

Grey text — passes on white, fails here

Lead — same hue axis, calibrated contrast

Surface: Parchment #F7F5F0

On Deep Royal

White at 40% opacity — looks disabled

Amber — same hue, adjusted: 5.64:1 AA

Air — full white: 15.6:1 AAA

Surface: Deep Royal #250066

Product palette — Socarrat

Primary & secondary colours

The primary colours define every brand-owned surface. Grape is the signature colour. Click any hex code to copy it.

Primary

Grape #4E00EB Primary brand colour. Signature violet. CTA and brand surfaces.
Indigo #330099 Dark primary. Hover and pressed states.
Violet #9661FF Mid-primary. AI accent, secondary UI.
Lavender #D6C2FF Light primary tint. Disabled fills.
Mauve #EEE5FF Lightest primary tint. Hover backgrounds.

Neutrals

Midnight #111318 Near-black. Primary text and dark surfaces.
Dusk #2D3548 Dark-mid neutral. H3 headings. 11.3:1 on Parchment — AAA.
Lead #465063 Mid neutral. Secondary text. 7.45:1 on Parchment — AA.
Steel #687692 Mid neutral. Tertiary text and icons at rest.
Silver #CFD4DD Light neutral. Borders and dividers.
Cloud #F0F2F4 Near-white. Surface and card backgrounds.
Air #FFFFFF White. Base background and inverse text.

Semantic colours

Destructive — Error
Candy#B32114Error text on light
Rose#E9483AError icons
Flamingo#F7BFBAError border tint
Ballet#FCE5E3Error banner fill
Constructive — Success
Basil#0C6E45Success text on light
Neon#16CA7FSuccess icons & KPIs
Mint#7EF1C1Success state fills
Daiquiri#B6F7DCSuccess banner fill
Support — Info / Link
Ocean#2A5EB6Info text & links
Skyline#448AFFInfo icons & banners
Azure#ADCCFFFocus rings & info fills
Frost#D6E5FFInfo banner fill
Accent — Warning
Gold#DBB700Warning text on light surfaces
Lemon#FFD505Warning icons & badge fills. Base token.
Banana#FFEB8AWarning state fills
Cream#FFF4BDWarning banner fill

Usage ratio — product UI

Cloud/Air 60%
Grape 30%
Midnight 10%

A directive, not a formula. Individual components will deviate, but the aggregate must hold.

Marketing palette — Albufera extension

Warm neutrals, amber accents, deep purple

Marketing materials operate in a different register; they must convey sophistication, editorial quality, and European premium positioning before a single word is read. The marketing extension introduces three additions to the base system.

Warm neutrals — The foundation

Organic base that reads as high-quality paper rather than screen grey. Replaces Cloud and Silver as the primary background layer in all marketing contexts.

Parchment#F7F5F060% — base marketing surface
Bone#EFEDE7Cards and section backgrounds
Flax#E8D9B5Accent background tint
Sand#E2DFD5Dividers and structural tints
Umber#3C3530Warm dark-mid neutral. Secondary text, captions, labels. 10.8:1 on Parchment — AAA.
Obsidian#1A181EWarm near-black. Primary text on warm surfaces. 16.15:1 on Parchment.

Amber accents — The contrast

Critical constraint

Amber (#C88A3E) achieves only 2.69:1 on Parchment and 2.5:1 on Bone. Both fail WCAG for normal and large text. Amber is never used as a text colour on any light background. On Deep Royal: 5.64:1 — AA pass. Use Obsidian or Copper as the text colour on light backgrounds. Reserve Amber for dark background contexts only.

Copper#915F3DDark amber. Only amber-family colour safe for text on light. 4.93:1 on Parchment.
Amber#C88A3EDecorative on light surfaces. Text on Deep Royal only.

Deep purple — Refined Grape

Deep Royal#250066Dark hero surfaces, high-end dark sections. 30% marketing rule.
Amethyst#824DFFGradient range and brand accent. Not a standalone surface.
Grape#4E00EBCTA and action colour; unchanged from base system. The 10% rule applies.

Usage ratio: marketing (60-30-10)

Parchment 60%
Bone+Deep Royal 30%
Grape 10%
Density rule

The warm palette and the marketing tríada are calibrated for low information density. A marketing page with 40 data points on a Parchment background does not look like a premium product. If a section needs data density, shift the background to Deep Royal (#250066) or use an inset with Air (#FFFFFF). The visual contrast between a Parchment section and a Deep Royal section is itself a typographic event.

Grape — 10% rule

Grape (#4E00EB) is reserved for maximum-hierarchy elements only: CTAs, checkmarks, accent borders, links, and primary interactive elements. It is not a decorative colour. Grape in a section background, an illustration fill, or a decorative strip is a hierarchy violation — the moment it exceeds the 10% band, the CTA signal degrades.

No pure white backgrounds

Do not substitute #FFFFFF for page backgrounds in marketing contexts. White reads as product UI or commodity SaaS. Parchment (#F7F5F0) and Bone (#EFEDE7) are the base surfaces — their warm undertone is the mechanism that makes the editorial register work.

Gradient system

Two brand gradients

Synthesis Gradient

Primary brand gradient. Hero and campaign surfaces. 135deg · #4E00EB → #250066

Signal Gradient

Secondary brand gradient. Ambient dark gradient. 135deg · #9661FF → #4E00EB → #250066

Deep Horizon

Marketing — ambient dark gradient. Deep Royal to Obsidian. 135deg · #250066 → #1A181E

Warm Surface

Marketing background. Parchment to Bone. Subtle transition for page sections. 135deg · #F7F5F0 → #EFEDE7

Gradient constraint

Use gradients as backgrounds only when text is 24px or larger, bold, and positioned over the darker portion of the gradient. For body text, use flat Grape or flat Midnight as the background. Gradient behind 14px regular-weight copy is a forbidden treatment.

Permitted decorative gradients

Warm Surface gradient

135deg · #F7F5F0 → #EFEDE7 — Parchment to Bone. Permitted for section transitions and PDF exports. Do not apply over body-weight text.

Amethyst radial glow

Amethyst (#824DFF) at 0.04–0.05 opacity max, corner-positioned on Deep Royal or Obsidian surfaces. Depth technique for dark panels only. Never on light backgrounds.

Closing anchor

Document termination pattern

Long-form marketing materials should not end on body copy. Body copy as a final element reads as unfinished — it leaves the reader without a destination.

The pattern

A full-width callout block using Deep Royal (#250066) as the surface. Message text in Instrument Serif italic, coloured Flax (#E8D9B5) or Air. An optional label in Iosevka Charon, Amber (#C88A3E), uppercase — one of the two legitimate uses of Amber as text on deep surfaces.

The closing anchor is not a footer. It carries the brand claim, a decisive statement, or a CTA. It is the last thing the reader sees.

Live example

Latency · latencydata.com

Decoding private markets.

Misuse guide

Eight forbidden treatments

Each treatment below describes the wrong output, not an abstract rule. The example is the thing that actually happens, not a hypothetical.

1
Lemon text on any light background

Do not

A warning label in Lemon (#FFD505) on an Air (#FFFFFF) card surface. The text is bright yellow, technically present, and completely unreadable; it fails WCAG at 1.2:1. Lemon does not have enough luminance difference from white to function as text under any circumstances.

Correct use

Use Gold (#DBB700) for warning-state text on light backgrounds. Reserve Lemon for fills, icons, and badge backgrounds only.

Do not — what this looks like

Warning

File size exceeds the 10 MB limit. This action cannot be undone. Please reduce the file size before uploading.

Lemon #FFD505 on Air #FFFFFF — 1.2:1 contrast. The label, the description, and the warning text are all invisible.

Correct use — what this looks like

Warning

File size exceeds the 10 MB limit. This action cannot be undone. Please reduce the file size before uploading.

Midnight #1A181E on Lemon fill #FFF4BD — 12.8:1 AAA. Lemon is applied as a tinted surface, not as text colour.

2
Violet as body-copy colour on Air

Do not

A paragraph of 14px Violet (#9661FF) text on an Air (#FFFFFF) background. At 3.0:1 it fails AA for normal-weight body text. Violet is reserved for UI accents, tags, and AI-context elements at non-text scale.

Correct use

Use Midnight (#111318) or Lead (#465063) for all body-weight copy on light surfaces.

Do not — what this looks like

The European private markets data infrastructure problem isn't about effort. It's about architecture. Three platforms running in parallel, financial data arriving 18 months late, and the most interesting companies staying effectively invisible — that's not a research failure. It's a process failure. Latency solves this by normalising data directly from national registries.

Violet #9661FF on Air #FFFFFF — 3.0:1 — fails AA for normal text at 14px. Requires 4.5:1 minimum.

Correct use — what this looks like

The European private markets data infrastructure problem isn't about effort. It's about architecture. Three platforms running in parallel, financial data arriving 18 months late, and the most interesting companies staying effectively invisible — that's not a research failure. It's a process failure. Latency solves this by normalising data directly from national registries.

Midnight #111318 on Air #FFFFFF — 18.58:1 AAA. Violet stays reserved for UI accents and AI-context elements at scale.

3
Grape background on extended content surfaces

Do not

A full-page Grape (#4E00EB) background behind a long-form content section. Within 30 seconds, the sustained violet saturation creates visual fatigue. Grape is a high-energy colour; it commands attention but cannot hold it at this scale.

Correct use

Limit Grape backgrounds to hero panels, CTAs, and feature highlights of less than 40% page height. Use the Synthesis Gradient (Grape to Deep Royal) for extended dark surfaces.

Do not — what this looks like

Latency maps an investor's thesis onto normalised data across +52M European companies and surfaces matches continuously.

The platform ingests registry filings directly — no intermediaries, no aggregator lag. Verified financials for 12M companies across every major European market.

A proprietary taxonomy covers 1,200 micro-markets. The agentic layer runs continuously against the full dataset, not on demand.

Section continues for 3 more screens at full Grape saturation. Visual fatigue sets in within 30 seconds — Grape cannot hold extended surfaces.

Correct use — what this looks like

Hero panel — max 40% page height

The data infrastructure problem isn't about effort. It's about architecture.

Latency maps an investor's thesis onto normalised data across +52M European companies and surfaces matches continuously.

The platform ingests registry filings directly — no intermediaries, no aggregator lag. Verified financials for 12M companies.

Grape hero transitions via Synthesis Gradient to Deep Royal. Extended content surfaces carry no visual fatigue.

4
Steel text on Cloud in data-dense tables

Do not

A table with Steel (#687692) body copy on Cloud (#F0F2F4) row backgrounds. The ratio is 4.07:1 — AA pass for large text only. In a product displaying 50-row tables of financial data, this fails WCAG AA for normal text and becomes actively unreadable at 14px.

Correct use

Use Midnight for primary data in tables on Cloud rows. Steel is only acceptable for metadata and tertiary labels that serve a subordinate function.

Do not — what this looks like
CompanyRevenueEBITDA
Acme Holdings GmbH€4,200,00012.3%
BauKonzern AG€18,750,0008.7%
CargologisteSL€840,00021.1%

Steel #687692 on Cloud #F0F2F4 — 4.07:1 — fails WCAG AA for 14px normal text. All data rows are below the required 4.5:1 threshold.

Correct use — what this looks like
CompanyRevenueEBITDA
Acme Holdings GmbH€4,200,00012.3%
BauKonzern AG€18,750,0008.7%
CargologisteSL€840,00021.1%

Midnight #111318 on Cloud #F0F2F4 — 15.3:1 AAA. All financial data is immediately readable at any text size.

5
Semantic colours used for brand decoration

Do not

A marketing section using Neon (#16CA7F) as a decorative accent strip because it is energetic and contrasts with Grape. Neon is now ambiguous: in product context it means "success state," in marketing it means "design accent." Users who move between product and marketing learn to distrust the system.

Correct use

Semantic colours (Candy, Neon, Skyline, Lemon) are reserved for status communication only. For decorative accents in marketing, use Violet or the Signal Gradient.

Do not — what this looks like

Coverage

+52M companies. Normalised.

Across every major European registry. Source-level, not aggregated.

Neon (#16CA7F) accent strip used as brand decoration. In the product, Neon means "success state." Readers trained on the system read "operation succeeded" — not "section header."

Correct use — what this looks like

Coverage

+52M companies. Normalised.

Across every major European registry. Source-level, not aggregated.

Violet (#9661FF) accent strip — a brand colour with no semantic status meaning. It decorates without corrupting the signal vocabulary.

6
Gradient behind 14px regular-weight copy

Do not

The Synthesis Gradient used as a background behind a paragraph of Air (#FFFFFF) body text at 14px regular weight. If the gradient is applied at 135deg across a wide surface, text positioned over the lighter Violet end of a Signal Gradient fails at 3.85:1 — AA pass for large text only.

Correct use

Use gradients as backgrounds only when text is 24px or larger, bold, and positioned over the darker portion of the gradient. For body text, use flat Grape or flat Midnight as the background.

Do not — what this looks like

The European private markets data infrastructure problem isn't about effort. It's about architecture. Three platforms running in parallel, financial data arriving 18 months late, and the most interesting companies staying effectively invisible. That's not a research failure — it's a process failure.

Latency solves this by normalising data directly from national registries across 50 European markets.

Text over the Violet end of Signal Gradient: ~3.85:1 — fails AA for 14px normal text. Text over the Grape/Deep Royal end: passes. A single gradient can produce both a pass and a fail on the same surface.

Correct use — what this looks like

The European private markets data infrastructure problem isn't about effort. It's about architecture. Three platforms running in parallel, financial data arriving 18 months late, and the most interesting companies staying effectively invisible. That's not a research failure — it's a process failure.

Latency solves this by normalising data directly from national registries across 50 European markets.

Midnight #111318 flat background — Air text at 19.97:1 AAA across the entire surface. No contrast failures anywhere on the panel.

7
Grey or opacity-reduced text on coloured surfaces

Do not

Supporting text on a Grape or Deep Royal card uses Lead (#465063) at 80% opacity, or white at 50% opacity. On a white background, grey text works by reducing luminance contrast. On a coloured surface, the same grey reads flat and disconnected — it has no relationship to the background hue. White at reduced opacity looks disabled and bleeds through any texture or gradient.

Correct use

Pick a new text colour sharing the background's hue — adjust saturation and lightness until the contrast ratio meets WCAG AA. The Amber-on-Deep-Royal pairing (5.64:1 AA) is the documented example of this technique applied correctly. Air at full opacity remains always available for primary text on dark surfaces.

Do not — what this looks like
White at 40% opacity

Platform overview — Latency

Lead grey on Grape

Platform overview — Latency

Steel grey on Grape

Platform overview — Latency

None of these three combinations meet WCAG AA on Grape. Grey has no hue relationship with the surface. Opacity-reduced white looks disabled and bleeds on any texture.

Correct use — what this looks like
Air on Grape

Platform overview — Latency

Air #FFFFFF on Grape #4E00EB — 8.32:1 AAA. Full-opacity white, no opacity reduction.

Amber on Deep Royal

Platform overview — Latency

Amber #C88A3E on Deep Royal #250066 — 5.64:1 AA. Hue-related secondary colour, not neutral grey.

8
Colour as the sole signal for status or data encoding

Do not

A table of company performance uses Neon (#16CA7F) for positive growth and Candy (#B32114) for negative growth, with no accompanying icon, label, or contrast difference. Red-green colour blindness affects approximately 8% of male users — for them the table communicates nothing about direction.

Correct use

Always pair colour with a second communication channel. For trend data: an upward/downward arrow icon alongside the colour. For status states: a text label or icon shape that is distinct independently of colour. The colour reinforces the signal; the second channel carries it for users who can't see the colour distinction.

Do not — what this looks like
CompanyYoYTrend
Acme Holdings GmbH+14.2%
BauKonzern AG-3.1%
CargologisteSL+8.7%
Delvaux Partners-0.4%

For a user with red-green colour blindness, all four Trend dots are the same colour. The column communicates nothing. No icon, no +/- label — just identical circles.

Correct use — what this looks like
CompanyYoYTrend
Acme Holdings GmbH+14.2% Up
BauKonzern AG-3.1% Down
CargologisteSL+8.7% Up
Delvaux Partners-0.4% Down

Arrow icon + text label added alongside the colour dot. Direction is communicated by shape and text — readable regardless of colour vision.

Design tokens

W3C token format

Complete colour token JSON. Primitive layer: one entry per named swatch. Semantic layer: references primitives using CSS variable syntax. Kebab-case throughout.

JSON — W3C Design Tokens
{
  "color": {
    "primitive": {
      "grape":    { "$value": "#4e00eb", "$type": "color" },
      "indigo":   { "$value": "#330099", "$type": "color" },
      "violet":   { "$value": "#9661ff", "$type": "color" },
      "lavender": { "$value": "#d6c2ff", "$type": "color" },
      "mauve":    { "$value": "#eee5ff", "$type": "color" },
      "midnight": { "$value": "#111318", "$type": "color" },
      "lead":     { "$value": "#465063", "$type": "color" },
      "steel":    { "$value": "#687692", "$type": "color" },
      "silver":   { "$value": "#cfd4dd", "$type": "color" },
      "cloud":    { "$value": "#f0f2f4", "$type": "color" },
      "air":      { "$value": "#ffffff", "$type": "color" },
      "mkt-obsidian":  { "$value": "#1a181e", "$type": "color" },
      "mkt-parchment": { "$value": "#f7f5f0", "$type": "color" },
      "mkt-bone":      { "$value": "#efede7", "$type": "color" },
      "mkt-amber":     { "$value": "#c88a3e", "$type": "color" },
      "mkt-copper":    { "$value": "#915f3d", "$type": "color" },
      "mkt-deep-royal":{ "$value": "#250066", "$type": "color" },
      "mkt-amethyst":  { "$value": "#824dff", "$type": "color" }
    },
    "semantic": {
      "interactive": {
        "default":  { "$value": "{color.primitive.grape}"    },
        "hovered":  { "$value": "{color.primitive.indigo}"   },
        "pressed":  { "$value": "{color.primitive.indigo}"   },
        "disabled": { "$value": "{color.primitive.lavender}" }
      },
      "text": {
        "primary":   { "$value": "{color.primitive.midnight}" },
        "secondary": { "$value": "{color.primitive.lead}"     },
        "tertiary":  { "$value": "{color.primitive.steel}"    },
        "inverse":   { "$value": "{color.primitive.air}"      }
      },
      "mkt": {
        "bg-base":    { "$value": "{color.primitive.mkt-parchment}" },
        "bg-surface": { "$value": "{color.primitive.mkt-bone}"      },
        "bg-deep":    { "$value": "{color.primitive.mkt-deep-royal}" },
        "text-primary": { "$value": "{color.primitive.mkt-obsidian}" },
        "cta":          { "$value": "{color.primitive.grape}"        }
      }
    }
  }
}

Download

Download colour system

Complete colour pack for the Albufera brand system. Includes a visual palette reference SVG with all 26 tokens, plus CSS custom properties and W3C Design Token JSON ready for direct import.

  • latency-colour-palette.svg — visual reference, all groups
  • latency-colour-tokens.css — CSS custom properties
  • latency-colour-tokens.json — W3C Design Tokens format
  • 26 tokens across 5 groups: Primary, Neutral, Marketing, Accent, Semantic
Download colour system

ZIP · SVG palette + CSS + JSON tokens

SVG palette only
Latency colour palette — all 26 tokens across 5 groups

Agent layer

Machine-readable.

The full colour system is available as W3C design tokens (JSON), CSS custom properties, WCAG contrast data, and colour construction rules in colour-system.md. Critical constraints, forbidden combinations, and construction methodology are encoded as structured YAML.

colour-system.md — CSS custom properties
css
:root {
  /* Marketing palette */
  --mkt-parchment:  #F7F5F0; /* 60% base */
  --mkt-bone:       #EFEDE7; /* cards */
  --mkt-obsidian:   #1A181E; /* primary text */
  --dusk:           #2D3548; /* H3 headings */
  --mkt-grape:      #4E00EB; /* CTA — 10% */
  --mkt-deep-royal: #250066; /* dark hero */
  --mkt-amber:      #C88A3E; /* dark only ⚠ */
  --mkt-copper:     #915F3D; /* safe on light */
  --mkt-amethyst:   #824DFF; /* gradient */
}
colour-system.md — construction rules
yaml
colour_construction:
  working_model: "HSL — not HSB"
  shade_generation:
    method: "fixed named primitives — no
             CSS lighten()/darken()"
    naming: "100–900; 500=base; 900=text;
             100=tinted bg"

  saturation_at_extremes:
    rule: "Increase saturation at both
           scale ends to prevent washout"

  hue_rotation:
    lighter: "rotate toward 60°/180°/300°"
    darker:  "rotate toward 0°/120°/240°"
    max:     "20–30° — beyond = new hue"
    example: "Amethyst (292°) = Grape (248°)
              rotated 12° toward 300°"

  gradient_constraint:
    max_hue_span: "~30° on colour wheel"
    synthesis:    "248°→262° — 14° span"

  second_channel:
    required: true
    options:  [icon, label, line_style,
               luminance_contrast]

  text_on_colour:
    rule: "Pick new colour matching bg hue
           — never grey or opacity-white"
    example: "Amber on Deep Royal 5.64:1"
colour-system.md — critical constraints
yaml
critical_constraints:
  amber:
    hex: "#C88A3E"
    on_parchment:  "2.69:1 — FAIL"
    on_bone:       "2.5:1  — FAIL"
    on_deep_royal: "5.64:1 — AA PASS"
    rule: NEVER text on light backgrounds

  neutral_scale:
    obsidian: "#1A181E"   # h1/h2 + primary text (warm)
    umber:    "#3C3530"   # warm secondary text — 10.8:1 AAA
    dusk:     "#2D3548"   # h3 headings (cool) — 11.3:1 AAA
    lead:     "#465063"   # body secondary (cool) — 7.45:1 AA
    steel:    "#687692"   # tertiary / metadata

  usage_ratio:
    parchment_bone:      60%   # never #FFFFFF
    deep_royal_obsidian: 30%
    grape:               10%   # CTAs/checkmarks only

  grape_max_bg:       40% page height
  grape_decorative:   never — hierarchy violation
  violet_body_text:   never — 3.0:1 fails AA
  forbidden_count:    8 treatments documented
colour-system.md — forbidden combinations #7–8
yaml
- id: 7
  description: "Grey / opacity-white on
    coloured surfaces (Grape, Deep Royal)"
  fix: "Match hue of background — adjust
    sat/lightness to WCAG AA"
  correct: "Amber on Deep Royal: 5.64:1"

- id: 8
  description: "Colour as sole signal for
    status / data (no icon, label or
    contrast difference)"
  reason: "Red-green CB affects ~8% male"
  fix: "Always add second channel:
    icon shape, label, line style,
    or luminance contrast"
colour-system.md — implementation rules
yaml
logo_css:
  rule: "Never fix width and height
         simultaneously — distorts ratio"
  correct: "height: 20px; width: auto;
            object-fit: contain"
  alignment: "left in doc headers — balanced
              with a badge or overline right"

grape_10pct:
  reserved_for:
    - CTAs and primary buttons
    - checkmarks and confirmation icons
    - accent borders and focus rings
    - links and interactive elements
  never_for:
    - section backgrounds
    - illustration fills
    - decorative strips or dividers

no_white_backgrounds:
  rule: "Never use #FFFFFF as the page
         background in marketing contexts"
  use_instead: "Parchment #F7F5F0 or
                Bone #EFEDE7"
  reason: "White reads as product UI;
           Parchment reads as editorial"
colour-system.md — closing anchor + gradients
yaml
closing_anchor:
  required: true
  surface:  "Deep Royal #250066"
  text:     "Instrument Serif italic,
             Flax #E8D9B5 or Air"
  label:    "Iosevka Charon, Amber #C88A3E,
             uppercase — valid Amber use"
  note: "Not a footer. Carries brand claim,
         decisive statement, or CTA."

decorative_gradients:
  warm_surface:
    value: "135deg · #F7F5F0 → #EFEDE7"
    use:   "Section transitions, PDF exports"
    rule:  "Not behind body-weight text"

  amethyst_glow:
    value: "radial, Amethyst #824DFF"
    opacity_max: 0.05
    position: "corner — dark surfaces only"
    rule: "Never on light backgrounds;
           above 0.05 reads as error"
Source document