Lanes delete into the trash — rendering, grammar, drag, clipboard, a11y
Phase 2 completes the lanes-in-trash card. TrashEntry merges the trash's two kinds by rank in exactly ONE place (ItemPath.resolve's own merge deleted in favor of it — the three-merge-points finding shrinks instead of growing). TrashLaneRowView renders the opaque row — tertiary plate, level-default lane glyph never the lane's own icon, title + card count, no accents, no expansion; the column badge counts rendered rows. Selection grammar: kind-homogeneous trash selections — ranges skip the other kind, ⇧-extension stops at the kind boundary, plain arrows walk the merged order, marquee stays card-only (now load-bearing: rows register frames for arrows), Select All card-scoped; successor-on-purge crosses kinds like navigation as the interim for open Gap 7b5cbc90. Drag: TrashDrop accepts lane sessions (drop on shown trash deletes), restoreLanes routes a trash-sourced strip drop as an arrival-ranked within-board move with an undo step. Clipboard: ⌘X/⌘V lane restore via opaque lane subjects; fixed boardRoot(ofLaneFolder:) returning .trash as the root — a same-board restore looked like an import and would have reminted the lane it was restoring (pinned by test). A11y: row = one flattened "title, deleted lane, N cards" element with Delete/Reveal actions; BoardDiff crossings read lanes as deleted/restored, shown-trash churn digested at row level. Agent guide stays v7 — the literal already teaches lanes-trash-by-move and kind stamping; drift-guard pins those lines. README trash paragraph notes lanes. Both schemes 1893 tests / 322 suites green. Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -81,9 +81,14 @@ final class MarqueeSession {
|
||||
/// is on screen. It is also what makes the band correct for free across a lane resize, a reorder in
|
||||
/// flight, and a foreign reload — the frames simply re-register.
|
||||
///
|
||||
/// **Lanes are never registered.** The band selects cards — board cards or trash cards; a lane has
|
||||
/// no entry here at all, which is 04-interactions.md § Selection's "click-drag rubber-bands across
|
||||
/// lanes" made structural rather than filtered.
|
||||
/// **A live lane is never registered.** The band selects cards, and a lane on the strip has no entry
|
||||
/// here at all — 04-interactions.md § Selection's "click-drag rubber-bands across lanes" made
|
||||
/// structural rather than filtered.
|
||||
///
|
||||
/// **A trashed lane row is registered** (lanes rejoined the trash 2026-07-29), and not for the band:
|
||||
/// this registry is also the arrows' geometry (`NavigationMath`, where "plain arrows walk every row,
|
||||
/// card and lane row alike") and the begin guard's universe below. The band still never selects one
|
||||
/// — `MarqueeMath` filters by kind, which is where that rule lives for both containers.
|
||||
///
|
||||
/// It is also the **begin guard's** universe: a drag that starts inside a registered frame belongs
|
||||
/// to that item's own gesture (a card drag, a drag out of the trash), never to the band. Deciding
|
||||
|
||||
Reference in New Issue
Block a user