From e6d3673891030e3903ed3b8590f41a459ecd0fe3 Mon Sep 17 00:00:00 2001 From: rzen Date: Tue, 28 Jul 2026 07:11:06 -0400 Subject: [PATCH] Give the trash column a full-height marquee backdrop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The trashed-side gesture surface was sized to the rows' fitted height, so blank column space below the last row couldn't arm a marquee — a dead zone the board side doesn't have (DESIGN/04 > The trash: the column's gesture surface is full height). The rows content now takes maxHeight: .infinity like LaneView's scrollableCards, the identical structure in the identical position, so the band arms from anywhere in the column. Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY --- Kanban/UI/Board/TrashLaneView.swift | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Kanban/UI/Board/TrashLaneView.swift b/Kanban/UI/Board/TrashLaneView.swift index a8cd3b3..e715652 100644 --- a/Kanban/UI/Board/TrashLaneView.swift +++ b/Kanban/UI/Board/TrashLaneView.swift @@ -188,12 +188,21 @@ struct TrashLaneView: View { .id(entry.id) } } - .frame(maxWidth: .infinity, alignment: .topLeading) + // `maxHeight: .infinity` here, not just `maxWidth`, is what makes the gesture surface + // below reach the column's full height rather than stopping where the last row ends — + // the same fix `LaneView.scrollableCards` applies to its masonry, and for the identical + // reason: a `ScrollView` proposes its content only the height that content asks for, so a + // view sized to fit its rows leaves the blank space beneath them un-hit-testable. "The + // column's gesture surface is full height" (04-interactions.md ▸ The trash, settled) + // needs that blank space to actually belong to the view the gesture below is on. + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) .padding(6) .contentShape(Rectangle()) - // The band's trash-side surface. It only ever arms from the column's empty space — a - // drag begun on a row is that row's drag-out — and the begin guard makes that geometric - // rather than a matter of gesture priority (`MarqueeControl`). + // The band's trash-side surface. It arms from the column's empty space, full height + // (above) included, so a drag can start from the blank area below the last row exactly + // as the board background allows on the live side — a drag begun on a row instead is that + // row's drag-out, and the begin guard makes that geometric rather than a matter of + // gesture priority (`MarqueeControl`). .simultaneousGesture(marquee.gesture(side: .trashed)) } }