{"version":3,"sources":["../src/components/Link.tsx","../src/utils/nprogress.ts","../src/components/ProgressBar.tsx","../src/hooks/useRouter.ts"],"sourcesContent":["'use client';\nimport { LinkProps as NextLinkProps } from 'next/link';\nimport NextLink from 'next/link';\nimport React, { Suspense } from 'react';\nimport { completeProgress, isModifiedEvent, isSameUrlNavigation, startProgress } from '../utils/nprogress';\n\ntype LinkProps = NextLinkProps & { children: React.ReactNode } & React.RefAttributes<HTMLAnchorElement> & React.AnchorHTMLAttributes<HTMLAnchorElement>;\n\nfunction LinkFallback(props: LinkProps) {\n    return (\n        <NextLink {...props}>\n            {props.children}\n        </NextLink>\n    )\n}\n\nexport default function Link(props: LinkProps) {\n    return (\n        <Suspense fallback={\n            <LinkFallback {...props} />\n        }>\n            <NextLink {...props} onClick={\n                (event) => {\n                    if (event.currentTarget.href.startsWith(\"#\")) return;\n                    if (isModifiedEvent(event)) return;\n                    startProgress();\n                    if (props.onClick) props.onClick(event);\n                    if (isSameUrlNavigation(props.href)) {\n                        completeProgress();\n                    }\n                }\n            }>\n                {props.children}\n            </NextLink>\n        </Suspense>\n    )\n};\n","import { UrlObject } from \"url\";\nimport nProgress from \"nprogress\";\n\nexport const configureProgress = (options: Partial<nProgress.NProgressOptions>) => {\n    nProgress.configure({\n        ...nProgress.settings,\n        ...options\n    });\n}\n\nexport const isModifiedEvent = (event: React.MouseEvent): boolean => {\n    const eventTarget = event.currentTarget as HTMLAnchorElement | SVGAElement;\n    const target = eventTarget.getAttribute(\"target\");\n    return (\n      (target && target !== \"_self\") ||\n      event.defaultPrevented ||\n      event.metaKey ||\n      event.ctrlKey ||\n      event.shiftKey ||\n      event.altKey || // triggers resource download\n      (event.nativeEvent && event.nativeEvent.button === 1)\n    );\n}\n\nexport const isSameUrlNavigation = (href: string | UrlObject) => {\n    const current = window.location;\n    const target = new URL(href.toString(), window.location.href);\n    return current.origin === target.origin && current.pathname === target.pathname && current.search === target.search;\n}\n\nexport const startProgress = () => {\n    nProgress.start();\n}\n\nexport const completeProgress = () => {\n    nProgress.done();\n    // remove 'nprogress-busy' class from html tag\n    document.documentElement.classList.remove('nprogress-busy');\n}\n","'use client';\nimport React from \"react\";\nimport { usePathname, useSearchParams } from \"next/navigation\";\nimport { memo, useEffect } from \"react\";\nimport { completeProgress, configureProgress } from \"../utils/nprogress\";\nimport { NProgressOptions } from \"nprogress\";\n\ntype ProgressBarProps = {\n  color?: string | undefined;\n  height?: string | undefined,\n  options?: Partial<NProgressOptions> | undefined\n}\nconst ProgressBar = memo(\n  function ProgressBar(\n    {\n      color = \"hsl(var(--primary, 202, 73%, 50%))\",\n      height = \"2px\",\n      options = {}\n    }: ProgressBarProps\n  ): JSX.Element {\n\n    configureProgress(options);\n\n    const pathName = usePathname();\n    const searchParams = useSearchParams();\n\n    useEffect(() => {\n      completeProgress();\n    }, [pathName, searchParams]);\n\n    return (\n      <style>\n          {`\n          #nprogress {\n              pointer-events: none;\n          }\n          \n          #nprogress .bar {\n              background: ${color};\n              position: fixed;\n              z-index: 1031;\n              top: 0;\n              left: 0;\n              width: 100%;\n              height: ${height};\n          }\n          \n          /* Fancy blur effect */\n          #nprogress .peg {\n              display: block;\n              position: absolute;\n              right: 0px;\n              width: 100px;\n              height: 100%;\n              box-shadow: 0 0 10px ${color}, 0 0 5px ${color};\n              opacity: 1.0;\n          \n              -webkit-transform: rotate(3deg) translate(0px, -4px);\n              -ms-transform: rotate(3deg) translate(0px, -4px);\n              transform: rotate(3deg) translate(0px, -4px);\n          }\n          \n          /* Remove these to get rid of the spinner */\n          #nprogress .spinner {\n              display: block;\n              position: fixed;\n              z-index: 1031;\n              top: 15px;\n              right: 15px;\n          }\n          \n          #nprogress .spinner-icon {\n              width: 18px;\n              height: 18px;\n              box-sizing: border-box;\n          \n              border: solid 2px transparent;\n          \n              border-top-color: ${color};\n              border-left-color: ${color};\n              border-radius: 50%;\n          \n              -webkit-animation: nprogress-spinner 400ms linear infinite;\n              animation: nprogress-spinner 400ms linear infinite;\n          }\n          \n          .nprogress-custom-parent {\n              overflow: hidden;\n              position: relative;\n          }\n          \n          .nprogress-custom-parent #nprogress .spinner,\n          .nprogress-custom-parent #nprogress .bar {\n              position: absolute;\n          }\n          \n          @-webkit-keyframes nprogress-spinner {\n              0% {\n                  -webkit-transform: rotate(0deg);\n              }\n          \n              100% {\n                  -webkit-transform: rotate(360deg);\n              }\n          }\n          \n          @keyframes nprogress-spinner {\n              0% {\n                  transform: rotate(0deg);\n              }\n          \n              100% {\n                  transform: rotate(360deg);\n              }\n          }\n         `}\n        </style>\n    );\n  },\n  () => true\n);\n\nProgressBar.displayName = \"ProgressBar\";\n\nexport default ProgressBar;","import { useRouter as useNextRouter } from \"next/navigation\";\nimport { NavigateOptions } from \"next/dist/shared/lib/app-router-context.shared-runtime\";\nimport { completeProgress, isSameUrlNavigation, startProgress } from \"../utils/nprogress\";\n\nconst useRouter = () => {\n    const router = useNextRouter();\n    \n    const push = (\n        href: string,\n        options?: NavigateOptions\n    ) => {\n        startProgress();\n        router.push(href, options);\n        if (isSameUrlNavigation(href)) {\n            completeProgress();\n        }\n    }\n\n    const back = () => {\n        startProgress();\n        return router.back();\n    }\n\n    return {\n        ...router,\n        push,\n        back\n    }\n}\n\nexport default useRouter;"],"mappings":"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","names":["NextLink","React","Suspense","nProgress","configureProgress","options","isModifiedEvent","event","target","isSameUrlNavigation","href","current","startProgress","completeProgress","LinkFallback","props","React","NextLink","Link","Suspense","event","isModifiedEvent","startProgress","isSameUrlNavigation","completeProgress","React","usePathname","useSearchParams","memo","useEffect","ProgressBar","memo","color","height","options","configureProgress","pathName","usePathname","searchParams","useSearchParams","useEffect","completeProgress","React","ProgressBar_default","useNextRouter","useRouter","router","useNextRouter","href","options","startProgress","isSameUrlNavigation","completeProgress","useRouter_default"]}