diff --git a/CONTEXT.md b/CONTEXT.md index de61883..fb392b3 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -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:1–7: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:1–7: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 S10–S13 UX), the kit is the **one source of drawing**: if S10–S13 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) diff --git a/PLAN.md b/PLAN.md index 2146289..465e15b 100644 --- a/PLAN.md +++ b/PLAN.md @@ -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 > modules — do not import vwnd's retained-mode object model wholesale. > - **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 as the signature surface. The kit palette is abstract (roles, one -> constants block), so the direction is a single-file change. +> keyboard strip. SETTLED 2026-07-26, REVISED 2026-07-26 (Daniel) — 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`, `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:1–7: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 > out the full button inventory (including M11's action-button additions) intuitively, > uncluttered, and useful — then applies the kit. Sequenced after M11 merges. ## 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 -strip up to the settled B+spectral look via the L1 kit: cached-font text, kit component -draws, the Neon-Console palette, the **spectral keyboard strip** as the signature surface -(DS-2), and hover/pressed/drag states throughout. CONTEXT.md §Phase L (VST restyle + the +strip up to the settled-and-revised **B + three-accent pastel** look via the L1 kit: kit +cached-font text (§3.1 — the kit's current face, no font change), kit component draws, 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. -**Verify (in DAW):** the VST editor + embed strip render in the settled B+spectral language -through the L1 kit — AA cached-font text, gradient/rounded kit components, the spectral -keyboard strip, working hover/pressed/drag; the VST3 class UID is unchanged (a visual -refresh is not a compat event). +**Verify (in DAW):** the VST editor + embed strip render in the settled B + three-accent +pastel language through the L1 kit — kit AA cached-font text, gradient/rounded kit +components, the pastel spectral keyboard strip, working hover/pressed/drag; the VST3 class +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 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 @@ -335,14 +352,18 @@ work. > 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. -- [ ] 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.) +- [ ] Route the VST editor's + embed strip's text through the kit's cached-font `text()` + (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 - rows, waveform, segmented controls) in the B (Neon Console) palette; add hover/pressed/ - drag states. (Gated.) -- [ ] Apply **Direction C's spectral treatment to the keyboard strip** (hue-mapped zones, - glow-on-active as a static drawn state — never a pulse, per the speed constraint) as the - signature surface; VST3 class UID unchanged. (Gated.) + rows, waveform, segmented controls) in the B (Neon Console) palette — **REAPER-grey + neutrals** (`bg/base` `#2b2b2b` / `bg/panel` `#333333` / `bg/cell` `#3a3a3a`) with the + **three pastel accents** (primary lime = live layer; secondary teal / tertiary purple = + categorical); add hover/pressed/drag states. (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 ``` diff --git a/docs/product/visual-design-language.md b/docs/product/visual-design-language.md index dcc6e49..f31f730 100644 --- a/docs/product/visual-design-language.md +++ b/docs/product/visual-design-language.md @@ -12,11 +12,15 @@ written after Daniel DAW-tested the S1–S6 instrument: > 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 -**SETTLED (Daniel, 2026-07-26)** — recorded in §6 with the reasoning preserved. 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. +**SETTLED (Daniel, 2026-07-26)** — recorded in §6 with the reasoning preserved. **DS-2 was +revised 2026-07-26 (Daniel)** from the single electric-cyan accent to a **three-accent +pastel system** (primary/secondary/tertiary = pastel lime green / pastel teal / pastel +purple) — see §6. (A stylish-font upgrade was considered and **declined** by Daniel — no +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 > 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 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. -- **DS-2 SETTLED (2026-07-26): Direction B ("Neon Console") + Direction C's spectral - keyboard strip** as the signature surface. Three visual directions are in §4; B+spectral - is the settled target. "Speed is the selling point" is a **design constraint**, not a - tagline: the UI must *feel* instant (§3.5). +- **DS-2 SETTLED (2026-07-26), REVISED (2026-07-26): Direction B ("Neon Console") + Direction + C's spectral keyboard strip** as the signature surface — now with a **three-accent pastel + system** (primary = pastel lime green, secondary = pastel teal, tertiary = pastel purple) + 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 a light reskin.** L2 lays out the *full button inventory* (including M11's additions) 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) 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/panel` | a raised region (list, waveform pane) | — (implicit) | 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) | -| `line/hairline` | separators | `60,60,66` | keep, 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/dim` | secondary / units | — | a dimmer step, still **AA-large (3:1) minimum** — the WCAG floor, not below it | -| `accent` | selection, active, focus | `120,200,160` | **Direction B: one vivid hue** (§4) — this is where the punch lives | -| `accent/hot` | hover / live / drag feedback | — (absent) | a brighter accent tint; **today there is no hover color at all** | +| `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) | **≈ `51,51,51` (`#333333`)** — one step lighter than base; elevation reads without a border | +| `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` | **≈ `74,74,74` (`#4a4a4a`)** — a subtle step above cell; use sparingly, elevation should carry most separation | +| `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 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/primary` | live / active / selected layer | `120,200,160` | **pastel lime green** (§4) — the one that means "this is live"; where the punch lives | +| `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 | -**WCAG-floor discipline (the "punch" rule, concretely):** for each text-on-surface pair, -pick the *most* saturated/vibrant accent that still clears its contrast floor — AA 4.5:1 -for body text, 3:1 for large text and for UI-state indicators (selection borders, active -fills). Do not retreat to safe grays "to be sure." The floor is the target, approached -from the vibrant side. +**Three-accent role assignment (DS-2 revised).** The accent layer is now *three* pastel +hues, not one, so the palette can carry categorical meaning without leaning on saturation +Daniel finds too loud. The coherent assignment: +- **`accent/primary` = pastel lime green** — the single "this is live/active/selected" + 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:1–4.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:1–7: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 @@ -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` (~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. -- **Font choice:** a clean UI sans is available on every Windows target (Segoe UI is the - safe system default; the kit takes an `HFONT`, so the exact face is a one-line change). - For the numeric `value` role, a tabular/mono face (Consolas is universally present) - keeps dragged numbers from reflowing. Windows-only (D5) means no cross-platform - font-fallback worry. +- **Font face — keep the kit's current cached-font face (DS-2: no font change).** A + stylish/bundled-font upgrade was considered and **declined by Daniel** — he does not want + to bundle and redistribute a font. So the kit keeps its **current** face; this doc + specifies no new typeface. The win at §3.1 is entirely the *mechanism* — routing all text + 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, 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 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 - (§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 @@ -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 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 -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) @@ -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 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 -vivid accent** (electric cyan `~60,200,235` leads; hot magenta `~235,70,170` is the -bolder sub-option), used with intent for the *live/active/selected* layer only. Everything -else is a calm neutral gray scale; the accent does all the punch. Waveforms and the -keyboard strip's active zone glow in the accent; inactive elements are quiet gray. This is -the "Serum / Vital / modern Arturia" idiom — vivid-accent-on-near-black. +A modern soft-synth / plugin look: **REAPER-theme mid-grey neutrals** (`bg/base` ≈ +`#2b2b2b`, `bg/panel` ≈ `#333333`, `bg/cell` ≈ `#3a3a3a` — the grey ladder in §2.1, matching +Daniel's REAPER theme so the dock is not a black box beside it), and the **accent layer +carries all the punch** — used with intent for the *live/active/selected* layer and for a +small number of categorical distinctions only. Everything else stays quiet grey. Waveforms +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:** one vivid hue (cyan leads). Clears WCAG-large comfortably at full saturation - on near-black — "push to the floor from the vibrant side." A second dimmer tint for - hover. **This is the settled target** — the strong-but-safe center; the single-accent - 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). +**Accent layer (DS-2 revised — three pastel accents, replacing the single electric cyan):** +Daniel's call — "it's too CYAN, I prefer pastel hues" — swaps the one vivid cyan for a +**three-hue pastel family**. Concrete *starting* values (the implementer locks final hex +against the WCAG tests — §2.1): -### 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 -**two-color gradient** — zones and the waveform aren't a flat accent, they're a -**hue-mapped gradient** (e.g. low notes cool-blue → high notes hot-magenta across the -keyboard strip; the waveform filled with a vertical accent gradient). Selection glows; the -active zone has a soft outer bloom (`LICE_GradRect` halo). 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*). +These are light-ish, low-saturation tints. On the **REAPER-grey surfaces** (`bg/cell` ≈ +`#3a3a3a`) they still clear **AA-large (3:1)** and the **state-indicator** floor — but the +margin is **much smaller than it was on near-black** (roughly ~6:1–7:1 on grey vs. ~15:1 +on `#12121x`). This is a real DS-2-revision tension: **the greyer background pulls the +pastels toward the floor** at the same time the "keep it soft" rule pulls them away from +saturation. Approach from the **soft side** (§2.1) — keep them as pastel as possible while +still clearing the floor on **grey, not near-black** — but **if any pastel used as a state +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 - spectrum you play across. +- **Feel:** a 2026 instrument, softer and calmer than a neon single-accent — the pastel + 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 - surface), over Direction B's Neon-Console chrome everywhere else. This is the - "modern-sleek center with one bold, identity-defining surface" Daniel chose — dial the - spectrum up (full C across more surfaces) or down (pure B) after seeing it on the DAW. + surface), over Direction B's Neon-Console chrome (now pastel-accented) everywhere else. + This is the "modern-sleek center with one bold, identity-defining surface" Daniel chose — + 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 - 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. **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 -Direction B (Neon Console)** with **Direction C's spectral keyboard strip** as the -signature surface. Because the palette is abstract, a later re-pick is one file. +Direction B (Neon Console) with the three-accent pastel system** (primary lime / secondary +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) 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 -spectral keyboard strip as the signature surface, hover/pressed/drag states everywhere. +full kit treatment: kit cached-font text (§3.1 — the kit's current face, no bundled font), +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 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, fully consistent with D-A. -**Fork DS-2 — visual direction. SETTLED: Direction B (Neon Console) + Direction C's -spectral keyboard strip.** +**Fork DS-2 — visual direction. SETTLED 2026-07-26: Direction B (Neon Console) + Direction +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 - system-wide target, with **C's spectral, hue-mapped keyboard strip** as the signature - surface — the multi-zone-in-one-instance advantage made visual. +- **Settled (original):** **B** (near-black + one vivid accent, modern soft-synth idiom) as + 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. 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 B/C read too loud for pro-audio). -- **Reasoning preserved:** modern-sleek center + one bold identity surface; Daniel reacts - better to bold than to conservative. The kit palette is abstract (roles, one constants - block), so this is **reversible for ~one file** — a starting direction, not a permanent - lock. +- **Reasoning preserved:** modern-sleek center + one bold identity surface; the revision + keeps that shape but trades neon punch for pastel calm (Daniel's taste, stated on seeing + the landed layout) and adds categorical meaning via the accent trio. The kit palette is + 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 re-skin).** @@ -539,7 +712,9 @@ re-skin).** - **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 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 - font fallback concern. +- **Windows-only (D5)** — the extension's GDI/HFONT path assumes Windows; no cross-platform + 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** — S7–S13 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.