@@ -28,6 +28,8 @@ const router = useRouter()
2828
2929const header = useTemplateRef (' header' )
3030const isHeaderPinned = shallowRef (false )
31+ const navExtraOffset = shallowRef (0 )
32+ const isMobile = useMediaQuery (' (max-width: 639.9px)' )
3133
3234function checkHeaderPosition() {
3335 const el = header .value
@@ -43,10 +45,51 @@ function checkHeaderPosition() {
4345useEventListener (' scroll' , checkHeaderPosition , { passive: true })
4446useEventListener (' 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+
4684onMounted (() => {
4785 checkHeaderPosition ()
86+ initFooterObserver ()
4887})
4988
89+ const navExtraOffsetStyle = computed (() => ({
90+ ' --package-nav-extra' : ` ${navExtraOffset .value }px ` ,
91+ }))
92+
5093const { packageName, requestedVersion, orgName } = usePackageRoute ()
5194const selectedPM = useSelectedPackageManager ()
5295const 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 , 0 px ) + env(safe-area-inset-bottom, 0px ));
14791523 }
14801524
14811525 .packageNav > :global(a kbd ) {
0 commit comments