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)) } }