             updateValueForCurrentTopOffset()
         }
     }
+    open var gradientTopColor: UIColor = UIColor.clear {
+        didSet {
+            updateGradientColors()
+        }
+    }
+    open var gradientBottomColor: UIColor = UIColor.clear {
+        didSet {
+            updateGradientColors()
+        }
+    }
+    private func updateGradientColors() {
+        backgroundGradientLayer.colors = [gradientTopColor.cgColor, gradientBottomColor.cgColor]
+    }
     
     open var backgroundView: UIImageView = {
         var view = UIImageView()

        var view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = UIColor.white.withAlphaComponent(0.5)
        return view
    }()
    private lazy var iconView: UIImageView = {
        var view = UIImageView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()
    
    private var progressTopConstraint: NSLayoutConstraint!

        updateValueFor(topOffset: progressTopConstraint.constant, isFinal: true)
    }
    private func updateValueFor(topOffset: CGFloat, isFinal: Bool) {
        let constrainedTopOffset = min(max(0, topOffset), bounds.height)
        progressTopConstraint.constant = constrainedTopOffset
        let value = OffsetCalculator.valueBy(topOffset: constrainedTopOffset, minValue: minValue, maxValue: maxValue, height: bounds.height, reversed: reversed)
        update(value: value, isFinal: isFinal)
    }
    private func update(value: CGFloat, isFinal: Bool) {
