docs: archive Phase L L7 to COMPLETED; reconcile CLAUDE.md + CONTEXT.md + PLAN.md
This commit is contained in:
@@ -1423,3 +1423,61 @@ targets, no capture/placement behavior change.
|
||||
|
||||
**Notes/decisions:**
|
||||
- Icons were considered and deferred (not implemented in this pass).
|
||||
|
||||
---
|
||||
|
||||
## L7 — capture ordering, card metadata, and selection styling
|
||||
**Goal:** Three grid-facing improvements to the dock panel, drawn through the L1 kit in the
|
||||
settled DS-2 palette. (1) **Persisted deterministic capture order + drag-drop reorder + sparse
|
||||
placement:** each bank (and the pool) carries an explicit, persisted per-sample order via a
|
||||
per-`Bank` id→slot `SlotMap` in `bank_book`; a card may sit in a slot that leaves earlier slots
|
||||
empty (gaps preserved; trailing empty tail trimmed for scroll extent). (2) **Decorative metadata
|
||||
over the peaks:** each card overlays capture length as **bars.beats.subdivisions (bottom-left)**
|
||||
and **seconds.ms (bottom-right)** in the kit's micro / value-mono type class, `text/dim`. (3)
|
||||
**Selection restyle:** a selected card drops the inverted accent-fill and instead draws the
|
||||
*normal* cell + an **`accent/tertiary` (pastel purple `#C2AAE8`) border**. No new capture /
|
||||
placement behavior; the "capture ≠ placement" principle is untouched.
|
||||
|
||||
- [x] **`SlotMap` in `bank_book`:** gap-preserving per-`Bank` id→slot map — persisted
|
||||
deterministic display order; interior gaps preserved / trailing tail trimmed; JSON rides
|
||||
inside the existing `"banks"` blob; pre-L7 migration seeds dense insertion order via
|
||||
`reconcileSlots()` on the load path. `bank_model` / `Sample` untouched by position (position
|
||||
is a per-bank display concern).
|
||||
- [x] **`BankBook` mutators:** `reorderSample` (insert-before-shift; same-slot = no-op),
|
||||
`replaceSample` (occupant index-removal via the standard remove path + pool-guard inheritance;
|
||||
no-op on reject), `orderedSampleIds`, `reconcileSlots`. All gap-preserving; deterministic;
|
||||
CTest-covered.
|
||||
- [x] **`Sample` meter stamp (ONE sanctioned `Sample` change):** `captureTimeSigNum` /
|
||||
`captureTimeSigDenom` added to `Sample` + JSON round-trip; stamped on both capture paths and
|
||||
refreshed on re-capture via `TimeMap_GetTimeSigAtTime` (API confirmed at build). Old samples
|
||||
with no stamp fall back gracefully (blank musical read-out).
|
||||
- [x] **`card_drag` pure module:** gesture precedence — leave-client → OS drag-out;
|
||||
other-bank → move/copy; same-bank → reorder / Alt-over-occupied → replace. Cursor-cue map
|
||||
returned as the pure resolved gesture. Sparse `computeSlotRects` / `hitTestSlot`. SWELL stock
|
||||
cursors chosen at build: Reorder→`IDC_SIZEALL`, Move→`IDC_HAND`, Copy→`IDC_UPARROW`,
|
||||
Replace→`IDC_SIZEWE`. New CTest target `card_drag_tests`.
|
||||
- [x] **`card_meta` pure module:** bars.beats.subdivisions from the stamped tempo + meter;
|
||||
seconds.milliseconds rounded. Both blank when the sample is unstamped. New CTest target
|
||||
`card_meta_tests`.
|
||||
- [x] **`bank_panel` sparse-grid render:** grid renders in sparse slot order; decorative
|
||||
empty-gap cells drawn for unoccupied slots; every cell↔sample consumer remapped to
|
||||
id-based occupied-ordinal space (selection, keyboard nav — arrows skip gaps, audition,
|
||||
multi-select, delete / re-capture resolution, drags).
|
||||
- [x] **`bank_panel` drop dispatch:** reorder / Alt-replace / move-copy drop with one-Ctrl-Z
|
||||
undo via the existing batched undo pattern; per-slot drop highlight (`accent/hot`, doubled
|
||||
outline for replace); SWELL stock cursor cues via `SetCursor` per the pure resolved gesture.
|
||||
- [x] **`bank_panel` metadata overlay:** bars.beats bottom-left (Micro), s.ms bottom-right
|
||||
(ValueMono), `TextDim`, decorative / non-interactive.
|
||||
- [x] **Selection restyle:** normal cell + `accent/tertiary` purple border; inversion removed;
|
||||
focus ring distinct from the selection border.
|
||||
|
||||
**Notes/decisions:**
|
||||
- **M9 overlap (awareness note — unchanged intent).** M9 (capture-to-slot-N / insert-slot-N,
|
||||
MIDI-bindable, MPC-style) remains **explicitly deferred (Daniel, 2026-07-26).** The
|
||||
interchangeable-slot substrate L7 builds still eases a future M9 revival but L7 adds **no**
|
||||
slot-numbered capture/insert actions and **no** MIDI bindings. The "plain vs. M9-shaped"
|
||||
sub-fork is closed: plain gap-preserving substrate (F2).
|
||||
- **Build-time choices confirmed:** `TimeMap_GetTimeSigAtTime` confirmed at build for the
|
||||
meter stamp; SWELL stock cursors chosen (no custom cursor load/synthesis required);
|
||||
gap navigation = skip gaps (arrow keys skip empty slots); same-slot reorder = no-op.
|
||||
- New CTest targets `card_drag_tests`, `card_meta_tests`.
|
||||
|
||||
Reference in New Issue
Block a user