Skip to content

Commit 344fd65

Browse files
authored
fix: scroll to bottom should show footer (#1352)
1 parent 5928d54 commit 344fd65

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

app/pages/package/[[org]]/[name].vue

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ const router = useRouter()
2828
2929
const header = useTemplateRef('header')
3030
const isHeaderPinned = shallowRef(false)
31+
const navExtraOffset = shallowRef(0)
32+
const isMobile = useMediaQuery('(max-width: 639.9px)')
3133
3234
function checkHeaderPosition() {
3335
const el = header.value
@@ -43,10 +45,51 @@ function checkHeaderPosition() {
4345
useEventListener('scroll', checkHeaderPosition, { passive: true })
4446
useEventListener('resize', checkHeaderPosition)
4547
48+
const footerTarget = ref<HTMLElement | null>(null)
49+
const footerThresholds = Array.from({ length: 11 }, (_, i) => i / 10)
50+
51+
const { pause: pauseFooterObserver, resume: resumeFooterObserver } = useIntersectionObserver(
52+
footerTarget,
53+
([entry]) => {
54+
if (!entry) return
55+
56+
navExtraOffset.value = entry.isIntersecting ? entry.intersectionRect.height : 0
57+
},
58+
{
59+
threshold: footerThresholds,
60+
immediate: false,
61+
},
62+
)
63+
64+
function initFooterObserver() {
65+
footerTarget.value = document.querySelector('footer')
66+
if (!footerTarget.value) return
67+
68+
pauseFooterObserver()
69+
70+
watch(
71+
isMobile,
72+
value => {
73+
if (value) {
74+
resumeFooterObserver()
75+
} else {
76+
pauseFooterObserver()
77+
navExtraOffset.value = 0
78+
}
79+
},
80+
{ immediate: true },
81+
)
82+
}
83+
4684
onMounted(() => {
4785
checkHeaderPosition()
86+
initFooterObserver()
4887
})
4988
89+
const navExtraOffsetStyle = computed(() => ({
90+
'--package-nav-extra': `${navExtraOffset.value}px`,
91+
}))
92+
5093
const { packageName, requestedVersion, orgName } = usePackageRoute()
5194
const selectedPM = useSelectedPackageManager()
5295
const activePmId = computed(() => selectedPM.value ?? 'npm')
@@ -663,6 +706,7 @@ const showSkeleton = shallowRef(false)
663706
as="nav"
664707
:aria-label="$t('package.navigation')"
665708
class="hidden sm:flex max-sm:flex max-sm:fixed max-sm:z-40 max-sm:inset-is-1/2 max-sm:-translate-x-1/2 max-sm:rtl:translate-x-1/2 max-sm:bg-[--bg]/90 max-sm:backdrop-blur-md max-sm:border max-sm:border-border max-sm:rounded-md max-sm:shadow-md"
709+
:style="navExtraOffsetStyle"
666710
:class="$style.packageNav"
667711
>
668712
<LinkBase
@@ -1475,7 +1519,7 @@ const showSkeleton = shallowRef(false)
14751519
/* Mobile floating nav: safe-area positioning + kbd hiding */
14761520
@media (max-width: 639.9px) {
14771521
.packageNav {
1478-
bottom: calc(1.25rem + env(safe-area-inset-bottom, 0px));
1522+
bottom: calc(1.25rem + var(--package-nav-extra, 0px) + env(safe-area-inset-bottom, 0px));
14791523
}
14801524
14811525
.packageNav > :global(a kbd) {

0 commit comments

Comments
 (0)