← All repositories

listless

A simple list app for Apple platforms

git clone https://code.inqk.net/listless.git


commit edfd371e7063944c5f2725428ab88bddbd6bca1f
parent 5c894793c625f5caaa608ae3db3162c9b676e953
Author: Michael Camilleri <[email protected]>
Date:   Tue, 24 Mar 2026 04:20:20 +0900

Make further fixes to pull-to-create animation

Diffstat

MListlessiOS/Extensions/TaskListView+PullGestures.swift | 2+-
MListlessiOS/Extensions/TaskListView+PullToCreate.swift | 2+-
MListlessiOS/Views/TaskListView.swift | 7+++----

3 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/ListlessiOS/Extensions/TaskListView+PullGestures.swift b/ListlessiOS/Extensions/TaskListView+PullGestures.swift

@@ -136,7 +136,7 @@ private struct PullGesturesModifier: ViewModifier {
                 _ = onCreateTaskAtTop()
             }
         case .collapseIndicator:
-            withAnimation(.spring(response: 0.22, dampingFraction: 0.95)) {
+            withAnimation(.spring(response: 0.22, dampingFraction: 1.0)) {
                 pullToCreate.indicatorOffset = 0
             }
         case .none:

diff --git a/ListlessiOS/Extensions/TaskListView+PullToCreate.swift b/ListlessiOS/Extensions/TaskListView+PullToCreate.swift

@@ -15,7 +15,7 @@ extension TaskListView {
         draftTitle = ""
         pState.frozenOffset = -min(pState.pullToCreate.pullOffset, maxOffset)
         draftPlacement = .prepend
-        DispatchQueue.main.async {
+        Task { @MainActor in
             pState.frozenOffset = 0
         }
         fState.selectedTaskID = taskID

diff --git a/ListlessiOS/Views/TaskListView.swift b/ListlessiOS/Views/TaskListView.swift

@@ -199,7 +199,7 @@ struct TaskListView: View, TaskListViewProtocol {
         }
 
         if placement == .prepend, !hasTitle {
-            withAnimation(.spring(response: 0.24, dampingFraction: 0.95)) {
+            withAnimation(.spring(response: 0.24, dampingFraction: 1.0)) {
                 clear()
             }
         } else if placement == .prepend {
@@ -258,8 +258,7 @@ struct TaskListView: View, TaskListViewProtocol {
                 : min(pullOffset, indicatorHeight + rowGap),
             alignment: .top
         )
-        .clipped()
-        .opacity(isPrependDraftVisible ? 0 : 1)
+        .opacity(isPrependDraftVisible || pullOffset <= 0 ? 0 : 1)
     }
 
     /// The draft row content styled to match a task row. Controlled by the
@@ -487,7 +486,7 @@ struct TaskListView: View, TaskListViewProtocol {
                         )
                 )
                 .animation(
-                    .spring(response: 0.28, dampingFraction: 0.9),
+                    .spring(response: 0.28, dampingFraction: 1.0),
                     value: pState.frozenOffset
                 )
                 .frame(maxWidth: .infinity, alignment: .topLeading)