From 7961458edd9b4b4fd06d2242607f83f41d0cd873 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Mon, 27 Jul 2026 00:14:38 -0400 Subject: [PATCH] docs: archive Phase L L5 to COMPLETED; reconcile CLAUDE.md + CONTEXT.md + PLAN.md --- CLAUDE.md | 10 ++++- COMPLETED.md | 53 ++++++++++++++++++++++ CONTEXT.md | 42 +++++++---------- PLAN.md | 125 ++++++++------------------------------------------- 4 files changed, 97 insertions(+), 133 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 3706a99..74f8e6a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Repo identity and current state -The CMake project and binary are now named `reaper_reasampler`. This is **ReaSampler** — a per-project audio sample-bank capture tool. The MPE modules (`mpe_model`, `mpe_view`) have been removed. M0–M8 are complete (bank_model, peaks, capture offline+realtime, persist, bank_panel, insert, capture action family, RealtimeRecordBackend, tail T1+T2+T1-followons). Phase B multi-bank (B1–B5, B-cap), Phase D1/D2 Design View (D1–D5, D2-W1–W3-B), Phase V versioning/beta-channel (V1/V3, V4), M10 provenance + re-capture from source, Phase R Reclaim (R1–R3: prune-reconcile core, dry-run shell, guarded deletion + action + panel button), M11 in full (batch capture, action-button strip + keybinding labels, conform-on-insert verified-extant, native OS drag-out), Phase L L1 (shared LICE drawing kit: `theme`/palette module, `component_geometry` geometry helpers, `draw_kit` shell, GDI DrawText retired in `bank_panel`), Phase L L2 (dock-panel layout redesign: `action_bar` pure task-grouped layout module, full M11-aware button inventory placed by task cluster, `bank_panel` redesigned through the L1 kit), and Phase L L4 (dock-panel button layout enhancement: three-zone layout — top capture/placement/maintenance toolbar, bottom Design-View tagging/switching toolbar, footer narrow-toggle + Tail-button + Prune; `footer_bar` pure module + `footer_bar_tests`; `ActionCluster::Tagging`/`Switching` in `action_bar`) have all landed. M9 slots deferred indefinitely. The *discipline* — pure REAPER-free testable core split from REAPER-facing shells — is **preserved** throughout. +The CMake project and binary are now named `reaper_reasampler`. This is **ReaSampler** — a per-project audio sample-bank capture tool. The MPE modules (`mpe_model`, `mpe_view`) have been removed. M0–M8 are complete (bank_model, peaks, capture offline+realtime, persist, bank_panel, insert, capture action family, RealtimeRecordBackend, tail T1+T2+T1-followons). Phase B multi-bank (B1–B5, B-cap), Phase D1/D2 Design View (D1–D5, D2-W1–W3-B), Phase V versioning/beta-channel (V1/V3, V4), M10 provenance + re-capture from source, Phase R Reclaim (R1–R3: prune-reconcile core, dry-run shell, guarded deletion + action + panel button), M11 in full (batch capture, action-button strip + keybinding labels, conform-on-insert verified-extant, native OS drag-out), Phase L L1 (shared LICE drawing kit: `theme`/palette module, `component_geometry` geometry helpers, `draw_kit` shell, GDI DrawText retired in `bank_panel`), Phase L L2 (dock-panel layout redesign: `action_bar` pure task-grouped layout module, full M11-aware button inventory placed by task cluster, `bank_panel` redesigned through the L1 kit), Phase L L4 (dock-panel button layout enhancement: three-zone layout — top capture/placement/maintenance toolbar, bottom Design-View tagging/switching toolbar, footer narrow-toggle + Tail-button + Prune; `footer_bar` pure module + `footer_bar_tests`; `ActionCluster::Tagging`/`Switching` in `action_bar`), and Phase L L5 (dock-panel button refinements: top-bar overflow menu for Batch Items/Batch Razor/Capture RT via `overflow_menu` pure module; custom LICE-kit hover-delay tooltips via `tooltip` pure module; four opposite-mode Item/Track tag buttons + Show Both on the bottom toolbar; Toggle + Activate-Arrange/Design buttons removed; grouping spacing widened — `mode_enable` pure opposite-mode enablement predicate) have all landed. M9 slots deferred indefinitely. The *discipline* — pure REAPER-free testable core split from REAPER-facing shells — is **preserved** throughout. CONTEXT.md is the authoritative spec and build roadmap. Read it first for any non-trivial task. Every REAPER API name cited there is correct-by-intent; verify argument order, types, and flag values against `vendor/reaper-sdk/sdk/reaper_plugin_functions.h` before use. @@ -46,6 +46,9 @@ Key targets (see CMakeLists.txt for the full list): | `component_geometry_tests` | executable | Pure unit tests for `component_geometry` — no REAPER, no DAW. | | `action_bar_tests` | executable | Pure unit tests for `action_bar` — no REAPER, no DAW. | | `footer_bar_tests` | executable | Pure unit tests for `footer_bar` — no REAPER, no DAW. | +| `overflow_menu_tests` | executable | Pure unit tests for `overflow_menu` — no REAPER, no DAW. | +| `mode_enable_tests` | executable | Pure unit tests for `mode_enable` — no REAPER, no DAW. | +| `tooltip_tests` | executable | Pure unit tests for `tooltip` — no REAPER, no DAW. | | `reaper_reasampler` | loadable module | The actual extension binary (`.dll` / `.dylib` / `.so`). | ### Beta channel build (Phase V, V4) @@ -91,11 +94,14 @@ There is no hot-reload. Copy the built binary into REAPER's `UserPlugins/` folde - `component_geometry` — Phase L pure component geometry/hit-test helpers (L1): button/slider/list-row geometry + hover hit-test. No LICE or REAPER types. Mirror of `mode_switch`/`bank_grid`. - `action_bar` — Phase L pure task-grouped action-bar layout/hit-test (L2 + L4): clusters (Capture / Placement / Maintenance / Tagging / Switching), per-button label + keybinding micro sub-rects, whole-trailing-button overflow, point→index hit-test. `ActionCluster::Tagging` and `ActionCluster::Switching` added in L4 for the bottom Design-View toolbar. No LICE or REAPER types. Mirror of `mode_switch`/`bank_grid`/`action_buttons`. - `footer_bar` — Phase L pure footer layout/hit-test (L4): narrow `[Arrange|Design]` mode-toggle geometry + per-mode count label, Tail button, and Prune placement in the panel footer strip. No LICE or REAPER types. Mirror of `mode_switch` / `prune_button`. +- `overflow_menu` — Phase L pure overflow-menu-button geometry/reserve/hit-test (L5): right-anchored More (⋯) button rect computation and hit-test for the top-toolbar overflow. No LICE or REAPER types. Mirror of `prune_button`. +- `mode_enable` — Phase L pure opposite-mode enablement predicate (L5): given the active mode, computes per-button live/disabled state for the four Item/Track × Arrange/Design tag buttons on the bottom toolbar. No LICE or REAPER types. +- `tooltip` — Phase L pure tooltip placement + prefix-strip (L5): custom LICE-kit hover-delay tooltip geometry and text derivation — strips the `ReaSampler:` display prefix from the registered action phrase; tooltip box width clamped to the client rect. No LICE or REAPER types. **REAPER-facing shells:** - `capture` — `ICaptureBackend` interface; `OfflineRenderBackend` (deterministic default) and `RealtimeRecordBackend`. Input: `CaptureRequest`. Output: finished file + populated `Sample` handed to `bank_model`. - `insert` — placement via `InsertMedia`; conform-to-project-tempo is an explicit opt-in flag, never silent stretching. -- `bank_panel` — docked LICE-drawn grid: thumbnails, audition, multi-select, keyboard navigation; three-zone layout (L4): **top toolbar** = capture cluster (capture item, capture track, batch items, batch razor, capture RT) + placement cluster (insert, insert-conform) + maintenance cluster (re-capture, cancel-realtime) via `action_bar`, firing each action via `NamedCommandLookup` + `Main_OnCommand` and showing live keybinding labels via `kbd_getTextFromCmd`; **bottom toolbar** = Design View tagging + switching verbs (`ActionCluster::Tagging` / `ActionCluster::Switching`) firing the registered `VIEW_*` actions; **footer** = narrow `[Arrange|Design]` toggle · per-mode count · Tail button (cycles tail on click, proper kit button states) · set-apart `warn` Prune (rightmost) via `footer_bar`; entire panel draws through the L1 kit by palette role with hover on interactive elements, single `KitColor→LICE_pixel` boundary via `draw_kit`; OS drag-out hook (M11) initiating an OS-level copy drag when the pointer leaves the panel client rect, via `drag_out` + `drag_out_win`. +- `bank_panel` — docked LICE-drawn grid: thumbnails, audition, multi-select, keyboard navigation; three-zone layout (L4/L5): **top toolbar** = capture cluster (Capture Item, Capture Track) + placement cluster (Insert, Insert Conform) + maintenance cluster (Re-capture, Cancel RT) via `action_bar`, each firing via `NamedCommandLookup` + `Main_OnCommand` with live keybinding labels via `kbd_getTextFromCmd`; a right-anchored **More (⋯) overflow menu button** (`overflow_menu`) opens a `TrackPopupMenu` listing Batch Items / Batch Razor / Capture RT; **hover tooltips** (`tooltip`) show the full action name with the `ReaSampler:` prefix stripped, sourced from the registered action phrase; **bottom toolbar** = four opposite-mode tag buttons (Item: Arrange / Item: Design / Track: Arrange / Track: Design — live only for the opposite of the active mode, `Disabled` otherwise via `mode_enable`) + set-apart Show Both (`VIEW_SHOW_BOTH`); Toggle and Activate-Arrange/Activate-Design buttons removed (actions stay registered); grouping `clusterGap` 24 / `buttonGap` 4; **footer** = narrow `[Arrange|Design]` toggle · per-mode count · Tail button (cycles tail on click, proper kit button states) · set-apart `warn` Prune (rightmost) via `footer_bar`; entire panel draws through the L1 kit by palette role with hover on interactive elements, single `KitColor→LICE_pixel` boundary via `draw_kit`; OS drag-out hook (M11) initiating an OS-level copy drag when the pointer leaves the panel client rect, via `drag_out` + `drag_out_win`. - `persist` — project ext state (`SetProjExtState` / `GetProjExtState`, namespace `"reasampler"`) ↔ `BankBook` JSON (`"banks"` key) + `ViewModeModel` JSON (`"view_state"` key) + `TailSetting` JSON (`"tail_setting"` key) + `OwnedManifest` JSON (`"owned_files"` key) + writing-version stamp (`"version"` key, written via `stampVersion()` on every `saveToActiveProject()`); project-relative path resolution. A `projectconfig` hook (`BeginLoadProjectState(isUndo)`) triggers a deferred session reload on undo/redo so Ctrl-Z/redo visibly restores book/view/tail/manifest in-session. Hosts `ReaSamplerSession::pruneDryRun()` (read-only orphan enumeration via M4 project-relative resolution) and `pruneOrphanSet()` (full-set query for the R3 delete path); supplies `referencedPaths()` + `owned().paths()` to the `prune_reconcile` pure core. - `view` — Design View shell: reads the folder tree via `view_tree`, snapshots flag values before parking, drives hide + CPU-park on inactive-mode leaves (`B_SHOWINTCP`/`B_SHOWINMIXER`/`B_MAINSEND`/`I_FXEN` + per-FX offline) and derived visibility on parents; restores from snapshot. Never touches master or `B_MUTE`/`I_SOLO`. - `track_guid` — shared `MediaTrack*` → canonical GUID-string formatter; single source of truth for membership keys used by both the view shell and the actions layer. diff --git a/COMPLETED.md b/COMPLETED.md index b4f2e81..38253b3 100644 --- a/COMPLETED.md +++ b/COMPLETED.md @@ -1348,3 +1348,56 @@ never auto-insert (the buttons only fire the existing, unchanged actions). Tail button + Prune); no LICE or REAPER types. New CTest target `footer_bar_tests`. - `action_bar` gained `ActionCluster::Tagging` and `ActionCluster::Switching` for the bottom-toolbar Design View verb groups. + +--- + +## L5 — dock-panel button refinements +**Goal:** Refine the L4 three-zone toolbar so the button faces read cleanly and group +legibly — an overflow menu for the rare capture variants, short faces with full-name +tooltips (no `ReaSampler:` prefix), an opposite-mode tag-button set, removal of the now- +redundant Toggle and Activate-Arrange/Design buttons, and semantic-grouping spacing. +**No new capture/placement behavior**; every button fires an existing registered action +(the "capture ≠ placement" principle is untouched). Ungated by Phase S; sequences after L4. +**Verify (in DAW):** the top bar shows only frequent capture/placement/maintenance buttons + +a right-anchored More (⋯) menu that fires Batch Items / Batch Razor / Capture RT; hover +tooltip shows the full action name with `ReaSampler:` prefix stripped; the bottom bar shows +four Item/Track × Arrange/Design tag buttons with only the opposite-mode pair live (disabled +pair visibly greyed via the kit `Disabled` state) and no Toggle button; cluster groups read +as groups. All buttons fire the same actions their keybindings do. + +- [x] Top-toolbar overflow: Batch Items / Batch Razor / Capture RT pulled off the visible bar + into a right-anchored **More (⋯) menu button** (kit-drawn button + `TrackPopupMenu` popup); + each entry fires its existing command id. Pure layout owns the menu-button rect + hit-test + (`overflow_menu` pure module); the popup + dispatch is shell. +- [x] Short faces + drop `ReaSampler:` prefix on the button *face*; keep the keybinding micro + sub-row. +- [x] **Hover tooltip carrying the full action name (prefix stripped)** via a **custom LICE-kit + hover-delay tooltip** (`tooltip` pure module): sourced from the registered action phrase + (not `kbd_getTextFromCmd`); `ReaSampler:` prefix stripped at draw time; tooltip box width + clamped to the client so it never overhangs a narrow dock. The keybinding sub-row still uses + the live binding from `kbd_getTextFromCmd`. +- [x] Bottom-toolbar four tag buttons: **Item: Arrange / Item: Design / Track: Arrange / + Track: Design**, wired to the existing item-move (`VIEW_MOVE_ITEMS_ARRANGE` / + `VIEW_MOVE_ITEMS_DESIGN`) + track-tag (`VIEW_TAG_ARRANGE` / `VIEW_TAG_DESIGN`) actions. +- [x] **Opposite-mode enablement:** a button is live iff its target mode ≠ the active mode; + otherwise drawn `Disabled` (kit disabled state, `TextDim`) and its click is a no-op. Pure + predicate (`mode_enable` pure module) unit-tested; shell reads `view().activeModeId()` once + per draw and applies. +- [x] **Activate-Arrange / Activate-Design / Toggle buttons removed** from the bottom toolbar + (all three actions stay registered; footer toggle owns mode switching). **Show Both** kept + as a set-apart button on the bottom toolbar. +- [x] Semantic-grouping spacing widened: `clusterGap` 16→24 (`buttonGap` remains 4; 6:1 ratio) + on both toolbars so clusters read as groups. + +**Notes/decisions:** +- **Activate-Arrange / Activate-Design / Toggle FORK resolved (Daniel):** all three removed + from the bottom toolbar. The footer `[Arrange|Design]` toggle is the single mode-switch + affordance; the bottom bar is tagging + Show Both only. +- **Tooltip mechanism resolved as custom LICE-kit hover-delay tooltip** (DS-1 "keep drawing in + the kit"): avoids attaching a SWELL tooltip control to non-child LICE rects. SWELL is the + Win32-emulation layer for macOS/Linux and is not the mechanism used here; on Windows the + path is native, and the chosen implementation is a custom kit-drawn tooltip. +- New pure modules: `src/overflow_menu.{h,cpp}` (menu-button geometry/reserve/hit-test), + `src/mode_enable.{h,cpp}` (opposite-mode enablement predicate), `src/tooltip.{h,cpp}` + (placement + prefix-strip). New CTest targets `overflow_menu_tests`, `mode_enable_tests`, + `tooltip_tests`. diff --git a/CONTEXT.md b/CONTEXT.md index 8e25d6b..c0f342c 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -1583,12 +1583,12 @@ adds a **hover tooltip showing the FULL action name with the `ReaSampler:` displ stripped.** Note the prefix (`actionDisplayPrefix()`) is baked into the *registered gaccel action name*, not the button face — so the tooltip derives the full name and strips the prefix for display; the button face never carried the prefix. The keybinding stays on the existing -`micro` sub-row. **Tooltip mechanism is a build-time choice (staff-engineer):** SWELL's tooltip -control vs. a custom hover-delay kit tooltip. **Recommended: a custom hover-delay kit tooltip** — -it owns its own hover timer + LICE overlay draw, stays inside the L1 kit (DS-1 "keep drawing in -the kit"), and avoids attaching a SWELL tooltip control to non-child LICE rects (awkward for -dynamically-tiled buttons). The hover-timer threshold + overlay draw are the only DAW-bound -pieces; the "which button, what text" decision stays pure. +`micro` sub-row. **Tooltip mechanism: custom LICE-kit hover-delay tooltip** (`tooltip` pure +module) — owns its own hover timer + LICE overlay draw, stays inside the L1 kit (DS-1 "keep +drawing in the kit"). Sourced from the registered action phrase (not `kbd_getTextFromCmd`); +`ReaSampler:` prefix stripped at draw time; tooltip box width clamped to the client so it never +overhangs a narrow dock. The hover-timer threshold + overlay draw are the only DAW-bound pieces; +the "which button, what text" decision stays pure. **3. Bottom-toolbar Item/Track × Arrange/Design tag buttons, opposite-mode-only.** The current `Tag Design` / `Untag` pair is replaced by **four buttons — "Item: Arrange", "Item: Design", @@ -1618,21 +1618,15 @@ bodies exactly (no selection semantics change). `[Arrange|Design]` toggle (L4) already covers mode switching. **The action stays registered** (keybinding-bound, FOREVER-STABLE id unchanged); only its *button home* is removed. -**Fate of Activate-Arrange / Activate-Design / Show-Both (FORK — Daniel's call).** These three -`Switching`-cluster buttons overlap the footer toggle to varying degrees: -- `VIEW_ACTIVATE_ARRANGE` / `VIEW_ACTIVATE_DESIGN` — **direct** mode jumps. With the footer - toggle present, they are largely redundant on the bar (the toggle *is* an Arrange/Design - switch). **Recommendation: DROP both from the bottom toolbar** (actions stay registered), so - the footer toggle is the single mode-switch affordance and the bottom bar is tagging-only. -- `VIEW_SHOW_BOTH` — the cross-mode "pin visible in every mode" escape hatch. It is **not** - covered by the footer toggle (it is a per-track pin, not a mode switch). **Recommendation: - KEEP it** — as a lone button, or folded into a small `⋯` bottom-bar menu alongside any other - rare view verbs. -- **Recommended final bottom-toolbar inventory:** `[ Item: Arrange | Item: Design ] · [ Track: - Arrange | Track: Design ] ⟩⟩ [ Show Both ]` — Tagging cluster (four opposite-mode buttons) - set apart from a lone `Show Both`. No Toggle, no Activate-Arrange/Design (footer toggle owns - switching). **Daniel decides whether to keep Activate-Arrange/Design as bar buttons and - whether Show-Both stays a button or moves to a menu.** +**Fate of Activate-Arrange / Activate-Design / Show-Both (FORK — RESOLVED, Daniel's call).** +- `VIEW_ACTIVATE_ARRANGE` / `VIEW_ACTIVATE_DESIGN` — **dropped from the bottom toolbar** (actions + stay registered, FOREVER-STABLE ids unchanged). The footer `[Arrange|Design]` toggle is the + single mode-switch affordance; the bottom bar is tagging + Show Both only. +- `VIEW_SHOW_BOTH` — **kept** as a set-apart button on the bottom toolbar. It is the cross-mode + "pin visible in every mode" escape hatch and is not covered by the footer toggle. +- **Landed bottom-toolbar inventory:** `[ Item: Arrange | Item: Design ] · [ Track: Arrange | + Track: Design ] ⟩⟩ [ Show Both ]` — Tagging cluster (four opposite-mode buttons) set apart + from a lone `Show Both`. No Toggle, no Activate-Arrange/Design (footer toggle owns switching). **5. Semantic-grouping spacing.** L4's `kBarSpec` is `buttonGap=4` / `clusterGap=16` (4:1). With the bottom bar's cluster boundary now more meaningful (four tag buttons vs. the `Show Both` @@ -1654,10 +1648,8 @@ editor (`IPlugView` LICE surface), the S6 embed strip, and the keyboard strip li 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 (≈ S1 / S6 / S10) merge to dev — **the Phase L team must not chase these files on dev; they are not there.** Until then L3 is a -planned, blocked point; L1, L2, and **L4 (dock-panel button layout enhancement) have all -landed**. L4 is independent of the L3 gate. **L5 (dock-panel button refinements — §L5 above) -is the live forward Phase L point**: ungated by Phase S, sequences after L4, also independent -of the L3 gate. +planned, blocked point; L1, L2, L4, and **L5 have all landed** — see `COMPLETED.md`. L4 and L5 +are independent of the L3 gate. **Coordination contract (load-bearing):** Phase S's S10–S13 build their interaction UX with the **current** drawing and **adopt the L1 kit when it is available — they are NOT gated on diff --git a/PLAN.md b/PLAN.md index 2b41497..87af92b 100644 --- a/PLAN.md +++ b/PLAN.md @@ -284,17 +284,18 @@ build:** the `IReaperUIEmbedInterface` contract + embed message/lifecycle agains > directions: `docs/product/visual-design-language.md`. When a point lands, doc-keeper > moves it to `COMPLETED.md`. > -> **L1 (shared LICE drawing kit — the foundation), L2 (dock-panel layout redesign), and L4 -> (dock-panel button layout enhancement) have landed** — `theme`/palette module, -> `component_geometry` geometry/hit-test helpers, `draw_kit` shell, GDI `DrawText` retirement -> in `bank_panel` (L1); `action_bar` pure task-grouped layout module, full M11-aware button -> inventory placed by task cluster, `bank_panel` redesigned through the L1 kit (L2); three-zone -> layout (top capture/placement/maintenance toolbar, bottom Design-View toolbar, footer toggle + -> Tail button + Prune), `footer_bar` pure module, `ActionCluster::Tagging`/`Switching` in -> `action_bar` (L4). See `COMPLETED.md`. **L5 (dock-panel button refinements — overflow menu, -short-face+tooltip labels, opposite-mode Item/Track tag buttons, Toggle removal, grouping -spacing) is the live forward point** — ungated by Phase S, sequences after L4. **L3 remains** — -L3 gated on Phase S landing on dev. +> **L1 (shared LICE drawing kit — the foundation), L2 (dock-panel layout redesign), L4 +> (dock-panel button layout enhancement), and L5 (dock-panel button refinements) have landed** — +> `theme`/palette module, `component_geometry` geometry/hit-test helpers, `draw_kit` shell, GDI +> `DrawText` retirement in `bank_panel` (L1); `action_bar` pure task-grouped layout module, full +> M11-aware button inventory placed by task cluster, `bank_panel` redesigned through the L1 kit +> (L2); three-zone layout (top capture/placement/maintenance toolbar, bottom Design-View toolbar, +> footer toggle + Tail button + Prune), `footer_bar` pure module, `ActionCluster::Tagging`/ +> `Switching` in `action_bar` (L4); top-bar overflow menu (`overflow_menu` pure module), +> custom LICE-kit hover-delay tooltips (`tooltip` pure module), opposite-mode Item/Track tag +> buttons + Show Both, Toggle + Activate-Arrange/Design buttons removed, grouping spacing +> widened (`mode_enable` pure module) (L5). See `COMPLETED.md`. **L3 remains** — L3 gated on +> Phase S landing on dev. > > **This section is self-contained for a team without Phase S context.** Where a point > touches a Phase S surface (the VST editor, the embed strip, the keyboard strip), the @@ -371,101 +372,16 @@ work. state — never a pulse, per the speed constraint) as the signature surface; VST3 class UID unchanged. (Gated.) -## L5 — dock-panel button refinements (ungated; sequences after L4) -**Goal:** Refine the L4 three-zone toolbar so the button faces read cleanly and group -legibly — an overflow menu for the rare capture variants, short faces with full-name -tooltips (no `ReaSampler:` prefix), an opposite-mode tag-button set, removal of the now- -redundant Toggle, and semantic-grouping spacing. **No new capture/placement behavior**; -every button fires an existing registered action (the "capture ≠ placement" principle is -untouched). **Ungated by Phase S** (the dock panel is on dev) and **independent of the L3 -gate.** Drawn through the L1 kit in the DS-2 grey-neutral + three-accent-pastel palette -(prune stays `warn`); **no palette or font decision is re-opened here.** Authoritative -contract: CONTEXT.md §L5. - -**The five refinements:** - -1. **Top-toolbar overflow menu.** The three less-frequent capture variants — **Batch Items, - Batch Razor, Capture RT** — move OFF the visible top bar into a **"⋯ / More" menu button - at the far right of the top toolbar** (a REAPER `TrackPopupMenu` popup listing the three, - each firing its existing command id). The frequent acts stay on the bar: **Capture Item, - Capture Track** (Capture), **Insert, Insert Conform** (Placement), **Re-capture, Cancel RT** - (Maintenance). This is a re-home of existing rows into a menu — no action changes. - -2. **Short faces + full-name tooltips; drop the `ReaSampler:` prefix.** Button *faces* - already carry a terse label (`ActionBarRow.shortLabel`) — this formalizes them and adds a - **hover tooltip carrying the FULL action name** (without the `ReaSampler:` display prefix, - which `actionDisplayPrefix()` bakes into the registered gaccel name — the tooltip strips - it). The keybinding stays on the existing `micro` sub-row. Tooltip *mechanism* is an - implementation choice flagged for staff-engineer (see the sub-item below). - -3. **Bottom-toolbar tag buttons — Item/Track × Arrange/Design, opposite-mode-only.** Replace - the current `Tag Design` / `Untag` pair with **four buttons: "Item: Arrange", "Item: - Design", "Track: Arrange", "Track: Design".** Each is **live only for the OPPOSITE of the - active mode** and drawn `Disabled` otherwise: when **Design is active**, only the "…: - Arrange" buttons are live (they send the selection to Arrange) and the "…: Design" buttons - are disabled; when **Arrange is active**, the reverse. Item buttons fire the existing - item-move actions (`VIEW_MOVE_ITEMS_ARRANGE` / a Design item-move); Track buttons fire the - existing track-tag actions (`VIEW_TAG_ARRANGE` (= untag) / `VIEW_TAG_DESIGN`). **Both action - families already exist** (research confirmed) — this is layout + enablement wiring, not new - feature work. - -4. **Remove the redundant Toggle button.** `VIEW_TOGGLE_MODE` leaves the bottom toolbar — the - footer's `[Arrange|Design]` toggle switch (landed in L4) already covers it. The action stays - registered (keybinding-bound); only its button home is removed. **Fate of Activate-Arrange / - Activate-Design / Show-Both is a FORK for Daniel** (see below) — recommended resolution - captured in CONTEXT.md §L5. - -5. **Semantic-grouping spacing.** Inter-cluster gaps must read visibly wider than intra-cluster - gaps so clusters parse as groups. Current `kBarSpec` is `buttonGap=4` / `clusterGap=16` - (a 4:1 ratio). With the bottom bar's cluster boundaries now more meaningful (four tag - buttons vs. the switching remnant), widen the ratio if the groups still don't read — target - ≈ `buttonGap=4` / `clusterGap=24` (6:1) as the starting point, tuned in-DAW. - -**Verify (in DAW):** the top bar shows only frequent capture/placement/maintenance buttons + -a right-anchored More menu that fires Batch Items / Batch Razor / Capture RT; button faces -are short with no `ReaSampler:` prefix and a hover tooltip shows the full action name; the -bottom bar shows four Item/Track × Arrange/Design tag buttons with only the opposite-mode -pair live (disabled pair visibly greyed via the kit `Disabled` state) and no Toggle button; -cluster groups read as groups. All buttons fire the same actions their keybindings do. - -**Depends on:** L1 (the kit — `Disabled` interaction state, `kitText`) **AND** L4 (the -`action_bar` two-toolbar + `footer_bar` layout this refines). **Sequences after L4.** Ungated -by Phase S; independent of the L3 gate. - -- [ ] Top-toolbar overflow: pull Batch Items / Batch Razor / Capture RT off the visible bar - into a right-anchored **More menu button** (kit-drawn button + `TrackPopupMenu` popup); - each entry fires its existing command id. Pure layout owns the menu-button rect + hit-test - (extend/mirror `action_bar` / `prune_button`); the popup + dispatch is shell. -- [ ] Short faces + drop `ReaSampler:` prefix on the button *face*; keep the keybinding micro - sub-row. Define/confirm the terse face label per button. -- [ ] **Hover tooltip carrying the full action name (prefix stripped).** *Mechanism is a - build-time choice for staff-engineer* — SWELL tooltip API vs. a custom hover-delay kit - tooltip draw. **Recommend: a custom hover-delay kit tooltip** (owns its own timing + draw, - consistent with the LICE kit and DS-1's "keep drawing in the kit"; SWELL's tooltip control - is awkward to attach to non-child LICE rects). Final call at build. -- [ ] Bottom-toolbar four tag buttons: **Item: Arrange / Item: Design / Track: Arrange / - Track: Design**, wired to the existing item-move + track-tag actions (no new actions). -- [ ] **Opposite-mode enablement rule:** a button is live iff its target mode ≠ the active - mode; otherwise drawn `Disabled` (kit disabled state, `TextDim`) and its click is a no-op. - Pure predicate (active mode → per-button live/disabled) unit-tested; shell reads the active - mode and applies. (Layout over existing actions — NOT flagged feature work; item-level - tagging already exists in the model.) -- [ ] Remove the `VIEW_TOGGLE_MODE` button from the bottom toolbar (action stays registered). -- [ ] Resolve the **Activate-Arrange / Activate-Design / Show-Both** fate per Daniel's call - (FORK — see §Handoff / CONTEXT.md §L5); apply the chosen bottom-toolbar inventory. -- [ ] Semantic-grouping spacing: widen `clusterGap` relative to `buttonGap` so clusters read - as groups (start ≈ 24 / 4; tune in-DAW). - ## Phase L — sequencing ``` L1 (shared kit) ──► L2 (dock-panel layout redesign) [LANDED] ├─────────► L3 (VST editor + embed-strip restyle; GATED on Phase S landing on dev) └─────────► L4 (dock-panel button layout enhancement) [LANDED] - └────► L5 (dock-panel button refinements; ungated, after L4) + └────► L5 (dock-panel button refinements; ungated, after L4) [LANDED] Phase S (separate team, ungated): S-work builds with current drawing, adopts L1 when it lands. ``` -L1, L2, and L4 have landed. L5 sequences after L4 (ungated). L3 waits for Phase S to reach dev. +L1, L2, L4, and L5 have landed. L3 waits for Phase S to reach dev. Phase S feature work runs in parallel, ungated by Phase L. ## Phase L — must-verify-before-build @@ -486,14 +402,11 @@ Phase S feature work runs in parallel, ungated by Phase L. - **L4 re-home surface (L4)** — resolved at L4 build: three-zone layout confirmed against the post-palette-revision `bank_panel`; `action_bar` extended with `ActionCluster::Tagging` + `Switching`; new pure `footer_bar` module covers footer layout/hit-test. -- **L5 refinement surface (L5)** — resolve at L5 build: (a) confirm `TrackPopupMenu` popup + - right-anchored menu-button geometry for the top-bar overflow; (b) **tooltip mechanism** - (SWELL tooltip vs. custom hover-delay kit tooltip — recommended custom) — pick and confirm - the hover-timer + LICE overlay draw at build; (c) confirm the item-move action ids the four - tag buttons fire (`VIEW_MOVE_ITEMS_ARRANGE` + the Design item-move; `VIEW_TAG_ARRANGE` / - `VIEW_TAG_DESIGN` for track) resolve on this channel; (d) confirm the active-mode read the - opposite-mode enablement predicate consumes is the same `view().activeModeId()` the footer - toggle reads (one source of truth for "which mode is active"). +- **L5 refinement surface (L5)** — resolved at L5 build: `TrackPopupMenu` overflow menu + confirmed; tooltip mechanism resolved as **custom LICE-kit hover-delay tooltip** (`tooltip` + pure module; sourced from the registered action phrase, prefix stripped at draw time); item-move + and track-tag action ids confirmed; active-mode read confirmed via the same + `view().activeModeId()` the footer toggle uses. ---