diff --git a/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue b/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue index 3fbdcfe994..f00ec1516d 100644 --- a/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue +++ b/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue @@ -29,6 +29,31 @@ const parsedRoute = computed(() => { const packageName = computed(() => parsedRoute.value.packageName) const version = computed(() => parsedRoute.value.version) + +// Preserve file-tree scroll position across navigation within same package (+ version) +const fileTreeKey = computed(() => `${packageName.value}@${version.value}`) +const fileTreeSidebarRef = useTemplateRef('file-tree-sidebar') +const savedFileTreeSidebarScroll = useState('code-sidebar-scroll', () => ({ + key: '', + scrollTop: 0, +})) + +onBeforeUnmount(() => { + savedFileTreeSidebarScroll.value = { + key: fileTreeKey.value, + scrollTop: fileTreeSidebarRef.value?.scrollTop ?? 0, + } +}) + +watch( + fileTreeSidebarRef, + fileTreeSidebarElement => { + if (fileTreeSidebarElement && savedFileTreeSidebarScroll.value.key === fileTreeKey.value) + fileTreeSidebarElement.scrollTop = savedFileTreeSidebarScroll.value.scrollTop + }, + { once: true, flush: 'post' }, +) + const filePathOrig = computed(() => parsedRoute.value.filePath) const filePath = computed(() => parsedRoute.value.filePath?.replace(/\/$/, '')) @@ -349,6 +374,7 @@ defineOgImageComponent('Default', {