mirror of
https://github.com/keven1024/015.git
synced 2026-05-26 15:13:30 +00:00
82 lines
2.6 KiB
Vue
82 lines
2.6 KiB
Vue
<template>
|
|
<div class="flex flex-row bg-white/50 backdrop-blur-xl p-2 rounded-full gap-1 sticky top-0 z-10">
|
|
<div
|
|
v-for="item in routes"
|
|
:key="item.key"
|
|
:class="
|
|
cx(
|
|
'flex flex-row items-center text-sm px-4 py-2 font-bold rounded-full relative select-none cursor-pointer',
|
|
!isActive(item) && 'hover:bg-black/5',
|
|
item?.name && 'gap-2',
|
|
item?.className
|
|
)
|
|
"
|
|
@click="handleClick(item)"
|
|
>
|
|
<motion.div v-if="isActive(item)" layoutId="navbar-active" class="absolute inset-0 rounded-full w-full h-full bg-black/10" />
|
|
<component :is="item.icon" />
|
|
<div class="hidden sm:block">{{ item.name }}</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { cx } from 'class-variance-authority'
|
|
import { LucideClipboardType, LucidePaperclip } from '#components'
|
|
import { motion } from 'motion-v'
|
|
import { LucideGlobe } from 'lucide-vue-next'
|
|
import showDrawer from '@/lib/showDrawer'
|
|
import I18nSwitchDrawer from './Drawer/I18nSwitchDrawer.vue'
|
|
const { t } = useI18n()
|
|
const routes = computed(() => [
|
|
{
|
|
key: 'about',
|
|
icon: () =>
|
|
h('img', {
|
|
class: 'size-10 rounded-full border-2 border-white/50',
|
|
src: '/logo.png',
|
|
}),
|
|
onClick: () => {
|
|
router.push('/about')
|
|
},
|
|
isActive: (item: { key: string }) => route.path?.endsWith(item.key),
|
|
className: '!p-1.5',
|
|
},
|
|
{ name: t('navbar.file'), key: 'file', icon: LucidePaperclip },
|
|
{ name: t('navbar.text'), key: 'text', icon: LucideClipboardType },
|
|
{
|
|
key: 'i18n',
|
|
icon: LucideGlobe,
|
|
onClick: () => {
|
|
showDrawer({
|
|
render: (props) => h(I18nSwitchDrawer, { ...props }),
|
|
})
|
|
},
|
|
className: 'size-12 !p-1.5 justify-center items-center',
|
|
},
|
|
])
|
|
const route = useRoute()
|
|
const router = useRouter()
|
|
const type = computed(() => route?.query?.type)
|
|
|
|
const isActive = (item: { key: string; isActive?: (item: { key: string }) => boolean }) => {
|
|
const { key, isActive } = item || {}
|
|
return isActive ? isActive(item) : type.value === key
|
|
}
|
|
|
|
const handleClick = (item: { key: string; onClick?: () => void }) => {
|
|
const { key, onClick } = item || {}
|
|
if (onClick) {
|
|
onClick()
|
|
return
|
|
}
|
|
router.push({
|
|
path: '/',
|
|
query: {
|
|
...route.query,
|
|
type: key,
|
|
},
|
|
})
|
|
}
|
|
</script>
|