123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- <template>
- <div class="slide-menu" id="slide-menu">
- <div
- v-for="item in items"
- :class="{active: item.name === activeName}"
- :key="item.name"
- @click="$emit('changeItem', item as any)"
- >
- <ui-icon :type="item.icon" :tip="item.title" class="icon" />
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import { metas, RoutesName, router, getRouteConfig } from '@/router'
- import { views, records, floders } from '@/store';
- import { computed } from 'vue';
- import type { RouteRaw } from '@/router'
- import { appType, params, routeIncludeFire } from '@/env';
- export type MenuItem = {
- name: RoutesName,
- config: RouteRaw,
- } & (typeof metas)[keyof typeof metas]
- defineProps<{ activeName: RoutesName }>()
- defineEmits<{ (e: 'changeItem', item: MenuItem): void }>()
- const items = computed(() => {
- const items = [
- {
- name: RoutesName.summaryShow,
- config: getRouteConfig(RoutesName.summaryShow),
- ...metas[RoutesName.summaryShow]
- }
- ]
- if (routeIncludeFire(params.app)) {
- items.unshift({
- name: RoutesName.fireInfo,
- config: getRouteConfig(RoutesName.fireInfo),
- ...metas[RoutesName.fireInfo]
- })
- }
- if (views.value.length) {
- items.push({
- name: RoutesName.viewShow,
- config: getRouteConfig(RoutesName.viewShow),
- ...metas[RoutesName.viewShow]
- })
- }
- if (records.value.length) {
- items.push({
- name: RoutesName.recordShow,
- config: getRouteConfig(RoutesName.recordShow),
- ...metas[RoutesName.recordShow]
- })
- }
- if (floders.value.length) {
- items.push({
- name: RoutesName.folderShow,
- config: getRouteConfig(RoutesName.folderShow),
- ...metas[RoutesName.folderShow]
- })
- }
- return items
- })
- </script>
- <style lang="scss" scoped>
- .slide-menu {
- width: var(--editor-menu-width);
- filter: var(--editor-menu-filter);
- background-color: var(--editor-menu-back);
- position: fixed;
- left: var(--editor-menu-left);
- top: calc(var(--editor-head-height) + var(--header-top));
- bottom: 0;
- z-index: 2000;
- overflow: hidden;
- backdrop-filter: blur(4px);
- transition: all .3s ease;
- > div {
- height: 70px;
- display: flex;
- align-items: center;
- justify-content: center;
- position: relative;
- color: rgba(255, 255, 255, 0.6);
- transition: color .3s ease;
- cursor: pointer;
- &::before {
- content: '';
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 0;
- background: currentColor;
- transition: width .3s ease;
- }
- &.active,
- &:hover {
- color: #00C8AF;
- }
- &.active::before {
- width: 4px;
- }
- .icon {
- font-size: 24px;
- color: currentColor;
- }
-
- }
- }
- </style>
|