listless

A simple list app for Apple platforms
Log | Files | Refs | README | LICENSE

commit 9d90ad7f51919dda67cf35e5d4baac80b930a1e8
parent c5e368a69436a651a3b06fb5768b59daafeed3b5
Author: Michael Camilleri <[email protected]>
Date:   Wed, 18 Feb 2026 12:56:39 +0900

Improve pull-to-clear affordance

Co-Authored-By: Codex GPT 5.3 <[email protected]>

Diffstat:
MListlessiOS/Views/PullToClear.swift | 38++++++++++----------------------------
1 file changed, 10 insertions(+), 28 deletions(-)

diff --git a/ListlessiOS/Views/PullToClear.swift b/ListlessiOS/Views/PullToClear.swift @@ -9,37 +9,19 @@ struct PullToClearIndicator: View { private var progress: CGFloat { min(1, pullOffset / pullClearThreshold) } private var isReady: Bool { pullOffset >= pullClearThreshold } - // Matches the "bottom" gradient stop used for the last active task row - private let accentColor = Color(hue: 0.72, saturation: 0.65, brightness: 0.85) - var body: some View { - HStack(spacing: 0) { - Rectangle() - .fill(accentColor) - .frame(width: 8) - HStack(spacing: 6) { - Image(systemName: isReady ? "checkmark" : "trash") - .foregroundStyle(.secondary) - .fontWeight(.semibold) - .animation(.easeInOut(duration: 0.15), value: isReady) - Text(isReady ? "Release to clear" : "Clear completed") - .foregroundStyle(.secondary) - .font(.body) - .animation(.easeInOut(duration: 0.15), value: isReady) - Spacer() - } - .padding(.horizontal, 16) - .frame(maxHeight: .infinity) - .background(Color.taskCard) + HStack(spacing: 6) { + Image(systemName: isReady ? "checkmark" : "trash") + .foregroundStyle(.secondary) + .fontWeight(.semibold) + .animation(.easeInOut(duration: 0.15), value: isReady) + Text(isReady ? "Release to clear" : "Clear completed") + .foregroundStyle(.secondary) + .font(.body) + .animation(.easeInOut(duration: 0.15), value: isReady) } + .frame(maxWidth: .infinity) .frame(height: 56) - .clipShape( - UnevenRoundedRectangle( - topLeadingRadius: 0, bottomLeadingRadius: 0, - bottomTrailingRadius: 14, topTrailingRadius: 14 - ) - ) - .padding(.trailing, 16) // Reveal from the bottom upward as the user pulls .frame(height: min(pullOffset, 56), alignment: .bottom) .clipped()