Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions contribute/decision-log.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ as contributions and reviews generate new decisions.)

| Date | Decision | Rationale |
|------|----------|-----------|
| 2026-07-03 | **Extended colour palette, EE neutral scale, and semantic/RAG layer adopted** (10 new palettes, `neutral-50…950`, `error`/`warning`/`success`/`info`/`link`/`interaction-state`). Destructive now resolves to Runtime Red `#a3152b`, not support `#dc2626`. Ramps are monotonic 50–950, anchored at each colour's measured lightness step — not forced to 500. | From the June 2026 Nick Orme / Ed Ford colours lockdown (`extended-palette-review.md`). Core stays primary; the extended set is exception-only (Tier 2, capped ≤5–10% of a page) and Tier 3 supplies a CVD-checked categorical order for data viz, closing the gap where four core hues were being reused as chart series and colliding (EE Blue × Transform Teal, 1.01:1 luminance). |
| 2026-07-03 | **Accessible link blue `#0080be` is WIP**, not the final semantic `link` value. | Deliberately ~97% of AA on white (4.34:1) to stay close to EE Blue — a brand-fidelity-over-strict-compliance call pending validation in real link contexts. Strict-AA fallback `#007cb9` (4.58:1) documented as the fallback if that validation doesn't hold. |
| 2026-07-03 | **Server Slate kept as a distinct brand grey, separate from the new EE neutral scale.** | They serve different jobs — Server Slate carries brand identity in a near-neutral tone; the neutral scale is the plain structural scale product UI surfaces/borders are built on. Reconciling Server Slate with kuat-core's existing slate support scale is deferred to the kuat-mono downstream work (WS5). |
| 2026-06-19 | **Contribution model adopted** (hybrid; Fix/Light/Medium/Heavy; skill-mediated, gate-enforced). | Adapted from EightShapes (Curtis) + Octopus; the Phase-7 skills/gates already implement the hard parts. |
| 2026-06-19 | **Custodians review everything initially, relaxing as we learn.** | Build trust first; the gates make reviewing all sizes fast, and let the small lane go autonomous later safely. |
| 2026-06-17 | **Design tokens have one source of truth, upstream** (`reference/design-language/tokens/colors.tokens.json`); `colours.md` + kuat-core `variables.css` are generated from it, each with a drift gate. | A hand-maintained value in two places drifted (EE Blue became `#0066CC`). Generation + drift checks make it impossible to recur. |
Expand Down
4 changes: 2 additions & 2 deletions plugins/kuat-build/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

All notable changes to this plugin are recorded here. Drives release notes.

## 1.0.0 — 2026-07-01
## 1.0.0 — 2026-07-03

- Initial release. Skills: `create-web-app`, `review-web-app`.
- Bundled `reference/` snapshot at `0cac4ab66e80`.
- Bundled `reference/` snapshot at `91e35031c8f0`.
4 changes: 2 additions & 2 deletions plugins/kuat-build/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
],
"reference": {
"repo": "EqualExperts/kuat-agent-rules",
"builtAtRef": "0cac4ab66e80fddc3af31cba5384774410849e82"
"builtAtRef": "91e35031c8f082972ca93ba4bab9b8b65089c0db"
},
"builtAt": "2026-07-01T14:25:19.140Z"
"builtAt": "2026-07-03T12:52:10.303Z"
}
28 changes: 27 additions & 1 deletion plugins/kuat-build/reference/accessibility/accessibility.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,37 @@ When using colour for status (red/amber/green):
3. **Include legend** - Always explain what colours mean
4. **Consider colour blindness** - Red/green are commonly confused

### Status / RAG Colour Values

The semantic layer in [colours.md](../design-language/colours.md#semantic--rag-colours) fixes the
status set — always pair with the listed shape/icon, never colour alone:

| State | Colour | Required text | Ratio |
|-------|--------|----------------|-------|
| Error / danger | Runtime Red `#a3152b` | White | 7.8:1 AAA |
| Warning | Equal Ember `#f07c00` | Dark Data (white **fails**, 2.8:1) | 5.6:1 AA |
| Success | Uptime Green `#11821b` | White | 5.0:1 AA |
| Info / call-out | Index Indigo `#352361` | White | 13.4:1 AAA |

Runtime Red and Uptime Green collapse under protanopia — the icon/shape/label partner is what
makes RAG status colour-blind safe, not the colour itself.

### Accessible Link Colour (WIP)

EE Blue (`#1795d4`) fails body-text contrast (3.3:1 on white) and is reserved for buttons, icons,
and larger CTAs. Text links and small text use the semantic `link` token (`#0080be`) instead —
see [colour-usage.md](../design-language/colour-usage.md#links-vs-buttons--the-accessible-blue).
This value is deliberately just under the 4.5:1 AA threshold (4.34:1 on white, ≈97%) to stay close
to EE Blue, pending validation in real link contexts; a strict-AA fallback (`#007cb9`, 4.58:1)
exists if that validation doesn't hold.

### Charts and Data Visualisation

- Use patterns or textures in addition to colours
- Ensure adjacent colours have sufficient contrast
- Ensure adjacent colours have sufficient contrast (3:1 minimum, WCAG 1.4.11)
- Never place EE Blue and Transform Teal adjacent — near-identical lightness (1.01:1)
- Provide data tables as alternatives to charts
- Full CVD rules and the categorical sequence: [colours.md](../design-language/colours.md#data-visualisation--categorical-order)

---

Expand Down
107 changes: 107 additions & 0 deletions plugins/kuat-build/reference/design-language/colour-usage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# Colour Usage

Tier, pairing, and role rules for the Equal Experts palette. This is the prose companion to
[colours.md](./colours.md) (generated — the token-derived swatches and values live there); this
file states the rules that govern *when* each tier applies. See
[accessibility.md](../accessibility/accessibility.md) for contrast targets and the never-colour-alone
rule, and each medium's own reference (`media-types/<medium>/`) for how a tier applies there.

Source: the June 2026 Nick Orme / Ed Ford colours lockdown.

---

## The tier model

Colour is governed by **what it is allowed to do**, not by which palette it belongs to.

| Tier | Contents | Where |
|------|----------|-------|
| **Tier 1 — Core** | The four brand hues (EE Blue, Transform Teal, Tech Blue, Equal Ember) + neutrals (Dark Data, The Cloud, Byte White) | Default for almost everything: product UI, adverts, the body of most slide decks |
| **Tier 2 — Extended accents** | The ten extended-palette colours | Exception only: small pull-out highlights, keyed diagrams, illustration accents. Capped at roughly 5–10% of a page's area |
| **Tier 3 — Data encoding** | The `categorical-1…8` sequence | Charts and data visualisation only |
| **Semantic / RAG** | `error`, `warning`, `success`, `info`, `link`, `interaction-state` | Cross-cutting — sits above all tiers, may appear in any scenario, reserved for meaning and never reused decoratively |

Core is what almost everyone should use almost all the time. The extended colours exist for
defined situations, used sparingly — flooding a layout with them reads as a different brand.

---

## Background floods

Full-page background floods are restricted to **Dark Data** or **Tech Blue** (or light greys /
The Cloud). **EE Blue, Transform Teal, and Equal Ember are not full-page fills** — they are
block/component-level backgrounds and accent/CTA colours only. A full-page EE Blue background is
too bright and swallows CTAs; the same logic applies to Transform Teal and Equal Ember.

---

## The three-stage blue

The blue family forms a deliberate three-step ramp:

**Tech Blue** (dark) → **EE Blue** (mid) → **Edge Blue** (light).

Edge Blue is the light end, brought in specifically for hover/active interaction states — it has
a defined product-UI role, not just decoration.

---

## Adjacency and pairing rules

- **Never place EE Blue and Transform Teal adjacent** in a categorical sequence, fill, or chart.
They share near-identical lightness (1.01:1 contrast) — indistinguishable in greyscale and for
many colour-vision-deficient viewers. Use one or the other per chart, not both.
- **The Fruity combination is decoration-only.** Runtime Red, Cursor Coral, Uptime Green, Logic
Lime, Signal Yellow, and Patch Peach together collapse under protanopia (Runtime Red and Uptime
Green become indistinguishable). Never use Fruity to encode data, status, or categories.
- **White text on Equal Ember fails** (2.8:1) — Equal Ember always takes Dark Data text.
- Dark-surface extended colours (Index Indigo, Packet Plum, Runtime Red, Uptime Green, Server
Slate) take white text; bright-surface extended colours (Logic Lime, Edge Blue, Signal Yellow,
Cursor Coral, Patch Peach) take Dark Data text — see [colours.md](./colours.md#pairing-summary)
for the generated pairing table.

---

## Server Slate vs the EE neutral scale

Server Slate is a distinct **brand grey** (a peer of the other extended colours, its own 50–950
scale). The EE neutral scale (Byte White → Dark Data) is a separate **UI neutral** scale for
surfaces, borders, and text. The two are kept apart because they serve different jobs: Server
Slate carries brand identity in a near-neutral tone; the neutral scale is the plain structural
scale product UI is built on.

---

## Links vs buttons — the accessible blue

EE Blue (`#1795d4`) fails body-text contrast (3.3:1 on white) but is retained for buttons, icons,
and larger CTAs, where it remains iconic and visually acceptable. Text links and small text use
the semantic `link` token instead (`#0080be`), a darkened EE Blue that keeps close to the brand
hue.

**The `link` value is WIP.** It is set deliberately just under the 4.5:1 AA threshold (4.34:1 on
white, ≈97%) to stay as close to EE Blue as possible — a brand-fidelity-over-strict-compliance
call, pending validation in real link contexts. A strict-AA fallback (`#007cb9`, 4.58:1) exists if
that validation doesn't hold up. Don't hard-code the current hex in a consuming app; reference the
`link` token so the value can move without a second migration.

---

## Named combinations

Brand groups colours into five named combinations — **Core, Data, Digital, Fruity, Ocean** — used
as mood/theme groupings for marketing and slide decks (Ocean reads cool/corporate, Fruity reads
energetic, and so on). These are theme palettes, not data-series orders: for charts, use the
Tier 3 categorical sequence in [colours.md](./colours.md), not a named combination. Fruity in
particular must never encode data (see above).

---

## Related

- [colours.md](./colours.md) — generated token values: brand colours, the extended palette, the
neutral scale, semantic roles, and the data-viz categorical order.
- [accessibility.md](../accessibility/accessibility.md) — contrast targets and the
never-colour-alone rule.
- `media-types/<medium>/` — how a tier applies in web product, web marketing, charts, slides, and
imagery.
97 changes: 86 additions & 11 deletions plugins/kuat-build/reference/design-language/colours.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,24 +88,99 @@ How the brand palettes map to semantic roles in kuat-core `variables.css`. **Use
| `--foreground` (`--brand-dark-data`) | text dark | `#212526` |
| `--background` (`--brand-byte-white`) | white | `#ffffff` |
| `--muted` (`--brand-the-cloud`) | Slate 100 | `#f5f5f5` |
| `--destructive` | Red 600 | `#dc2626` |
| `--destructive` | Runtime Red 600 | `#a3152b` |

Support scales (slate, red, indigo) back these aliases but are **not brand colours** — never use them directly as a brand colour.

---

## Neutral Colors
## Extended Palette (exception-only)

Added in the June 2026 colours lockdown. **Core is primary; extended is exception-only** — see
[colour-usage.md](./colour-usage.md) for the tier model (data viz, keyed diagrams, small pull-outs).
Each is a flat peer scale (50–950), anchored at its measured lightness step, not forced to 500.

| Colour | Role | Value | Text on it |
|--------|------|-------|------------|
| Index Indigo | Info / call-out | `#352361` (step 800) | White |
| Packet Plum | Expressive accent / dark surface | `#853d7b` (step 600) | White |
| Runtime Red | Error / danger | `#a3152b` (step 600) | White |
| Uptime Green | Success | `#11821b` (step 500) | White |
| Server Slate | Near-neutral brand grey (distinct from the EE neutral scale) | `#4c5659` (step 600) | White |
| Logic Lime | Bright pull-out accent · display alias "Lime" | `#b1d923` (step 300) | Dark Data |
| Edge Blue | Hover/active state — light end of the 3-stage blue | `#a1c8e2` (step 200) | Dark Data |
| Signal Yellow | Bright pull-out accent · display alias "Sunflower" | `#ffd930` (step 300) | Dark Data |
| Cursor Coral | Decorative pull-out (not error) | `#ff5c5c` (step 400) | Dark Data |
| Patch Peach | Light warm pull-out accent | `#fca84e` (step 300) | Dark Data |

For text, backgrounds, and UI elements:
---

| Color | Usage |
|-------|-------|
| White | Light backgrounds, text on dark |
| Slate-50 to Slate-200 | Light backgrounds, subtle borders |
| Slate-300 to Slate-500 | Secondary text, dividers |
| Slate-600 to Slate-800 | Primary text (light mode) |
| Slate-900 to Slate-950 | Headings, dark backgrounds |
| Black | Maximum contrast, specific uses |
## EE Neutral Scale

Monotonic Byte White → Dark Data, distinct from Server Slate (a brand grey, not a UI neutral):

| Step | Value | Alias |
|------|-------|-------|
| 50 | `#ffffff` | **Byte White** |
| 100 | `#f5f5f5` | **The Cloud** |
| 200 | `#dbdbdb` | |
| 300 | `#c1c2c2` | |
| 400 | `#a7a9a9` | |
| 500 | `#8f9192` | |
| 600 | `#777a7a` | **Overcast** |
| 700 | `#606364` | |
| 800 | `#4a4d4e` | |
| 900 | `#35393a` | |
| 950 | `#212526` | **Dark Data** |

---

## Semantic / RAG Colours

Cross-cutting roles that mean a *specific thing* and may appear in any scenario — reserved for
meaning, never reused decoratively. Always pair with an icon/shape/label (WCAG 1.4.1 — never
colour alone).

| Role | Value | Required text | Notes |
|------|-------|----------------|-------|
| Error / danger | `#a3152b` | White | 7.8:1 AAA · replaces support #dc2626 |
| Warning | `#f07c00` | Dark Data | 5.6:1 AA · white text FAILS (2.8:1) |
| Success | `#11821b` | White | 5.0:1 AA |
| Info / call-out | `#352361` | White | 13.4:1 AAA |
| Text link / small text | `#0080be` | is the text | WIP — ~97% of AA on white (4.34:1), deliberately close to EE Blue; strict-AA fallback #007cb9 |
| Interaction state (hover/active) | `#a1c8e2` | Dark Data | 8.8:1 AAA |
| Error, on dark surfaces | `#d98786` | — | lighter step for on-dark text |
| Success, on dark surfaces | `#72b070` | — | lighter step for on-dark text |
| Info, on dark surfaces | `#a49ec1` | — | lighter step for on-dark text |

---

## Data Visualisation — Categorical Order

Tier 3 sequence for charts/data viz only. Use in order; stop when there are enough categories.
CVD-checked, lightness-separated. Never place EE Blue and Transform Teal adjacent.

1. **EE Blue** `#1795d4`
2. **Equal Ember** `#f07c00`
3. **Tech Blue** `#22567c`
4. **Logic Lime** `#b1d923`
5. **Packet Plum** `#853d7b`
6. **Edge Blue** `#a1c8e2`
7. **Runtime Red** `#a3152b`
8. **Signal Yellow** `#ffd930`

---

## Pairing Summary

**Dark surfaces (white text):** Index Indigo, Packet Plum, Runtime Red, Uptime Green, Server Slate, Dark Data.

**Bright surfaces (Dark Data text):** Logic Lime, Edge Blue, Signal Yellow, Cursor Coral, Patch Peach, EE Blue, Transform Teal, Equal Ember.

**Do not pair:**
- EE Blue `#1795d4` and Transform Teal `#269c9e` adjacent in a categorical sequence — 1.01:1 luminance, indistinguishable in greyscale/CVD.
- The Fruity combination (Runtime Red, Cursor Coral, Uptime Green, Logic Lime, Signal Yellow, Patch Peach) for any data encoding — collapses under protanopia. Decoration only.
- White text on Equal Ember `#f07c00` — fails at 2.8:1; use Dark Data.

---

Expand Down
Loading
Loading