@lexz451/next-nprogress
Version:
NProgress integration with Next 13
1 lines • 9.88 kB
Source Map (JSON)
{"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"]}