From 5005cfbf0c19b5c47a0079f982fb1a730321cef1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9C=B1=E6=81=92=E9=9C=96?=
 <44224328+Magren0321@users.noreply.github.com>
Date: Fri, 26 May 2023 21:39:40 +0800
Subject: [PATCH 1/2] feat: darkMode

---
 src/index.tsx | 54 +++++++++++++++++++++++++++++++--------------------
 1 file changed, 33 insertions(+), 21 deletions(-)

diff --git a/src/index.tsx b/src/index.tsx
index c8b00ef..bbf1792 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -18,6 +18,10 @@ export type NextTopLoaderProps = {
    * @default "#29d"
    */
   color?: string;
+  /**
+   * Color for the TopLoader in dark mode.
+   */
+  darkColor?: string;
   /**
    * The initial position for the TopLoader in percentage, 0.08 is 8%.
    * @default 0.08
@@ -60,10 +64,11 @@ export type NextTopLoaderProps = {
    * @ you can disable it by setting it to `false`
    */
   shadow?: string | false;
-}
+};
 
 const NextTopLoader = ({
   color: propColor,
+  darkColor: propDarkColor,
   height: propHeight,
   showSpinner,
   crawl,
@@ -73,31 +78,31 @@ const NextTopLoader = ({
   speed,
   shadow,
 }: NextTopLoaderProps) => {
+  const [isDarkMode, setIsDarkMode] = React.useState(false);
+
   const defaultColor = '#29d';
   const defaultHeight = 3;
 
   const color = propColor ?? defaultColor;
+  const darkColor = propDarkColor ?? color;
   const height = propHeight ?? defaultHeight;
 
   // Any falsy (except undefined) will disable the shadow
-  const boxShadow = !shadow && shadow !== undefined
-    ? ''
-    : shadow
+  const boxShadow =
+    !shadow && shadow !== undefined
+      ? ''
+      : shadow
       ? `box-shadow:${shadow}`
       : `box-shadow:0 0 10px ${color},0 0 5px ${color}`;
 
   const styles = (
     <style>
       {`#nprogress{pointer-events:none}#nprogress .bar{background:${
-        color
-      };position:fixed;z-index:1031;top:0;left:0;width:100%;height:${
-        height
-      }px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;${
-        boxShadow
-      };opacity:1;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translate(0px,-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:${
-        color
+        isDarkMode ? darkColor : color
+      };position:fixed;z-index:1031;top:0;left:0;width:100%;height:${height}px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;${boxShadow};opacity:1;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translate(0px,-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:${
+        isDarkMode ? darkColor : color
       };border-left-color:${
-        color
+        isDarkMode ? darkColor : color
       };border-radius:50%;-webkit-animation:nprogress-spinner 400ms linear infinite;animation:nprogress-spinner 400ms linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}`}
     </style>
   );
@@ -112,6 +117,15 @@ const NextTopLoader = ({
       speed: speed ?? 200,
     });
 
+    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
+
+    function handleChange(event: MediaQueryListEvent) {
+      setIsDarkMode(event.matches);
+    }
+
+    mediaQuery.addEventListener('change', handleChange);
+    setIsDarkMode(mediaQuery.matches);
+
     function isAnchorOfCurrentUrl(currentUrl: string, newUrl: string) {
       const currentUrlObj = new URL(currentUrl);
       const newUrlObj = new URL(newUrl);
@@ -146,13 +160,13 @@ const NextTopLoader = ({
         if (anchor) {
           const currentUrl = window.location.href;
           const newUrl = (anchor as HTMLAnchorElement).href;
-          const isExternalLink = (anchor as HTMLAnchorElement).target === "_blank";
+          const isExternalLink = (anchor as HTMLAnchorElement).target === '_blank';
           const isAnchor = isAnchorOfCurrentUrl(currentUrl, newUrl);
           if (newUrl === currentUrl || isAnchor || isExternalLink) {
             NProgress.start();
             NProgress.done();
             [].forEach.call(npgclass, function (el: Element) {
-              el.classList.remove("nprogress-busy");
+              el.classList.remove('nprogress-busy');
             });
           } else {
             NProgress.start();
@@ -161,7 +175,7 @@ const NextTopLoader = ({
               history.pushState = function () {
                 NProgress.done();
                 [].forEach.call(npgclass, function (el: Element) {
-                  el.classList.remove("nprogress-busy");
+                  el.classList.remove('nprogress-busy');
                 });
                 // eslint-disable-next-line prefer-rest-params, @typescript-eslint/no-explicit-any
                 return pushState.apply(history, arguments as any);
@@ -178,11 +192,11 @@ const NextTopLoader = ({
     }
 
     // Add the global click event listener
-    document.addEventListener("click", handleClick);
+    document.addEventListener('click', handleClick);
 
     // Clean up the global click event listener when the component is unmounted
     return () => {
-      document.removeEventListener("click", handleClick);
+      document.removeEventListener('click', handleClick);
     };
   }, []);
 
@@ -192,6 +206,7 @@ export default NextTopLoader;
 
 NextTopLoader.propTypes = {
   color: PropTypes.string,
+  drakColor: PropTypes.string,
   height: PropTypes.number,
   showSpinner: PropTypes.bool,
   crawl: PropTypes.bool,
@@ -199,8 +214,5 @@ NextTopLoader.propTypes = {
   initialPosition: PropTypes.number,
   easing: PropTypes.string,
   speed: PropTypes.number,
-  shadow: PropTypes.oneOfType([
-    PropTypes.string,
-    PropTypes.bool,
-  ]),
+  shadow: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
 };

From b75254542d21843591df9d76b6411155bd02e222 Mon Sep 17 00:00:00 2001
From: Magren <44224328+Magren0321@users.noreply.github.com>
Date: Sun, 28 May 2023 09:35:25 +0800
Subject: [PATCH 2/2] Update src/index.tsx

Co-authored-by: Ariel Vieira <17505779+arielvieira@users.noreply.github.com>
---
 src/index.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/index.tsx b/src/index.tsx
index bbf1792..1023e91 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -206,7 +206,7 @@ export default NextTopLoader;
 
 NextTopLoader.propTypes = {
   color: PropTypes.string,
-  drakColor: PropTypes.string,
+  darkColor: PropTypes.string,
   height: PropTypes.number,
   showSpinner: PropTypes.bool,
   crawl: PropTypes.bool,