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:
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()