From a88598251d6fd07e8525296bcfe35e228e4198e1 Mon Sep 17 00:00:00 2001
From: outsourcestudio <31660852+outsourcestudio@users.noreply.github.com>
Date: Mon, 11 May 2020 23:35:04 +0300
Subject: [PATCH 1/4] Update MenuAnimator.swift

---
 Sources/MenuAnimator.swift | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Sources/MenuAnimator.swift b/Sources/MenuAnimator.swift
index 10d086f..31b3dcd 100644
--- a/Sources/MenuAnimator.swift
+++ b/Sources/MenuAnimator.swift
@@ -316,7 +316,7 @@ private extension MenuInteractiveTransition {
                 guard let transitionContext = transitionContext else {
                     fatalError("Invalid `transitionContext` value. This property should not be nil")
                 }
-                if progress > 0.4, velocity >= 0 || progress > 0.01, velocity > 100 {
+                if progress > 0.2 && velocity >= 0 {
                     finishTransition(currentPercentComplete: progress)
                     transitionContext.finishInteractiveTransition()
                 } else {

From f5f70a35a6f4e37176e0885e21c2b66146fdf5a4 Mon Sep 17 00:00:00 2001
From: Sergiy <stetris@gmail.com>
Date: Thu, 24 Sep 2020 12:15:04 +0300
Subject: [PATCH 2/4] hebrew detection

---
 Sources/MenuAnimator.swift | 61 ++++++++++++++++++++++++++++----------
 1 file changed, 46 insertions(+), 15 deletions(-)

diff --git a/Sources/MenuAnimator.swift b/Sources/MenuAnimator.swift
index 31b3dcd..d07533d 100644
--- a/Sources/MenuAnimator.swift
+++ b/Sources/MenuAnimator.swift
@@ -124,8 +124,10 @@ private extension MenuInteractiveTransition {
 
             toViewController.view.transform = CGAffineTransform(scaleX: options.contentScale, y: options.contentScale)
             addShadow(to: toViewController.view)
-
-            let newOrigin = CGPoint(x: screenWidth - options.visibleContentWidth, y: toViewController.view.frame.origin.y)
+            
+            let isLeft = UIApplication.shared.userInterfaceLayoutDirection == .leftToRight ? 1 : -1
+            
+            let newOrigin = CGPoint(x: CGFloat(isLeft) * screenWidth + options.visibleContentWidth, y: toViewController.view.frame.origin.y)
             let rect = CGRect(origin: newOrigin, size: toViewController.view.frame.size)
 
             toViewController.view.frame = rect
@@ -284,10 +286,16 @@ private extension MenuInteractiveTransition {
         let dx = translation.x / recognizerView.bounds.width
         let progress: CGFloat = abs(dx)
         var velocity = recognizer.velocity(in: recognizerView).x
-
+        
         if !present {
             velocity = -velocity
         }
+        
+        let isLeft = UIApplication.shared.userInterfaceLayoutDirection == .leftToRight ? true : false
+        
+        if (!isLeft) {
+            velocity = -velocity
+        }
 
         switch recognizer.state {
         case .began:
@@ -303,12 +311,22 @@ private extension MenuInteractiveTransition {
             }
 
         case .changed:
-            if transitionStarted && (present && dx > 0 || !present && dx < 0) {
-                guard let transitionContext = transitionContext else {
-                    fatalError("Invalid `transitionContext` value. This property should not be nil")
+            if (!isLeft) {
+                if transitionStarted && (present && dx < 0 || !present && dx > 0) {
+                    guard let transitionContext = transitionContext else {
+                        fatalError("Invalid `transitionContext` value. This property should not be nil")
+                    }
+                    updateTransition(percentComplete: progress)
+                    transitionContext.updateInteractiveTransition(progress)
+                }
+            } else {
+                if transitionStarted && (present && dx > 0 || !present && dx < 0) {
+                    guard let transitionContext = transitionContext else {
+                        fatalError("Invalid `transitionContext` value. This property should not be nil")
+                    }
+                    updateTransition(percentComplete: progress)
+                    transitionContext.updateInteractiveTransition(progress)
                 }
-                updateTransition(percentComplete: progress)
-                transitionContext.updateInteractiveTransition(progress)
             }
 
         case .cancelled, .ended:
@@ -316,12 +334,23 @@ private extension MenuInteractiveTransition {
                 guard let transitionContext = transitionContext else {
                     fatalError("Invalid `transitionContext` value. This property should not be nil")
                 }
-                if progress > 0.2 && velocity >= 0 {
-                    finishTransition(currentPercentComplete: progress)
-                    transitionContext.finishInteractiveTransition()
+                
+                if (!isLeft) {
+                    if progress < 0.2 && velocity <= 0 {
+                        cancelTransition(currentPercentComplete: progress)
+                        transitionContext.cancelInteractiveTransition()
+                    } else {
+                        finishTransition(currentPercentComplete: progress)
+                        transitionContext.finishInteractiveTransition()
+                    }
                 } else {
-                    cancelTransition(currentPercentComplete: progress)
-                    transitionContext.cancelInteractiveTransition()
+                    if progress > 0.2 && velocity >= 0 {
+                        finishTransition(currentPercentComplete: progress)
+                        transitionContext.finishInteractiveTransition()
+                    } else {
+                        cancelTransition(currentPercentComplete: progress)
+                        transitionContext.cancelInteractiveTransition()
+                    }
                 }
 
             } else if transitionShouldStarted, !transitionStarted {
@@ -358,6 +387,8 @@ private extension MenuInteractiveTransition {
         guard let contentSnapshotView = self.contentSnapshotView else {
             fatalError("Invalid `contentSnapshotView` value. This property should not be nil")
         }
+        
+        let isLeft = UIApplication.shared.userInterfaceLayoutDirection == .leftToRight ? 1 : -1
 
         if present {
             let newScale = 1 - (1 - options.contentScale) * percentComplete
@@ -365,7 +396,7 @@ private extension MenuInteractiveTransition {
 
             contentSnapshotView.transform = CGAffineTransform(scaleX: newScale, y: newScale)
 
-            let newOrigin = CGPoint(x: newX, y: contentSnapshotView.frame.origin.y)
+            let newOrigin = CGPoint(x: CGFloat(isLeft) * newX, y: contentSnapshotView.frame.origin.y)
             let rect = CGRect(origin: newOrigin, size: contentSnapshotView.frame.size)
 
             contentSnapshotView.frame = rect
@@ -380,7 +411,7 @@ private extension MenuInteractiveTransition {
             let newScale = options.contentScale + (1 - options.contentScale) * percentComplete
             toViewController.view.transform = CGAffineTransform(scaleX: newScale, y: newScale)
 
-            let newOrigin = CGPoint(x: newX, y: toViewController.view.frame.origin.y)
+            let newOrigin = CGPoint(x: CGFloat(isLeft) * newX, y: toViewController.view.frame.origin.y)
             let rect = CGRect(origin: newOrigin, size: toViewController.view.frame.size)
 
             toViewController.view.frame = rect

From 385d5b3453a161457ec817c30dc1f4e24ce7218a Mon Sep 17 00:00:00 2001
From: Sergiy <stetris@gmail.com>
Date: Sun, 27 Sep 2020 13:06:49 +0300
Subject: [PATCH 3/4] fix with shadow

---
 Sources/MenuAnimator.swift        | 7 ++++++-
 Sources/SideMenuItemOptions.swift | 1 +
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/Sources/MenuAnimator.swift b/Sources/MenuAnimator.swift
index d07533d..ca1d2bd 100644
--- a/Sources/MenuAnimator.swift
+++ b/Sources/MenuAnimator.swift
@@ -216,7 +216,12 @@ private extension MenuInteractiveTransition {
     func addShadow(to view: UIView) {
         view.layer.shadowColor = currentItemOptions.shadow.color?.cgColor
         view.layer.shadowOpacity = Float(currentItemOptions.shadow.opacity)
-        view.layer.shadowOffset = currentItemOptions.shadow.offset
+        let isLeft = UIApplication.shared.userInterfaceLayoutDirection == .leftToRight ? true : false
+        if (isLeft) {
+            view.layer.shadowOffset = currentItemOptions.shadow.offset
+        } else {
+            view.layer.shadowOffset = currentItemOptions.shadow.offset_reverse
+        }
         view.layer.shadowRadius = currentItemOptions.shadow.radius
         view.layer.shadowPath = UIBezierPath(roundedRect: view.bounds, cornerRadius: currentItemOptions.cornerRadius).cgPath
         view.layer.shouldRasterize = true
diff --git a/Sources/SideMenuItemOptions.swift b/Sources/SideMenuItemOptions.swift
index 94a5b0e..9a3bf91 100644
--- a/Sources/SideMenuItemOptions.swift
+++ b/Sources/SideMenuItemOptions.swift
@@ -17,6 +17,7 @@ public struct SideMenuItemOptions {
         public var color: UIColor? = UIColor.black
         public var opacity: CGFloat = 0.3
         public var offset: CGSize = CGSize(width: -5, height: 5)
+        public var offset_reverse: CGSize = CGSize(width: -5, height: 5)
         public var radius: CGFloat = 3
 
         public init() { }

From f9bc4c535429b56c7175dbb92fec4ef5eaec448e Mon Sep 17 00:00:00 2001
From: Sergiy <stetris@gmail.com>
Date: Sun, 27 Sep 2020 13:11:40 +0300
Subject: [PATCH 4/4] fix with shadow

---
 Sources/SideMenuItemOptions.swift | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Sources/SideMenuItemOptions.swift b/Sources/SideMenuItemOptions.swift
index 9a3bf91..0916d50 100644
--- a/Sources/SideMenuItemOptions.swift
+++ b/Sources/SideMenuItemOptions.swift
@@ -17,7 +17,7 @@ public struct SideMenuItemOptions {
         public var color: UIColor? = UIColor.black
         public var opacity: CGFloat = 0.3
         public var offset: CGSize = CGSize(width: -5, height: 5)
-        public var offset_reverse: CGSize = CGSize(width: -5, height: 5)
+        public var offset_reverse: CGSize = CGSize(width: 5, height: 5)
         public var radius: CGFloat = 3
 
         public init() { }