From 9ac3e90adebb9ca0ac91f9b835a45242e438c642 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Wed, 13 May 2020 03:19:39 +0430
Subject: [PATCH 01/34] Add files via upload

Add animate.js file for components transition.
   - Transitions for Modals.
   - Transitions for Alerts.
   - Transitions for Dropdowns/PopperJS.
   - Transitions for Popovers/PopperJS.
   - Transitions for Tooltips/PopperJS.
   - Transitions for Tab Pills.

From bf04d169684e6f85f7010425593c315f380331a1 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Wed, 13 May 2020 03:31:16 +0430
Subject: [PATCH 02/34] components transitions

Add animate.js file for components transition.
   - Transitions for Modals.
   - Transitions for Alerts.
   - Transitions for Dropdowns/PopperJS.
   - Transitions for Popovers/PopperJS.
   - Transitions for Tooltips/PopperJS.
   - Transitions for Tab Pills.
---
 dist/animate.js | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)
 create mode 100644 dist/animate.js

diff --git a/dist/animate.js b/dist/animate.js
new file mode 100644
index 0000000..d00d25c
--- /dev/null
+++ b/dist/animate.js
@@ -0,0 +1,32 @@
+function fadeIn(id, duration) {
+	id.animate([ { opacity: 0 }, { opacity: 1 } ], {
+		duration: duration,
+		easing: 'linear'
+	});
+}
+
+function fadeOut(id, duration) {
+	id.animate([ { opacity: 1 }, { opacity: 0 } ], {
+		duration: duration,
+		easing: 'linear'
+	});
+}
+
+function zoomIn(id) {
+	id.animate(
+		[
+			{
+				opacity: 0,
+				transform: 'translateY(20%) scale(.8)'
+			},
+			{
+				opacity: 1,
+				transform: 'translateY(0) scale(1)'
+			}
+		],
+		{
+			duration: 300,
+			easing: 'linear'
+		}
+	);
+}
\ No newline at end of file

From 138030120ae5a67eae569eec695ed7fbb24701c5 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Wed, 13 May 2020 03:35:12 +0430
Subject: [PATCH 03/34] Delete animate.js

---
 animate.js | 32 --------------------------------
 1 file changed, 32 deletions(-)
 delete mode 100644 animate.js

diff --git a/animate.js b/animate.js
deleted file mode 100644
index d00d25c..0000000
--- a/animate.js
+++ /dev/null
@@ -1,32 +0,0 @@
-function fadeIn(id, duration) {
-	id.animate([ { opacity: 0 }, { opacity: 1 } ], {
-		duration: duration,
-		easing: 'linear'
-	});
-}
-
-function fadeOut(id, duration) {
-	id.animate([ { opacity: 1 }, { opacity: 0 } ], {
-		duration: duration,
-		easing: 'linear'
-	});
-}
-
-function zoomIn(id) {
-	id.animate(
-		[
-			{
-				opacity: 0,
-				transform: 'translateY(20%) scale(.8)'
-			},
-			{
-				opacity: 1,
-				transform: 'translateY(0) scale(1)'
-			}
-		],
-		{
-			duration: 300,
-			easing: 'linear'
-		}
-	);
-}
\ No newline at end of file

From b7d88e589806e7dddd83bb0fdc66995b4a5ac634 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Wed, 13 May 2020 03:37:36 +0430
Subject: [PATCH 04/34] feature: add alert.js

Add some changes for alert.js file to have better and smooth transitions for alerts.
---
 dist/alert.js | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/dist/alert.js b/dist/alert.js
index 27ab694..a5c3804 100644
--- a/dist/alert.js
+++ b/dist/alert.js
@@ -1,10 +1,14 @@
 function closeAlert(event){
   let alert = event.currentTarget.getAttribute("data-target");
+  let container = document.querySelector(alert);
   if(alert){
-    alert = document.querySelectorAll(alert);
-    for (var index = 0; index < alert.length; index++) {
-      alert[index].parentNode.removeChild(alert[index]);
-    }
+    fadeOut(container, 500);
+    setTimeout(() => {
+      alert = document.querySelectorAll(alert);
+      for (var index = 0; index < alert.length; index++) {
+        alert[index].parentNode.removeChild(alert[index]);
+      }
+    }, 500);
   }
 }
 

From 1bdf15b8aa0b76af5880bacb002fb1290ce12176 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Wed, 13 May 2020 03:46:05 +0430
Subject: [PATCH 05/34] feature: add tabs.js

Add some changes for tabs.js file to have better and smooth transitions for tabs changes.
---
 dist/tabs.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/dist/tabs.js b/dist/tabs.js
index b2ee91b..e689d20 100644
--- a/dist/tabs.js
+++ b/dist/tabs.js
@@ -45,8 +45,10 @@ function initTabs(activeClasses,normalClasses){
     normalClasses = normalClasses ? normalClasses:"text-blue-600 bg-white";
     changeAtiveTab(event,activeClasses,normalClasses)
   }
+  const toggleAnimation = () => Array.from(dataTabs).forEach(el => zoomIn(document.querySelector(el.attributes.href.value)));
   for (var index = 0; index < dataTabs.length; index++) {
     dataTabs[index].addEventListener("click",toggleFunction);
+    dataTabs[index].addEventListener("click",toggleAnimation);
   }
 }
 

From d10bc9314e96a718ac361faac7b429403ebd1e3e Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Wed, 13 May 2020 03:49:58 +0430
Subject: [PATCH 06/34] feature: add popover.js

Add some changes for popover.js file to have better and smooth transitions for popovers.
---
 dist/popover.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dist/popover.js b/dist/popover.js
index b570f08..0adaaec 100644
--- a/dist/popover.js
+++ b/dist/popover.js
@@ -26,6 +26,7 @@ function togglePopper(event){
     default:
       break;
   }
+  fadeIn(popperElement, 500);
   popperInnerElement.classList.toggle(marginClass);
 }
 

From f92621c7bb619d7f250758bc773a0e89a443f2b0 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Wed, 13 May 2020 03:53:34 +0430
Subject: [PATCH 07/34] feature: add tooltip.js

Add some changes for tooltip.js file to have better and smooth transition for tooltip.
---
 dist/tooltip.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dist/tooltip.js b/dist/tooltip.js
index e17b773..c689d9e 100644
--- a/dist/tooltip.js
+++ b/dist/tooltip.js
@@ -26,6 +26,7 @@ function togglePopper(event){
     default:
       break;
   }
+  fadeIn(popperElement, 500);
   popperInnerElement.classList.toggle(marginClass);
 }
 

From cb6215bdb40ae890225e30ccf73bce38f4b2a539 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Wed, 13 May 2020 03:56:14 +0430
Subject: [PATCH 08/34] feature: add dropdown.js

Add some changes for dropdown.js file to have better and smooth transition for dropdown button.
---
 dist/dropdown.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dist/dropdown.js b/dist/dropdown.js
index 6ea103e..65acb3c 100644
--- a/dist/dropdown.js
+++ b/dist/dropdown.js
@@ -26,6 +26,7 @@ function togglePopper(event){
     default:
       break;
   }
+  fadeIn(popperElement, 500);
   popperInnerElement.classList.toggle(marginClass);
 }
 

From 27c08ba654741c5c449337396189bf77746e4c74 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Wed, 13 May 2020 03:59:07 +0430
Subject: [PATCH 09/34] feature: add modal.js

Add some changes for modal.js file to have better and smooth transition for modal.
---
 dist/modal.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dist/modal.js b/dist/modal.js
index 2611148..5edb983 100644
--- a/dist/modal.js
+++ b/dist/modal.js
@@ -3,6 +3,7 @@ function toggleModal(event){
   let modal = document.querySelector(modalID);
   let modalDialog = document.querySelector(modalID+"-dialog");
   let modalBackdrop = document.querySelector(modalID+"-backdrop");
+  zoomIn(modalDialog);
   modalBackdrop.classList.toggle("hidden");
   modalBackdrop.classList.toggle("flex");
   if (modal.classList.contains("hidden")) {

From 5d329873438b51a528498f9e8311b166ec46e92a Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:48:40 +0430
Subject: [PATCH 10/34] Update alert.js

---
 dist/alert.js | 43 +++++++++++++++++++------------------------
 1 file changed, 19 insertions(+), 24 deletions(-)

diff --git a/dist/alert.js b/dist/alert.js
index a5c3804..19c8de4 100644
--- a/dist/alert.js
+++ b/dist/alert.js
@@ -1,24 +1,19 @@
-function closeAlert(event){
-  let alert = event.currentTarget.getAttribute("data-target");
-  let container = document.querySelector(alert);
-  if(alert){
-    fadeOut(container, 500);
-    setTimeout(() => {
-      alert = document.querySelectorAll(alert);
-      for (var index = 0; index < alert.length; index++) {
-        alert[index].parentNode.removeChild(alert[index]);
-      }
-    }, 500);
-  }
-}
-
-function initAlert(){
-  let dataClose = document.querySelectorAll("[data-close='alert']");
-  for (var index = 0; index < dataClose.length; index++) {
-    dataClose[index].addEventListener("click",closeAlert);
-  }
-}
-
-(function () {
-  initAlert();
-}());
+const closeAlert = e => {
+  let alert = e.currentTarget.getAttribute("data-target");
+
+  if (alert) {
+    alert = document.querySelectorAll(alert);
+
+    for (let i of alert) {
+      fadeOut(i);
+      
+      setTimeout(() => i.remove(), 450);
+    }
+  }
+}
+
+const initAlert = () => {
+  const dataClose = document.querySelectorAll("[data-close='alert'");
+
+  for (let i of dataClose) i.addEventListener("click", closeAlert);
+}
\ No newline at end of file

From 441395c57a7df6ae0219c378dd0024a20b66a617 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:49:16 +0430
Subject: [PATCH 11/34] Update animations.js

---
 animations.js | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)
 create mode 100644 animations.js

diff --git a/animations.js b/animations.js
new file mode 100644
index 0000000..1e83ecb
--- /dev/null
+++ b/animations.js
@@ -0,0 +1,89 @@
+const fadeIn = (id, duration) => {
+    id.animate([{ opacity: 0 }, { opacity: 1 }], {
+        duration: duration ? duration : 500,
+        easing: "linear"
+    })
+}
+
+const fadeOut = (id, duration) => {
+    id.animate([{ opacity: 1 }, { opacity: 0 }], {
+        duration: duration ? duration : 500,
+        easing: "linear"
+    })
+}
+
+const slideInBottom = id => {
+    id.animate([
+        {
+            opacity: 0,
+            transform: "translateY(25%)"
+        },
+        
+        {
+            opacity: 1,
+            transform: "translateY(0)"
+        }
+    ], 
+    
+    {
+        duration: 300,
+        easing: "ease-out"
+    })
+}
+
+const slideOutBottom = id => {
+    id.animate([
+        {
+            opacity: 1,
+            transform: "translateY(0)"
+        },
+        
+        {
+            opacity: 0,
+            transform: "translateY(25%)"
+        }
+    ], 
+    
+    {
+        duration: 300,
+        easing: "ease-out"
+    })
+}
+
+const dropdownIn = id => {
+    id.animate([
+        {
+            opacity: 0,
+            transform: "translate(0, 50px)"
+        },
+        
+        {
+            opacity: 1,
+            transform: "translate(0, 38px)"
+        }
+    ], 
+    
+    {
+        duration: 300,
+        easing: "ease-out"
+    })
+}
+
+const dropdownOut = id => {
+    id.animate([
+        {
+            opacity: 1,
+            transform: "translate(0, 38px)"
+        },
+        
+        {
+            opacity: 0,
+            transform: "translate(0, 50px)"
+        }
+    ], 
+    
+    {
+        duration: 300,
+        easing: "ease-out"
+    })
+}
\ No newline at end of file

From 51522f4a80e128d8ae07f05d683ab28f4910d463 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:49:35 +0430
Subject: [PATCH 12/34] Upadate collapse.js

---
 collapse.js | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 collapse.js

diff --git a/collapse.js b/collapse.js
new file mode 100644
index 0000000..1908a56
--- /dev/null
+++ b/collapse.js
@@ -0,0 +1,11 @@
+const toggleCollapse = e => {
+  const collapseID  = e.currentTarget.getAttribute("data-target");
+
+  document.querySelector(collapseID).classList.toggle("hidden");
+}
+
+const initCollapse = () => {
+  const dataCollapse = document.querySelectorAll("[data-toggle='collapse']");
+  
+  for (let i of dataCollapse) i.addEventListener("click",toggleCollapse);
+}
\ No newline at end of file

From cef8515f8b4123f6a2bd8ab1d3fa9446c748312f Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:49:50 +0430
Subject: [PATCH 13/34] Update dropdown.js

---
 dropdown.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)
 create mode 100644 dropdown.js

diff --git a/dropdown.js b/dropdown.js
new file mode 100644
index 0000000..a29f9fa
--- /dev/null
+++ b/dropdown.js
@@ -0,0 +1,48 @@
+const toggleDropdown = e => {
+  let marginClass;
+
+  const element             = e.currentTarget;
+  const popperID            = element.getAttribute("data-target");
+  const placement           = element.getAttribute("data-placement");
+  const popperElement       = document.querySelector(popperID);
+  const popperInnerElement  = popperElement.querySelector("div");
+
+  Popper.createPopper(element, popperElement, {
+    placement: (placement ? placement : 'bottom')
+  });
+
+  switch (placement) {
+    case "bottom":
+      marginClass = "mt-3"
+      break;
+    case "top":
+      marginClass = "mb-3"
+      break;
+    case "left":
+      marginClass = "mr-3"
+      break;
+    case "right":
+      marginClass = "ml-3"
+      break;
+  }
+
+  if (popperElement.classList.contains("hidden")) {
+    dropdownIn(popperElement);
+
+    popperElement.classList.remove("hidden");
+    popperInnerElement.classList.add(marginClass);
+  } else {
+    dropdownOut(popperElement);
+    
+    setTimeout(() => {
+      popperElement.classList.add("hidden");
+      popperInnerElement.classList.remove(marginClass);
+    }, 300);
+  }
+}
+
+const initDropdown = () => {
+  const dropdownData = document.querySelectorAll("[data-toggle='dropdown']");
+  
+  for (let i of dropdownData) i.addEventListener("click",toggleDropdown);
+}
\ No newline at end of file

From 47a458465bb593990138a7883be8f0673cc2e42c Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:50:09 +0430
Subject: [PATCH 14/34] Update modal.sj

---
 modal.js | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
 create mode 100644 modal.js

diff --git a/modal.js b/modal.js
new file mode 100644
index 0000000..58a59ec
--- /dev/null
+++ b/modal.js
@@ -0,0 +1,41 @@
+const toggleModal = e => {
+  const modalID       = e.currentTarget.getAttribute("data-target");
+  const modal         = document.querySelector(modalID);
+  const modalDialog   = document.querySelector(`${modalID}-dialog`);
+  const modalBackdrop = document.querySelector(`${modalID}-backdrop`);
+
+  modalBackdrop.classList.toggle("hidden");
+  modalBackdrop.classList.toggle("flex");
+
+  if (modal.classList.contains("hidden")) {
+    modal.style.display = "block";
+
+    slideInBottom(modalDialog);
+
+    setTimeout(() => {
+      modal.classList.remove("hidden");
+      modal.classList.add("flex");
+      modal.classList.remove("opacity-0");
+      modalDialog.classList.remove("-translate-y-1");
+      modalDialog.classList.add("translate-y-1");
+    }, 30);
+  } else {
+    modalDialog.classList.remove("translate-y-1");
+    modalDialog.classList.add("-translate-y-1");
+    
+    slideOutBottom(modalDialog);
+
+    setTimeout(() => {
+      modal.style.display = "none";
+      modal.classList.add("hidden");
+      modal.classList.remove("flex");
+      modal.classList.add("opacity-0");
+    }, 300);
+  }
+}
+
+const initModal = () => {
+  const dataModal = document.querySelectorAll("[data-toggle='modal'");
+
+  for (let i of dataModal) i.addEventListener("click", toggleModal);
+}
\ No newline at end of file

From 4d8bd7189ed588225b98ec3a256bff7897ad7d79 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:50:29 +0430
Subject: [PATCH 15/34] Update popover.js

---
 popover.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)
 create mode 100644 popover.js

diff --git a/popover.js b/popover.js
new file mode 100644
index 0000000..9205b8e
--- /dev/null
+++ b/popover.js
@@ -0,0 +1,47 @@
+const togglePopper = e => {
+  let marginClass;
+
+  const element             = e.currentTarget;
+  const popperID            = element.getAttribute("data-target");
+  let placement             = element.getAttribute("data-placement");
+  const popperElement       = document.querySelector(popperID);
+  const popperInnerElement  = popperElement.querySelector("div");
+
+  Popper.createPopper(element, popperElement, {
+    placement: (placement ? placement : "right")
+  });
+
+  switch (placement) {
+    case "bottom":
+      marginClass = "mt-3";
+      break;
+    case "top":
+      marginClass = "mb-3";
+      break;
+    case "left":
+      marginClass = "mr-3";
+      break;
+    case "right":
+      marginClass = "ml-3";
+      break;
+  }
+
+  if (popperElement.classList.contains("hidden")) {
+    fadeIn(popperElement, 200);
+    popperElement.classList.remove("hidden");
+    popperInnerElement.classList.add(marginClass);
+  } else {
+    fadeOut(popperElement, 200);
+    
+    setTimeout(() => {
+      popperElement.classList.add("hidden");
+      popperInnerElement.classList.remove(marginClass);
+    }, 180);
+  }
+}
+
+const initPopovers = () => {
+  const popoverData = document.querySelectorAll("[data-toggle='popover']");
+
+  for (let i of popoverData) i.addEventListener("click", togglePopper);
+}
\ No newline at end of file

From 3abedce04d1bba5253f75d4f927800f7a75c40ab Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:50:47 +0430
Subject: [PATCH 16/34] Update tabs.js

---
 tabs.js | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)
 create mode 100644 tabs.js

diff --git a/tabs.js b/tabs.js
new file mode 100644
index 0000000..6236a2e
--- /dev/null
+++ b/tabs.js
@@ -0,0 +1,52 @@
+const changeAtiveTab = (e, activeClasses, normalClasses) => {
+  e.preventDefault();
+
+  normalClasses = normalClasses.split(" ").filter(item => item !== " " && item !== "");
+  activeClasses = activeClasses.split(" ").filter(item => item !== " " && item !== "");
+
+  let queryActiveClasses  = activeClasses.map(item => "." + item);
+  let element             = e.currentTarget;
+  let elementID           = e.currentTarget.getAttribute("href");
+  let tabElement          = document.querySelector(elementID);
+  let ulElement           = element.parentNode.parentNode;
+  let activeElement       = ulElement.querySelector("li > a" + queryActiveClasses);
+  let activeElementID     = activeElement.getAttribute("href");
+  let activeTabElement    = document.querySelector(activeElementID);
+
+  normalClasses.forEach(item => {
+    activeElement.classList.add(item);
+    element.classList.remove(item);
+  });
+
+  activeClasses.forEach(item => {
+    activeElement.classList.remove(item);
+    element.classList.add(item);
+  });
+
+  activeTabElement.classList.add("hidden");
+  activeTabElement.classList.remove("block");
+  tabElement.classList.remove("hidden");
+  tabElement.classList.add("block");
+}
+
+const initTabs = (activeClasses, normalClasses) => {
+  const dataTabs = document.querySelectorAll("[data-toggle='tab']");
+
+  const toggleFunction = e => {
+    e.preventDefault();
+
+    activeClasses = activeClasses ? activeClasses:"bg-blue-600 text-white";
+    normalClasses = normalClasses ? normalClasses:"text-blue-600 bg-white";
+
+    changeAtiveTab(e, activeClasses, normalClasses);
+  }
+
+  const toggleAnimation = () => {
+    Array.from(dataTabs).forEach(el => fadeIn(document.querySelector(el.attributes.href.value), 300));
+  }
+
+  for (let i of dataTabs) {
+    i.addEventListener("click", toggleFunction);
+    i.addEventListener("click", toggleAnimation);
+  }
+}
\ No newline at end of file

From b491b6332ef4cbe084496d41e1d26aa57a476bb5 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:51:06 +0430
Subject: [PATCH 17/34] Update tooltip.js

---
 tooltip.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)
 create mode 100644 tooltip.js

diff --git a/tooltip.js b/tooltip.js
new file mode 100644
index 0000000..159595d
--- /dev/null
+++ b/tooltip.js
@@ -0,0 +1,50 @@
+const toggleTooltips = e => {
+  let marginClass;
+
+  const element             = e.currentTarget;
+  const popperID            = element.getAttribute("data-target");
+  const placement           = element.getAttribute("data-placement");
+  const popperElement       = document.querySelector(popperID);
+  const popperInnerElement  = popperElement.querySelector("div");
+
+  popper = Popper.createPopper(element, popperElement, {
+    placement: (placement ? placement : 'bottom')
+  });
+
+  switch (placement) {
+    case "bottom":
+      marginClass = "mt-3"
+      break;
+    case "top":
+      marginClass = "mb-3"
+      break;
+    case "left":
+      marginClass = "mr-3"
+      break;
+    case "right":
+      marginClass = "ml-3"
+      break;
+  }
+
+  if (popperElement.classList.contains("hidden")) {
+    fadeIn(popperElement, 200);
+    popperElement.classList.remove("hidden");
+    popperInnerElement.classList.add(marginClass);
+  } else {
+    fadeOut(popperElement, 200);
+    
+    setTimeout(() => {
+      popperElement.classList.add("hidden");
+      popperInnerElement.classList.remove(marginClass);
+    }, 180);
+  }
+}
+
+const initTooltips = () => {
+  const tooltipData = document.querySelectorAll("[data-toggle='tooltip'");
+
+  for (let i of tooltipData) {
+    i.addEventListener("mouseenter", toggleTooltips);
+    i.addEventListener("mouseleave", toggleTooltips);
+  }
+}
\ No newline at end of file

From 90ac4bf7dc997e82eec30b0d61426b1ea1148e97 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:55:25 +0430
Subject: [PATCH 18/34] Delete animations.js

---
 animations.js | 89 ---------------------------------------------------
 1 file changed, 89 deletions(-)
 delete mode 100644 animations.js

diff --git a/animations.js b/animations.js
deleted file mode 100644
index 1e83ecb..0000000
--- a/animations.js
+++ /dev/null
@@ -1,89 +0,0 @@
-const fadeIn = (id, duration) => {
-    id.animate([{ opacity: 0 }, { opacity: 1 }], {
-        duration: duration ? duration : 500,
-        easing: "linear"
-    })
-}
-
-const fadeOut = (id, duration) => {
-    id.animate([{ opacity: 1 }, { opacity: 0 }], {
-        duration: duration ? duration : 500,
-        easing: "linear"
-    })
-}
-
-const slideInBottom = id => {
-    id.animate([
-        {
-            opacity: 0,
-            transform: "translateY(25%)"
-        },
-        
-        {
-            opacity: 1,
-            transform: "translateY(0)"
-        }
-    ], 
-    
-    {
-        duration: 300,
-        easing: "ease-out"
-    })
-}
-
-const slideOutBottom = id => {
-    id.animate([
-        {
-            opacity: 1,
-            transform: "translateY(0)"
-        },
-        
-        {
-            opacity: 0,
-            transform: "translateY(25%)"
-        }
-    ], 
-    
-    {
-        duration: 300,
-        easing: "ease-out"
-    })
-}
-
-const dropdownIn = id => {
-    id.animate([
-        {
-            opacity: 0,
-            transform: "translate(0, 50px)"
-        },
-        
-        {
-            opacity: 1,
-            transform: "translate(0, 38px)"
-        }
-    ], 
-    
-    {
-        duration: 300,
-        easing: "ease-out"
-    })
-}
-
-const dropdownOut = id => {
-    id.animate([
-        {
-            opacity: 1,
-            transform: "translate(0, 38px)"
-        },
-        
-        {
-            opacity: 0,
-            transform: "translate(0, 50px)"
-        }
-    ], 
-    
-    {
-        duration: 300,
-        easing: "ease-out"
-    })
-}
\ No newline at end of file

From 4458f84de73022408f9f7156c1e50ddd447b9b90 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:55:35 +0430
Subject: [PATCH 19/34] Delete collapse.js

---
 collapse.js | 11 -----------
 1 file changed, 11 deletions(-)
 delete mode 100644 collapse.js

diff --git a/collapse.js b/collapse.js
deleted file mode 100644
index 1908a56..0000000
--- a/collapse.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const toggleCollapse = e => {
-  const collapseID  = e.currentTarget.getAttribute("data-target");
-
-  document.querySelector(collapseID).classList.toggle("hidden");
-}
-
-const initCollapse = () => {
-  const dataCollapse = document.querySelectorAll("[data-toggle='collapse']");
-  
-  for (let i of dataCollapse) i.addEventListener("click",toggleCollapse);
-}
\ No newline at end of file

From 01d80d5021fd6a203199c8503548cc08e1c27484 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:55:45 +0430
Subject: [PATCH 20/34] Delete dropdown.js

---
 dropdown.js | 48 ------------------------------------------------
 1 file changed, 48 deletions(-)
 delete mode 100644 dropdown.js

diff --git a/dropdown.js b/dropdown.js
deleted file mode 100644
index a29f9fa..0000000
--- a/dropdown.js
+++ /dev/null
@@ -1,48 +0,0 @@
-const toggleDropdown = e => {
-  let marginClass;
-
-  const element             = e.currentTarget;
-  const popperID            = element.getAttribute("data-target");
-  const placement           = element.getAttribute("data-placement");
-  const popperElement       = document.querySelector(popperID);
-  const popperInnerElement  = popperElement.querySelector("div");
-
-  Popper.createPopper(element, popperElement, {
-    placement: (placement ? placement : 'bottom')
-  });
-
-  switch (placement) {
-    case "bottom":
-      marginClass = "mt-3"
-      break;
-    case "top":
-      marginClass = "mb-3"
-      break;
-    case "left":
-      marginClass = "mr-3"
-      break;
-    case "right":
-      marginClass = "ml-3"
-      break;
-  }
-
-  if (popperElement.classList.contains("hidden")) {
-    dropdownIn(popperElement);
-
-    popperElement.classList.remove("hidden");
-    popperInnerElement.classList.add(marginClass);
-  } else {
-    dropdownOut(popperElement);
-    
-    setTimeout(() => {
-      popperElement.classList.add("hidden");
-      popperInnerElement.classList.remove(marginClass);
-    }, 300);
-  }
-}
-
-const initDropdown = () => {
-  const dropdownData = document.querySelectorAll("[data-toggle='dropdown']");
-  
-  for (let i of dropdownData) i.addEventListener("click",toggleDropdown);
-}
\ No newline at end of file

From 74e1cd8a2cf97ef3de524dc11d05f21cd61dd3d7 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:56:27 +0430
Subject: [PATCH 21/34] Delete modal.js

---
 modal.js | 41 -----------------------------------------
 1 file changed, 41 deletions(-)
 delete mode 100644 modal.js

diff --git a/modal.js b/modal.js
deleted file mode 100644
index 58a59ec..0000000
--- a/modal.js
+++ /dev/null
@@ -1,41 +0,0 @@
-const toggleModal = e => {
-  const modalID       = e.currentTarget.getAttribute("data-target");
-  const modal         = document.querySelector(modalID);
-  const modalDialog   = document.querySelector(`${modalID}-dialog`);
-  const modalBackdrop = document.querySelector(`${modalID}-backdrop`);
-
-  modalBackdrop.classList.toggle("hidden");
-  modalBackdrop.classList.toggle("flex");
-
-  if (modal.classList.contains("hidden")) {
-    modal.style.display = "block";
-
-    slideInBottom(modalDialog);
-
-    setTimeout(() => {
-      modal.classList.remove("hidden");
-      modal.classList.add("flex");
-      modal.classList.remove("opacity-0");
-      modalDialog.classList.remove("-translate-y-1");
-      modalDialog.classList.add("translate-y-1");
-    }, 30);
-  } else {
-    modalDialog.classList.remove("translate-y-1");
-    modalDialog.classList.add("-translate-y-1");
-    
-    slideOutBottom(modalDialog);
-
-    setTimeout(() => {
-      modal.style.display = "none";
-      modal.classList.add("hidden");
-      modal.classList.remove("flex");
-      modal.classList.add("opacity-0");
-    }, 300);
-  }
-}
-
-const initModal = () => {
-  const dataModal = document.querySelectorAll("[data-toggle='modal'");
-
-  for (let i of dataModal) i.addEventListener("click", toggleModal);
-}
\ No newline at end of file

From 29146a06059ce369aff4c8d649457f824c984f5f Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:56:41 +0430
Subject: [PATCH 22/34] Delete popover.js

---
 popover.js | 47 -----------------------------------------------
 1 file changed, 47 deletions(-)
 delete mode 100644 popover.js

diff --git a/popover.js b/popover.js
deleted file mode 100644
index 9205b8e..0000000
--- a/popover.js
+++ /dev/null
@@ -1,47 +0,0 @@
-const togglePopper = e => {
-  let marginClass;
-
-  const element             = e.currentTarget;
-  const popperID            = element.getAttribute("data-target");
-  let placement             = element.getAttribute("data-placement");
-  const popperElement       = document.querySelector(popperID);
-  const popperInnerElement  = popperElement.querySelector("div");
-
-  Popper.createPopper(element, popperElement, {
-    placement: (placement ? placement : "right")
-  });
-
-  switch (placement) {
-    case "bottom":
-      marginClass = "mt-3";
-      break;
-    case "top":
-      marginClass = "mb-3";
-      break;
-    case "left":
-      marginClass = "mr-3";
-      break;
-    case "right":
-      marginClass = "ml-3";
-      break;
-  }
-
-  if (popperElement.classList.contains("hidden")) {
-    fadeIn(popperElement, 200);
-    popperElement.classList.remove("hidden");
-    popperInnerElement.classList.add(marginClass);
-  } else {
-    fadeOut(popperElement, 200);
-    
-    setTimeout(() => {
-      popperElement.classList.add("hidden");
-      popperInnerElement.classList.remove(marginClass);
-    }, 180);
-  }
-}
-
-const initPopovers = () => {
-  const popoverData = document.querySelectorAll("[data-toggle='popover']");
-
-  for (let i of popoverData) i.addEventListener("click", togglePopper);
-}
\ No newline at end of file

From 1f51aa7c417462835ede77658525d85718a7d4b4 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:56:52 +0430
Subject: [PATCH 23/34] Delete tabs.js

---
 tabs.js | 52 ----------------------------------------------------
 1 file changed, 52 deletions(-)
 delete mode 100644 tabs.js

diff --git a/tabs.js b/tabs.js
deleted file mode 100644
index 6236a2e..0000000
--- a/tabs.js
+++ /dev/null
@@ -1,52 +0,0 @@
-const changeAtiveTab = (e, activeClasses, normalClasses) => {
-  e.preventDefault();
-
-  normalClasses = normalClasses.split(" ").filter(item => item !== " " && item !== "");
-  activeClasses = activeClasses.split(" ").filter(item => item !== " " && item !== "");
-
-  let queryActiveClasses  = activeClasses.map(item => "." + item);
-  let element             = e.currentTarget;
-  let elementID           = e.currentTarget.getAttribute("href");
-  let tabElement          = document.querySelector(elementID);
-  let ulElement           = element.parentNode.parentNode;
-  let activeElement       = ulElement.querySelector("li > a" + queryActiveClasses);
-  let activeElementID     = activeElement.getAttribute("href");
-  let activeTabElement    = document.querySelector(activeElementID);
-
-  normalClasses.forEach(item => {
-    activeElement.classList.add(item);
-    element.classList.remove(item);
-  });
-
-  activeClasses.forEach(item => {
-    activeElement.classList.remove(item);
-    element.classList.add(item);
-  });
-
-  activeTabElement.classList.add("hidden");
-  activeTabElement.classList.remove("block");
-  tabElement.classList.remove("hidden");
-  tabElement.classList.add("block");
-}
-
-const initTabs = (activeClasses, normalClasses) => {
-  const dataTabs = document.querySelectorAll("[data-toggle='tab']");
-
-  const toggleFunction = e => {
-    e.preventDefault();
-
-    activeClasses = activeClasses ? activeClasses:"bg-blue-600 text-white";
-    normalClasses = normalClasses ? normalClasses:"text-blue-600 bg-white";
-
-    changeAtiveTab(e, activeClasses, normalClasses);
-  }
-
-  const toggleAnimation = () => {
-    Array.from(dataTabs).forEach(el => fadeIn(document.querySelector(el.attributes.href.value), 300));
-  }
-
-  for (let i of dataTabs) {
-    i.addEventListener("click", toggleFunction);
-    i.addEventListener("click", toggleAnimation);
-  }
-}
\ No newline at end of file

From 84f37c257eebc91179c6ce634dbfcb21f5a48305 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 12:57:03 +0430
Subject: [PATCH 24/34] Delete tooltip.js

---
 tooltip.js | 50 --------------------------------------------------
 1 file changed, 50 deletions(-)
 delete mode 100644 tooltip.js

diff --git a/tooltip.js b/tooltip.js
deleted file mode 100644
index 159595d..0000000
--- a/tooltip.js
+++ /dev/null
@@ -1,50 +0,0 @@
-const toggleTooltips = e => {
-  let marginClass;
-
-  const element             = e.currentTarget;
-  const popperID            = element.getAttribute("data-target");
-  const placement           = element.getAttribute("data-placement");
-  const popperElement       = document.querySelector(popperID);
-  const popperInnerElement  = popperElement.querySelector("div");
-
-  popper = Popper.createPopper(element, popperElement, {
-    placement: (placement ? placement : 'bottom')
-  });
-
-  switch (placement) {
-    case "bottom":
-      marginClass = "mt-3"
-      break;
-    case "top":
-      marginClass = "mb-3"
-      break;
-    case "left":
-      marginClass = "mr-3"
-      break;
-    case "right":
-      marginClass = "ml-3"
-      break;
-  }
-
-  if (popperElement.classList.contains("hidden")) {
-    fadeIn(popperElement, 200);
-    popperElement.classList.remove("hidden");
-    popperInnerElement.classList.add(marginClass);
-  } else {
-    fadeOut(popperElement, 200);
-    
-    setTimeout(() => {
-      popperElement.classList.add("hidden");
-      popperInnerElement.classList.remove(marginClass);
-    }, 180);
-  }
-}
-
-const initTooltips = () => {
-  const tooltipData = document.querySelectorAll("[data-toggle='tooltip'");
-
-  for (let i of tooltipData) {
-    i.addEventListener("mouseenter", toggleTooltips);
-    i.addEventListener("mouseleave", toggleTooltips);
-  }
-}
\ No newline at end of file

From ebd2aeb23ba6c101c045cd40676f0a9e3a7af5ca Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:01:46 +0430
Subject: [PATCH 25/34] Delete alert.js

---
 dist/alert.js | 19 -------------------
 1 file changed, 19 deletions(-)
 delete mode 100644 dist/alert.js

diff --git a/dist/alert.js b/dist/alert.js
deleted file mode 100644
index 19c8de4..0000000
--- a/dist/alert.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const closeAlert = e => {
-  let alert = e.currentTarget.getAttribute("data-target");
-
-  if (alert) {
-    alert = document.querySelectorAll(alert);
-
-    for (let i of alert) {
-      fadeOut(i);
-      
-      setTimeout(() => i.remove(), 450);
-    }
-  }
-}
-
-const initAlert = () => {
-  const dataClose = document.querySelectorAll("[data-close='alert'");
-
-  for (let i of dataClose) i.addEventListener("click", closeAlert);
-}
\ No newline at end of file

From fa97d127b2878f7c2feddf8546395a0934940ca2 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:02:22 +0430
Subject: [PATCH 26/34] Update animations.js

---
 dist/animations.js | 89 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)
 create mode 100644 dist/animations.js

diff --git a/dist/animations.js b/dist/animations.js
new file mode 100644
index 0000000..1e83ecb
--- /dev/null
+++ b/dist/animations.js
@@ -0,0 +1,89 @@
+const fadeIn = (id, duration) => {
+    id.animate([{ opacity: 0 }, { opacity: 1 }], {
+        duration: duration ? duration : 500,
+        easing: "linear"
+    })
+}
+
+const fadeOut = (id, duration) => {
+    id.animate([{ opacity: 1 }, { opacity: 0 }], {
+        duration: duration ? duration : 500,
+        easing: "linear"
+    })
+}
+
+const slideInBottom = id => {
+    id.animate([
+        {
+            opacity: 0,
+            transform: "translateY(25%)"
+        },
+        
+        {
+            opacity: 1,
+            transform: "translateY(0)"
+        }
+    ], 
+    
+    {
+        duration: 300,
+        easing: "ease-out"
+    })
+}
+
+const slideOutBottom = id => {
+    id.animate([
+        {
+            opacity: 1,
+            transform: "translateY(0)"
+        },
+        
+        {
+            opacity: 0,
+            transform: "translateY(25%)"
+        }
+    ], 
+    
+    {
+        duration: 300,
+        easing: "ease-out"
+    })
+}
+
+const dropdownIn = id => {
+    id.animate([
+        {
+            opacity: 0,
+            transform: "translate(0, 50px)"
+        },
+        
+        {
+            opacity: 1,
+            transform: "translate(0, 38px)"
+        }
+    ], 
+    
+    {
+        duration: 300,
+        easing: "ease-out"
+    })
+}
+
+const dropdownOut = id => {
+    id.animate([
+        {
+            opacity: 1,
+            transform: "translate(0, 38px)"
+        },
+        
+        {
+            opacity: 0,
+            transform: "translate(0, 50px)"
+        }
+    ], 
+    
+    {
+        duration: 300,
+        easing: "ease-out"
+    })
+}
\ No newline at end of file

From 9665b76f5c73ebd0f756db2ceb1385f9a8aca7e2 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:03:21 +0430
Subject: [PATCH 27/34] Delete animate.js, replace it with animations.js

---
 dist/animate.js | 32 --------------------------------
 1 file changed, 32 deletions(-)
 delete mode 100644 dist/animate.js

diff --git a/dist/animate.js b/dist/animate.js
deleted file mode 100644
index d00d25c..0000000
--- a/dist/animate.js
+++ /dev/null
@@ -1,32 +0,0 @@
-function fadeIn(id, duration) {
-	id.animate([ { opacity: 0 }, { opacity: 1 } ], {
-		duration: duration,
-		easing: 'linear'
-	});
-}
-
-function fadeOut(id, duration) {
-	id.animate([ { opacity: 1 }, { opacity: 0 } ], {
-		duration: duration,
-		easing: 'linear'
-	});
-}
-
-function zoomIn(id) {
-	id.animate(
-		[
-			{
-				opacity: 0,
-				transform: 'translateY(20%) scale(.8)'
-			},
-			{
-				opacity: 1,
-				transform: 'translateY(0) scale(1)'
-			}
-		],
-		{
-			duration: 300,
-			easing: 'linear'
-		}
-	);
-}
\ No newline at end of file

From bbaa1c54a09cbaab2437f66efbf73c624fa83027 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:03:39 +0430
Subject: [PATCH 28/34] Add alert.js

---
 dist/alert.js | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
 create mode 100644 dist/alert.js

diff --git a/dist/alert.js b/dist/alert.js
new file mode 100644
index 0000000..19c8de4
--- /dev/null
+++ b/dist/alert.js
@@ -0,0 +1,19 @@
+const closeAlert = e => {
+  let alert = e.currentTarget.getAttribute("data-target");
+
+  if (alert) {
+    alert = document.querySelectorAll(alert);
+
+    for (let i of alert) {
+      fadeOut(i);
+      
+      setTimeout(() => i.remove(), 450);
+    }
+  }
+}
+
+const initAlert = () => {
+  const dataClose = document.querySelectorAll("[data-close='alert'");
+
+  for (let i of dataClose) i.addEventListener("click", closeAlert);
+}
\ No newline at end of file

From 52b6ca9ae9e4175ca4d1aed46d70cf685e755642 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:04:01 +0430
Subject: [PATCH 29/34] Update collapse.js

---
 dist/collapse.js | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/dist/collapse.js b/dist/collapse.js
index 145bf81..1908a56 100644
--- a/dist/collapse.js
+++ b/dist/collapse.js
@@ -1,15 +1,11 @@
-function toggleCollapse(event){
-  let collapseID = event.currentTarget.getAttribute("data-target")
-  document.querySelector(collapseID).classList.toggle("hidden");
-}
-
-function initCollapse(){
-  let dataCollapse = document.querySelectorAll("[data-toggle='collapse']");
-  for (var index = 0; index < dataCollapse.length; index++) {
-    dataCollapse[index].addEventListener("click",toggleCollapse);
-  }
-}
-
-(function () {
-  initCollapse();
-}());
+const toggleCollapse = e => {
+  const collapseID  = e.currentTarget.getAttribute("data-target");
+
+  document.querySelector(collapseID).classList.toggle("hidden");
+}
+
+const initCollapse = () => {
+  const dataCollapse = document.querySelectorAll("[data-toggle='collapse']");
+  
+  for (let i of dataCollapse) i.addEventListener("click",toggleCollapse);
+}
\ No newline at end of file

From 0501d113c799415b842a8a47f78869fcebe38793 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:04:29 +0430
Subject: [PATCH 30/34] Update dropdown.js

---
 dist/dropdown.js | 90 ++++++++++++++++++++++++++----------------------
 1 file changed, 48 insertions(+), 42 deletions(-)

diff --git a/dist/dropdown.js b/dist/dropdown.js
index 65acb3c..a29f9fa 100644
--- a/dist/dropdown.js
+++ b/dist/dropdown.js
@@ -1,42 +1,48 @@
-function togglePopper(event){
-  let element = event.currentTarget;
-  let popperID = element.getAttribute("data-target");
-  let placement = element.getAttribute("data-placement");
-  let popperElement = document.querySelector(popperID);
-  let popperInnerElement = popperElement.querySelector("div");
-  let popper = Popper.createPopper(element, popperElement, {
-    placement: (placement ? placement : 'bottom')
-  });
-  popperElement.classList.toggle("hidden");
-  placement = popper.state.placement
-  let marginClass;
-  switch (placement) {
-    case "bottom":
-      marginClass = "mt-3"
-      break;
-    case "top":
-      marginClass = "mb-3"
-      break;
-    case "left":
-      marginClass = "mr-3"
-      break;
-    case "right":
-      marginClass = "ml-3"
-      break;
-    default:
-      break;
-  }
-  fadeIn(popperElement, 500);
-  popperInnerElement.classList.toggle(marginClass);
-}
-
-function initDropdowns(){
-  let dropdownData = document.querySelectorAll("[data-toggle='dropdown']");
-  for (var index = 0; index < dropdownData.length; index++) {
-    dropdownData[index].addEventListener("click",togglePopper);
-  }
-}
-
-(function () {
-  initDropdowns();
-}());
+const toggleDropdown = e => {
+  let marginClass;
+
+  const element             = e.currentTarget;
+  const popperID            = element.getAttribute("data-target");
+  const placement           = element.getAttribute("data-placement");
+  const popperElement       = document.querySelector(popperID);
+  const popperInnerElement  = popperElement.querySelector("div");
+
+  Popper.createPopper(element, popperElement, {
+    placement: (placement ? placement : 'bottom')
+  });
+
+  switch (placement) {
+    case "bottom":
+      marginClass = "mt-3"
+      break;
+    case "top":
+      marginClass = "mb-3"
+      break;
+    case "left":
+      marginClass = "mr-3"
+      break;
+    case "right":
+      marginClass = "ml-3"
+      break;
+  }
+
+  if (popperElement.classList.contains("hidden")) {
+    dropdownIn(popperElement);
+
+    popperElement.classList.remove("hidden");
+    popperInnerElement.classList.add(marginClass);
+  } else {
+    dropdownOut(popperElement);
+    
+    setTimeout(() => {
+      popperElement.classList.add("hidden");
+      popperInnerElement.classList.remove(marginClass);
+    }, 300);
+  }
+}
+
+const initDropdown = () => {
+  const dropdownData = document.querySelectorAll("[data-toggle='dropdown']");
+  
+  for (let i of dropdownData) i.addEventListener("click",toggleDropdown);
+}
\ No newline at end of file

From c596b833e7c0e0602132fc7857dc8ef696736bea Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:04:46 +0430
Subject: [PATCH 31/34] Update modal.js

---
 dist/modal.js | 80 ++++++++++++++++++++++++++-------------------------
 1 file changed, 41 insertions(+), 39 deletions(-)

diff --git a/dist/modal.js b/dist/modal.js
index 5edb983..58a59ec 100644
--- a/dist/modal.js
+++ b/dist/modal.js
@@ -1,39 +1,41 @@
-function toggleModal(event){
-  let modalID = event.currentTarget.getAttribute("data-target");
-  let modal = document.querySelector(modalID);
-  let modalDialog = document.querySelector(modalID+"-dialog");
-  let modalBackdrop = document.querySelector(modalID+"-backdrop");
-  zoomIn(modalDialog);
-  modalBackdrop.classList.toggle("hidden");
-  modalBackdrop.classList.toggle("flex");
-  if (modal.classList.contains("hidden")) {
-    modal.style.display = "block";
-    setTimeout(()=>{
-      modal.classList.remove("hidden");
-      modal.classList.add("flex");
-      modal.classList.remove("opacity-0");
-      modalDialog.classList.remove("-translate-y-1");
-      modalDialog.classList.add("translate-y-1");
-    },30);
-  } else {
-    modalDialog.classList.remove("translate-y-1");
-    modalDialog.classList.add("-translate-y-1");
-    setTimeout(()=>{
-      modal.style.display = "none";
-      modal.classList.add("hidden");
-      modal.classList.remove("flex");
-      modal.classList.add("opacity-0");
-    },30)
-  }
-}
-
-function initModal(){
-  let dataModal = document.querySelectorAll("[data-toggle='modal']");
-  for (var index = 0; index < dataModal.length; index++) {
-    dataModal[index].addEventListener("click",toggleModal);
-  }
-}
-
-(function () {
-  initModal();
-}());
+const toggleModal = e => {
+  const modalID       = e.currentTarget.getAttribute("data-target");
+  const modal         = document.querySelector(modalID);
+  const modalDialog   = document.querySelector(`${modalID}-dialog`);
+  const modalBackdrop = document.querySelector(`${modalID}-backdrop`);
+
+  modalBackdrop.classList.toggle("hidden");
+  modalBackdrop.classList.toggle("flex");
+
+  if (modal.classList.contains("hidden")) {
+    modal.style.display = "block";
+
+    slideInBottom(modalDialog);
+
+    setTimeout(() => {
+      modal.classList.remove("hidden");
+      modal.classList.add("flex");
+      modal.classList.remove("opacity-0");
+      modalDialog.classList.remove("-translate-y-1");
+      modalDialog.classList.add("translate-y-1");
+    }, 30);
+  } else {
+    modalDialog.classList.remove("translate-y-1");
+    modalDialog.classList.add("-translate-y-1");
+    
+    slideOutBottom(modalDialog);
+
+    setTimeout(() => {
+      modal.style.display = "none";
+      modal.classList.add("hidden");
+      modal.classList.remove("flex");
+      modal.classList.add("opacity-0");
+    }, 300);
+  }
+}
+
+const initModal = () => {
+  const dataModal = document.querySelectorAll("[data-toggle='modal'");
+
+  for (let i of dataModal) i.addEventListener("click", toggleModal);
+}
\ No newline at end of file

From 57470d17bfba39b082e9418bfc141399de7a14e5 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:05:03 +0430
Subject: [PATCH 32/34] Update popover.js

---
 dist/popover.js | 89 ++++++++++++++++++++++++++-----------------------
 1 file changed, 47 insertions(+), 42 deletions(-)

diff --git a/dist/popover.js b/dist/popover.js
index 0adaaec..9205b8e 100644
--- a/dist/popover.js
+++ b/dist/popover.js
@@ -1,42 +1,47 @@
-function togglePopper(event){
-  let element = event.currentTarget;
-  let popperID = element.getAttribute("data-target");
-  let placement = element.getAttribute("data-placement");
-  let popperElement = document.querySelector(popperID);
-  let popperInnerElement = popperElement.querySelector("div");
-  let popper = Popper.createPopper(element, popperElement, {
-    placement: (placement ? placement : 'bottom')
-  });
-  popperElement.classList.toggle("hidden");
-  placement = popper.state.placement
-  let marginClass;
-  switch (placement) {
-    case "bottom":
-      marginClass = "mt-3"
-      break;
-    case "top":
-      marginClass = "mb-3"
-      break;
-    case "left":
-      marginClass = "mr-3"
-      break;
-    case "right":
-      marginClass = "ml-3"
-      break;
-    default:
-      break;
-  }
-  fadeIn(popperElement, 500);
-  popperInnerElement.classList.toggle(marginClass);
-}
-
-function initPopovers(){
-  let popoverData = document.querySelectorAll("[data-toggle='popover']");
-  for (var index = 0; index < popoverData.length; index++) {
-    popoverData[index].addEventListener("click",togglePopper);
-  }
-}
-
-(function () {
-  initPopovers();
-}());
+const togglePopper = e => {
+  let marginClass;
+
+  const element             = e.currentTarget;
+  const popperID            = element.getAttribute("data-target");
+  let placement             = element.getAttribute("data-placement");
+  const popperElement       = document.querySelector(popperID);
+  const popperInnerElement  = popperElement.querySelector("div");
+
+  Popper.createPopper(element, popperElement, {
+    placement: (placement ? placement : "right")
+  });
+
+  switch (placement) {
+    case "bottom":
+      marginClass = "mt-3";
+      break;
+    case "top":
+      marginClass = "mb-3";
+      break;
+    case "left":
+      marginClass = "mr-3";
+      break;
+    case "right":
+      marginClass = "ml-3";
+      break;
+  }
+
+  if (popperElement.classList.contains("hidden")) {
+    fadeIn(popperElement, 200);
+    popperElement.classList.remove("hidden");
+    popperInnerElement.classList.add(marginClass);
+  } else {
+    fadeOut(popperElement, 200);
+    
+    setTimeout(() => {
+      popperElement.classList.add("hidden");
+      popperInnerElement.classList.remove(marginClass);
+    }, 180);
+  }
+}
+
+const initPopovers = () => {
+  const popoverData = document.querySelectorAll("[data-toggle='popover']");
+
+  for (let i of popoverData) i.addEventListener("click", togglePopper);
+}
\ No newline at end of file

From e879c8f24f15961659af691db1314c4899c918d3 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:05:29 +0430
Subject: [PATCH 33/34] Update tabs.js

---
 dist/tabs.js | 109 ++++++++++++++++++++++++---------------------------
 1 file changed, 52 insertions(+), 57 deletions(-)

diff --git a/dist/tabs.js b/dist/tabs.js
index e689d20..6236a2e 100644
--- a/dist/tabs.js
+++ b/dist/tabs.js
@@ -1,57 +1,52 @@
-function changeAtiveTab(event,activeClasses,normalClasses){
-  event.preventDefault();
-  // prepare classes for querySelectorAll and classList.remove/add
-  normalClasses = normalClasses.split(" ").filter(item => item !== " " && item !== "");
-  activeClasses = activeClasses.split(" ").filter(item => item !== " " && item !== "");
-  let queryActiveClasses = activeClasses.map(item => "." + item);
-  // get the anchor element with the data-toggle="tab" that has been clicked
-  let element = event.currentTarget;
-  let elementID = event.currentTarget.getAttribute("href");
-  // get it's counterpart tab element
-  let tabElement = document.querySelector(elementID);
-  // get the unordered list parent (grand-parent actualy)
-  let ulElement = element.parentNode.parentNode;
-  // get the current active element
-  let activeElement = ulElement.querySelector("li > a" + queryActiveClasses);
-  let activeElementID = activeElement.getAttribute("href");
-  // get the current active tab element
-  let activeTabElement = document.querySelector(activeElementID);
-
-  normalClasses.forEach((item) => {
-    activeElement.classList.add(item);
-    element.classList.remove(item);
-  });
-  activeClasses.forEach((item) => {
-    activeElement.classList.remove(item);
-    element.classList.add(item);
-  });
-
-  activeTabElement.classList.add("hidden");
-  activeTabElement.classList.remove("block");
-  tabElement.classList.remove("hidden");
-  tabElement.classList.add("block");
-}
-
-//  - activeClasses is for setting the classes for the active tab (anchor element)
-//  - normalClasses is for setting the classes for all the tabs (anchor elements) expect the
-// one that is currently active, if they are unset, then the default ones will be choosen
-// activeClasses = "bg-blue-600 text-white"
-// normalClasses = "text-blue-600 bg-transparent"
-function initTabs(activeClasses,normalClasses){
-  let dataTabs = document.querySelectorAll("[data-toggle='tab']");
-  const toggleFunction = (event) => {
-    event.preventDefault();
-    activeClasses = activeClasses ? activeClasses:"bg-blue-600 text-white";
-    normalClasses = normalClasses ? normalClasses:"text-blue-600 bg-white";
-    changeAtiveTab(event,activeClasses,normalClasses)
-  }
-  const toggleAnimation = () => Array.from(dataTabs).forEach(el => zoomIn(document.querySelector(el.attributes.href.value)));
-  for (var index = 0; index < dataTabs.length; index++) {
-    dataTabs[index].addEventListener("click",toggleFunction);
-    dataTabs[index].addEventListener("click",toggleAnimation);
-  }
-}
-
-(function () {
-  initTabs();
-}());
+const changeAtiveTab = (e, activeClasses, normalClasses) => {
+  e.preventDefault();
+
+  normalClasses = normalClasses.split(" ").filter(item => item !== " " && item !== "");
+  activeClasses = activeClasses.split(" ").filter(item => item !== " " && item !== "");
+
+  let queryActiveClasses  = activeClasses.map(item => "." + item);
+  let element             = e.currentTarget;
+  let elementID           = e.currentTarget.getAttribute("href");
+  let tabElement          = document.querySelector(elementID);
+  let ulElement           = element.parentNode.parentNode;
+  let activeElement       = ulElement.querySelector("li > a" + queryActiveClasses);
+  let activeElementID     = activeElement.getAttribute("href");
+  let activeTabElement    = document.querySelector(activeElementID);
+
+  normalClasses.forEach(item => {
+    activeElement.classList.add(item);
+    element.classList.remove(item);
+  });
+
+  activeClasses.forEach(item => {
+    activeElement.classList.remove(item);
+    element.classList.add(item);
+  });
+
+  activeTabElement.classList.add("hidden");
+  activeTabElement.classList.remove("block");
+  tabElement.classList.remove("hidden");
+  tabElement.classList.add("block");
+}
+
+const initTabs = (activeClasses, normalClasses) => {
+  const dataTabs = document.querySelectorAll("[data-toggle='tab']");
+
+  const toggleFunction = e => {
+    e.preventDefault();
+
+    activeClasses = activeClasses ? activeClasses:"bg-blue-600 text-white";
+    normalClasses = normalClasses ? normalClasses:"text-blue-600 bg-white";
+
+    changeAtiveTab(e, activeClasses, normalClasses);
+  }
+
+  const toggleAnimation = () => {
+    Array.from(dataTabs).forEach(el => fadeIn(document.querySelector(el.attributes.href.value), 300));
+  }
+
+  for (let i of dataTabs) {
+    i.addEventListener("click", toggleFunction);
+    i.addEventListener("click", toggleAnimation);
+  }
+}
\ No newline at end of file

From 9f5681601e1c2f333f63756412ff84679ec66761 Mon Sep 17 00:00:00 2001
From: Sajad Ahmad Nawabi <Sajad_Ahmad_Nawabi@outlook.com>
Date: Fri, 23 Oct 2020 13:05:59 +0430
Subject: [PATCH 34/34] Update tooltip.js

---
 dist/tooltip.js | 93 ++++++++++++++++++++++++++-----------------------
 1 file changed, 50 insertions(+), 43 deletions(-)

diff --git a/dist/tooltip.js b/dist/tooltip.js
index c689d9e..159595d 100644
--- a/dist/tooltip.js
+++ b/dist/tooltip.js
@@ -1,43 +1,50 @@
-function togglePopper(event){
-  let element = event.currentTarget;
-  let popperID = element.getAttribute("data-target");
-  let placement = element.getAttribute("data-placement");
-  let popperElement = document.querySelector(popperID);
-  let popperInnerElement = popperElement.querySelector("div");
-  let popper = Popper.createPopper(element, popperElement, {
-    placement: (placement ? placement : 'bottom')
-  });
-  popperElement.classList.toggle("hidden");
-  placement = popper.state.placement
-  let marginClass;
-  switch (placement) {
-    case "bottom":
-      marginClass = "mt-3"
-      break;
-    case "top":
-      marginClass = "mb-3"
-      break;
-    case "left":
-      marginClass = "mr-3"
-      break;
-    case "right":
-      marginClass = "ml-3"
-      break;
-    default:
-      break;
-  }
-  fadeIn(popperElement, 500);
-  popperInnerElement.classList.toggle(marginClass);
-}
-
-function initTooltips(){
-  let tooltipData = document.querySelectorAll("[data-toggle='tooltip']");
-  for (var index = 0; index < tooltipData.length; index++) {
-    tooltipData[index].addEventListener("mouseenter",togglePopper);
-    tooltipData[index].addEventListener("mouseleave",togglePopper);
-  }
-}
-
-(function () {
-  initTooltips();
-}());
+const toggleTooltips = e => {
+  let marginClass;
+
+  const element             = e.currentTarget;
+  const popperID            = element.getAttribute("data-target");
+  const placement           = element.getAttribute("data-placement");
+  const popperElement       = document.querySelector(popperID);
+  const popperInnerElement  = popperElement.querySelector("div");
+
+  popper = Popper.createPopper(element, popperElement, {
+    placement: (placement ? placement : 'bottom')
+  });
+
+  switch (placement) {
+    case "bottom":
+      marginClass = "mt-3"
+      break;
+    case "top":
+      marginClass = "mb-3"
+      break;
+    case "left":
+      marginClass = "mr-3"
+      break;
+    case "right":
+      marginClass = "ml-3"
+      break;
+  }
+
+  if (popperElement.classList.contains("hidden")) {
+    fadeIn(popperElement, 200);
+    popperElement.classList.remove("hidden");
+    popperInnerElement.classList.add(marginClass);
+  } else {
+    fadeOut(popperElement, 200);
+    
+    setTimeout(() => {
+      popperElement.classList.add("hidden");
+      popperInnerElement.classList.remove(marginClass);
+    }, 180);
+  }
+}
+
+const initTooltips = () => {
+  const tooltipData = document.querySelectorAll("[data-toggle='tooltip'");
+
+  for (let i of tooltipData) {
+    i.addEventListener("mouseenter", toggleTooltips);
+    i.addEventListener("mouseleave", toggleTooltips);
+  }
+}
\ No newline at end of file