Skip to content

Commit 6095057

Browse files
committed
feat: add responsive docs menu
1 parent 2e9dcdd commit 6095057

File tree

3 files changed

+125
-13
lines changed

3 files changed

+125
-13
lines changed

src/views/components/Sidebar.vue

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,99 @@
11
<template>
2-
<div :class="tw`min-h-full`">
2+
<transition
3+
:enter-active-class="tw`duration-150 ease-out`"
4+
:enter-from-class="tw`opacity-0`"
5+
:enter-to-class="tw`opacity-100`"
6+
:leave-active-class="tw`duration-150 ease-in`"
7+
:leave-from-class="tw`opacity-100`"
8+
:leave-to-class="tw`opacity-0`"
9+
>
10+
<div
11+
v-if="menuIsOpen"
12+
@click="toggleMenu"
13+
:class="tw`fixed inset-0 z-20 bg-black bg-opacity-50 lg:hidden`"
14+
aria-hidden="true"
15+
></div>
16+
</transition>
17+
18+
<button
19+
@click="toggleMenu"
20+
:class="
21+
tw`flex lg:hidden w-full items-center space-x-2 cursor-pointer select-none text(gray-500 dark:gray-300 hover:dark:white hover:green-700) p-4 rounded bg-gray-100 dark:bg-gray-700 hover:(bg(green-100 dark:gray-600 opacity-50 dark:opacity-50))`
22+
"
23+
>
24+
<svg
25+
:class="tw`w-5`"
26+
xmlns="http://www.w3.org/2000/svg"
27+
fill="none"
28+
viewBox="0 0 24 24"
29+
stroke="currentColor"
30+
>
31+
<path
32+
stroke-linecap="round"
33+
stroke-linejoin="round"
34+
stroke-width="2"
35+
d="M4 6h16M4 12h16M4 18h16"
36+
/>
37+
</svg>
38+
<div>{{ currentRoute.meta.title }}</div>
39+
</button>
40+
41+
<SidebarWrapper :menuIsOpen="menuIsOpen">
342
<ul :class="tw`sticky top-10`">
443
<li :class="classes.heading">Getting Started</li>
5-
<SidebarLink to="/docs/install">Installation</SidebarLink>
6-
<SidebarLink to="/docs/theming">Theming</SidebarLink>
7-
<SidebarLink to="/docs/guides">Guides</SidebarLink>
44+
<SidebarLink @click="toggleMenu" to="/docs/install">
45+
Installation
46+
</SidebarLink>
47+
<SidebarLink @click="toggleMenu" to="/docs/theming">Theming</SidebarLink>
48+
<SidebarLink @click="toggleMenu" to="/docs/guides">Guides</SidebarLink>
849
<li :class="classes.heading">
950
<div :class="tw`mt-8`">Components</div>
1051
</li>
11-
<SidebarLink to="/docs/anchor">Anchor Link</SidebarLink>
12-
<SidebarLink to="/docs/button">Button</SidebarLink>
13-
<SidebarLink to="/docs/dropdown">Dropdown</SidebarLink>
14-
<SidebarLink to="/docs/prose">Prose</SidebarLink>
15-
<SidebarLink to="/docs/table">Table</SidebarLink>
52+
<SidebarLink @click="toggleMenu" to="/docs/anchor">
53+
Anchor Link
54+
</SidebarLink>
55+
<SidebarLink @click="toggleMenu" to="/docs/button">Button</SidebarLink>
56+
<SidebarLink @click="toggleMenu" to="/docs/dropdown">
57+
Dropdown
58+
</SidebarLink>
59+
<SidebarLink @click="toggleMenu" to="/docs/prose">Prose</SidebarLink>
60+
<SidebarLink @click="toggleMenu" to="/docs/table">Table</SidebarLink>
1661
</ul>
17-
</div>
62+
</SidebarWrapper>
1863
</template>
1964

2065
<script lang="ts">
21-
import { computed, defineComponent } from "vue";
66+
import { computed, defineComponent, ref, watch } from "vue";
2267
import { tw } from "twind";
68+
import router from "@/router/index.ts";
69+
import SidebarWrapper from "@/views/components/SidebarWrapper.vue";
2370
import SidebarLink from "@/views/components/SidebarLink.vue";
2471
2572
export default defineComponent({
2673
components: {
2774
SidebarLink,
75+
SidebarWrapper,
2876
},
2977
setup() {
78+
const { currentRoute } = router;
79+
const menuIsOpen = ref(false);
3080
const classes = computed(() => {
3181
return {
3282
heading: tw`uppercase text-sm font-bold tracking-widest mb-3`,
3383
};
3484
});
35-
return { tw, classes };
85+
86+
const toggleMenu = (): void => {
87+
menuIsOpen.value = !menuIsOpen.value;
88+
};
89+
90+
watch(menuIsOpen, (menuIsOpen) => {
91+
menuIsOpen
92+
? document.body.classList.add(tw`overflow-hidden`)
93+
: document.body.classList.remove(tw`overflow-hidden`);
94+
});
95+
96+
return { tw, currentRoute, classes, menuIsOpen, toggleMenu };
3697
},
3798
});
3899
</script>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<template>
2+
<div :class="tw`relative text-white!`">
3+
<transition
4+
:enter-active-class="tw`duration-150 ease-out`"
5+
:enter-from-class="tw`scale-95 opacity-0`"
6+
:enter-to-class="tw`scale-100 opacity-100`"
7+
:leave-active-class="tw`duration-150 ease-in`"
8+
:leave-from-class="tw`scale-100 opacity-100`"
9+
:leave-to-class="tw`scale-95 opacity-0`"
10+
>
11+
<div
12+
v-if="menuIsOpen === true"
13+
:class="
14+
tw`z-30 absolute top-4 inset-x-0 mx-auto w-full transition transform origin-top`
15+
"
16+
>
17+
<div
18+
:class="
19+
tw`rounded-lg shadow-lg ring-1 p-6 ring-black ring-opacity-5 bg-white dark:bg-gray-800 divide-y divide-gray-200`
20+
"
21+
>
22+
<slot></slot>
23+
</div>
24+
</div>
25+
</transition>
26+
</div>
27+
<div :class="tw`min-h-full hidden lg:block`">
28+
<slot></slot>
29+
</div>
30+
</template>
31+
32+
<script lang="ts">
33+
import { defineComponent } from "vue";
34+
import { tw } from "twind";
35+
36+
export default defineComponent({
37+
props: {
38+
menuIsOpen: {
39+
type: Boolean,
40+
required: true,
41+
},
42+
toggleMenu: {
43+
type: Function,
44+
required: false,
45+
},
46+
},
47+
setup() {
48+
return { tw };
49+
},
50+
});
51+
</script>

src/views/layouts/default.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<div :class="tw`col-span-1 lg:mt-1.5`">
1212
<Sidebar />
1313
</div>
14-
<div :class="tw`col-span-3 mt-14 lg:mt-0`">
14+
<div :class="tw`col-span-3 mt-8 lg:mt-0`">
1515
<BaseLayout />
1616
</div>
1717
</div>

0 commit comments

Comments
 (0)