         var transform: CGAffineTransform {
             switch self {
             case .horizontal:
-                return CGAffineTransform(rotationAngle: -(.pi / 2))
+                return .identity
             case .vertical:
-                return .identity
-            }
-        }
-    }
-
-    fileprivate func animateOverflowToggleItem(_ direction: OverflowToggleAnimationDirection) {
-        UIView.animate(withDuration: Animations.springDuration,
-                       delay: 0,
-                       usingSpringWithDamping: Animations.springDamping,
-                       initialSpringVelocity: Animations.springInitialVelocity,
-                       options: [],
+                return CGAffineTransform(rotationAngle: (.pi / 2))
+            }
+        }
+    }
+
+    fileprivate func rotateOverflowToggleItem(_ direction: OverflowToggleAnimationDirection, animated: Bool, completion: ((Bool) -> Void)? = nil) {
+        let transform = {
+            self.overflowToggleItem.transform = direction.transform
+        }
+
+        if (animated) {
+            UIView.animate(withDuration: Animations.springDuration,
+                           delay: 0,
+                           usingSpringWithDamping: Animations.springDamping,
+                           initialSpringVelocity: Animations.springInitialVelocity,
+                           options: [],
+                           animations: transform,
+                           completion: completion)
+        } else {
+            transform()
+            completion?(true)
+        }
+    }
+
+    fileprivate func animateOverflowToggleOffscreen(completion: (() -> Void)? = nil) {
+        defer {
+            overflowToggleItem.removeFromSuperview()
+        }
+
+        // Replace toggle with a snapshot
+        guard let snapshot = overflowToggleItem.snapshotView(afterScreenUpdates: false) else { return }
+
+        addSubview(snapshot)
+        snapshot.frame = convert(overflowToggleItem.frame, from: stackView)
+
+        UIView.animate(withDuration: Animations.durationLong,
                        animations: {
-            self.overflowToggleItem.transform = direction.transform
-        }, completion: nil)
+                        snapshot.transform = CGAffineTransform(translationX: Constants.stackButtonWidth, y: 0)
+        }, completion: { _ in
+            snapshot.removeFromSuperview()
+            completion?()
+        })
     }
 }
 

                item.removeFromSuperview()
                item.removeConstraints(item.constraints)
            })

            stackView.addArrangedSubview(overflowToggleItem)
        }
    }


    private func setOverflowItemsVisible(_ visible: Bool) {
        if visible {
            scrollableStackView.addArrangedSubviews(overflowItems)

            configureConstraints(for: overflowItems, in: stackView)
        } else {
