fix: only show collapsed btn in pc

pull/4739/head
Artea 4 months ago
parent f3f067312d
commit 69f3520577

@ -105,10 +105,6 @@ const layoutClasses = computed(() => {
} }
@media (min-width: 1440px) { @media (min-width: 1440px) {
.Layout.has-sidebar.sidebar-collapsed {
--vp-sidebar-width: 0px;
}
.Layout.has-sidebar.sidebar-collapsed .VPContent :deep(.VPDoc .content-container), .Layout.has-sidebar.sidebar-collapsed .VPContent :deep(.VPDoc .content-container),
.Layout.has-sidebar.sidebar-collapsed .VPContent :deep(.VPDoc .content) { .Layout.has-sidebar.sidebar-collapsed .VPContent :deep(.VPDoc .content) {
max-width: 100%; max-width: 100%;

@ -1,20 +1,23 @@
<script setup lang="ts"> <script setup lang="ts">
import NotFound from '../NotFound.vue' import NotFound from '../NotFound.vue'
import { useData } from '../composables/data' import { useData } from '../composables/data'
import { useLayout } from '../composables/layout' import { useLayout, } from '../composables/layout'
import {useSidebarControl} from '../composables/sidebar'
import VPDoc from './VPDoc.vue' import VPDoc from './VPDoc.vue'
import VPHome from './VPHome.vue' import VPHome from './VPHome.vue'
import VPPage from './VPPage.vue' import VPPage from './VPPage.vue'
const { page, frontmatter } = useData() const { page, frontmatter } = useData()
const { isHome, hasSidebar } = useLayout() const { isHome, hasSidebar } = useLayout()
const {isCollapsed} = useSidebarControl()
</script> </script>
<template> <template>
<div <div
class="VPContent" class="VPContent"
id="VPContent" id="VPContent"
:class="{ 'has-sidebar': hasSidebar, 'is-home': isHome }" :class="{ 'has-sidebar': hasSidebar, 'is-home': isHome ,'collapsed':isCollapsed
}"
> >
<slot name="not-found" v-if="page.isNotFound"><NotFound /></slot> <slot name="not-found" v-if="page.isNotFound"><NotFound /></slot>
@ -91,5 +94,8 @@ const { isHome, hasSidebar } = useLayout()
padding-right: calc((100vw - var(--vp-layout-max-width)) / 2); padding-right: calc((100vw - var(--vp-layout-max-width)) / 2);
padding-left: calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)); padding-left: calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width));
} }
.VPContent.has-sidebar.collapsed {
padding-left: calc(100vw - var(--vp-layout-max-width)) / 2 ;
}
} }
</style> </style>

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useWindowScroll } from '@vueuse/core' import { useMediaQuery, useWindowScroll } from '@vueuse/core'
import { ref, computed, watchPostEffect } from 'vue' import { ref, watchPostEffect } from 'vue'
import { useLayout } from '../composables/layout' import { useLayout } from '../composables/layout'
import { useSidebarControl } from '../composables/sidebar' import { useSidebarControl } from '../composables/sidebar'
import VPNavBarAppearance from './VPNavBarAppearance.vue' import VPNavBarAppearance from './VPNavBarAppearance.vue'
@ -21,56 +21,46 @@ defineEmits<{
}>() }>()
const { y } = useWindowScroll() const { y } = useWindowScroll()
const { isCollapsed, toggleCollapse: toggleSidebarCollapse } = useSidebarControl() const {isCollapsed, toggleCollapse: toggleSidebarCollapse } = useSidebarControl()
const { isHome, hasSidebar } = useLayout() const { isHome, hasSidebar } = useLayout()
const classes = ref<Record<string, boolean>>({}) const classes = ref<Record<string, boolean>>({})
const isSidebarExpanded = computed(() => {
return hasSidebar.value && !isCollapsed.value;
});
watchPostEffect(() => { watchPostEffect(() => {
classes.value = { classes.value = {
'has-sidebar': hasSidebar.value, 'has-sidebar': hasSidebar.value,
'home': isHome.value, 'home': isHome.value,
'top': y.value === 0, 'top': y.value === 0,
'collapsed':isCollapsed.value,
'screen-open': props.isScreenOpen 'screen-open': props.isScreenOpen
} }
}) })
const is1440 = useMediaQuery('(min-width: 1440px)')
</script> </script>
<template> <template>
<div class="VPNavBar" :class="classes"> <div class="VPNavBar" :class="classes">
<div class="wrapper"> <div class="wrapper">
<div class="container"> <div class="container">
<div class="title" v-if="isSidebarExpanded||isHome"> <div class="title">
<VPNavBarTitle > <VPNavBarTitle >
<template #nav-bar-title-before><slot name="nav-bar-title-before" /></template> <template #nav-bar-title-before><slot name="nav-bar-title-before" /></template>
<template #nav-bar-title-after><slot name="nav-bar-title-after" /></template> <template #nav-bar-title-after><slot name="nav-bar-title-after" /></template>
</VPNavBarTitle>
<button
v-if="isSidebarExpanded"
class="sidebar-toggle-button"
@click="toggleSidebarCollapse"
aria-label="collapse sidebar"
>
<span class="vpi-collapse icon" />
</button>
</div>
<div class="content"> </VPNavBarTitle>
<div class="content-body">
<slot name="nav-bar-content-before" />
<button <button
v-if="!isSidebarExpanded&&!isHome" v-if="!isHome&&is1440"
class="sidebar-toggle-button" class="sidebar-toggle-button"
@click="toggleSidebarCollapse" @click="toggleSidebarCollapse"
aria-label="expand sidebar" aria-label="collapse sidebar"
> >
<span class="vpi-collapse icon is-collapsed" /> <span class="vpi-collapse icon" />
</button> </button>
</div>
<div class="content">
<div class="content-body">
<slot name="nav-bar-content-before" />
<VPNavBarSearch class="search" /> <VPNavBarSearch class="search" />
<VPNavBarMenu class="menu" /> <VPNavBarMenu class="menu" />
<VPNavBarTranslations class="translations" /> <VPNavBarTranslations class="translations" />
@ -117,6 +107,9 @@ watchPostEffect(() => {
.VPNavBar:not(.has-sidebar):not(.home.top) { .VPNavBar:not(.has-sidebar):not(.home.top) {
background-color: var(--vp-nav-bg-color); background-color: var(--vp-nav-bg-color);
} }
.VPNavBar.collapsed {
background-color: var(--vp-nav-bg-color);
}
} }
.wrapper { .wrapper {
@ -167,6 +160,14 @@ watchPostEffect(() => {
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
} }
.VPNavBar:not(.home):not(.collapsed).has-sidebar .title{
border-bottom: 1px solid var(--vp-c-divider);
width: calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px - 20px)
}
.VPNavBar:not(.home).collapsed .title{
background-color: var(--vp-nav-bg-color);
border-bottom: 1px solid var(--vp-c-divider);
}
@media (min-width: 960px) { @media (min-width: 960px) {
.VPNavBar.has-sidebar .title { .VPNavBar.has-sidebar .title {

@ -50,7 +50,6 @@ const target = computed(() =>
.title { .title {
display: flex; display: flex;
align-items: center; align-items: center;
border-bottom: 1px solid transparent;
width: 100%; width: 100%;
height: var(--vp-nav-height); height: var(--vp-nav-height);
font-size: 16px; font-size: 16px;
@ -63,10 +62,6 @@ const target = computed(() =>
.title { .title {
flex-shrink: 0; flex-shrink: 0;
} }
.VPNavBarTitle.has-sidebar .title {
border-bottom-color: var(--vp-c-divider);
}
} }
:deep(.logo) { :deep(.logo) {

@ -1,12 +1,12 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useScrollLock } from '@vueuse/core' import { useEventListener, useScrollLock } from '@vueuse/core'
import { inBrowser } from 'vitepress' import { inBrowser } from 'vitepress'
import { computed, ref, watch } from 'vue' import { ref, watch } from 'vue'
import { useLayout } from '../composables/layout' import { useLayout } from '../composables/layout'
import VPSidebarGroup from './VPSidebarGroup.vue' import VPSidebarGroup from './VPSidebarGroup.vue'
import { useSidebarControl } from '../composables/sidebar' import { useSidebarControl } from '../composables/sidebar'
const { sidebarGroups, hasSidebar } = useLayout() const { isHome,sidebarGroups } = useLayout()
const { isCollapsed } = useSidebarControl() const { isCollapsed } = useSidebarControl()
const props = defineProps<{ const props = defineProps<{
@ -30,8 +30,6 @@ watch(
const key = ref(0) const key = ref(0)
const showSideBar = computed(()=>hasSidebar.value&&!isCollapsed.value)
watch( watch(
sidebarGroups, sidebarGroups,
@ -40,15 +38,25 @@ watch(
}, },
{ deep: true } { deep: true }
) )
useEventListener(document,'mousemove',(e)=>{
if(isHome.value) return
if(e.clientX<5){
navEl.value?.classList.add('expanded')
}else if(e.target instanceof Node &&!navEl.value?.contains(e.target)&&e.pageX>272){
navEl.value?.classList.remove('expanded')
}
})
</script> </script>
<template> <template>
<aside <aside
v-if="showSideBar"
class="VPSidebar" class="VPSidebar"
:class="{ open }" :class="{ open ,collapsed:isCollapsed}"
ref="navEl" ref="navEl"
@click.stop @click.stop
v-if="!isHome"
> >
<div class="curtain" /> <div class="curtain" />
@ -89,6 +97,22 @@ watch(
overscroll-behavior: contain; overscroll-behavior: contain;
} }
.collapsed{
transform: translateX(-100%);
opacity: 0 !important;
transition: opacity 0.25s, transform 0.25s ease;
overscroll-behavior: contain;
}
.expanded{
transform: translateX(0);
opacity: 1 !important;
transition: opacity 0.25s, transform 0.25s ease;
overscroll-behavior: contain;
width: calc(100vw - 64px);
max-width: 320px;
z-index: var(--vp-z-index-sidebar) !important;
}
.VPSidebar.open { .VPSidebar.open {
opacity: 1; opacity: 1;
visibility: visible; visibility: visible;

Loading…
Cancel
Save