# Changelog

## v2.2 — 17 September 2026 · warning tokens

Source is pilot prototype v3/v4, which needed a warning card and tag that the system had no tokens for.

- New semantic tokens `--warn-bg`, `--warn-border`, `--warn-text` (light: `#F6EEDF` / `#E6D6B3` / `#8A5C1E`, dark: `#2E2414` / `#5A4523` / `#D9A05C`), plus base step `--amber-100` (`#E6D6B3`, warn tint border). `--warn-text` on `--warn-bg` is 5.0:1 light, 6.6:1 dark.
- v4's invented values for these tokens are adopted unchanged.
- Six raw v3 hexes mapped to existing tokens: booking summary gradient → flat `--accent-tint` + `--accent-tint-border`, hr `#CDE6DC` → `--accent-tint-border`, calendar today `#9DCEC0` → `--accent` at `--active-border`, disabled slot `#83918F` → `--text-muted`, pending booking `#C69540` → `--status-warn`, dark avatar border `#276551` → dark `--accent-tint-border`, red tag text `#913B28` → `--alert-text`.
- Updated: tokens/colors.css, readme.md, SKILL.md, guidelines/colors-semantic.html. Copies in apps/prototype-2 and apps/landing-page re-derived.

## v2.1 — 17 September 2026 · primary button colour

Founder decision after reviewing pilot prototype v3 and v4 side by side: the primary button keeps the colour v3 shipped with, a deep green fill with a white label, instead of the Pulse mint fill with an Ink label that v2.0 prescribed.

- `--pulse-700` (Deep Pulse) is now `#087858` (was `#0A7F5B`). Text, icons, links, active borders and the primary button all read it. White on it is 5.5:1.
- New semantic tokens `--button-fill` (light: Deep Pulse, dark: `#3FDCAB`) and `--button-label` (light: white, dark: navy). Components read these for buttons; `--accent-fill` stays for progress bars, check dots and the mark.
- Rule change: "a Pulse-filled button carries an Ink label" becomes "the primary button is a Deep Pulse fill with a white label; Pulse is never a button fill". `--accent-contrast` now only labels the Ink ✓ on check dots.
- Updated: `tokens/colors.css`, `readme.md`, `SKILL.md`, `components/actions/Button.*`. Copies in `apps/prototype-2` and `apps/landing-page` re-derived.

## v2.0 — 8 September 2026 · brand alignment

v1.0 of this system was built in Claude Design from a colour-and-type exploration, with no access to Nadi's brand assets. Its own readme said so: *"No codebase, Figma, logo, or font binaries were provided"* and *"No logo exists"*. It therefore invented a complete visual identity of its own. This release replaces every invented value with the values from **Nadi Brand Guideline v2.0 (8 September 2026)**, and keeps everything v1.0 got right: the two-layer token architecture, the three type roles, the content and status rules, the dark-mode discipline, the no-shadow rule, the radius and spacing scale, and the component inventory.

### Identity — replaced

| | v1.0 | v2.0 |
|---|---|---|
| Background | Paper `#f8f7f3`, warm | Mist `#F4F8F7`, cool |
| Text / dark ground | Ink `#20261f`, olive-black | Nadi Ink `#0D2137`, marine navy |
| Accent | Sage `#3f7357`, muted | Pulse `#10C98F` fill + Deep Pulse `#0A7F5B` text |
| Dark surfaces | Pine `#131a15` / `#1c2620` | Navy `#071522` / `#0E2537` |
| Dark accent | `#7fb894` | `#3FDCAB` |
| Display face | Source Serif 4 | Quicksand |
| Body face | Source Sans 3 | Inter |
| Data face | Spline Sans Mono | JetBrains Mono |
| Logo | none — *"never invent a mark"* | locked mark + wordmark, six official forms |
| Copy language | English | Bahasa Indonesia |

The palette change is not only the accent. v1.0's neutrals were warm and yellow-tinted; v2.0's are cool and green-tinted. Since the background occupies roughly 70% of any surface, that temperature flip is what makes the two systems read as different brands.

Quicksand is not a preference, it is a constraint: the wordmark is an outline conversion of Quicksand Bold, so a serif heading beside it would repeat exactly the mismatch the logo process already solved when the sharp-cornered mark was replaced with a curved one.

### Architecture — added

- **`--accent-fill` is new.** Sage could serve as both text and fill; Pulse cannot, at 2.2:1 against white. The accent is now split: `--accent-fill` `#10C98F` for filled areas, `--accent` `#0A7F5B` for accented text, links and icons.
- **`--accent-contrast` flipped from white to Ink.** A white label on a Pulse button is unreadable; Ink on Pulse clears 7.5:1.
- **`--status-warn` darkened** from `#B0782C` to `#8A5C1E`, so warning text clears 4.5:1 on Mist.
- **`--ember` declared and fenced.** The Brand Guideline's warm counter-accent is available to marketing work and explicitly banned from product UI, where it would collide with clay's meaning and fails contrast at 2.8:1 anyway.
- **`Logo` component added** with the six official forms, plus `brand/` holding the shipped SVG and PNG assets.

### Rules — reconciled

- **Dark mode**: v1.0 confined dark to in-session PT surfaces; the Brand Guideline's own mockup showed an Ink client app. Both survive: dark stays scoped to the live logger and rest timer, plus one Ink hero card allowed on the client home.
- **Imagery**: v1.0 banned all images, gradients and textures; the Brand Guideline ships a supergraphic, a photography direction and an illustration style. The ban now applies to product content surfaces, and brand imagery is allowed on marketing, onboarding, empty states, and the shared session summary.
- **Icons**: unicode glyphs keep the inline affordances; Lucide at 1.5px round-cap stroke covers named concepts, which unicode cannot express and the brand's monoline pictogram rule requires.
- **Shadows**: the Brand Guideline's leftover `--shadow` definition is retired in favour of v1.0's absolute no-shadow rule.
- **Language**: Bahasa Indonesia becomes the default, status labels are locked in Indonesian, and the em-dash is restricted to data glyphs.

### Still open

Two questions belong to the founders, not to this system:

1. Does the client app stay a light companion, when marketing treats the client as the primary audience?
2. How far may dark mode spread beyond the live logger and rest timer?
