diff --git a/docs/COMPLETED.md b/docs/COMPLETED.md index 48ec0d5..6f09ad1 100644 --- a/docs/COMPLETED.md +++ b/docs/COMPLETED.md @@ -321,13 +321,16 @@ state per instance, 6 additional `DeckParam` ids. this reading stands. - **Loop markers moved from `AccentTertiary` to `AccentSecondary`** — they collided exactly with the envelope trace (RGB delta 0) in the same overlay rect. Daniel - ruled. The palette is under active change on a separate branch, so the specific hex - values are in flux (see `docs/TODO.md`). + ruled. The palette has since settled: `AccentSecondary` is `#38A8A0` (see the + palette-rework entry below and `src/core/ui/CLAUDE.md`). -**Still open — not closed by this track.** The envelope overlay's contrast against -the waveform (tertiary purple, measured 1.37:1, below the 3:1 indicator floor) awaits -Daniel's eye on a build; pinned as a flagged deviation in `tests/test_theme.cpp`. See -`docs/TODO.md`. +**Left open by this track, resolved later.** The envelope overlay's contrast against +the waveform (tertiary purple, measured 1.37:1, below the 3:1 indicator floor) awaited +Daniel's eye on a build; pinned as a flagged deviation in `tests/test_theme.cpp` at the +time. Resolved by the ad-hoc palette rework below (`91f71f9`/`a19d645`): the trace moved +off `AccentTertiary` onto a new `Role::OverlayTrace` (`#816AA6`), clearing the floor at +3.07:1 — the mathematical ceiling for the pairing. See the palette-rework entry below and +`src/core/ui/CLAUDE.md`. ### Ξ-W1-T1 — tracking-consolidation @@ -381,3 +384,29 @@ every beats↔seconds↔ms conversion), and `note_program` (`Velocity`, the deno which sees both the bytes it read and the value construction produced. `NoteProgram` deliberately carries no MIDI note number — render pitch is deferred to Ξ-W2 as an additive field. + +### Palette rework — accent/secondary darkening + overlay/trace role (ad-hoc, Daniel's request) + +Two commits (`91f71f9`, `a19d645`) resolve the envelope-overlay contrast wart Θ-W3-T2 left +open (see above). `accent/secondary` darkened `#84D6D0` → `#38A8A0`; the keyboard strip's +spectral mid stop decoupled from `accent/secondary` into its own constant, since the +darkening had inverted the ramp's lo→mid→hi luminance ordering. A new `Role::OverlayTrace` +(`#816AA6`) was added and the envelope trace + handles repointed onto it: the trace now +measures **3.07:1** against the waveform — the mathematical ceiling for any single color +sitting between the primary accent and `bg/base` (9.41:1 apart; `sqrt(9.41) ≈ 3.068`), +`#816AA6` landing at 99.94% of that optimum. Two below-floor pairs remain deliberately +accepted — the trace inside the 20%-alpha loop-span fill (2.25:1) and against the +waveform's `line/hairline` zero-line (1.92:1) — both asserted as pinned ranges in +`tests/test_theme.cpp` so either direction of drift fails the build. + +Separately: the bank panel's region title enlarged into WCAG large class via a new +`Font::RegionTitle` (19px bold); `theme.h`'s large-text thresholds were corrected (a prior +revision had them ~25% low, letting 15px semibold self-classify as Large); `compositeOver` +was added to `theme` (the composited-fill arithmetic the loop-span-fill contrast pair +depends on); and the grabbed envelope handle was repointed off hue onto a size + ring +treatment, since no two values that clear the overlay-trace ceiling differ enough to carry +a state by color alone. + +Full detail — the two-neighbour contrast rule, the WCAG threshold correction, and the +accepted below-floor pairs — lives in `src/core/ui/CLAUDE.md` and +`docs/product/visual-design-language.md` §4 Direction B; not duplicated here. diff --git a/docs/TODO.md b/docs/TODO.md index af6a8ea..5f904dc 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -179,17 +179,3 @@ Forward-looking follow-ups. Deferred by decision, not oversight — each entry r **Priority / risk.** Low / deferred. Mitigated in the meantime: the console message names the stranded file's project-relative path, so the operator can recover or remove it rather than discovering it later as an unexplained orphan. **Done looks like.** Switching projects mid-record leaves the recorded file with a ledger record in the project it belongs to, so a later prune of that project can reclaim it normally. - -## Envelope overlay's tertiary-purple trace fails the 3:1 indicator contrast floor against the waveform - -**Context (what shipped — Θ-W3-T2, staged-envelope-curves).** The overlay recolor moved every envelope's segment trace to `Role::AccentTertiary` (purple), specifically because it separates from the primary-green waveform underneath it more than the previously-used secondary blue did — `tests/test_theme.cpp`'s `testOverlayAccentSeparatesFromTheWaveformAccent` pins that the tertiary pairing measures a HIGHER contrast than the retired secondary one against the same waveform color. - -**The wart.** Even the improved pairing measures **~1.37:1**, well below the **3:1** floor `theme.h` states as the indicator-class contrast floor everywhere else in the kit. The test pins the measured value as a KNOWN, HELD deviation rather than asserting the floor. - -**Intended fix.** Not yet specified — awaiting Daniel's eye on a running build before choosing a new tertiary hue or a different palette approach. - -**The constraint the fix MUST handle.** A separate palette branch is in flight (worktree `palette-darker-teal`) and may change the tertiary/secondary hues involved; a fix landed here could collide with or be superseded by that branch. Also: whatever fix lands must not reopen the loop-marker/envelope-overlay role collision this same track resolved by moving loop markers to `AccentSecondary` — a new tertiary hue must keep that separation too. - -**Priority / risk.** Not yet triaged — pinned as a flagged deviation in `tests/test_theme.cpp`, open pending a visual pass. - -**Done looks like.** The envelope overlay trace clears the 3:1 indicator floor against the primary-green waveform, `tests/test_theme.cpp`'s pinned deviation is replaced with a floor assertion matching every other indicator pairing, and the fix is reconciled with whatever the in-flight palette branch lands.