|
<script lang="ts" setup> |
|
import router from "@/router.ts"; |
|
import {watch, ref, onMounted, onUnmounted} from "vue"; |
|
import {ArrowRightOutlined, DashboardOutlined, |
|
ExperimentOutlined, SettingOutlined} from "@ant-design/icons-vue"; |
|
|
|
const windowWidth = ref(window.innerWidth) |
|
|
|
onMounted(() => { |
|
window.addEventListener('resize', () => { |
|
windowWidth.value = window.innerWidth |
|
}) |
|
}) |
|
onUnmounted(() => { |
|
window.removeEventListener('resize', () => { |
|
windowWidth.value = window.innerWidth |
|
}) |
|
}) |
|
|
|
const sessionActive = ref(false) |
|
const toolsActive = ref(false) |
|
watch(router.currentRoute, (to, from) => { |
|
console.log('router changed', to, from) |
|
|
|
const sessionActivePath = ['/sessions', '/sessions/', '/form', '/form/', '/output'] |
|
|
|
if (sessionActivePath.includes(to.path)) { |
|
sessionActive.value = true |
|
toolsActive.value = false |
|
return |
|
} |
|
|
|
const toolsActivePath = ['/tools', '/tools/', '/benchmark', '/benchmark/', '/benchmark_detail', '/benchmark_detail/'] |
|
if (toolsActivePath.includes(to.path)) { |
|
sessionActive.value = false |
|
toolsActive.value = true |
|
return |
|
} |
|
|
|
sessionActive.value = false |
|
toolsActive.value = false |
|
}) |
|
|
|
const gotoSettings = (e: any) => { |
|
e.preventDefault() |
|
router.push('/settings') |
|
} |
|
|
|
const gotoProfiling = (e: any) => { |
|
e.preventDefault() |
|
router.push('/profiling') |
|
} |
|
|
|
const gotoHealthcheck = (e: any) => { |
|
e.preventDefault() |
|
router.push('/healthcheck') |
|
} |
|
|
|
</script> |
|
<template> |
|
<nav class="header-nav"> |
|
<div class="nav-left flex flex-row justify-between items-center"> |
|
<router-link to="/" > |
|
<img |
|
alt="logo" |
|
src="/logo.webp" |
|
class="logo" |
|
/> |
|
</router-link> |
|
|
|
</div> |
|
<div class="title"> |
|
<div v-if="windowWidth >= 1280"> |
|
<div class="primary">AVATAR |
|
</div> |
|
<div class="secondary">(power by AI)</div> |
|
</div> |
|
<h3 v-if="windowWidth < 1280" |
|
class="text-3xl font-medium text-primary-dark dark:text-ternary-light hidden sm:block" |
|
style="font-size: 22px; line-height: 60px; font-weight: 600;" |
|
>AVATAR</h3> |
|
</div> |
|
<div class="nav-right flex flex-row justify-between items-center"> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a-button type="ghost" style="margin-right: 12px;" |
|
size="large" @click="gotoProfiling"> |
|
<template #icon> |
|
<ExperimentOutlined style="font-size: 24px;"/> |
|
</template> |
|
</a-button> |
|
<a-button type="ghost" style="margin-right: 12px;" |
|
size="large" @click="gotoHealthcheck"> |
|
<template #icon> |
|
<DashboardOutlined style="font-size: 24px;"/> |
|
</template> |
|
</a-button> |
|
<a-button type="ghost" size="large" @click="gotoSettings"> |
|
<template #icon> |
|
<SettingOutlined style="font-size: 24px;"/> |
|
</template> |
|
</a-button> |
|
|
|
|
|
|
|
</div> |
|
</nav> |
|
</template> |
|
<style scoped lang="scss"> |
|
.header-nav { |
|
display: flex; |
|
align-items: center; |
|
justify-content: space-between; |
|
width: 100vw; |
|
height: 72px; |
|
background: aliceblue; |
|
box-shadow: 1px 1px 2px 1px #d9d9d9; |
|
top: 0; |
|
position: sticky; |
|
z-index: 99; |
|
} |
|
|
|
.nav-left { |
|
position: absolute; |
|
left: 20px; |
|
top: 12px; |
|
} |
|
|
|
.nav-right { |
|
.ant-btn { |
|
span { |
|
font-size: 15px; |
|
font-weight: 600; |
|
} |
|
} |
|
} |
|
|
|
.logo { |
|
width: 48px; |
|
height: 48px; |
|
border-radius: 24px; |
|
will-change: filter; |
|
transition: filter 300ms; |
|
} |
|
|
|
.logo:hover { |
|
filter: drop-shadow(0 0 2em #646cffaa); |
|
} |
|
|
|
.logo.vue:hover { |
|
filter: drop-shadow(0 0 2em #42b883aa); |
|
} |
|
|
|
.nav-items { |
|
margin-left: 10px; |
|
} |
|
|
|
.nav-right { |
|
position: absolute; |
|
right: 20px; |
|
height: 64px; |
|
align-items: center; |
|
display: flex; |
|
} |
|
|
|
.title { |
|
margin-left: 84px; |
|
line-height: 48px; |
|
height: 54px; |
|
|
|
.primary { |
|
font-weight: bold; |
|
text-align: left; |
|
font-size: 16px; |
|
letter-spacing: -0.8px; |
|
font-family: Courier,Menlo, monospace, 'SFMono-Regular', Consolas, 'Liberation Mono'; |
|
} |
|
.secondary { |
|
font-family: Courier,Menlo, monospace, 'SFMono-Regular', Consolas, 'Liberation Mono'; |
|
text-align: left; |
|
font-size: 8px; |
|
letter-spacing: -0.2px; |
|
font-weight: 400; |
|
line-height: 20px; |
|
margin-top: -12px; |
|
} |
|
} |
|
|
|
.switch-icon { |
|
margin-left: 20px; |
|
} |
|
</style> |
|
|