Loading...
Please waitLoading...
Please waitTracks navigation transitions (SPA routing and browser-driven navigations) so you can show optimistic loaders and skeleton UIs.
pnpm dlx uselab@latest add use-page-transition
import * as React from "react"
import { usePageTransition } from "@/hooks/use-page-transition"
export function LayoutWithSpinner({ children }: { children: React.ReactNode }) {
const { isTransitioning } = usePageTransition({ minDuration: 200 })
return (
<div className="relative">
{isTransitioning && (
<div className="absolute inset-x-0 top-0 z-10 h-0.5 animate-pulse bg-gradient-to-r from-sky-500 via-violet-500 to-emerald-500" />
)}
{children}
</div>
)
}usePageTransition(options?)| Name | Type | Description | Optional | Default |
|---|---|---|---|---|
options | UsePageTransitionOptions | Configuration object for transition behavior. | Yes | {} |
minDuration | number | Minimum time in milliseconds a transition should remain visible to avoid flicker. | Yes | 150 |
| Name | Type | Description |
|---|---|---|
isTransitioning | boolean | true while a navigation or route transition is considered in-flight. |
The hook wires into multiple browser signals to infer “page transitions”:
history.pushState and history.replaceState.popstate for back/forward navigations.beforeunload and pagehide start a transition.pageshow and visibilitychange (back to visible) clear transitions.In all cases, transitions are debounced with minDuration so your loaders do not flicker for ultra-fast route changes.
interface UsePageTransitionOptions {
minDuration?: number
}
interface UsePageTransitionResult {
isTransitioning: boolean
}usePageTransition or rely on the hook’s history/visibility detection as a drop-in solution.