slide-menu.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 { 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: 200;
  74. overflow: hidden;
  75. backdrop-filter: blur(4px);
  76. transition: all 0.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 0.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 0.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>