From 6a33280175dd201056c34cf35abcc860d62dcbdb Mon Sep 17 00:00:00 2001 From: Artea Date: Thu, 8 May 2025 23:01:55 +0800 Subject: [PATCH 1/3] feat(default-theme): collapsible sidbar Signed-off-by: Artea --- src/client/theme-default/Layout.vue | 68 ++++++++++++++- .../theme-default/components/VPNavBar.vue | 86 ++++++++++++++++++- .../theme-default/components/VPSidebar.vue | 33 ++++++- .../theme-default/composables/sidebar.ts | 9 +- src/client/theme-default/styles/icons.css | 3 + 5 files changed, 188 insertions(+), 11 deletions(-) diff --git a/src/client/theme-default/Layout.vue b/src/client/theme-default/Layout.vue index 30ebe4912b91..33900358a6cf 100644 --- a/src/client/theme-default/Layout.vue +++ b/src/client/theme-default/Layout.vue @@ -8,15 +8,18 @@ import VPNav from './components/VPNav.vue' import VPSidebar from './components/VPSidebar.vue' import VPSkipLink from './components/VPSkipLink.vue' import { useData } from './composables/data' -import { registerWatchers } from './composables/layout' +import { registerWatchers, useLayout } from './composables/layout' import { useSidebarControl } from './composables/sidebar' const { isOpen: isSidebarOpen, open: openSidebar, - close: closeSidebar + close: closeSidebar, + isCollapsed } = useSidebarControl() +const { hasSidebar } = useLayout() + registerWatchers({ closeSidebar }) const { frontmatter } = useData() @@ -25,13 +28,21 @@ const slots = useSlots() const heroImageSlotExists = computed(() => !!slots['home-hero-image']) provide('hero-image-slot-exists', heroImageSlotExists) + +const layoutClasses = computed(() => { + return { + [String(frontmatter.value.pageClass || '')]: !!frontmatter.value.pageClass, + 'has-sidebar': hasSidebar.value, + 'sidebar-collapsed': isCollapsed.value && hasSidebar.value + } +})