docs(product): DS-2 revised — three-accent pastel palette + REAPER-grey neutrals

Replace the single electric-cyan accent with a pastel lime/teal/purple three-accent system; shift neutral surfaces + text from near-black to REAPER's mid-grey theme family. Font upgrade declined (no bundling). L3 conformed to the new look; gate intact.
This commit is contained in:
2026-07-26 21:48:26 -04:00
parent d33e25751c
commit 6fece8d571
3 changed files with 365 additions and 116 deletions
+75 -22
View File
@@ -1373,12 +1373,38 @@ LICE's actual ceiling — which REAPER's own themed UI and SWS prove is a modern
object model wholesale (its controls own their hit-test internally, which would move
geometry into untestable shell code and undercut the pure/shell split).
- **DS-2 — visual direction: Direction B ("Neon Console") + Direction C's spectral
keyboard strip.** Near-black base (`~18,18,22`) with a single vivid accent (electric cyan
leads) for the live/active/selected layer only; everything else calm neutral gray. The
**spectral (hue-mapped) keyboard strip** — low notes cool → high notes hot, glow-on-active
as a static drawn state — is the signature surface (it turns the multi-zone-in-one-instance
advantage into a visual identity). The kit palette is **abstract** (role→color, one
constants block), so the direction is a single-file change.
keyboard strip. SETTLED 2026-07-26, REVISED 2026-07-26 (Daniel) — three-accent pastel
accents AND REAPER-grey neutrals (palette-only).** *Neutral surfaces (revised):* the
neutral ladder moved **from near-black up into REAPER's mid-grey theme family** so the
dock reads as *part of REAPER, not a black slab* — `bg/base` ≈ `#2b2b2b` (REAPER chrome),
`bg/panel` ≈ `#333333`, `bg/cell` ≈ `#3a3a3a` (REAPER track bg), `line/hairline` ≈
`#4a4a4a`, `text/primary` ≈ `#dcdcdc`, `text/dim` ≈ `~#a0a0a0`+. Elevation-ladder
discipline unchanged (base < panel < cell by a few %, micro-gradient + inner
highlight/shadow carry elevation, not hard borders). *Accent layer (revised):* changed
from **one electric cyan** to **three pastel accents**: `accent/primary` = **pastel lime
green** (`~176,224,152`, the
live/active/selected signal), `accent/secondary` = **pastel teal** (`~132,214,208`,
categorical role A), `accent/tertiary` = **pastel purple** (`~194,170,232`, categorical
role B); `accent/hot` is a lighter pastel-lime tint (`~200,236,178`). These are *starting*
values — the implementer locks final hex against the theme module's WCAG tests, staying
**within the pastel intent** ("soft-side" floor: the most pastel value that still clears,
not re-saturated toward neon). The **spectral (hue-mapped) keyboard strip** — signature
surface, glow-on-active as a static drawn state — is now a **pastel** sweep anchored on the
three accents (pastel-lime low → pastel-teal mid → pastel-purple high). **A stylish/bundled
font upgrade was considered and DECLINED (Daniel, 2026-07-26)** — no font bundling or
redistribution; the kit keeps its **current** cached-font face and no new typeface is
specified (§3.1). The kit palette stays **abstract** (role→color, one constants block —
now three accent roles), so the direction is a single-file change. *Tight pairs flagged for
the implementer (re-verify against the GREY ladder, not near-black):* **`text/dim` on
grey** (mid-grey-on-mid-grey — lands ~4:1 at start, must be lifted toward `~#a8a8a8`+ to
clear AA 4.5:1 body on `#333`/`#3a3a3a`, the classic floor failure); **the three pastels
as state indicators / active fills on `bg/cell`** (the pastel cushion shrank from ~15:1 on
near-black to ~6:17:1 on grey — still clears 3:1 but must be re-checked; if any drops
below floor, nudge that hue slightly deeper within the pastel intent); body text **on a
pastel fill** (light-grey on a light pastel can drop below AA 4.5:1 — use dark labels on
pastel fills or darken the fill); and **secondary vs. tertiary** distinguishability (both
cool/desaturated — verify they read as distinct categories). Full reasoning:
`docs/product/visual-design-language.md` §2.1 + §4 + §6.
- **DS-3 — dock-panel scope: a thorough layout redesign, not a light re-skin.** L2 lays out
the *full* button/affordance inventory — including M11's action-trigger buttons +
keybinding-help labels — intuitively, uncluttered, and useful, then applies the kit.
@@ -1386,17 +1412,32 @@ LICE's actual ceiling — which REAPER's own themed UI and SWS prove is a modern
## Palette + the "punch" rule (Daniel's standing taste)
Dark, modern, **visual punch over conservative contrast.** The palette is defined by
**role**, not hardcoded hue: `bg/base`, `bg/panel`, `bg/cell`, `line/hairline`,
`text/primary`, `text/dim`, `accent`, `accent/hot`, `warn`. A modern dark UI is built from
**elevation layers**, not borders — surfaces gain a **micro-gradient** (`LICE_GradRect`,
a few percent lighter at the top) + a 1px inner top-highlight / bottom-shadow (the vwnd
trick) instead of flat fills. **WCAG-floor discipline:** for each text-on-surface pair,
take the *most* vibrant accent that still clears its floor (AA 4.5:1 body / 3:1 large +
state indicators) — the floor approached from the vibrant side, never a retreat to safe
gray. The `warn` role (red/amber) is reserved *only* for byte-deleting or clip states
(prune, delete). Because the palette is role-based in one constants block, the settled
B+spectral direction (DS-2) is one file.
Dark, modern, **visual punch over conservative contrast — now pastel, on REAPER-grey.** The
palette is defined by **role**, not hardcoded hue: `bg/base`, `bg/panel`, `bg/cell`,
`line/hairline`, `text/primary`, `text/dim`, `accent/primary`, `accent/secondary`,
`accent/tertiary`, `accent/hot`, `warn`. **Neutral surfaces (DS-2 revised, 2026-07-26):**
the neutral ladder sits in **REAPER's mid-grey theme family**, not near-black, so the dock
reads as *part of REAPER* — `bg/base` ≈ `#2b2b2b`, `bg/panel` ≈ `#333333`, `bg/cell` ≈
`#3a3a3a`, `line/hairline` ≈ `#4a4a4a`, `text/primary` ≈ `#dcdcdc`, `text/dim` ≈ `~#a0a0a0`+.
A modern dark UI is built from **elevation layers**, not borders — surfaces gain a
**micro-gradient** (`LICE_GradRect`, a few percent lighter at the top) + a 1px inner
top-highlight / bottom-shadow (the vwnd trick) instead of flat fills; the grey ladder keeps
this discipline (base < panel < cell by a few %, subtle steps like REAPER, not hard
outlines). The three accents carry categorical meaning: **primary (pastel lime) =
live/active/selected**, **secondary (pastel teal) + tertiary (pastel purple) = supporting
categorical distinctions** (kinds, not intensity — primary is always "what's live now").
**WCAG-floor discipline (pastel + grey re-read):** moving neutrals *up* into grey makes two
pairs *harder* — (1) **`text/dim` on `bg/panel`/`bg/cell`** is the classic
mid-grey-on-mid-grey floor failure (must be lifted light enough to clear AA 4.5:1 body on
the greyest surface it draws on), and (2) **the three pastels as state indicators on grey**
have a shrunken contrast cushion (~6:17:1 vs. ~15:1 on near-black — still clear 3:1 but
re-verify; nudge a hue slightly deeper within the pastel intent if it drops below floor).
Text-on-a-pastel-fill (AA 4.5:1) remains a tight pair. Take the *most pastel* value that
still clears the floor **on grey** — approached from the **soft side**, never re-saturated
toward neon "to be safe," except where the grey floor forces a small deepening. The `warn`
role (red/amber) is reserved *only* for byte-deleting or clip states (prune, delete).
Because the palette is role-based in one constants block, the settled-and-revised
B+pastel+grey+spectral direction (DS-2) is one file.
## "Speed is the selling point" — a design constraint, not a tagline
@@ -1413,8 +1454,18 @@ already does). Direction C's glow/bloom is a **static drawn state, never a pulse
Pure (no LICE, no REAPER types, unit-tested — the mirror of `mode_switch`/`bank_grid`):
- **`theme`/palette module** — role→color mapping, direction-selectable via one constants
block (the B+spectral values). Pure; unit-tested that each text-on-surface pair clears
its WCAG floor (the "punch" rule made testable).
block (the B + REAPER-grey-neutral + three-accent-pastel + pastel-spectral values). Pure;
unit-tested that each text-on-surface pair clears its WCAG floor (the "punch" rule made
testable). *DS-2 revision (2026-07-26):* (a) the neutral ladder moves from near-black up
into REAPER's mid-grey family (`bg/base` `#2b2b2b` / `bg/panel` `#333333` / `bg/cell`
`#3a3a3a` / `line/hairline` `#4a4a4a` / `text/primary` `#dcdcdc` / `text/dim` `~#a0a0a0`+),
and (b) the accent role expands from one to three (`accent/primary` lime, `accent/secondary`
teal, `accent/tertiary` purple) with the spectral ramp a pastel sweep anchored on those
three — all still confined to the one constants block + the shell's font lifecycle. **The
WCAG test must be re-run against the GREY ladder** — it gains the newly-tight grey pairs:
`text/dim`-on-grey (AA 4.5:1) and each pastel-as-state-indicator on `bg/cell` (3:1), plus
the existing text-on-pastel-fill pairs. (No font change: a bundled-font upgrade was
declined — the cached-font set keeps the kit's current face.)
- **Component geometry/hit-test helpers** — button rect, slider track/handle geometry,
list-row rect + hover hit-test, and any new layout module L2 needs (an action-bar layout
module). No LICE, no host types; CTest-covered. Existing pure modules
@@ -1475,9 +1526,11 @@ the **current** drawing and **adopt the L1 kit when it is available — they are
Phase L.** Whichever lands first (the L1 kit or the S10S13 UX), the kit is the **one source
of drawing**: if S10S13 reach dev before L1, they draw in the current language and L3
restyles them; if L1 lands first, they are born in the kit. Either way there is one kit and
one look; L3 completes the VST/embed adoption and applies the settled B+spectral treatment
(with C's spectral keyboard strip as the signature surface). The VST3 class UID is
unchanged — a visual refresh is not a compat event.
one look; L3 completes the VST/embed adoption and applies the settled-and-revised **B +
three-accent pastel** treatment (with C's **pastel** spectral keyboard strip as the
signature surface), routing text through the kit's cached-font `text()` (§3.1 — the kit's
current face; no font change). The VST3 class UID is unchanged — a visual refresh is not a
compat event.
## Precision / invariant implications (what Phase L does NOT change)