Skip to content

Commit

Permalink
refactor: 💡 refactor sidebar
Browse files Browse the repository at this point in the history
  • Loading branch information
huyikai committed Dec 8, 2023
1 parent 0cfcc20 commit 39ca44b
Show file tree
Hide file tree
Showing 23 changed files with 276 additions and 154 deletions.
4 changes: 4 additions & 0 deletions example/.vitepress/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@ declare module '*.vue' {
const component: DefineComponent<{}, {}, any>;
export default component;
}
declare module 'vitepress/dist/client/shared';
declare module 'vitepress/dist/client/theme-default/composables/nav'
declare module 'vitepress/dist/client/theme-default/composables/sidebar'
declare module 'vitepress/dist/client/theme-default/composables/flyout'
2 changes: 1 addition & 1 deletion example/.vitepress/theme/Layout.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<script setup lang="ts">
import { provide, watch } from 'vue'
import { useData, useRoute } from 'vitepress'
import { useSidebar, useCloseSidebarOnEscape } from 'vitepress/dist/client/theme-default/composables/sidebar.js'
import { useSidebar, useCloseSidebarOnEscape } from 'vitepress/dist/client/theme-default/composables/sidebar'
import VPSkipLink from 'vitepress/dist/client/theme-default/components/VPSkipLink.vue'
import VPBackdrop from 'vitepress/dist/client/theme-default/components/VPBackdrop.vue'
Expand Down
2 changes: 1 addition & 1 deletion example/.vitepress/theme/components/VPContent.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script setup lang="ts">
import { useRoute, useData } from 'vitepress';
import { useSidebar } from 'vitepress/dist/client/theme-default/composables/sidebar.js';
import { useSidebar } from 'vitepress/dist/client/theme-default/composables/sidebar';
import VPPage from 'vitepress/dist/client/theme-default/components/VPPage.vue';
import VPHome from 'vitepress/dist/client/theme-default/components/VPHome.vue';
import VPDoc from 'vitepress/dist/client/theme-default/components/VPDoc.vue';
Expand Down
16 changes: 11 additions & 5 deletions example/.vitepress/theme/components/VPFlyout.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script lang="ts" setup>
import { ref } from 'vue'
import { useFlyout } from 'vitepress/dist/client/theme-default/composables/flyout.js'
import { useFlyout } from 'vitepress/dist/client/theme-default/composables/flyout'
import VPIconChevronDown from 'vitepress/dist/client/theme-default/components/icons/VPIconChevronDown.vue'
import VPIconMoreHorizontal from 'vitepress/dist/client/theme-default/components/icons/VPIconMoreHorizontal.vue'
import VPMenu from './VPMenu.vue'
Expand Down Expand Up @@ -39,7 +39,7 @@ function onBlur() {
>
<span v-if="button || icon" class="text">
<component v-if="icon" :is="icon" class="option-icon" />
{{ button }}
<span v-if="button" v-html="button"></span>
<VPIconChevronDown class="text-icon" />
</span>

Expand All @@ -60,7 +60,7 @@ function onBlur() {
}
.VPFlyout:hover {
color: var(--vp-c-brand);
color: var(--vp-c-brand-1);
transition: color 0.25s;
}
Expand All @@ -73,11 +73,11 @@ function onBlur() {
}
.VPFlyout.active .text {
color: var(--vp-c-brand);
color: var(--vp-c-brand-1);
}
.VPFlyout.active:hover .text {
color: var(--vp-c-brand-dark);
color: var(--vp-c-brand-2);
}
.VPFlyout:hover .menu,
Expand All @@ -87,6 +87,12 @@ function onBlur() {
transform: translateY(0);
}
.button[aria-expanded="false"] + .menu {
opacity: 0;
visibility: hidden;
transform: translateY(0);
}
.button {
display: flex;
align-items: center;
Expand Down
20 changes: 5 additions & 15 deletions example/.vitepress/theme/components/VPMenu.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,31 +25,21 @@ defineProps<{
border-radius: 12px;
padding: 12px;
min-width: 128px;
border: 1px solid var(--vp-c-divider-light);
background-color: var(--vp-c-bg);
border: 1px solid var(--vp-c-divider);
background-color: var(--vp-c-bg-elv);
box-shadow: var(--vp-shadow-3);
transition: background-color 0.5s;
max-height: calc(100vh - var(--vp-nav-height-mobile));
max-height: calc(100vh - var(--vp-nav-height));
overflow-y: auto;
}
@media (min-width: 960px) {
.VPMenu {
max-height: calc(100vh - var(--vp-nav-height-desktop));
}
}
.dark .VPMenu {
box-shadow: var(--vp-shadow-2);
}
.VPMenu :deep(.group) {
margin: 0 -12px;
padding: 0 12px 12px;
}
.VPMenu :deep(.group + .group) {
border-top: 1px solid var(--vp-c-divider-light);
border-top: 1px solid var(--vp-c-divider);
padding: 11px 12px 12px;
}
Expand All @@ -58,7 +48,7 @@ defineProps<{
}
.VPMenu :deep(.group + .item) {
border-top: 1px solid var(--vp-c-divider-light);
border-top: 1px solid var(--vp-c-divider);
padding: 11px 16px 0;
}
Expand Down
60 changes: 42 additions & 18 deletions example/.vitepress/theme/components/VPMenuGroup.vue
Original file line number Diff line number Diff line change
@@ -1,54 +1,78 @@
<script lang="ts" setup>
import VPMenuLink from 'vitepress/dist/client/theme-default/components/VPMenuLink.vue'
import VPMenuLink from './VPMenuLink.vue';
defineProps<{
text?: string
items: any[]
}>()
text?: string;
items: any[];
}>();
</script>

<template>
<div class="VPMenuGroup">
<p v-if="text" class="title">{{ text }}</p>
<p
v-if="text"
class="title"
>
{{ text }}
</p>

<template v-for="item in items">
<VPMenuLink v-if="'link' in item" :item="item" />
<VPMenuGroup class="VPMenuGroupItem" v-else :text="item.text" :items="item.items" />
<div class="VPMenuGroupContainer">
<VPMenuLink
v-if="'link' in item"
:item="item"
/>
<VPMenuGroup
class="VPMenuGroupItem"
v-else
:text="item.text"
:items="item.items"
/>
</div>
</template>
</div>
</template>

<style scoped>
.VPMenuGroup {
margin: 12px -12px 0;
border-top: 1px solid var(--vp-c-divider-light);
padding: 12px 12px 0;
border-top: 1px solid var(--vp-c-divider);
padding: 12px 12px 0 20px;
}
.VPMenuGroupItem{
.VPMenuGroupContainer {
border-left: 1px solid var(--vp-c-divider);
margin-left: 5px;
}
.VPMenuGroupContainer+.VPMenuGroupContainer{
padding-top: 5px;
}
.VPMenuGroupItem {
border-top: 0;
margin-left: 12px;
margin-top: -8px;
margin-left: 16px;
margin-top: 0;
padding-left: 0;
}
.VPMenuGroup:first-child {
margin-top: 0;
border-top: 0;
padding-top: 0;
}
.VPMenuGroup + .VPMenuGroup {
margin-top: 12px;
border-top: 1px solid var(--vp-c-divider-light);
/* margin-top: 12px; */
border-top: 1px solid var(--vp-c-divider);
}
.title {
padding: 0 12px;
margin-left: 5px;
line-height: 32px;
font-size: 14px;
font-weight: 600;
font-weight: bold;
color: var(--vp-c-text-2);
transition: color 0.25s;
white-space: nowrap;
transition: color 0.25s;
user-select: none;
}
</style>
64 changes: 64 additions & 0 deletions example/.vitepress/theme/components/VPMenuLink.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<script lang="ts" setup>
import type { DefaultTheme } from 'vitepress/theme';
import { useData } from 'vitepress';
import { isActive } from 'vitepress/dist/client/shared';
import VPLink from 'vitepress/dist/client/theme-default/components/VPLink.vue';
defineProps<{
item: DefaultTheme.NavItemWithLink;
}>();
const { page } = useData();
</script>

<template>
<div class="VPMenuLink">
<VPLink
:class="{
active: isActive(
page.relativePath,
item.activeMatch || item.link,
!!item.activeMatch
)
}"
:href="item.link"
:target="item.target"
:rel="item.rel"
>
{{ item.text }}
</VPLink>
</div>
</template>

<style scoped>
.VPMenuGroup + .VPMenuLink {
margin: 0 -16px 0 16px;
padding: 12px 16px 0 0px;
}
.link {
margin-left: 8px;
display: block;
border-radius: 6px;
padding: 0 12px;
line-height: 32px;
font-size: 12px;
font-weight: normal;
color: var(--vp-c-text-1);
white-space: nowrap;
transition: background-color 0.25s, color 0.25s;
}
.VPMenuGroup + .VPMenuLink .link {
margin-left: 0px;
padding-left: 0;
}
.link:hover {
color: var(--vp-c-brand-1);
background-color: var(--vp-c-default-soft);
}
.link.active {
color: var(--vp-c-brand-1);
}
</style>
4 changes: 2 additions & 2 deletions example/.vitepress/theme/components/VPNav.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<script setup lang="ts">
import { provide } from 'vue'
import { useNav } from 'vitepress/dist/client/theme-default/composables/nav.js'
import { useSidebar } from 'vitepress/dist/client/theme-default/composables/sidebar.js'
import { useNav } from 'vitepress/dist/client/theme-default/composables/nav'
import { useSidebar } from 'vitepress/dist/client/theme-default/composables/sidebar'
import VPNavBar from './VPNavBar.vue'
import VPNavScreen from 'vitepress/dist/client/theme-default/components/VPNavScreen.vue'
Expand Down
39 changes: 26 additions & 13 deletions example/.vitepress/theme/components/VPNavBarMenuGroup.vue
Original file line number Diff line number Diff line change
@@ -1,25 +1,38 @@
<script lang="ts" setup>
import { useData } from 'vitepress'
import type { DefaultTheme } from 'vitepress/theme'
import { isActive } from 'vitepress/dist/client/shared'
import VPFlyout from './VPFlyout.vue'
import type { DefaultTheme } from 'vitepress/theme';
import { computed } from 'vue';
import { useData } from 'vitepress';
import { isActive } from 'vitepress/dist/client/shared';
import VPFlyout from './VPFlyout.vue';
defineProps<{
item: DefaultTheme.NavItemWithChildren
}>()
const props = defineProps<{
item: DefaultTheme.NavItemWithChildren;
}>();
const { page } = useData()
const { page } = useData();
const isChildActive = (navItem: DefaultTheme.NavItem) => {
if ('link' in navItem) {
return isActive(
page.value.relativePath,
navItem.link,
!!props.item.activeMatch
);
} else {
return navItem.items.some(isChildActive);
}
};
const childrenActive = computed(() => isChildActive(props.item));
</script>

<template>
<VPFlyout
:class="{
VPNavBarMenuGroup: true,
active: isActive(
page.relativePath,
item.activeMatch,
!!item.activeMatch
)
active:
isActive(page.relativePath, item.activeMatch, !!item.activeMatch) ||
childrenActive
}"
:button="item.text"
:items="item.items"
Expand Down
5 changes: 3 additions & 2 deletions example/.vitepress/theme/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import Layout from './Theme.vue';
import 'vitepress/dist/client/theme-default/styles/fonts.css';
import 'vitepress/dist/client/theme-default/styles/vars.css';
import 'vitepress/dist/client/theme-default/styles/base.css';
Expand All @@ -7,8 +6,10 @@ import 'vitepress/dist/client/theme-default/styles/components/custom-block.css';
import 'vitepress/dist/client/theme-default/styles/components/vp-code.css';
import 'vitepress/dist/client/theme-default/styles/components/vp-doc.css';
import 'vitepress/dist/client/theme-default/styles/components/vp-sponsor.css';
import './styles/style.scss';

import Layout from './Theme.vue';
import NotFound from 'vitepress/dist/client/theme-default/NotFound.vue';

const theme = {
Layout,
NotFound
Expand Down
7 changes: 0 additions & 7 deletions example/.vitepress/theme/styles/style.scss

This file was deleted.

Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Loading

0 comments on commit 39ca44b

Please sign in to comment.