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 object model wholesale (its controls own their hit-test internally, which would move
geometry into untestable shell code and undercut the pure/shell split). geometry into untestable shell code and undercut the pure/shell split).
- **DS-2 — visual direction: Direction B ("Neon Console") + Direction C's spectral - **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 keyboard strip. SETTLED 2026-07-26, REVISED 2026-07-26 (Daniel) — three-accent pastel
leads) for the live/active/selected layer only; everything else calm neutral gray. The accents AND REAPER-grey neutrals (palette-only).** *Neutral surfaces (revised):* the
**spectral (hue-mapped) keyboard strip** — low notes cool → high notes hot, glow-on-active neutral ladder moved **from near-black up into REAPER's mid-grey theme family** so the
as a static drawn state — is the signature surface (it turns the multi-zone-in-one-instance dock reads as *part of REAPER, not a black slab* — `bg/base` ≈ `#2b2b2b` (REAPER chrome),
advantage into a visual identity). The kit palette is **abstract** (role→color, one `bg/panel` ≈ `#333333`, `bg/cell` ≈ `#3a3a3a` (REAPER track bg), `line/hairline` ≈
constants block), so the direction is a single-file change. `#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 - **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 + the *full* button/affordance inventory — including M11's action-trigger buttons +
keybinding-help labels — intuitively, uncluttered, and useful, then applies the kit. 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) ## Palette + the "punch" rule (Daniel's standing taste)
Dark, modern, **visual punch over conservative contrast.** The palette is defined by Dark, modern, **visual punch over conservative contrast — now pastel, on REAPER-grey.** The
**role**, not hardcoded hue: `bg/base`, `bg/panel`, `bg/cell`, `line/hairline`, palette is defined by **role**, not hardcoded hue: `bg/base`, `bg/panel`, `bg/cell`,
`text/primary`, `text/dim`, `accent`, `accent/hot`, `warn`. A modern dark UI is built from `line/hairline`, `text/primary`, `text/dim`, `accent/primary`, `accent/secondary`,
**elevation layers**, not borders — surfaces gain a **micro-gradient** (`LICE_GradRect`, `accent/tertiary`, `accent/hot`, `warn`. **Neutral surfaces (DS-2 revised, 2026-07-26):**
a few percent lighter at the top) + a 1px inner top-highlight / bottom-shadow (the vwnd the neutral ladder sits in **REAPER's mid-grey theme family**, not near-black, so the dock
trick) instead of flat fills. **WCAG-floor discipline:** for each text-on-surface pair, reads as *part of REAPER* — `bg/base` ≈ `#2b2b2b`, `bg/panel` ≈ `#333333`, `bg/cell` ≈
take the *most* vibrant accent that still clears its floor (AA 4.5:1 body / 3:1 large + `#3a3a3a`, `line/hairline` ≈ `#4a4a4a`, `text/primary` ≈ `#dcdcdc`, `text/dim` ≈ `~#a0a0a0`+.
state indicators) — the floor approached from the vibrant side, never a retreat to safe A modern dark UI is built from **elevation layers**, not borders — surfaces gain a
gray. The `warn` role (red/amber) is reserved *only* for byte-deleting or clip states **micro-gradient** (`LICE_GradRect`, a few percent lighter at the top) + a 1px inner
(prune, delete). Because the palette is role-based in one constants block, the settled top-highlight / bottom-shadow (the vwnd trick) instead of flat fills; the grey ladder keeps
B+spectral direction (DS-2) is one file. 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 ## "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`): 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 - **`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 block (the B + REAPER-grey-neutral + three-accent-pastel + pastel-spectral values). Pure;
its WCAG floor (the "punch" rule made testable). 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, - **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 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 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 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 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 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 one look; L3 completes the VST/embed adoption and applies the settled-and-revised **B +
(with C's spectral keyboard strip as the signature surface). The VST3 class UID is three-accent pastel** treatment (with C's **pastel** spectral keyboard strip as the
unchanged — a visual refresh is not a compat event. 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) ## Precision / invariant implications (what Phase L does NOT change)
+38 -17
View File
@@ -303,23 +303,40 @@ build:** the `IReaperUIEmbedInterface` contract + embed message/lifecycle agains
> settled bare-SDK+LICE build shape). Keep hit-test geometry in pure CTest-covered > settled bare-SDK+LICE build shape). Keep hit-test geometry in pure CTest-covered
> modules — do not import vwnd's retained-mode object model wholesale. > modules — do not import vwnd's retained-mode object model wholesale.
> - **DS-2 — visual direction: Direction B ("Neon Console") + Direction C's spectral > - **DS-2 — visual direction: Direction B ("Neon Console") + Direction C's spectral
> keyboard strip.** Near-black + one vivid accent everywhere; a hue-mapped spectral > keyboard strip. SETTLED 2026-07-26, REVISED 2026-07-26 (Daniel) — palette-only.**
> keyboard strip as the signature surface. The kit palette is abstract (roles, one > *Neutral surfaces (revised):* the neutral ladder moved **from near-black up into REAPER's
> constants block), so the direction is a single-file change. > mid-grey theme family** so the dock reads as part of REAPER, not a black slab — `bg/base`
> ≈ `#2b2b2b`, `bg/panel``#333333`, `bg/cell``#3a3a3a`, `line/hairline``#4a4a4a`,
> `text/primary``#dcdcdc`, `text/dim``~#a0a0a0`+ (elevation-ladder discipline
> unchanged). *Accent layer (revised):* now a **three-accent pastel system**
> `accent/primary` pastel lime green (live/active/selected), `accent/secondary` pastel teal
> + `accent/tertiary` pastel purple (categorical distinctions) — replacing the original
> single electric cyan. The spectral keyboard strip is a **pastel** sweep anchored on the
> three accents. *Tight WCAG pairs to re-verify against the grey ladder:* `text/dim`-on-grey
> (mid-grey-on-mid-grey, AA 4.5:1) and the three pastels-as-indicators on `bg/cell` (shrunk
> from ~15:1 to ~6:17:1). **A stylish/bundled-font upgrade was considered and DECLINED
> (Daniel):** no font bundling/redistribution — the kit keeps its current cached-font face,
> no new typeface. The kit palette stays abstract (roles, one constants block — three accent
> roles + grey neutrals), so the direction is a single-file change; final hex is locked
> against the theme WCAG tests within the pastel intent. Detail:
> `docs/product/visual-design-language.md` §2.1/§4/§6 + CONTEXT.md §Phase L.
> - **DS-3 — dock-panel scope: a thorough layout redesign, not a light re-skin.** L2 lays > - **DS-3 — dock-panel scope: a thorough layout redesign, not a light re-skin.** L2 lays
> out the full button inventory (including M11's action-button additions) intuitively, > out the full button inventory (including M11's action-button additions) intuitively,
> uncluttered, and useful — then applies the kit. Sequenced after M11 merges. > uncluttered, and useful — then applies the kit. Sequenced after M11 merges.
## L3 — VST editor + embed-strip restyle (GATED on Phase S landing on dev) ## L3 — VST editor + embed-strip restyle (GATED on Phase S landing on dev)
**Goal:** Bring the ReaSampler 9000 VST editor (`IPlugView` LICE surface) and the S6 embed **Goal:** Bring the ReaSampler 9000 VST editor (`IPlugView` LICE surface) and the S6 embed
strip up to the settled B+spectral look via the L1 kit: cached-font text, kit component strip up to the settled-and-revised **B + three-accent pastel** look via the L1 kit: kit
draws, the Neon-Console palette, the **spectral keyboard strip** as the signature surface cached-font text (§3.1 — the kit's current face, no font change), kit component draws, the
(DS-2), and hover/pressed/drag states throughout. CONTEXT.md §Phase L (VST restyle + the Neon-Console palette with **REAPER-grey neutrals** (`#2b2b2b`/`#333333`/`#3a3a3a`) and the
**three pastel accents** (primary lime / secondary teal / tertiary purple), the **pastel
spectral keyboard strip** as the signature surface (DS-2
revised), and hover/pressed/drag states throughout. CONTEXT.md §Phase L (VST restyle + the
Phase S coordination contract). Product framing: `docs/product/visual-design-language.md` §5.3. Phase S coordination contract). Product framing: `docs/product/visual-design-language.md` §5.3.
**Verify (in DAW):** the VST editor + embed strip render in the settled B+spectral language **Verify (in DAW):** the VST editor + embed strip render in the settled B + three-accent
through the L1 kit — AA cached-font text, gradient/rounded kit components, the spectral pastel language through the L1 kit — kit AA cached-font text, gradient/rounded kit
keyboard strip, working hover/pressed/drag; the VST3 class UID is unchanged (a visual components, the pastel spectral keyboard strip, working hover/pressed/drag; the VST3 class
refresh is not a compat event). UID is unchanged (a visual refresh is not a compat event).
**Depends on:** L1 (the kit) **AND — GATE — Phase S landing on dev.** The VST editor, embed **Depends on:** L1 (the kit) **AND — GATE — Phase S landing on dev.** The VST editor, embed
strip, and keyboard strip live in Phase S, which is **not on dev yet** (it exists on the strip, and keyboard strip live in Phase S, which is **not on dev yet** (it exists on the
phase-s worktree). **L3 cannot be built on dev until Phase S's editor/embed surfaces phase-s worktree). **L3 cannot be built on dev until Phase S's editor/embed surfaces
@@ -335,14 +352,18 @@ work.
> Either way there is one kit and one look, and L3 is the point that completes the VST/embed > Either way there is one kit and one look, and L3 is the point that completes the VST/embed
> adoption and applies the settled B+spectral treatment. > adoption and applies the settled B+spectral treatment.
- [ ] Route the VST editor's + embed strip's text through the kit's cached-font `text()`; - [ ] Route the VST editor's + embed strip's text through the kit's cached-font `text()`
retire their raw GDI `DrawTextA` path. (Gated — Phase S surfaces must be on dev.) (the kit's current face — §3.1, no font change); retire their raw GDI `DrawTextA` path.
(Gated — Phase S surfaces must be on dev.)
- [ ] Restyle the editor + embed components through the kit (buttons, sliders/ADSR, list - [ ] Restyle the editor + embed components through the kit (buttons, sliders/ADSR, list
rows, waveform, segmented controls) in the B (Neon Console) palette; add hover/pressed/ rows, waveform, segmented controls) in the B (Neon Console) palette — **REAPER-grey
drag states. (Gated.) neutrals** (`bg/base` `#2b2b2b` / `bg/panel` `#333333` / `bg/cell` `#3a3a3a`) with the
- [ ] Apply **Direction C's spectral treatment to the keyboard strip** (hue-mapped zones, **three pastel accents** (primary lime = live layer; secondary teal / tertiary purple =
glow-on-active as a static drawn state — never a pulse, per the speed constraint) as the categorical); add hover/pressed/drag states. (Gated.)
signature surface; VST3 class UID unchanged. (Gated.) - [ ] Apply **Direction C's pastel spectral treatment to the keyboard strip** (hue-mapped
zones as a pastel sweep anchored on the three accents, glow-on-active as a static drawn
state — never a pulse, per the speed constraint) as the signature surface; VST3 class UID
unchanged. (Gated.)
## Phase L — sequencing ## Phase L — sequencing
``` ```
+252 -77
View File
@@ -12,11 +12,15 @@ written after Daniel DAW-tested the S1S6 instrument:
> Cockos have a toolkit for this type of visual design?" > Cockos have a toolkit for this type of visual design?"
**Status:** framed by product-designer (2026-07-26); the DS-1/DS-2/DS-3 forks are **Status:** framed by product-designer (2026-07-26); the DS-1/DS-2/DS-3 forks are
**SETTLED (Daniel, 2026-07-26)** — recorded in §6 with the reasoning preserved. The **SETTLED (Daniel, 2026-07-26)** — recorded in §6 with the reasoning preserved. **DS-2 was
build points it feeds live in **PLAN.md §Phase L** (**L1** the shared LICE drawing kit, revised 2026-07-26 (Daniel)** from the single electric-cyan accent to a **three-accent
**L2** the dock-panel layout redesign, **L3** the VST editor + embed-strip restyle) and pastel system** (primary/secondary/tertiary = pastel lime green / pastel teal / pastel
**CONTEXT.md §Phase L** (the design-system spec). Toolkit facts below are **verified purple) — see §6. (A stylish-font upgrade was considered and **declined** by Daniel — no
against the vendored `vendor/WDL` tree**, not lore. font bundling/redistribution; the kit keeps its current cached-font face.) The build points it feeds live in
**PLAN.md §Phase L** (**L1** the shared LICE drawing kit, **L2** the dock-panel layout
redesign, **L3** the VST editor + embed-strip restyle) and **CONTEXT.md §Phase L** (the
design-system spec). Toolkit facts below are **verified against the vendored `vendor/WDL`
tree**, not lore.
> **Phase-boundary note (2026-07-26).** This look-and-feel effort was originally drafted > **Phase-boundary note (2026-07-26).** This look-and-feel effort was originally drafted
> as Phase S points **S0-DS** (the shared kit) and **S14** (the panel refresh). It was > as Phase S points **S0-DS** (the shared kit) and **S14** (the panel refresh). It was
@@ -51,10 +55,14 @@ against the vendored `vendor/WDL` tree**, not lore.
- **The real work is L1 — a shared drawing kit** — one small LICE-based - **The real work is L1 — a shared drawing kit** — one small LICE-based
component/palette/type layer that the VST editor, the embed strip, and the bank panel component/palette/type layer that the VST editor, the embed strip, and the bank panel
all draw through. It is the one source of drawing for the whole system. all draw through. It is the one source of drawing for the whole system.
- **DS-2 SETTLED (2026-07-26): Direction B ("Neon Console") + Direction C's spectral - **DS-2 SETTLED (2026-07-26), REVISED (2026-07-26): Direction B ("Neon Console") + Direction
keyboard strip** as the signature surface. Three visual directions are in §4; B+spectral C's spectral keyboard strip** as the signature surface — now with a **three-accent pastel
is the settled target. "Speed is the selling point" is a **design constraint**, not a system** (primary = pastel lime green, secondary = pastel teal, tertiary = pastel purple)
tagline: the UI must *feel* instant (§3.5). in place of the original single electric-cyan accent. (A stylish-font upgrade was
considered and **declined** — no font bundling; the kit keeps its current face.) Three
visual directions are in §4; B+spectral with the pastel accents is the settled target.
"Speed is the selling point" is a **design constraint**, not a tagline: the UI must *feel*
instant (§3.5).
- **DS-3 SETTLED (2026-07-26): the dock-panel work is a real, thorough layout design, not - **DS-3 SETTLED (2026-07-26): the dock-panel work is a real, thorough layout design, not
a light reskin.** L2 lays out the *full button inventory* (including M11's additions) a light reskin.** L2 lays out the *full button inventory* (including M11's additions)
intuitively, uncluttered, and useful — §5.2. intuitively, uncluttered, and useful — §5.2.
@@ -156,25 +164,93 @@ background `RGB(28,28,30)`, waveform/accent `RGB(120,200,160)`, cell `RGB(44,44,
### 2.1 Structural roles (direction-independent) ### 2.1 Structural roles (direction-independent)
A modern dark UI is built from **elevation layers**, not borders. Define the palette by A modern dark UI is built from **elevation layers**, not borders. Define the palette by
role, then let the direction set the accent: role, then let the direction set the accent.
| Role | Purpose | Current | Direction | **Neutral surfaces — REAPER-theme-matching mid-grey (DS-2 revised, 2026-07-26, Daniel).**
The neutral role ladder is **not near-black** — it sits in **REAPER's own mid-grey theme
family** so the dock reads as *part of REAPER*, not a black slab bolted on beside it.
Ground truth from Daniel's theme: REAPER's arrange/track background is a mid grey
(`~#373737`), window chrome / ruler / transport a touch darker (`~#2b2b2b`), body text a
light grey (`~#c8c8c8`white). The DS-2 neutral ladder below matches that family. **The
elevation-ladder discipline is unchanged:** base < panel < cell, each a few percent
lighter, with the micro-gradient (§2.2) + 1px inner highlight/shadow still doing the
elevation work — REAPER differentiates surfaces by subtle steps, not hard borders, which
is exactly DS-2's "elevation layers, not borders" principle. Only the *values* moved up
from near-black into the grey range; the *structure* is identical:
| Role | Purpose | Current | Direction (DS-2 revised — REPER-grey neutrals) |
|---|---|---|---| |---|---|---|---|
| `bg/base` | window canvas | `28,28,30` | deepen slightly + a **subtle top-down `LICE_GradRect`** (base look, not flat) | | `bg/base` | window canvas | `28,28,30` | **REAPER chrome grey ≈ `43,43,43` (`#2b2b2b`)** + a **subtle top-down `LICE_GradRect`** (base look, not flat) |
| `bg/panel` | a raised region (list, waveform pane) | — (implicit) | one step lighter than base; elevation reads without a border | | `bg/panel` | a raised region (list, waveform pane) | — (implicit) | **`51,51,51` (`#333333`)** — one step lighter than base; elevation reads without a border |
| `bg/cell` | a control/row surface | `44,44,48` | as now, but with a 1px inner top highlight (the vwnd trick) | | `bg/cell` | a control/row surface | `44,44,48` | **`58,58,58` (`#3a3a3a`)** (matches REAPER track bg `~#373737``#3c3c3c`), with a 1px inner top highlight (the vwnd trick) |
| `line/hairline` | separators | `60,60,66` | keep, use sparingly elevation should carry most separation | | `line/hairline` | separators | `60,60,66` | **`74,74,74` (`#4a4a4a`)** — a subtle step above cell; use sparingly, elevation should carry most separation |
| `text/primary` | labels, values | `210,230,220` | near-white, **must clear WCAG AA (4.5:1) on `bg/panel`** | | `text/primary` | labels, values | `210,230,220` | **REAPER body light grey ≈ `220,220,220` (`#dcdcdc`)**, **must clear WCAG AA (4.5:1) on `bg/panel`/`bg/cell`** (clears ~8:1 — comfortable) |
| `text/dim` | secondary / units | — | a dimmer step, still **AA-large (3:1) minimum** — the WCAG floor, not below it | | `text/dim` | secondary / units | — | a dimmer light-grey step ≈ `~160,160,160` (`#a0a0a0`), **must clear AA 4.5:1 on the greyer surfaces if used for body** (see §2.1 WCAG note — this is the newly tight pair) |
| `accent` | selection, active, focus | `120,200,160` | **Direction B: one vivid hue** (§4) — this is where the punch lives | | `accent/primary` | live / active / selected layer | `120,200,160` | **pastel lime green** (§4) — the one that means "this is live"; where the punch lives |
| `accent/hot` | hover / live / drag feedback | — (absent) | a brighter accent tint; **today there is no hover color at all** | | `accent/secondary` | supporting categorical role A | — | **pastel teal** — a second categorical hue (e.g. secondary zones, non-primary selection state) |
| `accent/tertiary` | supporting categorical role B | — | **pastel purple** — a third categorical hue (e.g. tertiary zones, a distinct affordance class) |
| `accent/hot` | hover / live / drag feedback | — (absent) | a brighter tint **of the primary accent**; **today there is no hover color at all** |
| `warn` | clip / destructive (prune, delete) | — | a red/amber reserved *only* for byte-deleting or clip states | | `warn` | clip / destructive (prune, delete) | — | a red/amber reserved *only* for byte-deleting or clip states |
**WCAG-floor discipline (the "punch" rule, concretely):** for each text-on-surface pair, **Three-accent role assignment (DS-2 revised).** The accent layer is now *three* pastel
pick the *most* saturated/vibrant accent that still clears its contrast floor — AA 4.5:1 hues, not one, so the palette can carry categorical meaning without leaning on saturation
for body text, 3:1 for large text and for UI-state indicators (selection borders, active Daniel finds too loud. The coherent assignment:
fills). Do not retreat to safe grays "to be sure." The floor is the target, approached - **`accent/primary` = pastel lime green** — the single "this is live/active/selected"
from the vibrant side. signal. It does the same job the old single cyan did: it is the eye-magnet, used with
discipline for the live layer only (selection, active fill, focus-adjacent, the active
zone's glow). One primary keeps the "accent = live, never chrome" rule intact.
- **`accent/secondary` = pastel teal** and **`accent/tertiary` = pastel purple** — the
*categorical* distinctions that a single-accent palette had to fake with brightness. They
mark **kinds** of thing, not intensity: e.g. non-active zone bands on the keyboard strip,
a second/third action-cluster identity, or a supporting-state fill. They never out-shout
primary — primary is always the "what's live now" answer; secondary/tertiary are "what
category is this." The three read as a family (all pastel, adjacent-ish in the cool→warm
band), so the UI stays coherent, not carnival.
Primary/secondary/tertiary is a **role trio in the same constants block** as the rest —
adding two accents did not change the "one file, one direction" property (§2.1 opener).
**WCAG-floor discipline (the "punch" rule, re-read for pastels):** for each text-on-surface
pair, pick the value that still clears its contrast floor — AA 4.5:1 for body text, 3:1 for
large text and UI-state indicators (selection borders, active fills). With the old vivid
cyan the rule was "push to the floor *from the vibrant side*." **Pastels are the inverse
approach:** a pastel is intrinsically less saturated and (as a light-ish tint on a dark
surface) usually *brighter* than a vivid accent, so it clears the *large/state* floor more
easily than a vivid hue — though on the DS-2-revised **grey** surfaces the cushion is much
smaller than on near-black (see the grey re-read below). The tight case flips — **text
drawn on a pastel fill** (dark text on a light pastel, or the pastel as fill behind
`text/primary`) is where contrast can fail. So the rule becomes:
**take the most *pastel* (softest, least-saturated) value that still clears the floor,
approached from the soft side** — do not over-saturate a pastel back toward neon "to be
safe," and do not wash it out so far it drops a text pair below floor. The implementer runs
the theme module's WCAG tests and nudges each accent *within the pastel intent* until every
drawn pair clears. See §4 for concrete starting values and the pairs expected to be tight.
**WCAG re-read for the greyer neutrals (DS-2 revised — the load-bearing check).** Moving
the neutral surfaces *up* from near-black into REAPER's mid-grey makes two pairs *harder*,
because contrast against a lighter surface is smaller. Both must be re-verified against the
new grey ladder, not the old near-black:
- **`text/dim` on `bg/panel`/`bg/cell` — the classic mid-grey-on-mid-grey floor failure.**
A mid-grey dim text against a mid-grey surface is exactly where AA fails. At the starting
values a `~#9a9a9a`-`#a0a0a0` dim on `#333333`/`#3a3a3a` lands around **~4:14.4:1** — under
the AA 4.5:1 body floor and only just clearing the 3:1 large floor. **`text/dim` must be
lifted light enough (toward `~#a8a8a8`+) to clear AA 4.5:1 on the greyest surface it draws
body text on**, or be confined to large/UI-label use where the 3:1 floor applies. The
implementer locks the exact value against the test; the intent is "dim, but never below
the floor it is actually drawn against."
- **The three pastel accents on the greyer surfaces — the cushion shrank.** Pastels have
*less* contrast against mid-grey than against near-black. On near-black the three cleared
the 3:1 large/indicator floor by a huge margin (~15:1); on `bg/cell` `#3a3a3a` the same
pastels land around **~6:17:1** — still clearing 3:1, but the comfortable cushion is
gone. Every pastel used as a **state indicator / active fill** (selection border, active
zone, focus-adjacent) **must be re-verified to still clear the 3:1 large/indicator floor
on `bg/cell`, not on the old near-black.** If any pastel would drop below floor on grey,
the "punch from the soft side" rule now means **nudge that hue slightly deeper / more
saturated until it clears** — the hues stay pastel lime / teal / purple; only their
value/chroma may move a little. This is a real tension: the greyer background pulls the
pastels *toward* the floor at the same time the "keep it soft" rule pulls them away from
saturation. The implementer resolves it per-hue against the test, staying within the
pastel intent.
### 2.2 Motion of color, not just color ### 2.2 Motion of color, not just color
@@ -198,11 +274,14 @@ and it's exactly what `virtwnd`'s button/slider drawing does. Bake it into the k
typographic variety: `title` (~15px semibold), `label` (~12px regular), `value`/`mono` typographic variety: `title` (~15px semibold), `label` (~12px regular), `value`/`mono`
(~12px, tabular for note numbers / ms / dB so digits don't jitter during a drag), (~12px, tabular for note numbers / ms / dB so digits don't jitter during a drag),
`micro` (~10px, dim, for units/counts). Four cached fonts total. `micro` (~10px, dim, for units/counts). Four cached fonts total.
- **Font choice:** a clean UI sans is available on every Windows target (Segoe UI is the - **Font face — keep the kit's current cached-font face (DS-2: no font change).** A
safe system default; the kit takes an `HFONT`, so the exact face is a one-line change). stylish/bundled-font upgrade was considered and **declined by Daniel** — he does not want
For the numeric `value` role, a tabular/mono face (Consolas is universally present) to bundle and redistribute a font. So the kit keeps its **current** face; this doc
keeps dragged numbers from reflowing. Windows-only (D5) means no cross-platform specifies no new typeface. The win at §3.1 is entirely the *mechanism* — routing all text
font-fallback worry. through a `LICE_CachedFont` (AA glyph cache, one weight/size scale, optional soft shadow
on titles) instead of raw GDI `DrawTextA` — not a new type family. The `HFONT` fed to
`SetFromHFont` stays the kit's existing choice; the "temple os → modern" jump is the AA
cached-glyph pipeline plus the type scale above, not the face.
- **Soft shadow on title/accent text only** (`LICE_FONT_FLAG_FX_SHADOW`) — subtle depth, - **Soft shadow on title/accent text only** (`LICE_FONT_FLAG_FX_SHADOW`) — subtle depth,
used sparingly; body text stays crisp and flat for legibility. used sparingly; body text stays crisp and flat for legibility.
@@ -264,7 +343,8 @@ house discipline). The set:
- **Keyboard strip** — the bespoke S10 surface: white/black key lanes, zone bars as - **Keyboard strip** — the bespoke S10 surface: white/black key lanes, zone bars as
translucent colored overlays, root markers. No prior art in the kit; it *defines* new translucent colored overlays, root markers. No prior art in the kit; it *defines* new
kit primitives (key-lane fill, zone overlay). **Direction C's spectral treatment kit primitives (key-lane fill, zone overlay). **Direction C's spectral treatment
(§4, DS-2 settled) lives here** — the hue-mapped keyboard is the signature surface. (§4, DS-2 settled + revised) lives here** — the hue-mapped keyboard is the signature
surface, now a **pastel** sweep anchored on the three accent hues (§4).
### 3.5 Motion policy — "speed is the selling point," read as a constraint ### 3.5 Motion policy — "speed is the selling point," read as a constraint
@@ -292,12 +372,17 @@ instant, and no decoration may cost that.** Concretely —
--- ---
## 4. Three visual directions (DS-2 SETTLED: B + C's spectral keyboard strip) ## 4. Three visual directions (DS-2 SETTLED: B + C's spectral keyboard strip; REVISED to pastel accents)
Each is a complete palette + treatment, not a shade of the same thing. All three are Each is a complete palette + treatment, not a shade of the same thing. All three are
LICE-drawable today (no new dependency); all three honor the WCAG-floor "punch" rule. LICE-drawable today (no new dependency); all three honor the WCAG-floor "punch" rule.
Ordered safe → bold. **Daniel settled (2026-07-26) on Direction B as the target, with Ordered safe → bold. **Daniel settled (2026-07-26) on Direction B as the target, with
Direction C's spectral keyboard strip as the signature surface.** Direction C's spectral keyboard strip as the signature surface** — then **revised the
accent layer (2026-07-26) from a single electric cyan to a three-accent pastel system**
(primary pastel lime green / secondary pastel teal / tertiary pastel purple), and
**revised the neutral surfaces (2026-07-26) from near-black up into REAPER's mid-grey theme
family** so the dock reads as part of REAPER, not a black slab (§2.1). Only the accent layer
and the neutral ladder changed; the direction (B + C's spectral strip) is unchanged.
### Direction A — "Studio Rack" (evolutionary; not selected) ### Direction A — "Studio Rack" (evolutionary; not selected)
@@ -311,49 +396,104 @@ controls get the vwnd inner-highlight/shadow treatment.
make anyone say "sleek." Retained as the fallback if B/C ever feel too loud for a make anyone say "sleek." Retained as the fallback if B/C ever feel too loud for a
pro-audio context, but Daniel's taste points away from it. pro-audio context, but Daniel's taste points away from it.
### Direction B — "Neon Console" (contemporary synth; SETTLED default) ### Direction B — "Neon Console" (contemporary synth; SETTLED default, REVISED to pastel accents)
A modern soft-synth / plugin look: near-black background (`~18,18,22`) with a **single A modern soft-synth / plugin look: **REAPER-theme mid-grey neutrals** (`bg/base`
vivid accent** (electric cyan `~60,200,235` leads; hot magenta `~235,70,170` is the `#2b2b2b`, `bg/panel``#333333`, `bg/cell``#3a3a3a` — the grey ladder in §2.1, matching
bolder sub-option), used with intent for the *live/active/selected* layer only. Everything Daniel's REAPER theme so the dock is not a black box beside it), and the **accent layer
else is a calm neutral gray scale; the accent does all the punch. Waveforms and the carries all the punch** — used with intent for the *live/active/selected* layer and for a
keyboard strip's active zone glow in the accent; inactive elements are quiet gray. This is small number of categorical distinctions only. Everything else stays quiet grey. Waveforms
the "Serum / Vital / modern Arturia" idiom — vivid-accent-on-near-black. and the keyboard strip's active zone glow in the **primary** accent; inactive/categorical
elements pick up secondary/tertiary. This is the "Serum / Vital / modern Arturia" idiom —
accent-on-dark — but **pastel, not neon,** and on **REAPER-grey rather than near-black**.
- **Feel:** a 2026 instrument. Sleek, focused, the accent guides the eye to what's live. **Accent layer (DS-2 revised — three pastel accents, replacing the single electric cyan):**
- **Accent:** one vivid hue (cyan leads). Clears WCAG-large comfortably at full saturation Daniel's call — "it's too CYAN, I prefer pastel hues" — swaps the one vivid cyan for a
on near-black — "push to the floor from the vibrant side." A second dimmer tint for **three-hue pastel family**. Concrete *starting* values (the implementer locks final hex
hover. **This is the settled target** — the strong-but-safe center; the single-accent against the WCAG tests — §2.1):
discipline is easy to keep coherent across VST + embed + panel.
- **Watch:** a single vivid accent can feel "gamer" if over-applied — discipline required
(accent = live only, never chrome). One hue is a commitment; changing it later is a
palette sweep (cheap in the shared kit — one constants block — but a sweep).
### Direction C — "Spectral" (bold; SETTLED for the keyboard strip) | Role | Pastel | Starting RGB (hex) | Job |
|---|---|---|---|
| `accent/primary` | pastel lime green | `~176,224,152` (`#B0E098`) | the live/active/selected signal — the eye-magnet |
| `accent/secondary` | pastel teal | `~132,214,208` (`#84D6D0`) | categorical role A (non-active zones, a second cluster) |
| `accent/tertiary` | pastel purple | `~194,170,232` (`#C2AAE8`) | categorical role B (tertiary zones, a distinct affordance class) |
| `accent/hot` | brighter primary tint | `~200,236,178` (`#C8ECB2`) | hover / live / drag feedback (a lighter pastel-lime) |
Lean *all the way* into vibrancy and depth. Near-black base, but the accent is a These are light-ish, low-saturation tints. On the **REAPER-grey surfaces** (`bg/cell`
**two-color gradient** — zones and the waveform aren't a flat accent, they're a `#3a3a3a`) they still clear **AA-large (3:1)** and the **state-indicator** floor — but the
**hue-mapped gradient** (e.g. low notes cool-blue → high notes hot-magenta across the margin is **much smaller than it was on near-black** (roughly ~6:17:1 on grey vs. ~15:1
keyboard strip; the waveform filled with a vertical accent gradient). Selection glows; the on `#12121x`). This is a real DS-2-revision tension: **the greyer background pulls the
active zone has a soft outer bloom (`LICE_GradRect` halo). Multi-zone keymaps become pastels toward the floor** at the same time the "keep it soft" rule pulls them away from
genuinely *beautiful* — each zone a band of the spectrum — which is exactly the saturation. Approach from the **soft side** (§2.1) — keep them as pastel as possible while
"multi-zone-in-one-instance" capability that RS5K structurally lacks (the sharpest still clearing the floor on **grey, not near-black** — but **if any pastel used as a state
"better than RS5K" claim, made *visual*). indicator / active fill drops below 3:1 on `bg/cell`, nudge that hue slightly deeper /
more saturated until it clears** (hue stays lime/teal/purple; only value/chroma moves a
little). Re-verify against the grey ladder, not the old near-black values.
- **Feel:** premium, almost visualizer-grade. The keyboard strip becomes a signature — a - **Feel:** a 2026 instrument, softer and calmer than a neon single-accent — the pastel
spectrum you play across. family guides the eye to what's live (primary) and quietly categorizes the rest.
- **Watch — the tight pairs (flag for the implementer):**
- **Body text *on* a pastel fill.** When a pastel accent is a *fill* and `text/primary`
(light-grey `~220,220,220` / `#dcdcdc`) or a dark label sits on top, the pair can drop
below **AA 4.5:1** — pastels are mid-to-light, so light-grey-on-pastel is the risky
combination.
Where an accent is used as a filled surface behind body text, either (a) use a *dark*
near-black label on the light pastel (which clears easily) or (b) darken that specific
pastel fill until near-white clears 4.5:1. The theme test must cover every actual
text-on-accent-fill pair the kit draws.
- **Secondary vs. tertiary distinguishability.** Pastel teal and pastel purple are both
cool-ish and desaturated; verify they read as *distinct* categories, not two greys,
when adjacent (e.g. neighboring zone bands). Nudge tertiary warmer/more-violet if they
muddy.
- **Three pastels can drift "candy" if over-applied** — same discipline as before: accent
= live + a few categorical marks, never chrome. Coherence rule: keep all three clearly
in the pastel family (no one of them creeping back to full saturation).
- **Reversibility:** unchanged — all three accents live in the one constants block, so a
future re-pick (or a saturation nudge) is still a single-file change.
### Direction C — "Spectral" (bold; SETTLED for the keyboard strip; REVISED to a pastel sweep)
Lean into depth via a **hue-mapped gradient** across the signature surface: zones and the
waveform aren't a flat accent — the keyboard strip is a **spectrum you play across** (low
notes cool → high notes hot), the waveform filled with a vertical accent gradient. Selection
glows; the active zone has a soft outer bloom (`LICE_GradRect` halo, a *static* drawn state
— §3.5). Multi-zone keymaps become genuinely *beautiful* — each zone a band of the
spectrum — which is exactly the "multi-zone-in-one-instance" capability that RS5K
structurally lacks (the sharpest "better than RS5K" claim, made *visual*).
**How the spectral ramp relates to the three pastel accents (DS-2 revised).** The strip
keeps a **full low→high sweep**, but it is now a **pastel spectral ramp anchored on the
three accent hues** rather than a neon cool-blue→hot-magenta gradient — so the signature
surface stays coherent with "pastel, not neon" and visibly belongs to the same palette as
the rest of the UI. Concretely: the ramp runs **pastel-lime (primary, low) → pastel-teal
(secondary, mid) → pastel-purple (tertiary, high)** as a three-stop gradient through the
accent constants (or a slightly wider pastel arc that passes *through* those three anchor
points), keeping every stop in the pastel band. This ties the spectrum to the palette:
the same three hues that mean "live / category A / category B" elsewhere are the endpoints
and midpoint of the spectrum here, so the strip reads as an extension of the accent system,
not a separate neon flourish. The **active** zone still lifts to `accent/primary` +
its bloom, so "which zone is live" stays unambiguous over the categorical spectral bands.
- **Feel:** premium, almost visualizer-grade — but soft and cohesive, a pastel spectrum
rather than a rave. The keyboard strip is the signature; it is unmistakably the same
palette as the panel.
- **Settled scope:** **C's spectral treatment lands on the keyboard strip** (the signature - **Settled scope:** **C's spectral treatment lands on the keyboard strip** (the signature
surface), over Direction B's Neon-Console chrome everywhere else. This is the surface), over Direction B's Neon-Console chrome (now pastel-accented) everywhere else.
"modern-sleek center with one bold, identity-defining surface" Daniel chose — dial the This is the "modern-sleek center with one bold, identity-defining surface" Daniel chose —
spectrum up (full C across more surfaces) or down (pure B) after seeing it on the DAW. dial the spectrum wider (a broader pastel arc) or narrower (tight to the three anchors)
after seeing it on the DAW.
- **Watch:** gradients/bloom are easy to overdo into "toy"; the glow must stay a static - **Watch:** gradients/bloom are easy to overdo into "toy"; the glow must stay a static
drawn state, never a pulse (§3.5); risks reading as *flashy* over *fast* if the speed drawn state, never a pulse (§3.5); a pastel ramp has *less* inter-note contrast than a
neon one, so verify adjacent zone bands stay distinguishable (the same secondary-vs-
tertiary caution as Direction B); risks reading as *flashy* over *fast* if the speed
discipline slips. discipline slips.
**Settled recommendation, now spec:** build the **kit palette abstractly** (roles, not **Settled recommendation, now spec:** build the **kit palette abstractly** (roles, not
hardcoded colors — §2.1) so the direction is *one file of constants*; **default to hardcoded colors — §2.1) so the direction is *one file of constants*; **default to
Direction B (Neon Console)** with **Direction C's spectral keyboard strip** as the Direction B (Neon Console) with the three-accent pastel system** (primary lime / secondary
signature surface. Because the palette is abstract, a later re-pick is one file. teal / tertiary purple) and **Direction C's pastel spectral keyboard strip** as the
signature surface. Because the palette is abstract, a later re-pick — or a saturation nudge
within the pastel intent — is one file.
--- ---
@@ -445,8 +585,10 @@ not a forecast of them. If L2 starts before M11 lands, it designs against a movi
### 5.3 `L3` — VST editor + embed-strip restyle (GATED on Phase S landing on dev) ### 5.3 `L3` — VST editor + embed-strip restyle (GATED on Phase S landing on dev)
The ReaSampler 9000 VST editor (`IPlugView` LICE surface) and the S6 embed strip get the The ReaSampler 9000 VST editor (`IPlugView` LICE surface) and the S6 embed strip get the
full kit treatment: cached-font text, kit component draws, the B+spectral palette, the full kit treatment: kit cached-font text (§3.1 — the kit's current face, no bundled font),
spectral keyboard strip as the signature surface, hover/pressed/drag states everywhere. kit component draws, the **B palette with the three-accent pastel system**
(primary lime / secondary teal / tertiary purple), the **pastel spectral keyboard strip**
as the signature surface, hover/pressed/drag states everywhere.
**L3 is explicitly GATED: these surfaces do not exist on dev yet.** The VST editor, the **L3 is explicitly GATED: these surfaces do not exist on dev yet.** The VST editor, the
embed strip, and the keyboard strip live in Phase S, which has landed on the phase-s embed strip, and the keyboard strip live in Phase S, which has landed on the phase-s
@@ -495,18 +637,49 @@ is gated on Phase S reaching dev. Phase S feature work proceeds in parallel, ung
"temple os" look is drawing at LICE's floor, not hitting its ceiling. No new dependency, "temple os" look is drawing at LICE's floor, not hitting its ceiling. No new dependency,
fully consistent with D-A. fully consistent with D-A.
**Fork DS-2 — visual direction. SETTLED: Direction B (Neon Console) + Direction C's **Fork DS-2 — visual direction. SETTLED 2026-07-26: Direction B (Neon Console) + Direction
spectral keyboard strip.** C's spectral keyboard strip. REVISED 2026-07-26 (Daniel): three-accent pastel system.**
- **Settled:** **B** (near-black + one vivid accent, modern soft-synth idiom) as the - **Settled (original):** **B** (near-black + one vivid accent, modern soft-synth idiom) as
system-wide target, with **C's spectral, hue-mapped keyboard strip** as the signature the system-wide target, with **C's spectral, hue-mapped keyboard strip** as the signature
surface — the multi-zone-in-one-instance advantage made visual. surface — the multi-zone-in-one-instance advantage made visual. The single accent was
**electric cyan**.
- **Revised (2026-07-26, Daniel) — accent layer:** the accent layer changes from **one
electric cyan** to a **three-accent pastel system** — **primary = pastel lime green,
secondary = pastel teal, tertiary = pastel purple**. The spectral keyboard strip becomes
a **pastel** sweep anchored on the three accents (§4 Direction C). This revision is
**palette-only.** *Rationale (Daniel, verbatim intent):* "the layout is a huge
improvement… the only thing I want to change is the cyan — it's too CYAN, I prefer pastel
hues… a three-color accent system, primary / secondary / tertiary as pastel lime green /
pastel teal / pastel purple" — too cyan; prefers pastel; wants three-accent
primary/secondary/tertiary.
- **Revised (2026-07-26, Daniel) — neutral surfaces:** the neutral role ladder moves
**from near-black up into REAPER's mid-grey theme family**, so the dock reads as *part of
REAPER, not a black slab bolted on beside it*. Concrete starting ladder (§2.1): `bg/base`
`#2b2b2b` (REAPER chrome), `bg/panel``#333333`, `bg/cell``#3a3a3a` (REAPER track
bg), `line/hairline``#4a4a4a`, `text/primary``#dcdcdc`, `text/dim``~#a0a0a0`+.
The **elevation-ladder discipline is unchanged** (base < panel < cell by a few %, micro-
gradient + inner highlight/shadow carry elevation, not hard borders). This shifts the WCAG
burden (§2.1 re-read): **`text/dim` on grey** and **the three pastels as state indicators
on grey** are now the tight pairs — mid-grey-on-mid-grey for dim text, shrunken pastel
cushion for the accents — the implementer re-verifies both against the grey ladder, not
near-black. *Rationale (Daniel, verbatim):* "we should adjust the neutral colors to be
more grey to match my REAPER theme… Text and surfaces should match" — the dock should
read as part of REAPER, not a black box.
- **Font upgrade — considered and DECLINED (Daniel, 2026-07-26).** A stylish/bundled-font
upgrade was on the table in an earlier draft of this revision and Daniel **declined it**:
he does not want to bundle and redistribute a font. The kit keeps its **current**
cached-font face; no new typeface is specified (§3.1). Recorded here so the question is
not re-raised — the §3.1 win is the AA cached-glyph mechanism, not the face.
- **Not selected:** **A Studio Rack** (evolutionary green — retained only as a fallback if - **Not selected:** **A Studio Rack** (evolutionary green — retained only as a fallback if
B/C read too loud for pro-audio). B/C read too loud for pro-audio).
- **Reasoning preserved:** modern-sleek center + one bold identity surface; Daniel reacts - **Reasoning preserved:** modern-sleek center + one bold identity surface; the revision
better to bold than to conservative. The kit palette is abstract (roles, one constants keeps that shape but trades neon punch for pastel calm (Daniel's taste, stated on seeing
block), so this is **reversible for ~one file** — a starting direction, not a permanent the landed layout) and adds categorical meaning via the accent trio. The kit palette is
lock. abstract (roles, one constants block — now three accent roles instead of one), so this is
still **reversible for ~one file** — a starting direction, not a permanent lock. The final
hex is the implementer's to lock against the theme module's WCAG tests, staying within the
pastel intent (the "soft-side" floor discipline, §2.1).
**Fork DS-3 — panel refresh scope. SETTLED: thorough layout redesign (not a light **Fork DS-3 — panel refresh scope. SETTLED: thorough layout redesign (not a light
re-skin).** re-skin).**
@@ -539,7 +712,9 @@ re-skin).**
- **Read-only-over-bank untouched** — this is look-and-feel; no data-ownership change. - **Read-only-over-bank untouched** — this is look-and-feel; no data-ownership change.
- **The instrument keeps the same VST3 class UID / component-state contract** — a visual - **The instrument keeps the same VST3 class UID / component-state contract** — a visual
refresh is not a compat event (Phase S concern; noted for when L3 runs). refresh is not a compat event (Phase S concern; noted for when L3 runs).
- **Windows-only (D5)** — the font/GDI/HFONT choices assume Windows; no cross-platform - **Windows-only (D5)** — the extension's GDI/HFONT path assumes Windows; no cross-platform
font fallback concern. font-fallback concern. The kit keeps its current cached-font face (no bundled font — DS-2
declined the font upgrade), so §3.1 introduces no new redistribution or cross-platform
font obligation.
- **Phase S is not gated on Phase L** — S7S13 proceed in parallel; they adopt the kit - **Phase S is not gated on Phase L** — S7S13 proceed in parallel; they adopt the kit
when it lands. Phase L (L1/L2) is the live work on dev; L3 waits for Phase S to reach dev. when it lands. Phase L (L1/L2) is the live work on dev; L3 waits for Phase S to reach dev.