From 60958accae2adf2e8af32512258e0ca93983d80d Mon Sep 17 00:00:00 2001 From: zhaopan Date: Thu, 27 Apr 2023 20:06:23 +0800 Subject: [PATCH 1/6] feat(theme-default): optimizing css variable acquisition method --- .../src/client/components/Navbar.vue | 30 ++++++++----------- .../src/client/components/NavbarItems.vue | 30 ++++++++----------- ecosystem/theme-default/src/client/shim.d.ts | 8 +++++ .../src/client/styles/_variables.module.scss | 5 ++++ .../theme-default/src/client/utils/index.ts | 1 + .../src/client/utils/updateDeviceType.ts | 28 +++++++++++++++++ 6 files changed, 67 insertions(+), 35 deletions(-) create mode 100644 ecosystem/theme-default/src/client/styles/_variables.module.scss create mode 100644 ecosystem/theme-default/src/client/utils/updateDeviceType.ts diff --git a/ecosystem/theme-default/src/client/components/Navbar.vue b/ecosystem/theme-default/src/client/components/Navbar.vue index 8fbfa7f3ab..5b4645aa84 100644 --- a/ecosystem/theme-default/src/client/components/Navbar.vue +++ b/ecosystem/theme-default/src/client/components/Navbar.vue @@ -3,8 +3,9 @@ import NavbarBrand from '@theme/NavbarBrand.vue' import NavbarItems from '@theme/NavbarItems.vue' import ToggleColorModeButton from '@theme/ToggleColorModeButton.vue' import ToggleSidebarButton from '@theme/ToggleSidebarButton.vue' -import { computed, onMounted, ref } from 'vue' +import { computed, ref } from 'vue' import { useThemeLocaleData } from '../composables/index.js' +import { DeviceType, updateDeviceType } from '../utils/index.js' defineEmits(['toggle-sidebar']) @@ -24,27 +25,20 @@ const linksWrapperStyle = computed(() => { }) // avoid overlapping of long title and long navbar links -onMounted(() => { - // TODO: migrate to css var - // refer to _variables.scss - const MOBILE_DESKTOP_BREAKPOINT = 719 +const handleLinksWrapWidth = (mobileDesktopBreakpoint: number): void => { const navbarHorizontalPadding = getCssValue(navbar.value, 'paddingLeft') + getCssValue(navbar.value, 'paddingRight') - const handleLinksWrapWidth = (): void => { - if (window.innerWidth < MOBILE_DESKTOP_BREAKPOINT) { - linksWrapperMaxWidth.value = 0 - } else { - linksWrapperMaxWidth.value = - navbar.value!.offsetWidth - - navbarHorizontalPadding - - (navbarBrand.value?.offsetWidth || 0) - } + if (window.innerWidth < mobileDesktopBreakpoint) { + linksWrapperMaxWidth.value = 0 + } else { + linksWrapperMaxWidth.value = + navbar.value!.offsetWidth - + navbarHorizontalPadding - + (navbarBrand.value?.offsetWidth || 0) } - handleLinksWrapWidth() - window.addEventListener('resize', handleLinksWrapWidth, false) - window.addEventListener('orientationchange', handleLinksWrapWidth, false) -}) +} +updateDeviceType(DeviceType.MOBILE, handleLinksWrapWidth) function getCssValue(el: HTMLElement | null, property: string): number { // NOTE: Known bug, will return 'auto' if style value is 'auto' diff --git a/ecosystem/theme-default/src/client/components/NavbarItems.vue b/ecosystem/theme-default/src/client/components/NavbarItems.vue index 9d64ad3dc4..67d27c874e 100644 --- a/ecosystem/theme-default/src/client/components/NavbarItems.vue +++ b/ecosystem/theme-default/src/client/components/NavbarItems.vue @@ -3,7 +3,7 @@ import AutoLink from '@theme/AutoLink.vue' import NavbarDropdown from '@theme/NavbarDropdown.vue' import { useRouteLocale, useSiteLocaleData } from '@vuepress/client' import { isLinkHttp, isString } from '@vuepress/shared' -import { computed, onMounted, ref } from 'vue' +import { computed, ref } from 'vue' import type { ComputedRef } from 'vue' import { useRouter } from 'vue-router' import type { @@ -12,7 +12,11 @@ import type { ResolvedNavbarItem, } from '../../shared/index.js' import { useNavLink, useThemeLocaleData } from '../composables/index.js' -import { resolveRepoType } from '../utils/index.js' +import { + DeviceType, + resolveRepoType, + updateDeviceType, +} from '../utils/index.js' /** * Get navbar config of select language dropdown @@ -153,22 +157,14 @@ const navbarLinks = computed(() => [ ]) // avoid overlapping of long title and long navbar links -onMounted(() => { - // TODO: migrate to css var - // refer to _variables.scss - const MOBILE_DESKTOP_BREAKPOINT = 719 - - const handleMobile = (): void => { - if (window.innerWidth < MOBILE_DESKTOP_BREAKPOINT) { - isMobile.value = true - } else { - isMobile.value = false - } +const handleMobile = (mobileDesktopBreakpoint: number): void => { + if (window.innerWidth < mobileDesktopBreakpoint) { + isMobile.value = true + } else { + isMobile.value = false } - handleMobile() - window.addEventListener('resize', handleMobile, false) - window.addEventListener('orientationchange', handleMobile, false) -}) +} +updateDeviceType(DeviceType.MOBILE, handleMobile)