diff --git a/app/pages/package/[...package].vue b/app/pages/package/[...package].vue index 4c45c7a85..45211cf34 100644 --- a/app/pages/package/[...package].vue +++ b/app/pages/package/[...package].vue @@ -52,6 +52,57 @@ onMounted(() => { checkHeaderPosition() }) +const windowSize = useWindowSize() +const sidebar = useTemplateRef('sidebar') +const sidebarContainer = useTemplateRef('container') +const sidebarBounds = useElementBounding(sidebar) +const scrollState = useWindowScroll() +const scrollDirection = shallowRef<'up' | 'down'>('down') +const sidebarOffset = shallowRef([0, 0]) + +const sidebarOverflow = computed(() => { + return sidebarBounds.height.value > windowSize.height.value - 120 +}) + +const sidebarStyles = computed(() => { + if (!sidebarOverflow.value) { + return { + alignSelf: 'flex-start', + top: '80px', + } + } + + if (scrollDirection.value === 'down') { + return { + alignSelf: 'flex-end', + marginBlockStart: `${sidebarOffset.value[0]}px`, + bottom: '40px', + } + } + + if (scrollDirection.value === 'up') { + return { + alignSelf: 'flex-start', + marginBlockEnd: `${sidebarOffset.value[1]}px`, + top: '80px', + } + } +}) + +watch(scrollState.directions, ({ bottom, top }) => { + if (bottom) scrollDirection.value = 'down' + if (top) scrollDirection.value = 'up' +}) + +function checkSidebarPosition() { + sidebarOffset.value = [ + sidebar.value!.offsetTop, + sidebarContainer.value!.offsetHeight - sidebar.value!.offsetTop - sidebar.value!.offsetHeight, + ] +} + +useEventListener('scroll', checkSidebarPosition, { passive: true }) + const { packageName, requestedVersion, orgName } = usePackageRoute() const selectedPM = useSelectedPackageManager() const activePmId = computed(() => selectedPM.value ?? 'npm') @@ -1187,11 +1238,9 @@ onKeyStroke( -
+
-