slide-menu.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <template>
  2. <div class="slide-menu" id="slide-menu">
  3. <div
  4. v-for="item in items"
  5. :class="{active: item.name === activeName}"
  6. :key="item.name"
  7. @click="$emit('changeItem', item as any)"
  8. >
  9. <ui-icon :type="item.icon" :tip="item.title" class="icon" />
  10. </div>
  11. </div>
  12. </template>
  13. <script lang="ts" setup>
  14. import { metas, RoutesName, router, getRouteConfig } from '@/router'
  15. import { views, records, floders } from '@/store';
  16. import { computed } from 'vue';
  17. import type { RouteRaw } from '@/router'
  18. import { appType, params, routeIncludeFire } from '@/env';
  19. export type MenuItem = {
  20. name: RoutesName,
  21. config: RouteRaw,
  22. } & (typeof metas)[keyof typeof metas]
  23. defineProps<{ activeName: RoutesName }>()
  24. defineEmits<{ (e: 'changeItem', item: MenuItem): void }>()
  25. const items = computed(() => {
  26. const items = [
  27. {
  28. name: RoutesName.summaryShow,
  29. config: getRouteConfig(RoutesName.summaryShow),
  30. ...metas[RoutesName.summaryShow]
  31. }
  32. ]
  33. if (routeIncludeFire(params.app)) {
  34. items.unshift({
  35. name: RoutesName.fireInfo,
  36. config: getRouteConfig(RoutesName.fireInfo),
  37. ...metas[RoutesName.fireInfo]
  38. })
  39. }
  40. if (views.value.length) {
  41. items.push({
  42. name: RoutesName.viewShow,
  43. config: getRouteConfig(RoutesName.viewShow),
  44. ...metas[RoutesName.viewShow]
  45. })
  46. }
  47. if (records.value.length) {
  48. items.push({
  49. name: RoutesName.recordShow,
  50. config: getRouteConfig(RoutesName.recordShow),
  51. ...metas[RoutesName.recordShow]
  52. })
  53. }
  54. if (floders.value.length) {
  55. items.push({
  56. name: RoutesName.folderShow,
  57. config: getRouteConfig(RoutesName.folderShow),
  58. ...metas[RoutesName.folderShow]
  59. })
  60. }
  61. return items
  62. })
  63. </script>
  64. <style lang="scss" scoped>
  65. .slide-menu {
  66. width: var(--editor-menu-width);
  67. filter: var(--editor-menu-filter);
  68. background-color: var(--editor-menu-back);
  69. position: fixed;
  70. left: var(--editor-menu-left);
  71. top: calc(var(--editor-head-height) + var(--header-top));
  72. bottom: 0;
  73. z-index: 2000;
  74. overflow: hidden;
  75. backdrop-filter: blur(4px);
  76. transition: all .3s ease;
  77. > div {
  78. height: 70px;
  79. display: flex;
  80. align-items: center;
  81. justify-content: center;
  82. position: relative;
  83. color: rgba(255, 255, 255, 0.6);
  84. transition: color .3s ease;
  85. cursor: pointer;
  86. &::before {
  87. content: '';
  88. position: absolute;
  89. left: 0;
  90. top: 0;
  91. bottom: 0;
  92. width: 0;
  93. background: currentColor;
  94. transition: width .3s ease;
  95. }
  96. &.active,
  97. &:hover {
  98. color: #00C8AF;
  99. }
  100. &.active::before {
  101. width: 4px;
  102. }
  103. .icon {
  104. font-size: 24px;
  105. color: currentColor;
  106. }
  107. }
  108. }
  109. </style>