StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
StackGenVis/frontend/node_modules/vue-slider-component/src/components/Navbar.vue

257 lines
5.8 KiB

<template>
<div :class="['navbar', { hide }]">
<aside class="btn-wrap">
<div class="hide-btn" @click="hide = true"></div>
<div class="btn-group">
<div class="btn switch-btn" @click="hide = !hide"></div>
<div class="btn language-btn" @click="switchLanguage">{{ nextLanguage }}</div>
<a class="btn github-btn" :href="homePageUrl" target="_blank"></a>
</div>
</aside>
<div class="content">
<div class="site-info">
<div class="name">{{ name }}</div>
<div class="version">v{{ version }}</div>
<label for="theme">
Theme:
<select id="theme" class="theme" v-model="theme" @change="changeTheme">
<option value="default">default</option>
<option value="antd">antd</option>
<option value="material">material</option>
</select>
</label>
</div>
<div class="nav-content">
<div
v-for="(list, title) in navObj"
:key="title"
class="nav-group"
>
<div class="nav-title">{{ title }}</div>
<router-link
v-for="(item, index) in list"
:key="index"
class="nav-item"
:to="$route.meta.lang + item.route"
exact
@click.native="routeClickHandle"
>
<span class="nav-name">{{ item.name }}</span>
</router-link>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import packageInfo from '../../package.json'
import { getNavObj, LANG } from '../nav/'
import { getTheme } from '../utils'
@Component({})
export default class Navbar extends Vue {
hide = false
name = packageInfo.name
version = packageInfo.version
homePageUrl = packageInfo.homepage
theme = getTheme() || 'default'
get nextLanguage() {
return this.$route.meta.lang === LANG.ENGLISH ? '🇨🇳' : '🇺🇸'
}
get navObj() {
return getNavObj(this.$route.meta.lang)
}
mounted() {
this.hide = document.body.clientWidth < 992 ? true : false
}
switchLanguage() {
this.$router.push({
path: (
this.$route.meta.lang === LANG.ENGLISH ? LANG.ZH_CN : LANG.ENGLISH
) + this.$route.meta.route
})
}
changeTheme(e: Event) {
const theme = (e.target as any).value
localStorage.setItem('theme', theme)
location.reload()
}
routeClickHandle() {
if (document.body.clientWidth < 992) {
this.hide = true
}
}
}
</script>
<style lang="scss">
@import '../styles/var';
@import '../styles/media';
$width: 320px;
$bgColor: #f2f4f6;
$gap: 30px;
$navFont: #7e99b6;
.navbar {
position: relative;
width: $width;
height: 100vh;
background-color: $bgColor;
transition: all .5s;
z-index: 99;
&.hide {
margin-left: -$width;
}
.hide-btn {
display: none;
position: absolute;
right: 20px;
top: 20px;
width: 16px;
height: 16px;
cursor: pointer;
background-image: url('../assets/close.png');
background-size: 100%;
background-repeat: no-repeat;
}
@include max-screen(992px) {
& {
position: fixed;
width: 100vw;
left: 0;
top: 0;
&.hide {
margin-left: 0;
transform: translateX(-100%);
}
.hide-btn {
display: block;
}
}
}
.btn-group {
position: absolute;
left: 100%;
top: 0;
transform: translateX(10px);
.btn {
width: 28px;
height: 28px;
border-radius: 50%;
cursor: pointer;
background-color: $bgColor;
margin-top: 10px;
display: block;
}
.switch-btn {
background-image: url('../assets/menu.png');
background-size: 16px;
background-repeat: no-repeat;
background-position: center;
}
.language-btn {
display: flex;
justify-content: center;
align-items: center;
}
.github-btn {
background-image: url('../assets/github.png');
background-size: 16px;
background-repeat: no-repeat;
background-position: center;
}
@include max-screen(992px) {
& {
display: flex;
align-items: flex-start;
transform: translateX(0);
.btn {
margin-left: 10px;
}
}
}
}
.content {
height: 100%;
overflow-y: auto;
}
.site-info {
display: flex;
justify-content: center;
flex-direction: column;
padding: ($gap * 2) $gap;
.name {
font-size: 24px;
font-weight: bold;
}
.version {
font-size: 14px;
color: #999;
}
.theme {
margin: 15px 0 0 5px;
width: 80px;
}
}
.nav-content {
padding: 0 $gap;
.nav-group {
margin: 0 0 $gap;
.nav-title {
font-size: 18px;
font-weight: bold;
color: $navFont;
margin-bottom: 5px;
}
.nav-item {
display: block;
padding: 5px 0;
color: $navFont;
cursor: pointer;
text-decoration: none;
.nav-name {
position: relative;
&::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 2px;
background-color: $navFont;
transition: all .3s;
transform: scale(0);
transform-origin: left;
}
}
&:hover .nav-name::after,
&.router-link-active .nav-name::after {
transform: scale(1);
}
}
}
}
}
</style>