Skip to content

Commit f843c96

Browse files
authored
Merge pull request #281 from ethpandaops/feat/router-viewport-preloading
feat: add viewport preloading to improve navigation performance
2 parents b1d0f58 + bb9d59a commit f843c96

File tree

5 files changed

+25
-0
lines changed

5 files changed

+25
-0
lines changed

.storybook/preview.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ const preview: Preview = {
110110
history: createMemoryHistory({
111111
initialEntries: [initialUrl + searchString],
112112
}),
113+
defaultPendingMinMs: 0,
113114
});
114115

115116
return (

src/components/Layout/Sidebar/Sidebar.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ export function Sidebar({ sidebarOpen, setSidebarOpen }: SidebarProps): JSX.Elem
122122
<ListItem key={page.to}>
123123
<Link
124124
to={page.to}
125+
preload="viewport"
126+
preloadDelay={100}
125127
className="group flex gap-x-3 rounded-lg px-2.5 py-2 text-base font-semibold text-muted transition-all hover:bg-primary/10 hover:text-primary lg:py-1.5 lg:text-sm/6"
126128
activeProps={{
127129
className: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20',
@@ -140,6 +142,8 @@ export function Sidebar({ sidebarOpen, setSidebarOpen }: SidebarProps): JSX.Elem
140142
<ListItem key={page.to}>
141143
<Link
142144
to={page.to}
145+
preload="viewport"
146+
preloadDelay={100}
143147
className="group flex gap-x-3 rounded-lg px-2.5 py-2 text-base font-semibold text-muted transition-all hover:bg-primary/10 hover:text-primary lg:py-1.5 lg:text-sm/6"
144148
activeProps={{
145149
className: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20',
@@ -158,6 +162,8 @@ export function Sidebar({ sidebarOpen, setSidebarOpen }: SidebarProps): JSX.Elem
158162
<ListItem key={page.to}>
159163
<Link
160164
to={page.to}
165+
preload="viewport"
166+
preloadDelay={100}
161167
className="group flex gap-x-3 rounded-lg px-2.5 py-2 text-base font-semibold text-muted transition-all hover:bg-primary/10 hover:text-primary lg:py-1.5 lg:text-sm/6"
162168
activeProps={{
163169
className: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20',
@@ -178,6 +184,8 @@ export function Sidebar({ sidebarOpen, setSidebarOpen }: SidebarProps): JSX.Elem
178184
<ListItem key={page.to}>
179185
<Link
180186
to={page.to}
187+
preload="viewport"
188+
preloadDelay={100}
181189
className="group flex gap-x-3 rounded-lg px-2.5 py-2 text-base font-semibold text-muted transition-all hover:bg-primary/10 hover:text-primary lg:py-1.5 lg:text-sm/6"
182190
activeProps={{
183191
className: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20',
@@ -229,6 +237,8 @@ export function Sidebar({ sidebarOpen, setSidebarOpen }: SidebarProps): JSX.Elem
229237
<ListItem key={page.to}>
230238
<Link
231239
to={page.to}
240+
preload="viewport"
241+
preloadDelay={100}
232242
className="group flex gap-x-3 px-2.5 py-1.5 text-sm/6 font-semibold text-muted transition-all hover:bg-primary/10 hover:text-primary"
233243
activeProps={{
234244
className: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20',
@@ -247,6 +257,8 @@ export function Sidebar({ sidebarOpen, setSidebarOpen }: SidebarProps): JSX.Elem
247257
<ListItem key={page.to}>
248258
<Link
249259
to={page.to}
260+
preload="viewport"
261+
preloadDelay={100}
250262
className="group flex gap-x-3 px-2.5 py-1.5 text-sm/6 font-semibold text-muted transition-all hover:bg-primary/10 hover:text-primary"
251263
activeProps={{
252264
className: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20',
@@ -265,6 +277,8 @@ export function Sidebar({ sidebarOpen, setSidebarOpen }: SidebarProps): JSX.Elem
265277
<ListItem key={page.to}>
266278
<Link
267279
to={page.to}
280+
preload="viewport"
281+
preloadDelay={100}
268282
className="group flex gap-x-3 px-2.5 py-1.5 text-sm/6 font-semibold text-muted transition-all hover:bg-primary/10 hover:text-primary"
269283
activeProps={{
270284
className: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20',
@@ -285,6 +299,8 @@ export function Sidebar({ sidebarOpen, setSidebarOpen }: SidebarProps): JSX.Elem
285299
<ListItem key={page.to}>
286300
<Link
287301
to={page.to}
302+
preload="viewport"
303+
preloadDelay={100}
288304
className="group flex gap-x-3 px-2.5 py-1.5 text-sm/6 font-semibold text-muted transition-all hover:bg-primary/10 hover:text-primary"
289305
activeProps={{
290306
className: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20',

src/components/Overlays/FeatureGate/FeatureGate.stories.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ export const Default: Story = {
128128
history: createMemoryHistory({
129129
initialEntries: ['/ethereum/data-availability/custody?network=mainnet'],
130130
}),
131+
defaultPendingMinMs: 0,
131132
});
132133

133134
return (

src/main.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ const router = createRouter({
1616
defaultErrorComponent: FatalError,
1717
defaultNotFoundComponent: NotFound,
1818
scrollRestoration: true,
19+
defaultPendingMinMs: 0, // https://github.com/TanStack/router/discussions/1765#discussioncomment-10046260
20+
defaultPreload: 'intent', // preload on hover/touch
21+
defaultPreloadDelay: 50, // wait 50ms before preloading (prevents accidental hovers)
1922
});
2023

2124
// Register the router instance for type safety

src/pages/ethereum/live/components/MobileSlotHeader/MobileSlotHeader.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,17 @@ function MobileSlotHeaderComponent({
3030
<div className="flex flex-col">
3131
<Link
3232
to="/ethereum/slots/$slot"
33+
preload="viewport"
34+
preloadDelay={100}
3335
params={{ slot: currentSlot.toString() }}
3436
className="text-lg font-bold text-foreground hover:text-primary"
3537
>
3638
Slot <Slot slot={currentSlot} noLink />
3739
</Link>
3840
<Link
3941
to="/ethereum/epochs/$epoch"
42+
preload="viewport"
43+
preloadDelay={100}
4044
params={{ epoch: epoch.toString() }}
4145
className="text-xs text-muted hover:text-primary"
4246
>

0 commit comments

Comments
 (0)