feat(components): add sidebar component
This commit is contained in:
parent
b2e950e798
commit
aca345f676
140
components/layouts/sidebar.vue
Normal file
140
components/layouts/sidebar.vue
Normal file
@ -0,0 +1,140 @@
|
||||
<script setup lang="ts">
|
||||
import type {
|
||||
MenuItemType,
|
||||
SubMenuType,
|
||||
} from "ant-design-vue/es/menu/src/interface";
|
||||
import { ItemType, theme } from "ant-design-vue";
|
||||
import sidebarIcon from "./sidebarIconified.vue";
|
||||
import Icon from "../icon.vue";
|
||||
import { ISidebarItem } from "~/models/sidebarEntry";
|
||||
import { NuxtLink } from "#components";
|
||||
|
||||
const loaded = inject<Ref<boolean>>("loaded");
|
||||
|
||||
const { useToken } = theme;
|
||||
const { token } = useToken();
|
||||
|
||||
const selState = ref<string>("");
|
||||
|
||||
const { data: injecto } = await useApiFetch<ISidebarItem[]>("/sidebar");
|
||||
|
||||
let items: Ref<ItemType[]> = ref([
|
||||
{
|
||||
key: "important",
|
||||
label: h("span", { class: "smallcaps" }, ["Pinned"]),
|
||||
icon: h(Icon, {
|
||||
istyle: "regular",
|
||||
name: "thumbtack",
|
||||
size: 19,
|
||||
}),
|
||||
children: [
|
||||
{
|
||||
key: "/submission-rules",
|
||||
label: h(
|
||||
"b",
|
||||
{
|
||||
style: {
|
||||
color: token.value.colorInfo,
|
||||
},
|
||||
class: "smallcaps",
|
||||
},
|
||||
["submission rules"],
|
||||
),
|
||||
icon: h(Icon, {
|
||||
istyle: "regular",
|
||||
name: "memo",
|
||||
size: 15,
|
||||
}),
|
||||
} as MenuItemType,
|
||||
{
|
||||
key: "/terms",
|
||||
label: "Terms of Service",
|
||||
icon: h(Icon, {
|
||||
istyle: "regular",
|
||||
name: "globe",
|
||||
size: 15,
|
||||
}),
|
||||
} as MenuItemType,
|
||||
],
|
||||
} as SubMenuType,
|
||||
{
|
||||
key: "fun-features",
|
||||
label: h("span", { class: "smallcaps" }, ["Fun features"]),
|
||||
icon: h(Icon, {
|
||||
istyle: "regular",
|
||||
name: "sparkles",
|
||||
size: 19,
|
||||
}),
|
||||
children: (injecto.value || ([] as ISidebarItem[]))
|
||||
.sort((a, b) => a.index - b.index)
|
||||
.map((b) => ({
|
||||
key: b.url,
|
||||
label: h(
|
||||
"span",
|
||||
{
|
||||
"data-color": b.color,
|
||||
class: "custom-side-item",
|
||||
},
|
||||
[h(NuxtLink, { to: b.url }, [b.linkTitle])],
|
||||
),
|
||||
})),
|
||||
} as SubMenuType,
|
||||
]);
|
||||
|
||||
// console.log("wtf", items)
|
||||
</script>
|
||||
<template>
|
||||
<client-only>
|
||||
<a-menu
|
||||
mode="inline"
|
||||
@select="
|
||||
({ item, key, selectedKeys }) => {
|
||||
if ((key as string).startsWith('/')) {
|
||||
navigateTo(key as string);
|
||||
}
|
||||
}
|
||||
"
|
||||
:style="{
|
||||
flexGrow: 0.8,
|
||||
}"
|
||||
:trigger-sub-menu-action="'click'"
|
||||
v-model:active-key="selState"
|
||||
:items="items"
|
||||
:inline-indent="16"
|
||||
>
|
||||
<!-- <a-sub-menu>
|
||||
<template #title>
|
||||
<sidebar-icon>
|
||||
<template #icon>
|
||||
<Icon name="sparkles" istyle="regular" :size="19"/>
|
||||
</template>
|
||||
<template #rest>
|
||||
<div class="smallcaps">
|
||||
fun features
|
||||
</div>
|
||||
</template>
|
||||
</sidebar-icon>
|
||||
</template>
|
||||
<a-menu-item>
|
||||
<sidebar-icon>
|
||||
<template #icon>
|
||||
<icon name="memo" :icolor="token.colorInfo" istyle="regular" :size="13"/>
|
||||
</template>
|
||||
<template #rest>
|
||||
<nuxt-link to="/submission-rules">
|
||||
<b :style="{ color: token.colorInfo }">
|
||||
submission rules
|
||||
</b>
|
||||
</nuxt-link>
|
||||
</template>
|
||||
</sidebar-icon>
|
||||
</a-menu-item>
|
||||
</a-sub-menu> -->
|
||||
</a-menu>
|
||||
</client-only>
|
||||
</template>
|
||||
<style>
|
||||
.smallcaps {
|
||||
font-variant: small-caps;
|
||||
}
|
||||
</style>
|
Loading…
Reference in New Issue
Block a user